
자동화된 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: Canary"]
CB["Canary DLL Builder"]
TE["Trigger Executor"]
VF["Verification"]
end
subgraph Phase4["Phase 4: 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
CB --> TE --> VF
Phase3 --> Phase4
IFEO Debugger 항목이 열거되고 참조된 바이너리가 DLL 임포트에 대해 분석되지만, 전용 IFEO/KnownDLL 우회 하이재킹 유형은 없습니다. 이들은 독립적인 탐지로 광고되지 않습니다.
DLLHijackHunter에는 전용 UAC 우회 발견 기능이 포함되어 있습니다:
System32 및 SysWOW64에서 포함된 매니페스트에 <autoElevate>true</autoElevate>가 있는 EXE를 스캔합니다.HKLM\SOFTWARE\Classes\CLSID에서 Elevation\Enabled=1이 있는 COM 개체를 스캔합니다.SetDllDirectory 또는 SetDefaultDllDirectories를 호출하지 않는 AutoElevate 바이너리의 경우, "EXE를 쓰기 가능한 폴더에 복사 + DLL 떨어뜨리기" 공격 경로를 시뮬레이션합니다.Resources/hijacklibs.json에 포함되어 있습니다. 일치하면 신뢰도를 높이고 해당 결과를 HijackLibs 참조 페이지에 연결합니다. 일치하지 않아도 아무 의미가 없습니다. 데이터셋은 데이터 기반입니다. https://hijacklibs.net/api/hijacklibs.json을 해당 리소스에 다시 다운로드하여 새로 고칠 수 있습니다(코드 변경 불필요). 데이터셋 © HijackLibs 프로젝트 및 기여자.PATH 폴더를 평가하고, 기본 Windows 서비스 중 PATH에서 누락된 DLL을 검색하는 것으로 알려진 선별된 맵에 대한 하이재킹 후보를 생성합니다.파이프라인은 두 단계를 통해 거짓 양성을 줄입니다:
하드 게이트(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: 카나리 DLL 빌드
B->>B: 사전 컴파일된 카나리 추출<br/>(또는 MSVC로 프록시 컴파일)
B-->>H: canary.dll + 확인 파일 경로
H->>H: 하이재킹 경로에 DLL 배치
H->>T: 바이너리 실행 트리거
T->>V: 서비스 시작 / 작업 실행 / COM 활성화
V->>V: 카나리 DLL 로드
V-->>H: 확인 파일 작성<br/>PID, 권한, 무결성 수준
H->>H: 기록: CONFIRMED
H->>H: 카나리 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
GhostVector Academy 제작.
| 유형 | 설명 | 은밀성 | 상태 |
|---|
| 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만 |