这篇首发在 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 进行端口复用相关推荐

  1. iptables实现端口复用

    iptables实现端口复用 1.端口复用的概念 2.基于iptables的端口复用 2.0 前置概念 2.0.1 iptables自定义链 2.0.2 iptables recent模块使用 2.1 ...

  2. iptables端口复用

    环境: 攻击主机:Kali -- 192.168.218.135 目标主机:RHEL8 -- 192.168.218.129 什么是端口复用 端口复用是指不同的应用程序使用相同端口使用相同端口进行通讯 ...

  3. 管理端口_内网渗透 | 红蓝对抗:Windows利用WinRM实现端口复用打造隐蔽后门

    目录 WinRM端口复用原理 端口复用配置 新增80端口监听 修改WinRM默认监听的端口 远程连接WinRM WinRM端口复用原理 该端口复用的原理是使用Windows的远程管理服务WinRM,结 ...

  4. iptables实现端口映射(本地和远程端口映射)

    iptables实现端口映射(本地和远程端口映射) 说明: 需要将外网访问本地IP(192.168.75.5)的80端口转换为访问192.168.75.3的8000端口,这就需要用到iptables的 ...

  5. linux socket 端口复用 SO_REUSEADDR

    下面建立的套接字都是tcp套接字 1.进程创建监听套接字socket1,邦定一个指定端口,并接受了若干连接.那么进程创建另外一个套接口socket2,并试图邦定同一个端口时候,bind错误返回&quo ...

  6. Web端口复用正向后门研究实现与防御

    0×01背景 现在的很多远控/后门因为目前主流防火墙规则的限制,基本上都采用TCP/UDP反弹回连的通讯形式:但是在较高安全环境下,尤其负责web相关业务的环境,因为安防设备(防火墙,IDS,IPS等 ...

  7. Centos6.8下安装Mysql5.6.14,连接mysql及增删改查,通过Mysql-Front远程连接(开启端口、允许远程连接)

    Centos6.8下安装Mysql5.6.14,连接mysql及增删改查,并能通过Mysql-Front远程连接(开启端口.允许远程连接) 概述: 通过源代码安装高版本的5.6.14. 正文: 一:卸 ...

  8. php开启端口复用,WebServer端口复用后门

    0x00 有朋友问到了我一个关于"无端口可用"的问题.说在如下图所示的内网环境中,firewall只允许Web Server的80端口建立网络连接,并且Web Server上的80 ...

  9. esp32-cam摄像头+远程遥控小车

    目录 1.esp32cam开发 2.51单片机开发 3.手机端开发 4.总结 先来说说需要的器件,因为是心血来潮做的一个简单的实验,所以用的也都是最基础的东西.淘宝买的一个小车底板,外加四个带轮子的减 ...

最新文章

  1. Mirror, Mirror,What do I see、一切都是投射
  2. 并发编程之多进程进程进程
  3. 简单检测CDN链接是否有效
  4. Google Hacking的用法
  5. POJ 2115 C Looooops
  6. [Axure教程]0001.新手入门基础
  7. homebrew mac_借助Homebrew使从Mac到Linux的转换更加容易
  8. 浙大 PAT 乙级1055
  9. OAuth2.0认证服务器之客户端相关配置
  10. MyBatis递归查询
  11. chrome浏览器提示“adobe flash player不是最新版本!”
  12. python列表怎么比较大小_python列表怎么比较大小
  13. 超详细的商业智能BI知识分享,值得收藏
  14. 多因子模型水平测试题试答(因子部分)
  15. 面向对象设计之单一职责原则(Simple-Responsibility Principle)
  16. 计算机专业买什么u盘好,大容量u盘要格式化要选择哪种格式比较好用?-win7之家...
  17. 论文阅读 [TPAMI-2022] DE-GAN: A Conditional Generative Adversarial Network for Document Enhancement
  18. java64 压缩包,qq64位下载-rar 64位 v5.21 免费版
  19. 西安邮电大学计算机专业怎样,计算机怎么样?西安理工大学和西安邮电大学哪个比较好?...
  20. 科普篇|什么是JBOD?

热门文章

  1. 链表相关算法汇总(详细)
  2. bfd的文件格式识别
  3. 软件测试面试常见问题(2)
  4. 云应用程序架构:阿里云国际版服务器托管注意事项
  5. 梅科尔工作室E1-张冉-鸿蒙笔记3
  6. 轻轻松松背单词软件测试,MBA联考十佳背单词软件测评报告
  7. 苏春园:跟车品觉老师吃了顿早茶,让我明白了什么是数据的本质
  8. 本周上班6天,令人兴奋的五一小长假即将到来
  9. android蓝牙文件传输的实现
  10. python3学习(6):ID 遍历爬虫,将需要下载的网页数量最小化