
Herramientas para el descubrimiento y abuso de secuestros COM
Tu cómplice en el secuestro de COM
Autor: David Tulis (@kafkaesqu3)
Este repositorio contiene ejemplos de código y pruebas de concepto para explorar el secuestro de COM. El secuestro de COM es una técnica de post-explotación de Windows que puede utilizarse para la persistencia o la evasión de defensas.
Para obtener más información sobre la interfaz COM, cómo encontrar secuestros y las técnicas para abusar de un secuestro, consulte la presentación realizada en Derbycon 9, COM Hijacking Techniques.
Extract-HijackableKeysFromProcmonCSV: analiza una exportación CSV de Procmon en busca de
objetos secuestrablesHijack-CLSID: Secuestra un CLSID con una DLL determinadaHijack-MultipleKeys: Secuestra varios CLSID simultáneamente con una
DLL determinada. Esto es útil para encontrar CLSID
que se activan con frecuenciaCreateProcessCreateRemoteThreadCreateThreadScript de PowerShell que contiene scripts auxiliares para tratar con secuestros de COM. Puntos destacados:
Muestra todos los CLSID de objetos COM y la ubicación de la implementación en disco
$keys = Get-CLSIDRegistryKeys -RegHive HKCR
$results = $keys | % {$guid = Extract-GUIDFromText $_; Map-GUIDToDLL -guid $guid 2> $null }
Realiza un inventario de los CLSID de un sistema
$HKCR_keys = Get-CLSIDRegistryKeys -RegHive HKCR
$HKCR_keys | where-object {$_ -like "*inprocserver"} | Measure-Object
$HKCR_keys | where-object {$_ -like "*inprocserver32"} | Measure-Object
$HKCR_keys | where-object {$_ -like "*localserver"} | Measure-Object
$HKCR_keys | where-object {$_ -like "*localserver32"} | Measure-Object
$HKLM_keys = Get-CLSIDRegistryKeys -RegHive HKLM
$HKLM_keys | Measure-Object
$HKCU_keys = Get-CLSIDRegistryKeys -RegHive HKCU
$HKCU_keys | Measure-Object
explorer:{69486DD6-C19F-42e8-B508-A53F9F8E67B8}
explorer:{9E175B6D-F52A-11D8-B9A5-505054503030}
explorer:{30CC9D06-7E62-4966-9777-BC3442E788BD}
explorer:{3eef301f-b596-4c0b-bd92-013beafce793}
explorer:{682159d9-c321-47ca-b3f1-30e36b2ec8b9}
explorer:{6B3B8D23-FA8D-40B9-8DBD-B950333E2C52}
explorer:{9aa46009-3ce0-458a-a354-715610a075e6}
explorer:{9BA05972-F6A8-11CF-A442-00A0C90A8F39}
explorer:{AC36A05C-FB95-4C7A-868C-A43CC8D2D926}
explorer:{B52D54BB-4818-4EB9-AA80-F9EACD371DF8}
explorer:{c2f03a33-21f5-47fa-b4bb-156362a2f239}
Encuentra CLSID que hagan referencia a una DLL que no existe en el sistema:
Find-MissingLibraries
3 plantillas de prueba de concepto para el abuso del secuestro de COM, como se demostró en la presentación de Derbycon 9:
HijackDLL-Process: Crea un nuevo proceso cuando se carga la DLLHijackDLL-CreateRemoteThread: Realiza la técnica de inyección de hilos
mediante la llamada a la API CreateRemoteThread
cuando se carga la DLLHijackDLL-Threads: Útil para medir la vida útil de los hilos iniciados en la
DLL después de un secuestroPrueba de concepto que muestra cómo el secuestro de COM puede utilizarse para inyecciones de procesos:
El primer paso es realizar el secuestro:
COMInjectDotNet.exe chrome.exe C:\COM\COMInjectTarget.dll
El secuestro no se activará de inmediato y puede requerir que la aplicación se inicie (si no está en ejecución) o algunas acciones básicas en la aplicación. Es probable que existan mejores CLSID que se activen con más frecuencia, pero estos son suficientes.
La COMInjectTarget.dll registrará su progreso en un archivo de registro en C:\COM. Esto
parece más estable que usar algo como AllocConsole desde otro proceso e
imprimir simplemente en la consola.
Lo siguiente muestra la DLL inyectada ejecutándose dentro del proceso principal
chrome.exe:
[*] chrome pid=9104 ppid=4900 (count 0)
[*] chrome pid=9104 ppid=4900 (count 1)
[*] chrome pid=9104 ppid=4900 (count 2)
[*] chrome pid=9104 ppid=4900 (count 3)
[*] chrome pid=9104 ppid=4900 (count 4)
[*] chrome pid=9104 ppid=4900 (count 5)
Los procesos actualmente compatibles son:
Para obtener más información sobre COM y los secuestros de COM: