
자동화된 DLL 하이재킹 발견, 검증 및 확인. 로컬 구성 오류를 무기화되고 확인된 공격 경로로 전환합니다.
자동화된 DLL 하이재킹 탐지, 검증 및 확인
로컬 구성 오류를 무기화된 확인된 공격 경로로 전환.
DLLHijackHunter는 정적 분석을 넘어서는 자동화된 Windows DLL 하이재킹 탐지 도구입니다. 다단계 파이프라인을 통해 DLL 하이재킹 기회를 발견, 검증, 확인합니다:
대부분의 DLL 하이재킹 도구는 "이 DLL이 하이재킹될 수 있을지도 모른다"에서 멈춥니다. DLLHijackHunter는 이를 검증하고, 알려진 악용 인텔리전스와 교차 참조하며, 가능한 경우 실제 실행 경로를 확인하려고 시도합니다.
flowchart TB
subgraph Phase1["Phase 1: Discovery"]
SE["Static Engine<br/>Services, Tasks, Startup,<br/>COM, Run Keys"]
AE["AutoElevate Engine<br/>Manifest + COM UAC Bypass"]
PE["PE Analyzer<br/>Import Tables, Delay Loads,<br/>Manifests, Exports"]
ETW["ETW Engine<br/>Real-time DLL Load<br/>Monitoring"]
SO["Search Order<br/>Calculator"]
end
subgraph Phase2["Phase 2: Filter Pipeline"]
direction LR
HG["Hard Gates<br/>(Binary Kill)"]
SG["Soft Gates<br/>(Confidence Adj.)"]
end
subgraph Phase3["Phase 3: Load Verification (--verify-load)"]
LP["LoadProbe<br/>Child-process loader test<br/>Probe DLL placed & removed"]
end
subgraph Phase4["Phase 4: Canary"]
CB["Canary DLL Builder"]
TE["Trigger Executor"]
VF["Verification"]
end
subgraph Phase5["Phase 5: Output"]
SC["Tiered Scorer"]
RC["Console Report"]
RJ["JSON Report"]
RH["HTML Report"]
end
SE --> PE --> SO
AE --> PE
ETW --> SO
SO --> Phase2
HG --> SG
Phase2 --> Phase3
Phase3 --> Phase4
CB --> TE --> VF
Phase4 --> Phase5
| 유형 | 설명 | 은밀성 | 상태 |
|---|---|---|---|
| Phantom | DLL이 디스크 어디에도 존재하지 않음 | 높음 | 구현됨 |
| Search Order | Windows 검색 순서에서 더 앞쪽에 DLL 배치 | 높음 | 구현됨 |
| Side-Loading | 합법적인 앱이 자체 디렉터리에서 DLL을 로드하는 것 악용 | 높음 | 구현됨 (AutoElevate 복사-임시 경로) |
| .local Redirect | .local 디렉터리 리디렉션을 통한 하이재킹 | 높음 | 구현됨 |
| ENV PATH | 시스템 PATH의 쓰기 가능한 디렉터리 무기화 | 높음 | 구현됨 (선별된 서비스/DLL 맵) |
| AppInit DLLs | AppInit_DLLs 레지스트리 악용 | 낮음 | 구현됨 |
| AppCert DLLs | AppCertDLLs 레지스트리 악용 (모든 CreateProcess/WinExec 호출자에 로드됨) | 낮음 | 구현됨 |
| CWD | 현재 작업 디렉터리 하이재킹 | 낮음 | 계획됨 — 현재 어떤 발견 경로에서도 생성되지 않음 |
IFEO Debugger 항목은 열거되고 참조된 바이너리는 DLL 가져오기에 대해 분석되지만, 전용 IFEO/KnownDLL-우회 하이재킹 유형은 없습니다 — 이러한 항목은 독립형 탐지로 광고되지 않습니다.
DLLHijackHunter에는 전용 UAC 우회 발견 기능이 포함되어 있습니다:
<autoElevate>true</autoElevate>가 있는 EXE를 위해 System32 및 SysWOW64를 스캔합니다Elevation\Enabled=1이 있는 COM 개체를 위해 HKLM\SOFTWARE\Classes\CLSID를 스캔합니다SetDllDirectory 또는 SetDefaultDllDirectories를 호출하지 않는 AutoElevate 바이너리의 경우 "EXE를 쓰기 가능한 폴더에 복사 + DLL 드롭" 공격 경로를 시뮬레이션합니다Resources/hijacklibs.json으로 포함됩니다. 일치하면 신뢰도가 높아지고 발견 항목이 해당 HijackLibs 참조 페이지에 연결됩니다. 일치하지 않는다고 해서 의미가 없는 것은 아닙니다. 데이터셋은 데이터 기반입니다 — https://hijacklibs.net/api/hijacklibs.json을 해당 리소스 위에 다시 다운로드하여 새로 고칠 수 있습니다(코드 변경 불필요). 데이터셋 © HijackLibs 프로젝트 및 기여자.PATH 폴더를 평가하고 누락된 DLL에 대해 PATH를 검색하는 것으로 알려진 선별된 기본 Windows 서비스 맵에 대한 하이재킹 후보를 생성합니다파이프라인은 두 단계를 통해 오탐(false positive)을 줄입니다:
하드 게이트(Hard Gates)
api-ms-*, ext-ms-*)Users / Authenticated Users / Everyone, 그리고 LOCAL SERVICE/NETWORK SERVICE와 같은 누출 방지 하위 관리자 서비스 계정)가 유효한 쓰기 권한을 가진 경우에만 쓰기 가능한 것으로 간주됩니다. 중요하게도, 이는 도구가 실행되는 토큰과 독립적으로 계산되므로, 상승된 권한으로 실행해도 System32/Program Files가 쓰기 가능해 보이지 않습니다. 이것이 LPE 트리아지에서 상승된 실행을 의미 있게 만드는 이유입니다.소프트 게이트(Soft Gates)
LoadLibraryEx 완화 검사추측 대신, DLLHijackHunter는 하이재킹이 실제로 작동함을 증명하려고 시도합니다:
sequenceDiagram
participant H as DLLHijackHunter
participant B as Canary DLL Builder
participant T as Trigger Executor
participant V as Victim Binary
H->>B: Build canary DLL
B->>B: Extract precompiled canary<br/>(or compile a proxy with MSVC)
B-->>H: canary.dll + confirmation file path
H->>H: Place DLL at hijack path
H->>T: Trigger binary execution
T->>V: Start service / run task / COM activate
V->>V: Loads canary DLL
V-->>H: Writes confirmation file<br/>PID, privilege, integrity level
H->>H: Record: CONFIRMED
H->>H: Cleanup canary DLL
카나리 DLL:
%ProgramData%\DLLHijackHunter\canary_<hash>.confirm)에서 확인 파일 경로를 파생하므로, 하나의 바이너리가 모든 후보에 사용됩니다. 스캐너는 배포 경로에서 동일한 해시를 계산하고 해당 파일을 폴링합니다.번들된 바이너리는 src/DLLHijackHunter/Resources/canary_src.c의 감사 가능한 소스에서 빌드되며 Resources/build_canary.bat로 재생성할 수 있습니다(MSVC C++ 툴체인 필요, 스캐너는 필요 없음).
기능 프록시 예외: 검색 순서 하이재킹이 존재하고 내보내기를 노출하는 DLL을 대상으로 할 때, 확인 후 호스트를 유지하려면 내보내기 전달 프록시가 필요하며, 이는 MSVC(
cl.exe,vswhere/vcvarsall을 통해 위치 확인)로 DLL별로 컴파일됩니다. 툴체인이 없으면 사전 컴파일된 카나리가 대신 사용됩니다 — 여전히 로드를 확인(DllMain 실행)하지만 내보내기를 전달하지 않으므로, 확인이 기록된 후 호스트 프로세스가 충돌할 수 있습니다. Phantom-DLL 및 기타 내보내기 없는 후보는 컴파일러가 전혀 필요하지 않습니다.
서명: 내장된 카나리는 서명되지 않았습니다. 코드 서명(더 엄격한 정책에서 로드되고 귀속 가능하도록)에는 서명 인증서가 필요하며 유지 관리자를 위한 릴리스 시점 단계로 남겨집니다.
프록시/내보내기 전달 카나리는 실험적이며 최선의 노력(best-effort) 입니다. 일부 대상은 다음에 따라 올바르게 로드되지 않거나 예기치 않게 동작할 수 있습니다:
즉, 실패한 프록시 카나리가 항상 기본 하이재킹 경로가 불가능하다는 것을 의미하지는 않습니다.
--verify-load)필터 파이프라인과 카나리 단계 사이에 위치한 옵트인(opt-in), 표준 사용자 검증입니다. 각 적용 가능한 후보에 대해 쓰기 가능한 하이재킹 위치에 무해한 프로브 DLL을 잠시 기록한 다음, 수명이 짧은 자식 프로세스에서 실제 Windows 로더에 DLL을 이름으로 해석하도록 요청합니다. 로더가 해석하는 위치에 따라 판정이 결정됩니다:
ntdll.dll에 대한 .local/검색 순서 "발견").설계 및 안전 참고 사항: