远程遥控 IPTables 进行端口复用
這篇首發在 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 进行端口复用的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: POI在Word文档插入表格,表格中插入
- 下一篇: Word处理控件Aspose.Words
