農林漁牧網

您現在的位置是:首頁 > 林業

Fragscapy:繞過防火牆和IDS的新工具

2022-01-25由 NOSEC安全訊息平臺 發表于 林業

如何繞過防火牆

Fragscapy:繞過防火牆和IDS的新工具

Fragscapy是什麼?

在Amossys公司中,我們經常需要分析防火牆和IDS的功能及其配置,這往往很費時費力。自然,我們需要開發一些基本工具和指令碼來進行自動化分析。而Fragscapy旨在對這些工具和指令碼進行改進和整合,最終得到一個一個自動化、模組化、可擴充套件的Python 3專案。顧名思義,Fragscapy是基於Scapy來處理修改網路資料包的。

簡而言之,Fragscapy是一個可以測試防火牆保護能力的工具。它背後的原理其實很簡單:

Fragscapy:繞過防火牆和IDS的新工具

Fragscapy執行的流程是:

與目標應用進行互動(通常是基於HTTP協議的wget命令,或是更底層協議的ping命令)。

攔截傳輸的資料包。

對資料包進行修改。這是整個過程中最重要的一步,也是fuzz的地方。我們的目標是獲得一個經過重重修改後依然可被伺服器正確解析但又能繞過防火牆的資料包。

傳送修改後的資料包並等待響應。

回到步驟1,但是使用不同的修改方法。

如何修改?

好的,大家應該明白這個工具最有趣的部分發生在第3步的修改資料包。那麼在這個階段中到底發生了什麼呢?

從技術上講,修改操作可以看作一個函式,它接收資料包然後再返回不同的資料包。在這期間,任何事情都可能發生:資料包可以被修改、延遲、刪除、替換、切分、重新分組……該工具目前包括一些基本的資料包修改,例如:

丟棄資料包(以某種機率執行,或者指定某個特殊的資料包)

延遲資料包傳遞

對資料包進行過濾和重新排序,

對IPv4和IPv6資料包進行分片

分割TCP資料包

修改資料包的任何欄位。

想要知道修改資料包的更多細節,可以在fragscapy/modificatons/中檢視詳細的python程式碼

如何使用這個很棒的工具?

示例1:如何發現Linux中的未知特性

先讓我們看一個簡單的例子。假設有以下場景,我們試圖訪問目標伺服器80和8080埠(涉及web服務),但是iptables攔截了對8080埠的請求。

Fragscapy:繞過防火牆和IDS的新工具

使用Fragscapy

現在,先讓我們嘗試圍繞IPv6分片進行fuzz測試。Fragscapy的所有配置都圍繞以下兩點:

一個JSON配置檔案(規定測試行為)

命令列選項(用於輸出、日誌等)

其中JSON配置檔案ipv6_frag。json定義了測試的3個方面:

1。執行的命令:透過curl來獲取80和8080埠的連通性,只有當埠80可連通,8080埠被攔截,才說明防火牆正常工作

2。防火牆捕捉的特定資料包:無法確認,因此在預設情況下所有資料包都會被捕捉

3。修改方法:透過指定引數實現,輸入和輸出都可修改。

{ “cmd”: “/usr/bin/curl -6 -f -m 1 http://www。example。com:80 -o results/http_{i}_{j}。html; e1=$?; /usr/bin/curl -6 -f -m 1 http://www。example。com:8080 -o results/alt_{i}_{j}。html; e2=$? if [ $e1 -eq 0 && $e2 -ne 0 ]; then return 0; else return 1; fi”, “nfrules”: [ {“host”: “www。example。com”, “port”: 80, “ipv4”: false, “input_chain”: false} ], “input”: [ ], “output”: [ { “mod_name”: “ipv6_frag”, “mod_opts”: “range 10 3000 10” } ]}

我們計劃將資料包進行分段,分段大小從10位元組到3000位元組,跨度為10。最後,啟動下面的命令開始進行測試:

fragscapy start fragment。json \ -o run/std/stdout_{i}_{j}。txt \ -e run/std/stderr_{i}_{j}。txt \ -W run/pcap/local_{i}_{j}。txt \ -w run/pcap/remote_{i}_{j}。txt

fragscapy命令有多個選項來指定輸出哪些日誌(標準輸出和錯誤資訊等)。這樣我們就可以檢視在測試中到底發生了什麼。{i}和{j}只是python格式語法,會被數字所替代。

想了解命令的更多資訊,可以透過以下方式瞭解:

fragscapy ——helpfragscapy start ——help

“驚喜”的結果

有多種方法可以檢驗測試是否正確。首先,fragscapy start命令顯示了測試結果(0 = pass, other = fail)。

100%|██████████████████████████████████████████████████████████████████|300/300Results (300 tests done over 300 scenarios)==================Pass : 174 n°0_0, n°127_0, n°128_0, n°129_0, n°130_0, n°131_0, n°132_0, n°133_0, 。。。Fail : 126 n°1_0, n°2_0, n°3_0, n°4_0, n°5_0, n°6_0, n°7_0, n°8_0, n°9_0, n°10_0, 。。。Not Done : 0

從以上進度條可以看出來,總共需要進行300次測試,結果包括三個部分:

透過的測試(這裡是174個)

未透過的測試(這裡是126)

尚未完成的測試(這裡是0),主要指測試程式中斷時的狀況

其中174個透過的測試是指成功獲取80埠的頁面,但沒能獲取8080埠頁面。我們可以輕易發現,前126個測試(片段大小在10到1270之間)未包含在內。這時我們就可以透過日誌來了解到底發生了什麼。

透過檢視results/目錄下的日誌檔案,我們可以看到8080埠的頁面從未成功獲取,但是80埠的頁面在#1到#126的結果中也未能獲取。到底發生了什麼?

在run/pcap/目錄中有我們所捕獲的資料包。經過簡短的研究,發現小於1280位元組的片段都被拒絕了……同時,1280是IPv6資料包的下限,這可能不是一個巧合。

後來我們發現,只要小於1280位元組的片段都會被拒絕,但沒有任何文件記錄了這一點。我們只能猜測是Linux核心丟棄了這些片段,而在Linux 5。0中這一現象已不存在。

這就是Fragscapy的使用方法:配置、測試、分析日誌和結果。當然,在以上這個簡單的例子中,我們沒能繞過iptables,但是卻意外發現了iptables的一個奇怪行為。

示例2:如何繞過防火牆

現在,讓我們更深入地使用Fragscapy進行測試。以下示例來自一個真實的場景,情況如下:

Fragscapy:繞過防火牆和IDS的新工具

我們將從“User”區域fuzz在DMZ中的web伺服器。中間的防火牆已經配置好,會攔截帶有特定引數的請求。讓我們進行多種測試,看看會發生什麼:

fragment_ipv4。json:

{ “cmd”: “/usr/bin/curl -f -m 1 http://www。example。com/index。html?azerty -o results/{i}_{j}。html”, “nfrules”: [ {“host”: “www。example。com”, “port”: 80, “ipv6”: false, “input_chain”: false} ], “input”: [ ], “output”: [ { “mod_name”: “ipv4_frag”, “mod_opts”: “range 1 1000” }, { “mod_name”: “drop_proba”, “mod_opts”: “seq_float 0。1 0。2 0。3 0。4 0。5”, “optional”: true }, { “mod_name”: “duplicate”, “mod_opts”: “seq_str first last random”, “optional”: true }, { “mod_name”: “reorder”, “mod_opts”: “seq_str reverse random”, “optional”: true } ]}

segment_tcp。json:

{ “cmd”: “/usr/bin/curl -f -m 1 http://www。example。com/index。html?azerty -o results/{i}_{j}。html”, “nfrules”: [ {“host”: “www。example。com”, “port”: 80, “input_chain”: false} ], “input”: [ ], “output”: [ { “mod_name”: “tcp_segment”, “mod_opts”: “range 1 1000” }, { “mod_name”: “drop_proba”, “mod_opts”: “seq_float 0。1 0。2 0。3 0。4 0。5”, “optional”: true }, { “mod_name”: “duplicate”, “mod_opts”: “seq_str first last random”, “optional”: true }, { “mod_name”: “reorder”, “mod_opts”: “seq_str reverse random”, “optional”: true } ]}

相關命令如下:

fragscapy start fragment_ipv4。json segment_tcp。json \ -o run/std/stdout_{i}_{j}。txt \ -e run/std/stderr_{i}_{j}。txt \ -W run/pcap/local_{i}_{j}。txt \ -w run/pcap/remote_{i}_{j}。txt \ ——append

基本上,我們執行Fragscapy的目的是為了能順利獲取帶有引數azerty的index。html頁面內容。除了IPv4資料包切片處理,還有其他很多混淆設定。在運行了144000個測試,數小時後,結果如下:

100%|██████████████████████████████████████████████████████████████|72000|72000Results (666000 tests done over 72000 scenarios)==================Pass : 0Fail : 666000 n°0_0, n°1_0, n°2_0, n°2_1, n°2_2, n°2_3, n°2_4, n°2_5, n°2_6, n°2_7, 。。。Not Done : 0100%|██████████████████████████████████████████████████████████████|72000|72000Results (666000 tests done over 72000 scenarios)==================Pass : 98 n°0_0, n°1_0, n°2_0, n°2_1, n°2_2, n°2_3, n°2_4, n°2_5, n°2_6, n°2_7, 。。。Fail : 665987 n°22_5, n°23_3, n°25_5, n°32_1, n°32_6, n°33_8, n°34_1, n°35_6, n°35_7, 。。。Not Done : 0

結果的上半部分顯示了IPv4資料包分片測試的結果。沒有什麼特別的,全都失敗了,這意味著要麼防火牆攔截了資料包,要麼傳遞的資料包對web服務來說無法解析。

但是,結果的下半部分,TCP分片測試則得到了一些成功的結果。從results/目錄的內容上看,防火牆並沒有很好地處理從大小1到46的片段,自然就沒有觸發攔截規則,但web服務可以完美地重構請求並響應。

沒錯,這個防火牆的缺陷被我找到了,透過使用較小的資料包片段就能繞過防火牆。

示例3:劫持Fragscapy以獲取樂趣

讓我們最後用一個有趣的例子來演示Fragscapy還可以做什麼。我們現在知道它可以用於針對安全產品進行測試,但我們也可用其中的機制做其他的事。我們可以把Fragscapy配置為HTTP代理,只是看起像但不是。

相關配置檔案如下:

{ “cmd”: “while true; do sleep 1; done”, “nfrules”: [ {“port”: 80, “output_chain”: false}, {“port”: 8080, “input_chain”: false} ], “input”: [ { “mod_name”: “field”, “mod_opts”: [“TCP”, “sport”, 8080] }, { “mod_name”: “field”, “mod_opts”: [“TCP”, “chksum”, “none”] } ], “output”: [ { “mod_name”: “field”, “mod_opts”: [“TCP”, “dport”, 80] }, { “mod_name”: “field”, “mod_opts”: [“TCP”, “chksum”, “none”] } ]}

以上這個配置檔案只會執行一個無限迴圈的命令,它實際上不進行任何測試。它把8080埠接收到的資料包傳遞給80埠,再把80埠的響應傳遞給8080埠。

fragscapy start http_proxy。json

現在,你可以透過8080埠訪問80埠,至少你本地的瀏覽器和工具是這樣的。你可以嘗試訪問http://www。example。com:8080,應該會得到80埠的頁面。

歡迎改進

如果你想深入瞭解Fragscap,並基於現有的模組進行改進,可以訪問Amossys的Github。如果你有勇氣對核心程式碼進行修改,我們也是歡迎的。

本文由白帽彙整理並翻譯,不代表白帽匯任何觀點和立場

原文:https://blog。amossys。fr/fragscapy-fuzzing-protocols-to-evade-firewalls。html

白帽匯從事資訊保安,專注於安全大資料、企業威脅情報。

公司產品:FOFA-網路空間安全搜尋引擎、FOEYE-網路空間檢索系統、NOSEC-安全訊息平臺。

為您提供:網路空間測繪、企業資產收集、企業威脅情報、應急響應服務。