SpeechRuntimeMove
SpeechRuntimeのDCOMトリガーとCOMハイジャックによるラテラルムーブメント。
このラテラルムーブメントの概念実証(PoC)は、INTERACTIVE USERとして構成されている一部のCOMクラスが、現在ログオンしているユーザーのセッションコンテキストでプロセスを起動するという事実を悪用します。
それらのプロセスがCOMハイジャックにも脆弱である場合、リモートレジストリ経由でCOMハイジャックを設定し、SMB経由で悪意のあるDLLを配置し、DCOMを介してこのDLLの読み込み/実行をトリガーできます。
この手法により、システムを乗っ取る必要がなくなり、その後に以下を行う必要もなくなります:
- ターゲットユーザーになりすます
- LSASSまたは他の場所からターゲットユーザーの資格情報を窃取する
- または別の手法でアカウントを乗っ取る
私たちのコードはすでにログオン中ユーザーのコンテキストで実行されているため、そのコンテキスト内で好きなことができ、代替手法に比べてIoCを減らせます。
このPoCでは、CLSID 38FE8DFE-B129-452B-A215-119382B89E3D(Speech Named Pipe COM)をIID ISpeechNamedPipeとともに使用します。Speech Named Pipe COMクラスのインスタンスが作成されるたびにSpeechRuntime.exeが起動されますが、これはCOMハイジャックに脆弱です:

CLSID 655D9BF9-3876-43D0-B6E8-C83C1224154C(および他にも多数)はHKCU配下で検索されますが、これはリモートからハイジャック可能です。
列挙モード
リモートクライアント上でどのユーザーがアクティブかを調べるには、次のように列挙モードを使用できます:
SpeechRuntimeMove.exe mode=enum target=<targetHost>
攻撃モード
リモートシステム上で実際にコードを実行するには、ターゲットのユーザー名、セッション番号、DLLの配置パス、および実行するコマンドを指定する必要があります:
SpeechRuntimeMove.exe mode=attack target=<targetHost> dllpath=C:\windows\temp\pwned.dll session=2 targetuser=local\domadm command="cmd.exe /C calc.exe"
OpSec上の考慮事項/検知
このPoCはハードコードされたDLLを使用しており、常に同じ見た目で、ターゲットに配置されます。このDLLに対する検知は非常に容易なため、自作DLLを使用したほうが検知されにくくなります。カスタムDLLを使えば、新しいプロセスを起動するのではなく、信頼された署名済みプロセス内で動作することにもなり、これは通常攻撃者が好む点です。
この手法の振る舞いベースの検知は、以下を確認することで行えます
- 前述のCLSIDに対するリモートCOMハイジャックが行われ、その後に
SpeechRuntime.exeがハイジャック先の場所から新たに配置されたDLLを読み込むSpeechRuntime.exeが不審なサブプロセスを生成する