
Cobalt Strike の回避機能を再現・統合・強化することを目的とした、概念実証用の Cobalt Strike Reflective Loader です!

Cobalt Strikeのエイベージョン機能を再現、統合、強化することを目的とした、概念実証(PoC)のユーザー定義リフレクティブローダー(UDRL)です。
| 貢献者 | 主な貢献 | |
|---|---|---|
| Bobby Cooke | @0xBoku | プロジェクトの原作者およびメンテナー |
| Santiago Pecin | @s4ntiago_p | リフレクティブローダーの主要な拡張 |
| Chris Spehn | @ConsciousHacker | Aggressorスクリプティング |
| Joshua Magri | @passthehashbrwn | IATフッキング |
| Dylan Tran | @d_tranman | リフレクティブコールスタックスプーフィング |
| James Yeung | @5cript1diot | 間接システムコール |
組み込みのCobalt Strikeリフレクティブローダーは堅牢で、Cobalt Strikeが提供するすべてのMalleable PEエイベージョン機能を処理できます。カスタムUDRLを使用する際の主な欠点は、Malleable PEエイベージョン機能が標準ではサポートされていない場合があることです。
公開されているBokuLoaderプロジェクトの目的は、レッドチームが独自の社内Cobalt Strike UDRLを作成する際の支援です。このプロジェクトは、価値のあるCS Malleable PEエイベージョン機能をすべてサポートすることを目指しています。一部のエイベージョン機能はCS統合を活用し、別の機能は完全に再現され、一部はサポートされていません。
このプロジェクトをいかなる形であれ使用する前に、エイベージョン機能が意図どおりに動作するか適切にテストしてください。CコードとAggressorスクリプトの間では、オペレーティングシステム、コンパイラ、Javaのバージョンが異なると、コンパイル結果が異なる場合があります。
NtProtectVirtualMemoryへの間接システムコールを介して行われます。obfuscate "true"0x1000バイトはヌルになります。XGetProcAddress
Kernel32.GetProcAddressは使用しません。xLoadLibrary
TEB->PEB->PEB_LDR_DATA->InMemoryOrderModuleListからDLLのベースアドレスを取得します。Kernel32.LoadLibraryAは使用しません。makeを使用してBokuLoaderオブジェクトファイルをコンパイルします。BokuLoader.cna Aggressorスクリプトをインポートします。Script Consoleを使用して、BokuLoaderがビーコンビルドに実装されていることを確認します。RAWビーコンの生成はそのまま動作します。ビーコローダーにArtifact Kitを使用する場合、stagesize変数はデフォルトより大きくする必要があります。
| 元のCobalt Strike文字列 | BokuLoaderのCobalt Strike文字列 |
|---|---|
| ReflectiveLoader | BokuLoader |
| Microsoft Base Cryptographic Provider v1.0 | 12367321236742382543232341241261363163151d |
| (admin) | (tomin) |
| beacon | bacons |
Kernel32.LoadLibraryExAが呼び出されます。Kernel32.LoadLibraryExAの第3引数はDONT_RESOLVE_DLL_REFERENCES (0x00000001)です。
RXまたはRWXメモリがヒープ内に存在します。Kernel32.CreateFileMappingAおよびKernel32.MapViewOfFileが呼び出されます。NtAllocateVirtualMemory、NtProtectVirtualMemoryntdll.dllにユーザーランドフックを設定しても、これらのシステムコールは検知できません。mov eax, r11d; mov r11, r10; mov r10, rcx; jmp r11というアセンブリ命令が含まれます。0x1000バイトはゼロです。| コマンド | オプション | サポート状況 |
|---|
allocator | HeapAlloc, MapViewOfFile, VirtualAlloc | すべてBokuLoader実装でサポート |
module_x64 | string (DLL Name) | BokuLoader実装でサポート。CS実装と同じDLLスタンピング要件が適用されます |
obfuscate | true/false | HTTP/SビーコンはBokuLoader実装でサポート。SMB/TCPは現在、obfuscate trueではサポートされていません。詳細はissueを参照。修正できる方は協力歓迎です :) |
entry_point | RVA as decimal number | BokuLoader実装でサポート |
cleanup | true | CS統合でサポート |
userwx | true/false | BokuLoader実装でサポート |
sleep_mask | (true/false) or (Sleepmask Kit+true) | サポート。デフォルトの"sleepmask true"(sleepmaskキットなし)を使用する場合は"userwx true"を設定してください。RX beacon.textメモリ(src47/Ekko)をサポートするsleepmaskキットを使用する場合は、"sleepmask true" && "userwx false"を設定してください。 |
magic_mz_x64 | 4 char string | CS統合でサポート |
magic_pe | 2 char string | CS統合でサポート |
transform-x64 prepend | escaped hex string | BokuLoader.cna Aggressorスクリプトの変更 |
transform-x64 strrep | string string | BokuLoader.cna Aggressorスクリプトの変更 |
stomppe | true/false | 非サポート。BokuLoaderはbeacon DLLのヘッダーをコピーしません。仮想beacon DLLの最初の0x1000バイトは0x00です。 |
checksum | number | 実験的。BokuLoader.cna Aggressorスクリプトの変更 |
compile_time | date-time string | 実験的。BokuLoader.cna Aggressorスクリプトの変更 |
image_size_x64 | decimal value | 非サポート |
name | string | 実験的。BokuLoader.cna Aggressorスクリプトの変更 |
rich_header | escaped hex string | 実験的。BokuLoader.cna Aggressorスクリプトの変更 |
stringw | string | 非サポート |
string | string | 非サポート |