
자동화된 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 --> Phase5IFEO 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/검색 순서 "발견").설계 및 안전 참고 사항:
LOAD_LIBRARY_SEARCH 순서를 모델링하므로 Phantom / Search-Order / Side-Load 후보에만 적용됩니다. .local, PATH 및 AppInit/AppCert 후보는 다른 메커니즘을 사용하며 Skipped로 보고됩니다.# 로더 검증 검색 순서를 사용한 표준 사용자 트리아지 (카나리 없음, ETW 없음)
.\DLLHijackHunter.exe --lpe-only --no-canary --no-etw --verify-load
git clone https://github.com/ghostvectoracademy/DLLHijackHunter.git
cd DLLHijackHunter
# 빌드 (자체 포함 단일 파일)
dotnet publish src/DLLHijackHunter/DLLHijackHunter.csproj `
-c Release -r win-x64 --self-contained `
-p:PublishSingleFile=true -o ./publish
# 또는 빌드 스크립트 사용
.\build.ps1
# 전체 공격적 스캔 (권장, 관리자 필요)
.\DLLHijackHunter.exe --profile aggressive
# 안전 스캔 (파일 드롭 없음, 트리거 없음)
.\DLLHijackHunter.exe --profile safe
# UAC 우회 집중 스캔
.\DLLHijackHunter.exe --profile uac-bypass
# 특정 바이너리 대상
.\DLLHijackHunter.exe --target "C:\Program Files\MyApp\app.exe"
# 파일 이름으로 대상 지정 (부분 일치)
.\DLLHijackHunter.exe --target notepad.exe
# 확인된 발견만
.\DLLHijackHunter.exe --profile redteam --format json -o report.json
DLLHijackHunter — 자동화된 DLL 하이재킹 탐지
옵션:
-p, --profile <profile> 스캔 프로필 [기본값: aggressive]
aggressive | strict | safe | redteam | uac-bypass
-o, --output <path> 출력 파일 경로 (형식 자동 감지)
-f, --format <format> 출력 형식 [기본값: console]
console | json | html
-t, --target <target> 특정 바이너리, 디렉터리 또는 파일 이름 대상 지정
--min-confidence <value> 최소 신뢰도 임계값 0-100. 생략 시 각 프로필의
자체 임계값이 적용됩니다. 전달 시 이를 재정의합니다.
--no-canary 카나리 확인 비활성화
--no-etw ETW 런타임 발견 비활성화
--verify-load 실제 로더로 검색 순서 검증 (아래 참조).
표준 사용자. 무해한 프로브를 일시적으로 기록합니다.
--confirmed-only 카나리 확인된 발견만 표시
--lpe-only 엄격한 LPE 헌팅: System32/Program Files 무시, 표준
사용자 쓰기 가능 취약점만 표시
--log-file <path> 진단 스캔 로그를 파일에 기록
-v, --verbose 자세한 출력
참고:
--min-confidence는 명시적으로 전달할 때만 재정의로 처리됩니다. 그렇지 않으면 선택된 프로필의 임계값이 사용됩니다(예:safe= 50%,strict= 80%).
각 발견 항목은 최종 우선순위 계층으로 결합되는 신뢰도 및 영향 신호를 받습니다.
일반적인 영향 고려 사항:
확인된 카나리 실행은 가장 강력한 검증 신호로 취급되어야 합니다.
계층 게이팅: High 및 Confirmed 계층은 증명 신호(실행된 카나리, ETW 런타임 로드 관찰 또는 문서화된 지식 베이스 일치)로 뒷받침되는 발견을 위해 예약됩니다. 순수 정적 검색 순서 일치는 아무리 깨끗해도 Medium 계층 상단으로 제한되고 Static-only로 주석 처리되어 검증되지 않은 휴리스틱이 높은 신뢰도로 제시되지 않습니다.
쓰기 가능성이 공격자 기준으로 평가되므로 상승된 실행과 표준 사용자 실행 모두 의미가 있습니다:
--lpe-only를 사용한 표준 사용자 실행입니다(컴파일러를 사용할 수 없는 경우 --no-canary 포함) — 살아남은 모든 발견은 권한 없는 주체가 실제로 쓸 수 있습니다.DLLHijackHunter는 승인된 환경에서 방어적 보안 연구, 랩 검증, 감사 및 레드팀 시뮬레이션을 위해 설계되었습니다.
소유하거나 명시적으로 평가 권한이 부여된 시스템 및 네트워크에서만 사용하십시오.
DLLHijackHunter는 다음을 지원합니다:
권장 워크플로:
MIT
ProjectMerai 제작.
| 유형 | 설명 | 은밀성 | 상태 |
|---|
| 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 | 현재 작업 디렉터리 하이재킹 | 낮음 | 계획됨 — 현재 어떤 발견 경로에서도 생성되지 않음 |
| 기능 | DLLHijackHunter | Robber | DLLSpy | WinPEAS | Procmon |
|---|
| 자동화된 발견 | ✅ | ✅ | ✅ | ✅ | ❌ |
| Phantom DLL 탐지 | ✅ | ❌ | ✅ | ❌ | ✅ |
| 검색 순서 분석 | ✅ | ❌ | ❌ | ❌ | ❌ |
| ACL 기반 쓰기 가능성 검사 | ✅ | 부분적 | ❌ | 기본 | ❌ |
| ETW 실시간 모니터링 | ✅ | ❌ | ❌ | ❌ | ✅ |
| 카나리 확인 | ✅¹ | ❌ | ❌ | ❌ | ❌ |
| 권한 상승 검사 | ✅ | ❌ | ❌ | ❌ | ❌ |
| UAC 우회 발견 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 오탐 감소 | ✅² | 없음 | 기본 | 없음 | 없음 |
| 재부팅 지속성 검사 | ✅³ | ❌ | ❌ | ❌ | ❌ |
| 프록시 DLL 생성 | ✅⁴ | ❌ | ❌ | ❌ | ❌ |
| 신뢰도 점수 산정 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 자동 트리거 (svc/task/COM) | ✅⁵ | ❌ | ❌ | ❌ | ❌ |
| HTML/JSON 보고 | ✅ | ❌ | ❌ | TXT | ❌ |
| 위협 인텔리전스 연관 | ✅⁶ | ❌ | ❌ | ❌ | ❌ |
| 자동화된 PATH 악용 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 대상별 스캔 | ✅ | ❌ | ❌ | ❌ | ✅ |
| 자체 포함 바이너리 | ✅ | ❌ | ❌ | ✅ | ❌ |
| 프로필 | 사용 사례 | 카나리 | ETW | UAC 우회 | 최소 신뢰도 | 트리거 |
|---|
| aggressive | 전체 감사, 랩 환경 | ✅ | ✅ | ✅ | 15% | 서비스, 작업, COM |
| strict | 고신뢰도 발견만 | ✅ | ✅ | ❌ | 80% | 서비스, 작업 |
| safe | 프로덕션 시스템, 읽기 전용 | ❌ | ❌ | ❌ | 50% | 없음 |
| redteam | 확인된 악용 가능만 | ✅ | ✅ | ❌ | 50% | 서비스, 작업, COM |
| uac-bypass | UAC 우회 벡터만 | ❌ | ❌ | ✅ | 20% | AutoElevate만 |