
SMB1サーバーによるNTLMv2ハッシュ傍受用ツール。C言語で記述されています。
NTLMv2ハッシュを傍受するためのSMB1サーバー。C言語で書かれています。
このプロジェクトの目標は、SMB1サーバーをステートマシンとして実装し、クライアントの要求を正しく受け入れて応答することでクライアントを欺き、NTLM認証を完了させて、自身のNTLMv2ハッシュ(hashcat/johnと互換性のある形式)を漏えいさせることです。
このツールは、攻撃的セキュリティ/レッドチーム活動および教育目的(SMB1/NTLMプロトコルの研究)を意図しており、所有する環境または明示的な同意を得た環境でのみ使用してください。
このサーバーは正規のSMB1サーバーを装い、クライアントを3フェーズのステートマシンで誘導します:

| 状態 | 遷移 |
|---|---|
1. NEGOTIATE | SMB NEGOTIATEが到着すると、サーバーの応答に続いて状態は2. CHALLENGEへ移行します |
2. CHALLENGE | NTLM_NEGOTIATEが到着すると、サーバーの応答に続いて状態は3. AUTHへ移行します |
3. AUTH | NTLM_AUTHが到着すると、サーバーの応答に続いて状態は1. NEGOTIATEへ戻ります |
実装レベルでは、4バイトからなる外側のNetBIOS「エンベロープ」を考慮する必要があります。最後の3バイトはSMBパケットの長さをバイト単位で示します。
各クライアント接続は、ステートマシンの状態に加えて以下を保持する状態構造体(server.h内のclient_t)を介して追跡されます:
rx_buf)とその長さ。ソケットから読み取られたがまだ完全に処理されていないデータをバッファリングします;tx_buf、オフセットtx_off付き)。クライアントに送信されるがまだ完全に送信されていないデータをバッファリングします;netbios_header_recvおよびnetbios_msg_lenフィールド。データを受信すると、少なくとも4バイト(NetBIOSヘッダー)が受信されたことが確認され、SMBメッセージの長さが決定され、状態フィールドが更新され、最後にメッセージが処理されて、次の受信に備えてクライアントの状態が更新されます。
サーバーのメインループはpoll()に基づいており、複数の接続をノンブロッキング方式で同時に処理します:

NTLM認証が完了すると、サーバーはユーザー名、ホスト名、ドメイン、およびキャプチャされたNTLMv2ハッシュを画面に([INTERCEPTED] ...)次の形式で出力します:
username::domain:server_challenge:ntlmv2_response:blob
hashcat(モード-m 5600)やjohnなどのクラッキングツールですぐに使用できます。
gcc/clang)とPOSIXツールチェーン(コードはBSDソケット、poll()、signal()などを使用するため、Linux/Unix系環境を対象としています)。Makefileが含まれています:
make # メインサーバーをビルド -> ./impostor
make debug # デバッグビルド(シンボル、-O0、AddressSanitizer/UBSan)
make clean # 生成されたオブジェクトファイルと実行可能ファイルを削除
make run # サーバーをビルドして実行
あるいは、同等の手動コンパイルコマンドは次のとおりです:
gcc -o impostor server.c smb1_parser.c spnego_decoder.c asn1_parser.c ntlm_parser.c
./impostor [port]
port(オプション):サーバーがリッスンするTCPポート。省略した場合、server.hで定義されたデフォルトポート(SERVER_PORT、9000)が使用されます。1〜65535の値である必要があります。起動時に、サーバーはバナー、バージョン、および設定情報(ポート、最大クライアント数)を出力し、その後接続を待ち受けます。NTLMv2ハッシュがキャプチャされると、傍受されたデータ(ユーザー名、ホスト名、ドメイン、ハッシュ)が画面に出力されます。サーバーはintHandlerによって処理されるCtrl+C(SIGINT)で停止できます。
___ ___ _ ___
|_ _|_ __ ___ _ __ / _ \ ___| |_ / _ \ _ __
| || '_ ` _ \| '_ \| | | / __| __| | | | '__|
| || | | | | | |_) | |_| \__ \ |_| |_| | |
|___|_| |_| |_| .__/ \___/|___/\__|\___/|_|
|_| (v.1.0) by Lcky
[*] Version: 1.0
[*] Author: Lcky <luca9vinci at gmail dot com>
[*] Server Info
Port: 9090
Max Clients: 50
[*] Listening on port 9090
[*] Waiting for connections...
[INTERCEPTED] Username: test
[INTERCEPTED] Hostname: KALILINUX-2023-02
[INTERCEPTED] Domain : WORKGROUP
[INTERCEPTED] Hash : test::WORKGROUP:c4ba87a265de9e09:3482d0efa64fc09a94e44faa83d2a936:01010000000000009A3DE84B6235DD01D36FD06DFF4D64BB000000000200080038004E004900490001001E00570049004E002D00310046005800340055004D005000530034005400420004003400570049004E002D00310046005800340055004D00500053003400540042002E0038004E00490049002E004C004F00430041004C000300140038004E00490049002E004C004F00430041004C000500140038004E00490049002E004C004F00430041004C0008003000300000000000000000000000000000000CAFEB574B56CB6139E261228FBFE3075B4FA9393A3B71031AF3280F4D5A27D00A0010000000000000000000000000000000000009001C0063006900660073002F003100320037002E0030002E0030002E00310000000000
^C
[*] Stopping the server...
| ファイル | 説明 |
|---|
server.c / server.h | エントリーポイント、TCPリスナー設定、クライアントステートマシン、poll()ベースのメインループ、RX/TXバッファリング、傍受したハッシュの出力 |
smb1_parser.c / smb1_parser.h | SMB1パケットの解析/構築(ヘッダー、NEGOTIATE、SESSION_SETUPコマンド、フラグ/flags2など) |
spnego_decoder.c / spnego_decoder.h | SMBメッセージに含まれるSPNEGOトークン(認証メカニズムのネゴシエーション、NTLMSSPブロブの抽出)のデコード |
asn1_parser.c / asn1_parser.h | SPNEGOデコーダーがASN.1構造ツリーを構築するために使用する最小限のASN.1 DERパーサー |
ntlm_parser.c / ntlm_parser.h | NTLMSSPメッセージ(NEGOTIATE、CHALLENGE、AUTHENTICATE)の解析と、ユーザー名、ドメイン、ホスト名、NTLMv2応答の抽出 |
endianness.h | エンディアン処理用ユーティリティ(実行時のリトル/ビッグエンディアン変換) |
test.c、test2.c | パーサー用のテスト/実験ファイル |
docs/ | 図と補助資料(ステートマシン図、メインループ) |