我是靠谱客的博主 喜悦帆布鞋,最近开发中收集的这篇文章主要介绍远程遥控 IPTables 进行端口复用将发送本机 80 端口,源端口为 8989 的流量重定向至本机 22 端口socat 监听本地 2326 端口,接收到链接后,利用本地的 8989 端口将流量转至虚拟机的80端口SSH 连接本地 2326 端口,成功连接上了虚拟机的 SSH,同时本地正常用 curl 是能够访问到虚拟机的 80 端口的 HTTP 服务的创建端口复用链创建端口复用规则,将流量转发至 22 端口开启开关,如果接收到一个长为 1139 的 ICMP 包,则将来源 IP 添加到加为,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这篇首发在 ThreatHunter 社区:国内首个专注于高级威胁发现与安全数据分析的社区,请大家多多支持,https://threathunter.org。

有一天坐地铁的时候突然想到利用 iptables nat 表的 PREROUTING 链配合 REDIRECT 应该是可以达到端口复用的效果的。

比如在服务器的 PREROUTING 链里面加一条规则,将到本机 80 端口的流量 REDIRECT 到 22 端口,就算 80 端口正在被 Apache 监听,此流量也能成功到达 22 端口,因为 nat 表的 PREROUTING 链会在路由决策之前被处理。

现在的问题只有一个,如何区分到 80 端口的正常流量和“复用流量”? 正常的的 HTTP 流量应该让它正常地发往 Apache,而“复用流量”应该前往 22 端口。答案也很简单,只要“复用流量”有特征就可以了。

当天晚上我简单写了一个 PoC 来验证我的想法,如下:192.168.33.78 为虚拟机的 IP,虚拟机上用 python 在 80 端口启动了一个 http 服务
虚拟机上执行:

将发送本机 80 端口,源端口为 8989 的流量重定向至本机 22 端口

/sbin/iptables -t nat -A PREROUTING -p tcp --sport 8989 --dport 80 -j REDIRECT --to-port 22
本地执行:

socat 监听本地 2326 端口,接收到链接后,利用本地的 8989 端口将流量转至虚拟机的80端口

socat tcp-listen:2326,fork,reuseaddr tcp:192.168.33.78:80,sourceport=8989,reuseaddr &

SSH 连接本地 2326 端口,成功连接上了虚拟机的 SSH,同时本地正常用 curl 是能够访问到虚拟机的 80 端口的 HTTP 服务的

ssh vagrant@127.0.0.1 -p 2326
效果图:

以上是最初的 PoC。它有一个很明显的问题是不支持多链接。 如果想创建两个 SSH 链接就会出错,因为本地的 8989 端口已经被第一个 SSH 连接占用了。

今天我对这个方法进行了改进,不再用 source port 做为 “复用流量” 的标识,所以也就不需要再用 socat 来进行一次本地的转发了。同时,加入了远程遥控端口复用开关的功能。我这里直接放出脚本代码:

第一种方式:利用 ICMP 做遥控开关。缺点在于如果目标在内网,你是无法直接 ping 到它的。

创建端口复用链

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

let’s do it,如果发现 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
开启复用前,WEB 是可以访问的:

开启复用
ping -c 1 -s 1111 192.168.33.78
向目标发送一个长度为 1111 的 ICMP 数据包(加上包头28,总长度实际为1139)

关闭复用
ping -c 1 -s 1112 192.168.33.78
向目标发送一个长度为 1112 的 ICMP 数据包(加上包头 28,总长度实际为 1140)

效果图:

第二种方式:利用 tcp 数据包中的关键字做遥控开关,不怕目标在内网。

端口复用链

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 ‘threathuntercoming’ --algo bm -m recent --set --name letmein --rsource -j ACCEPT

关闭开关

iptables -A INPUT -p tcp -m string --string ‘threathunterleaving’ --algo bm -m recent --name letmein --remove -j ACCEPT

let’s do it

iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN
开启复用,开启后本机到目标 80 端口的流量将转发至目标的 SSH,80 将无法再被本机访问:
echo threathuntercoming | socat - tcp:192.168.33.78:80

关闭复用,关闭后,80 恢复正常:
echo threathunterleaving | socat - tcp:192.168.33.78:80
效果图:

只要有特征,就可以做为远程遥控的标志。我这里只是想验证一下自己的想法,所以用了我认为最简单的两种方法。其它方法希望大家自己挖掘,分享。

最后留一个小问题,如果在开启 tcpdump 进行抓包的同时,利用 iptables 对数据包进行了更改,那 tcpdump 抓到的是更改之前的包还是更改之后的包呢? :)

最后

以上就是喜悦帆布鞋为你收集整理的远程遥控 IPTables 进行端口复用将发送本机 80 端口,源端口为 8989 的流量重定向至本机 22 端口socat 监听本地 2326 端口,接收到链接后,利用本地的 8989 端口将流量转至虚拟机的80端口SSH 连接本地 2326 端口,成功连接上了虚拟机的 SSH,同时本地正常用 curl 是能够访问到虚拟机的 80 端口的 HTTP 服务的创建端口复用链创建端口复用规则,将流量转发至 22 端口开启开关,如果接收到一个长为 1139 的 ICMP 包,则将来源 IP 添加到加为的全部内容,希望文章能够帮你解决远程遥控 IPTables 进行端口复用将发送本机 80 端口,源端口为 8989 的流量重定向至本机 22 端口socat 监听本地 2326 端口,接收到链接后,利用本地的 8989 端口将流量转至虚拟机的80端口SSH 连接本地 2326 端口,成功连接上了虚拟机的 SSH,同时本地正常用 curl 是能够访问到虚拟机的 80 端口的 HTTP 服务的创建端口复用链创建端口复用规则,将流量转发至 22 端口开启开关,如果接收到一个长为 1139 的 ICMP 包,则将来源 IP 添加到加为所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部