
C/C++で再作成されたEternalBlueスイート。これには以下が含まれます:MS17-010 Exploit、EternalBlue脆弱性検出器、DoublePulsar検出器、DoublePulsar Shellcode & DLLアップローダー
EternalBlueスイートをC/C++で再実装。以下を含む:



Recvbuff[18] から Recvbuff[22] までのこれらの値は、DoublePulsar XOR キー計算関数に入力され、DoublePulsar にアップロードするシェルコードまたは DLL ペイロードを暗号化するために使用できる unsigned int XOR キーが生成されます。Windows 7 x64 でテスト済み。
サンプルスクリーンショット:

FUZZBUNCH の元の NSA バイナリと同じキー

DoublePulsar_structure_ping.cpp - このプログラムは4つの SMB パケットを送信します。1つのネゴシエーション、1つのセッションセットアップ、1つのツリーコネクト、および Trans2 SESSION_SETUP パケットです。doublepulsar_check.cpp との違いは、Wannacry サンプルから抽出したハードコードされた SMB 16進文字列ではなく、構造体を使用して Trans2 DoublePulsar PING パケットを生成することです。もう1つの違いは、Wannacry サンプルに含まれているハードコードされたものではなく、プログラムが動的に TreeConnect パケットを生成することです。このプログラムで生成された ping パケットは、リモートマシンに DoublePulsar がインストールされているかどうかを通知します。
DoublePulsar_structure_exec.cpp - このプログラムは5つの SMB パケットを送信します。1つの SMB ネゴシエーション、1つのセッションセットアップ、1つのツリーコネクト、1つの Doublepulsar Trans2 SESSION_SETUP Ping パケット、および1つの Doublepulsar Trans2 SESSION_SETUP 実行パケットです。Doublepulsar_UploadShellcode.cpp との違いは、Wannacry サンプルから抽出したハードコードされた SMB 16進文字列ではなく、構造体を使用して Trans2 DoublePulsar 実行パケットを生成することです。
Doublepulsar_UploadDLL.cpp - このプログラムは DLL を対象としています。このプログラムは4つの SMB パケットを送信し、SMB Trans2 パケット内に DLL データを含めます。1つのネゴシエーション、1つのセッションセットアップ、1つのツリーコネクト、1つの Ping Trans2 SESSION_SETUP 要求、および1つの実行 Trans2 SESSION_SETUP パケットです。Ping Trans2 SESSION_SETUP 要求パケットは、Trans2 SESSION_SETUP 応答パケット内の SMB 署名を取得するために送信されます。この署名は DoublePulsar XOR キー計算機で処理されます。プログラムは DLL ファイルを読み取り、それを64ビットカーネルおよびユーザーランドシェルコードと結合して DLL を実行し、バッファを SMB 署名から計算した DoublePulsar XOR キーで XOR します。メモリを割り当て、Trans2 パケットをコピーし、SMBトランザクションに必要な値(UserID、TreeID、TotalDataCount、DataCount、ByteCount)を編集し、XOR されたデータ(カーネルシェルコード + DLL)を末尾にコピーし、合計パケット長 4096 バイトずつ DoublePulsar にループ送信するパケットが生成されます。総パケット長 = 4178。4096 は XOR 暗号化データ用です。今後のリリースでは SMB & TRANSACTION2 構造体も実装予定です。
Doublepulsar_UploadShellcode.cpp - このプログラムは5つの SMB パケットを送信します。1つのネゴシエーション、1つのセッションセットアップ、1つのツリーコネクト、1つの Ping Trans2 SESSION_SETUP パケット、1つの実行 Trans2 SESSION_SETUP パケットです。Trans2 SESSION_SETUP 要求パケットは、TRANS2 SESSION_SETUP 応答パケット内の SMB 署名を取得するために送信されます。この署名は DoublePulsar XOR キー計算機で処理されます。プログラムはカーネルシェルコードとサンプルシェルコードをバッファにコピーし、SMB 署名から計算した DoublePulsar XOR キーでバッファを XOR します。メモリを割り当て、Trans2 実行パケットをコピーし、SMBトランザクションに必要な値(UserID、TreeID、TotalDataCount、DataCount、ByteCount)を編集し、SESSION_SETUP パラメータと4096バイトの XOR されたシェルコードデータを末尾にコピーし、合計パケット長 4178 バイトで DoublePulsar に送信します。総パケット長 = 4178。NetBIOS 長は4174になります(NetBIOS ヘッダーは自身をサイズに含めないため)。このパケットのうち12バイトは Doublepulsar SESSION_SETUP パラメータ用、4096 は XOR 暗号化データ用です。今後のリリースでは SMB & TRANSACTION2 構造体が使用される予定です。

Shellcode generated from - zerosum0x0 は ETERNALBLUE 用のカスタムシェルコードを作成し、DOUBLEPULSAR 用に小さな修正を加えて再利用できるようにしました。コピーされたシェルコード内の syscall 上書きはこのユースケースでは不要だったため、未定義にしました:
;%define SYSCALL_OVERWRITE ; to run at process IRQL in syscall
再コンパイル: nasm -w-other -o >(xxd -p -c 16 | sed 's/../\x&/g') external/source/shellcode/windows/multi_arch_kernel_queue_apc.asm
https://github.com/rapid7/metasploit-framework/blob/master/external/source/shellcode/windows/multi_arch_kernel_queue_apc.asm
https://raw.githubusercontent.com/ninp0/eternalblue/master/eternalblue_kshellcode_x64.asm
https://raw.githubusercontent.com/ninp0/eternalblue/master/eternalblue_kshellcode_x86.asm
https://www.rapid7.com/blog/post/2019/10/02/open-source-command-and-control-of-the-doublepulsar-implant/
DoublePulsar_UploadExe.cpp -
このプログラムは実行ファイルを対象としています。実行ファイルはメモリに読み込まれ、Wannacry ランチャー DLL に配置され、DoublePulsar 経由で送信されます。1つのネゴシエーション、1つのセッションセットアップ、1つのツリーコネクト、1つの Trans2 Ping パケット、および複数の Trans2 exec SESSION_SETUP パケットです。Trans2 Ping 要求パケットは、Trans2 応答パケット内の SMB 署名を取得するために送信されます。この署名は DoublePulsar XOR キー計算機で処理されます。その後、プログラムは EXE ファイルを読み取り、64ビットカーネルおよびユーザーランドシェルコードとスケルトン DLL ファイルと結合し、バッファを SMB 署名から計算した DoublePulsar XOR キーで XOR します。メモリを割り当て、Trans2 実行パケットをコピーし、SMBトランザクションに必要な値(UserID、TreeID、TotalDataCount、DataCount、ByteCount)を編集し、XOR されたデータ(カーネルシェルコード + DLL + 実行ファイル)を末尾にコピーし、合計パケット長 4096 バイトずつ DoublePulsar にループ送信するパケットが生成されます。総パケット長 = 4178。NetBIOS 長は4174になります(NetBIOS ヘッダーは自身をサイズに含めないため)。このパケットのうち12バイトは Doublepulsar SESSION_SETUP パラメータ用、4096 は XOR 暗号化データ用です。
EternalBlue.cpp - このプログラムは複数の SMB パケットを送信します。ネゴシエーション、SessionSetup、TreeConnect、および複数の NT trans および Trans2 パケットです。これらの NT trans パケットは不正な形式であり、被害者コンピュータのメモリ内でエクスプロイトを準備します。より多くの空白または空の SMB パケットが、被害者の同じポート上の複数のソケットを介して被害者に送信されます。EternalBlue の base64 ペイロードのほとんどは、ネゴシエーション、SessionSetup、TreeConnect パケットが送信されたソケット1を介して送信されます。その後、さらに20個のソケットが作成され、それらのソケット(ソケット3からソケット21)にデータが送信されます。その後、DoublePulsar がソケット3からソケット21に送信されます。プログラムによってソケットが閉じられ、被害者コンピュータ上で EternalBlue と DoublePulsar が起動されます。SMB 切断要求と SMB ログオフ要求が送信され、接続が閉じられます。このエクスプロイトは動作し、Windows 7 x64 でテスト済みです。バックドアが完全に動作可能になるまで約5秒かかりました(これはすでにインターネット上で EternalBlue のレポートで報告されています)。より多くのエクスプロイト試行が必要な場合があります。ただし、現在パケット内の TreeID と UserID が正しく設定されていないバグがあり、これは後のリリースで修正される予定です。このプログラムは、最近起動されたマシンに対しては、TreeID と UserID がデフォルト値に設定されているため動作します。これらのパケットは現在デフォルト値 "08 00" に設定されているため、TreeID と UserID の値を更新する必要があります。
Metasploit のオープンソース DoublePulsar RCE モジュールを使用して機能するカスタム Metasploit モジュールを作成しました。
ロジックを変更して、DLL を生成し、それを Wannacry から取得した x64 カーネルシェルコード(先頭に追加)とマージすることで、DoublePulsar が DLL を実行できるようにしました。

リポジトリには、教育目的で以下のコードも含まれていますが、私によるサポートは提供されません。
DoublePulsar x86/x64 DLL アップロード Python スクリプト
EternalBlue オールインワンバイナリ
マルチアーキテクチャカーネルキュー APC アセンブリコード & Windows x86/x64 マルチアーキテクチャカーネル Ring 0 から Ring 3 へのキュー APC カーネルコード
worawit による EternalBlue x64/x86 カーネルペイロードシェルコード
Eternalblue リプレイファイル


