
Spartacus DLL/COM ハイジャッキングツールキット
[!CAUTION]
このリポジトリはメンテナンスされていません。最新バージョンについては https://github.com/sadreck/Spartacus をご覧ください。
1960年の映画『スパルタカス』をご覧になったことがあれば、ローマ人がスパルタカスに出頭するよう要求する場面を覚えているでしょう。本物のスパルタカスが立ち上がった瞬間、他の多くの人々も立ち上がり、「私はスパルタカスだ」と名乗り出ました。
DLLハイジャックに対して脆弱なプロセスがDLLの読み込みを要求するとき、それは「VERSION.DLLは誰だ?」と尋ねているようなもので、ランダムなディレクトリが「私がVERSION.DLLだ」「いいえ、私がVERSION.DLLだ」と主張し始めます。そしてそれがSpartacusです。
DllMainからすべてを実行する代わりに、個別にプロキシされた関数を介してペイロードを実行できます。この手法は、https://www.redteam.cafe/red-team/dll-sideloading/dll-sideloading-not-by-dllmain のShantanu Khandelwalによるウォークスルーに触発され実装されました。[防御] 実行中のアプリケーションが呼び出しをプロキシしている(「DLLハイジャック進行中」)ことを特定しようとする監視モード。これは簡単に見つかる脆弱性を拾うためのもので、これに依存すべきではありません。Spartacusの最新バージョンはReleasesから見つけてダウンロードしてください。あるいは、単にこのリポジトリをクローンしてソースからビルドしてください。
以下は、Spartacusがサポートする各モードの説明です。
注: v1からv2でコマンドライン引数が大幅に変更されました。
Spartacusの本来の機能は、DLLハイジャック脆弱性を見つけることだけでした。動作方法は以下の通りです。
CreateFile。.dll で終わる。procmon.exe または procmon64.exe ではない。Drop Filtered Events を有効化。Auto Scroll を無効化。ENTER を押すまで停止します。ENTER を押すと Process Monitor を終了します。すべてのイベントを収集し、C:\Data\logs.pml に保存します。脆弱なDLLは C:\Data\VulnerableDLLFiles.csv に、プロキシDLLソリューションは C:\Data\Solutions に保存されます。
--mode dll --procmon C:\SysInternals\Procmon.exe --pml C:\Data\logs.pml --csv C:\Data\VulnerableDLLFiles.csv --solution C:\Data\Solutions --verbose
既存のPMLイベントログ出力を解析し、CSVに出力し、プロキシVisual Studioソリューションを生成します。
--mode dll --existing --pml C:\MyData\SomeBackup.pml --csv C:\Data\VulnerableDLLFiles.csv --solution C:\Data\Solutions --verbose


Spartacusの新機能として、ローカルCOMハイジャック脆弱性を特定することができます。動作方法は以下の通りです。
RegOpenKey。procmon.exe または procmon64.exe ではない。Drop Filtered Events を有効化。Auto Scroll を無効化。ENTER を押すまで停止します。ENTER を押すと Process Monitor を終了します。InprocServer32 で結果が NAME_NOT_FOUND のすべての欠落したレジストリキーを特定します。HKEY_CURRENT_USER の下にある場合、HKEY_CLASSES_ROOT の下でそのGUIDを検索し、見つかった場合はその詳細をエクスポートCSVに含めます。proxy モードを使用できます。COMハイジャックでは、Spartacusはローカルシステムの誤設定されたCOMエントリのスキャンもサポートしています。
HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE のすべてを列挙します。InProcServer、InProcServer32、LocalServer、または LocalServer32 と呼ばれるレジストリキーを探します。すべてのイベントを収集し、C:\Data\logs.pml に保存します。脆弱なCOM情報は C:\Data\VulnerableCOM.csv に保存されます。
--mode com --procmon C:\SysInternals\Procmon.exe --pml C:\Data\logs.pml --csv C:\Data\VulnerableCOM.csv --verbose
既存のPMLファイルを処理して脆弱なCOMエントリを特定します。
--mode com --existing --pml C:\Data\logs.pml --csv C:\Data\VulnerableCOM.csv --verbose
ローカルシステムのレジストリを列挙して、欠落または誤設定されたCOMライブラリと実行可能ファイルを特定します。
--mode com --acl --csv C:\Data\VulnerableCOM.csv --verbose


Spartacusは、悪用したいDLLに基づいてスケルトンプロジェクトを作成し、Visual Studioソリューションを生成することをサポートしています。
DllMain 関数からペイロードを実行する必要があります。DllMain 以外の関数からペイロードを実行できます。version.dll を悪用する場合、脆弱なアプリケーションによって呼び出される GetFileVersionInfoExW からインプラントを実行できます。すべてのエクスポートをリダイレクトするソリューションを生成します(関数プロキシなし)。
--mode proxy --dll C:\Windows\System32\version.dll --solution "C:\data\tmp\refactor-version" --overwrite --verbose --external-resources
複数のDLLを同時に入力することも可能です。
--mode proxy --dll C:\Windows\System32\version.dll --dll C:\Windows\System32\userenv.dll --solution "C:\data\tmp\dll-collection" --overwrite --verbose --external-resources
可能な限り多くの関数のプロキシを作成します(Ghidraの出力に基づく)。
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose
上記と同じですが、外部アセットファイルを使用してソリューションを生成します(変更が必要な場合)。
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose --external-resources
Ghidraが関数定義を抽出できなかった関数のために、事前に生成された関数プロトタイプを利用します。
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\userenv.dll --solution C:\Projects\spartacus-userenv --overwrite --verbose --external-resources --prototypes C:\data\prototypes.csv
GetFileVersionInfoExW と GetFileVersionInfoExA 関数のみのプロキシを生成します。
--mode proxy --ghidra C:\ghidra\support\analyzeHeadless.bat --dll C:\Windows\System32\version.dll --solution C:\Projects\spartacus-version --verbose --overwrite --external-resources --only "GetFileVersionInfoExW, GetFileVersionInfoExA"
既存の *.h ファイルから関数プロトタイプデータベースを生成し、Ghidraが関数定義を抽出できなかった関数のプロキシ生成を支援します。
--mode proxy --action prototypes --path "C:\Program Files (x86)\Windows Kits" --csv C:\data\prototypes.csv --verbose
DLLのエクスポートを一覧表示し、各関数に事前に生成されたプロトタイプがあるかどうかを確認します。
--mode proxy --action exports --dll C:\Windows\System32\version.dll --dll C:\Windows\System32\amsi.dll --prototypes ./Assets/prototypes.csv
Spartacusは現在、自己署名証明書の生成(既存ファイルから属性をコピーしながら)とDLLファイルへの署名をサポートしています。
C:\Windows\System32\version.dll(署名済みDLLである必要があります)のプロパティを使用して署名証明書を作成します。
--mode sign --action generate --pfx "C:\Output\certificate.pfx" --password "Welcome1" --not-before "2022-12-31 00:00:55" --not-after "2026-01-01 00:00:01" --copy-from C:\Windows\System32\version.dll --verbose
既存または生成された証明書を使用してDLLに署名します。
--mode sign --action sign --pfx "C:\Output\certificate.pfx" --password "Welcome1" --path "C:\Input\MyFakeVersion.dll" --algorithm SHA256 --verbose
Spartacusには --detect モードもあり、アクティブなDLLプロキシを特定しようとします。その背後にあるロジックは次の通りです。
この機能を使用するには、Spartacusを --detect で実行するだけです。
Spartacusは --sign モードをサポートしており、自己署名証明書の生成と、それを使用してコンパイル済みDLLに署名することができます。
既存のファイルから発行者/件名をコピーして自己署名証明書を生成します。
--mode sign --action generate --pfx "C:\Output\myCertificate.pfx" --password "Welcome1" --not-before "2023-01-01 00:00:04" --not-after "2025-01-01 00:00:42" --copy-from C:\Windows\System32\version.dll --verbose
その証明書を使用してコンパイル済みファイルに署名します。
--mode sign --action sign --pfx "C:\Output\myCertificate.pfx" --password "Welcome1" --path "C:\Projects\Spartacus-AMSI\amsi.dll" --algorithm SHA256 --verbose
作業を簡単にするために、CommandLineGenerator.html を使用してください。
誤字、バグ、新機能など、Spartacusへのコントリビューションは大歓迎ですが、以下の点に同意いただく必要があります。
| Mode | Argument | Description |
|---|
--mode | 使用するモードを定義します。dll、proxy、com、detect のいずれか。 | |
all | --verbose | 詳細出力を有効にします。 |
all | --debug | デバッグ出力を有効にします。 |
all | --external-resources | デフォルトでは、SpartacusはVSソリューションファイルなどを生成するために埋め込みリソースを使用します。テンプレートを変更する必要がある場合は、この引数を使用してSpartacusに ./Assets フォルダからすべてのファイルをロードさせます。 |
dll, com | --procmon | SysInternals Process Monitorの procmon.exe または procmon64.exe の場所(ファイル) |
dll, com | --pml | ProcMonイベントログファイルを保存する場所(ファイル)。ファイルが存在する場合は上書きされます。--existing と一緒に使用すると、読み取るイベントログファイルを指定し、上書きされません。 |
dll, com | --pmc | カスタムProcMon(PMC)ファイルを定義します。このファイルは変更されず、そのまま使用されます。 |
dll, com | --csv | 実行結果のCSV出力を保存する場所(ファイル)。 |
dll, proxy | --solution | プロキシDLLのソリューションが保存されるディレクトリへのパス。 |
dll, com | --existing | Spartacusが既存のProcMonイベントログファイル(PML)を処理することを示すスイッチ。イベントログファイルを指定するには --pml を使用します。ProcMonを何時間も実行したり、ブートログで使用した場合に便利です。 |
dll | --all | デフォルトでは、WindowsまたはProgram Filesディレクトリ内のDLLはスキップされます。これを使用して、出力にそれらのディレクトリを含めます。 |
proxy | --ghidra | Ghidraの 'analyzeHeadless.bat' ファイルへのパス。DllMain だけでなく特定の関数をプロキシしたい場合に使用します。 |
proxy | --dll | プロキシしたいDLLへのパス。この引数は複数指定できます。また、C:\Windows\System32\*.dll のようなワイルドカードも使用できますが、すべてのパスは *.dll で終わる必要があります。 |
proxy, sign | --overwrite | --solution(proxy)または --pfx(sign)ファイルが既に存在する場合、このフラグを使用して上書きします。 |
proxy | --only | この変数で定義された関数のみのプロキシ関数を生成します。値はカンマ区切りで、例:'WTSFreeMemory,WTSFreeMemoryExA,WTSSetUserConfigA'。 |
proxy | --action | デフォルトのアクションはVSソリューションの生成です。--action prototypes はWindows SDKフォルダを入力として受け取り、*.h ファイルを解析して関数プロトタイプのデータベースを生成します。--action exports はDLLのエクスポート関数を表示し、--prototypes と組み合わせると関数定義が事前に生成されているかどうかを表示します。 |
sign | --action | sign モジュールで --action を使用する場合、PFXを作成する generate とファイルに署名する sign の2つのオプションのいずれかになります。 |
proxy | --path | 現在は --action prototypes でのみ機能し、Windows SDKディレクトリの場所です。 |
proxy | --prototypes | prototypes.csvの場所(現在は ./Assets フォルダ内)。 |
com | --acl | ローカルシステムの欠落または誤設定されたCOMライブラリと実行可能ファイルを列挙します。 |
sign | --subject | --action generate と一緒に使用し、証明書のサブジェクトを指定します。 |
sign | --issuer | --action generate と一緒に使用し、証明書の発行者を指定します。 |
sign | --copy-from | --action generate と一緒に使用し、発行者とサブジェクトをコピーする既存の署名付きファイルを指定します。 |
sign | --not-before | --action generate と一緒に使用し、新しい証明書が有効になる開始日時を定義します。形式は YYYY-MM-DD HH:MM:SS。 |
sign | --not-after | --action generate と一緒に使用し、新しい証明書が有効になる終了日時を定義します。形式は YYYY-MM-DD HH:MM:SS。 |
sign | --pfx | --action generate と一緒に使用すると、pfxファイルの保存先を指定します。--action sign と一緒に使用すると、pfxファイルの読み込み元を指定します。 |
sign | --password | --action generate と一緒に使用すると、--pfx ファイルのパスワードを定義します。 |
sign | --path | --action sign と一緒に使用すると、署名する実行可能ファイル/DLLファイルの場所を定義します。 |
sign | --algorithm | --action sign と一緒に使用すると、署名に使用するハッシュアルゴリズムを定義します。オプション: MD5、SHA1、SHA256、SHA384、SHA512。 |
sign | --timestamp | --action sign と一緒に使用すると、タイムスタンプサーバー(例:http://timestamp.sectigo.com または http://timestamp.digicert.com)を定義します。 |