
Ferramentas para descoberta e abuso de sequestros de COM
Seu cúmplice de sequestro de COM
Autor: David Tulis (@kafkaesqu3)
Este repositório contém exemplos de código e provas de conceito para explorar o sequestro de COM. O sequestro de COM é uma técnica de pós-exploração do Windows, que pode ser usada para persistência ou evasão de defesa.
Para mais informações sobre a interface COM, como encontrar sequestros e técnicas para abusar de um sequestro, consulte a apresentação feita na Derbycon 9, COM Hijacking Techniques.
Extract-HijackableKeysFromProcmonCSV: analisa uma exportação CSV do Procmon em busca de objetos sequestráveisHijack-CLSID: sequestra um CLSID com uma DLL fornecidaHijack-MultipleKeys: sequestra vários CLSIDs simultaneamente com uma DLL fornecida. Isso é útil para encontrar CLSIDs que são ativados com frequênciaCreateProcessCreateRemoteThreadCreateThreadScript do Powershell contendo scripts auxiliares para lidar com sequestros de COM. Destaques:
Mostra todos os CLSIDs de objetos COM e a localização da implementação no disco
$keys = Get-CLSIDRegistryKeys -RegHive HKCR
$results = $keys | % {$guid = Extract-GUIDFromText $_; Map-GUIDToDLL -guid $guid 2> $null }
Realiza um levantamento dos CLSIDs em um 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}
Encontra CLSIDs que referenciam uma DLL que não existe no sistema:
Find-MissingLibraries
3 modelos de prova de conceito para abuso de sequestro de COM, conforme demonstrado na apresentação da Derbycon 9:
HijackDLL-Process: Cria um novo processo quando a DLL é carregadaHijackDLL-CreateRemoteThread: Executa a técnica de injeção de thread usando a chamada de API CreateRemoteThread quando a DLL é carregadaHijackDLL-Threads: Útil para medir o tempo de vida de threads iniciadas na DLL após um sequestroProva de conceito para mostrar como o sequestro de COM pode ser usado para injeções de processo:
O primeiro passo é realizar o sequestro:
COMInjectDotNet.exe chrome.exe C:\COM\COMInjectTarget.dll
O sequestro não será acionado imediatamente e pode exigir que o aplicativo seja iniciado (se não estiver em execução) ou algumas ações básicas do aplicativo. Provavelmente existem CLSIDs melhores que disparam com mais frequência, mas estes são bons o suficiente.
O COMInjectTarget.dll registrará seu progresso em um arquivo de log em C:\COM. Isso parece mais estável do que usar algo como AllocConsole de dentro de outro processo e simplesmente imprimir no console.
O seguinte mostra a DLL injetada em execução dentro do processo 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)
Os processos atualmente compatíveis são:
Para saber mais sobre COM e sequestros de COM: