
あなたのCOMハイジャックの共犯者
著者: David Tulis (@kafkaesqu3)
このリポジトリには、COMハイジャックを調査するためのコードサンプルと概念実証(PoC)が含まれています。COMハイジャックは、永続化や防御回避に使用できるWindowsの侵害後(post exploitation)テクニックです。
COMインターフェースの詳細、ハイジャックの見つけ方、およびハイジャックを悪用するテクニックについては、Derbycon 9で行われたプレゼンテーション『COM Hijacking Techniques』を参照してください。
Extract-HijackableKeysFromProcmonCSV: ProcmonのCSVエクスポートを解析してハイジャック可能なオブジェクトを抽出するHijack-CLSID: 指定したDLLでCLSIDをハイジャックするHijack-MultipleKeys: 指定したDLLで複数のCLSIDを同時にハイジャックする。頻繁にアクティブ化されるCLSIDを見つけるのに有用CreateProcess で新しいプロセスを作成するCreateRemoteThread で既存のプロセスにインジェクションするCreateThread を使用して現在のプロセス内のスレッドの生存時間を測定するCOMハイジャックを処理するためのヘルパースクリプトを含むPowershellスクリプト。主な機能:
すべてのCOMオブジェクトのCLSIDと、ディスク上の実装の場所を表示する
$keys = Get-CLSIDRegistryKeys -RegHive HKCR
$results = $keys | % {$guid = Extract-GUIDFromText $_; Map-GUIDToDLL -guid $guid 2> $null }
システム上のCLSIDの調査を実施する
$HKCR_keys = Get-CLSIDRegistryKeys -RegHive HKCR
$HKCR_keys | where-object {$_ -like "*inprocserver"} | Measure-Object
$HKCR_keys | where-object {$_ -like "*inprocserver32"} | Measure-Object
$HKCR_keys | where-object {$_ -like "*localserver"} | Measure-Object
$HKCR_keys | where-object {$_ -like "*localserver32"} | Measure-Object
$HKLM_keys = Get-CLSIDRegistryKeys -RegHive HKLM
$HKLM_keys | Measure-Object
$HKCU_keys = Get-CLSIDRegistryKeys -RegHive HKCU
$HKCU_keys | Measure-Object
explorer:{69486DD6-C19F-42e8-B508-A53F9F8E67B8}
explorer:{9E175B6D-F52A-11D8-B9A5-505054503030}
explorer:{30CC9D06-7E62-4966-9777-BC3442E788BD}
explorer:{3eef301f-b596-4c0b-bd92-013beafce793}
explorer:{682159d9-c321-47ca-b3f1-30e36b2ec8b9}
explorer:{6B3B8D23-FA8D-40B9-8DBD-B950333E2C52}
explorer:{9aa46009-3ce0-458a-a354-715610a075e6}
explorer:{9BA05972-F6A8-11CF-A442-00A0C90A8F39}
explorer:{AC36A05C-FB95-4C7A-868C-A43CC8D2D926}
explorer:{B52D54BB-4818-4EB9-AA80-F9EACD371DF8}
explorer:{c2f03a33-21f5-47fa-b4bb-156362a2f239}
システム上に存在しないDLLを参照するCLSIDを見つける:
Find-MissingLibraries
Derbycon 9のプレゼンテーションで実演された、COMハイジャック悪用のための3つの概念実証テンプレート:
HijackDLL-Process: DLLが読み込まれたときに新しいプロセスを作成するHijackDLL-CreateRemoteThread: DLLが読み込まれたときにCreateRemoteThread API呼び出しを使用してスレッドインジェクションテクニックを実行するHijackDLL-Threads: ハイジャック後にDLL内で開始されたスレッドの生存時間を測定するのに便利COMハイジャックをプロセスインジェクションに使用できることを示す概念実証:
最初のステップは、ハイジャックを実行することです:
COMInjectDotNet.exe chrome.exe C:\COM\COMInjectTarget.dll
ハイジャックはすぐには発動せず、アプリケーションの起動(まだ実行されていない場合)や基本的なアプリケーション操作が必要になる場合があります。おそらく、より頻繁に発動する、より良いCLSIDも存在しますが、これらで十分です。
COMInjectTarget.dll は、C:\COM 内のログファイルに進行状況を記録します。これは、別のプロセス内から AllocConsole のようなものを使って単にコンソールに出力するよりも安定しているようです。
以下は、メインの chrome.exe プロセス内で実行されているインジェクションされたDLLを示しています:
[*] chrome pid=9104 ppid=4900 (count 0)
[*] chrome pid=9104 ppid=4900 (count 1)
[*] chrome pid=9104 ppid=4900 (count 2)
[*] chrome pid=9104 ppid=4900 (count 3)
[*] chrome pid=9104 ppid=4900 (count 4)
[*] chrome pid=9104 ppid=4900 (count 5)
現在サポートされているプロセスは次のとおりです:
COMとCOMハイジャックの詳細については: