
Anvil은 Windows thick client 애플리케이션을 위한 런타임 우선(runtime-first) 공격 표면 평가 도구로, 표적화된 애플리케이션 보안 평가를 수행하는 침투 테스터와 보안 연구자를 위해 설계되었습니다. 단일 표적 실행에서 여러 공격 클래스를 포괄합니다.
Windows thick 클라이언트를 위한 런타임 우선 권한 상승 및 공격 표면 평가.
Anvil은 Windows thick 클라이언트 애플리케이션을 위한 런타임 우선 권한 상승 및 공격 표면 평가 도구입니다. 파일 시스템을 맹목적으로 스캔하는 대신, Procmon 캡처와 Windows AccessCheck를 결합하여 런타임에 관찰되고 표준 사용자에게 쓰기 가능한 경로만 보고함으로써, 일반적인 열거 도구에서 발생하는 거짓 긍정 소음을 제거합니다.
대부분의 thick 클라이언트 평가 도구는 하나 또는 두 가지 공격 클래스를 다룹니다. Anvil은 런타임 관찰, ACL로 확인된 이용 가능성 및 넓은 공격 표면이 모두 동일한 대상 실행에 포함되어야 하며, 게이트가 있는 파이프라인이 결과를 실행 가능하게 유지한다는 아이디어를 기반으로 구축되었습니다.
모든 후보는 보고되기 전에 순차적으로 4개의 게이트를 통과합니다.
하드 게이트
AccessCheck API를 통해 확인모듈 로직 게이트
Supersede, OverwriteIf 등) + 교차 사용자 쓰기 가능 가드.sys 경로 제외대상 확인
도구는 (--exe, --service 또는 --pid에서) 실행 대상 경로를 확인합니다. 서비스인 경우 현재 PID 및 상태와 함께 ServiceInfo를 가져옵니다.
Procmon 캡처
프로세스 무결성 수준은 시작 직후(프로세스가 살아 있는 동안) 읽혀 컨텍스트에 저장됩니다.
모듈별 필터링된 분석
각 모듈은 자체 .pmc 필터(filters/에 저장)를 사용하여 Procmon에서 필터링된 CSV 내보내기를 요청합니다. CSV를 구문 분석하고 일련의 게이트가 적용됩니다:
정적 상관 분석
com 모듈은 추가 정적 패스를 수행합니다 — 대상 바이너리에서 포함된 CLSID를 스캔하고 각각을 HKLM 및 HKCU와 비교하여 캡처 기간 동안 실행되지 않은 하이재킹 기회를 찾아냅니다. 이들은 [Static Correlation] 태그로 표시됩니다.
보고
결과는 터미널에 출력(색상 코딩)되며 선택적으로 JSON 또는 독립형 HTML 보고서로 기록됩니다.
flowchart TB
%% Phase 1
subgraph Phase1["Phase 1: Target & Runtime Discovery"]
TR["Target Resolver<br/>--exe / --service / --pid"] -->
IL["Integrity Gate<br/>Medium-IL launch / Service restart"] -->
PM["Procmon Engine<br/>Runtime FS / Reg / Pipe events"]
end
%% Phase 2
subgraph Phase2["Phase 2: Signal Reduction"]
direction LR
PF["Per-Module PMC Filters<br/>High-signal traces only"] -->
CSV["Filtered CSV Export"]
end
%% Phase 3
subgraph Phase3["Phase 3: Exploitability Gates"]
HG["Hard Gates<br/>High-Integrity target<br/>Not protected path"] -->
ACL["AccessChk Validation<br/>Writable by standard user"] -->
LG["Logic Gates<br/>Module-specific rules"]
end
%% Phase 4
subgraph Phase4["Phase 4: Correlation"]
RT["Runtime Findings"]
ST["Static Correlation<br/>COM: CLSID binary scan / registry"]
end
%% Phase 5
subgraph Phase5["Phase 5: Reporting"]
SV["Severity Engine<br/>P1–P5"] --> OUT["Console Output"]
SV --> JSON["JSON Report"]
SV --> HTML["HTML Report"]
end
%% Cross-phase flow
PM --> PF
CSV --> HG
LG --> RT
ST -.-> RT
RT --> SV
%% Styling
classDef p1 fill:#0f2a44,stroke:#4cc9f0,color:#e6f1ff
classDef p2 fill:#2b193d,stroke:#f72585,color:#fde8f3
classDef p3 fill:#1f2d1c,stroke:#7ae582,color:#eaf7ea
classDef p4 fill:#3a1f1f,stroke:#ffb703,color:#fff3d6
classDef p5 fill:#0b2e2a,stroke:#00f5d4,color:#e6fffb
class Phase1 p1
class Phase2 p2
class Phase3 p3
class Phase4 p4
class Phase5 p5
linkStyle default stroke:#9aa4b2,stroke-width:2px모든 Procmon 기반 모듈은 filters/ 디렉터리에 일치하는 .pmc 필터 파일이 필요합니다(필터 참조).
Anvil은 첫 실행 시 두 종속성을 자동 설치합니다. 수동으로 설치할 수도 있습니다:
pip install rich pefile
pip install rich>=13.0 pefile>=2023.2.7
Anvil은 세 개의 Sysinternals 바이너리를 사용합니다.
매 실행마다 Anvil은 다음 우선순위로 각 도구를 확인합니다:
--procmon, --handle 또는 --accesschk (아래 참조)HKCU\Software\Anvil (첫 번째 성공적인 확인 시 기록)where 스타일 검색live.sysinternals.com에서 가져와 %LOCALAPPDATA%\Anvil\sysinternals\에 저장도구가 어떤 경로로든 확인되면 그 경로가 레지스트리 캐시에 기록됩니다. 이후 실행은 단계 1–3을 완전히 건너뛰고 캐시된 경로로 바로 이동합니다.
도구를 다운로드할 수 없는 경우(인터넷 없음, 방화벽, 프록시) Anvil은 구조화된 오류를 출력하고 즉시 종료됩니다. 누락된 도구와 사용할 플래그를 나열하는 오류 메시지가 표시됩니다.
해당 플래그를 사용하여 바이너리 경로를 지정하십시오. Anvil은 이를 %LOCALAPPDATA%\Anvil\sysinternals\로 복사하고 레지스트리 캐시에 경로를 기록합니다. 첫 실행 후에는 플래그를 다시 사용할 필요가 없습니다.
python anvil.py --exe "C:\App\target.exe" --procmon "D:\Tools\Procmon64.exe" --handle "D:\Tools\handle.exe" --accesschk "D:\Tools\accesschk.exe"
# 저장소 클론
git clone https://github.com/shellkraft/Anvil.git
cd Anvil
# 실행 — 첫 스캔 시 종속성 자동 설치
python.exe anvil.py
팁: Anvil을 실행하기 전에 항상 터미널을 관리자 권한으로 실행으로 시작하십시오.
PyInstaller 필요 (pip install pyinstaller):
python -m PyInstaller --onefile --console --add-data "filters;filters" --add-data "modules/logo.png;." --icon .\modules\logo.ico --name Anvil anvil.py
출력 바이너리는 dist\Anvil.exe에 있습니다. 대상 컴퓨터에 Python 설치가 필요하지 않습니다.
참고: Windows SmartScreen은 서명되지 않았으므로 처음 실행 시 컴파일된 실행 파일을 차단할 수 있습니다.
사전 빌드된 Anvil.exe는 Releases 페이지에서 제공됩니다. — 인터넷에서 무작위 바이너리를 신뢰하는 것이 위협 모델에 포함된다면 사용하십시오.
| 버전 | SHA-256 | VirusTotal |
|---|---|---|
| V1.0.0 | 0ecf5a62... | 4/72 |
SHA-256은
certutil -hashfile Anvil.exe SHA256(Windows) 또는sha256sum Anvil.exe(Linux)로 확인할 수 있습니다.
python anvil.py [--exe PATH | --service NAME | --pid PID] [옵션]
| 플래그 | 설명 |
|---|---|
--exe PATH | 대상 실행 파일. Procmon 캡처를 위해 Medium IL로 시작됨. |
--service NAME | Windows 서비스 이름. 레지스트리에서 EXE 확인; 시작을 캡처하기 위해 서비스 재시작. |
--pid PID | 이미 실행 중인 프로세스에 연결. Procmon은 진행 중인 활동을 캡처. |
| 플래그 | 기본값 | 설명 |
|---|---|---|
--modules LIST | all | 실행할 모듈 목록(쉼표로 구분). |
모듈 이름: dll, com, registry, binary, configs, installdir, memory, symlink, unquoted, pesec, pipes
| 플래그 | 기본값 | 설명 |
|---|---|---|
--procmon-runtime SEC | 30 | Procmon 캡처 창(초). 느리게 시작되는 앱의 경우 증가. |
데스크톱 애플리케이션 기본 스캔:
python anvil.py --exe "C:\Program Files\MyApp\myapp.exe" --report report.html
느리게 시작되는 앱을 위한 더 긴 캡처 창:
python anvil.py --exe "C:\Program Files\MyApp\myapp.exe" --procmon-runtime 60 --scan-install-dir
Windows 서비스 대상:
python anvil.py --service MyAppSvc --modules dll,binary,unquoted,registry
이미 실행 중인 프로세스에 연결:
python anvil.py --pid 4872 --report report.html --verbose
특정 모듈만 실행:
python anvil.py --exe "C:\App\app.exe" --modules dll,symlink,unquoted
프로세스 메모리 스캔에 추가 사용자 정의 문자열 포함:
python anvil.py --exe "C:\App\app.exe" --modules memory --memory-strings "InternalSecret,DevPassword"
**
**에어갭 환경 — Sysinternals 수동 제공 (한 번 복사됨):**
python anvil.py --exe "C:\App\app.exe" --procmon "E:\Sysint\Procmon64.exe" --handle "E:\Sysint\handle.exe" --accesschk "E:\Sysint\accesschk.exe"
---
## 출력
### 터미널
심각도별 색상 코딩, 선택적 `--verbose` 세부 정보 블록. `rich` 패키지 필요(자동 설치).
<img width="1161" height="772" alt="Image" src="https://assets.kitploit.com/production/public/readmes/12586/0b81de03f45d8374811b095c17583f11df6ba2ce10c55127cbc23240a976d63f.png" />
### JSON (`--report findings.json`)
기계 판독 가능한 결과 객체 배열:
```json
[
{
"severity": "P1",
"module": "DLL Hijacking",
"message": "[System→User] Phantom DLL: version.dll",
"detail": "DLL name : version.dll\nAttempted : C:\\ProgramData\\MyApp\\version.dll\n..."
}
]
--report report.html) [권장]자체 포함 단일 파일 보고서:
모든 .pmc 필터 파일은 저장소의 filters/ 디렉터리에 포함되어 있습니다 — 설정이 필요 없습니다. Procmon 기반 모듈이 자동으로 가져옵니다.
필터 파일이 손실되거나 손상된 경우 위의 규칙을 사용하여 Procmon에서 재생성하십시오: **Filter → Filter…**로 조건을 구성한 후 **File → Export Configuration…**로 filters/<name>.pmc에 저장합니다.
Anvil은 다음 실행 시 해당 모듈에 대해 .pmc 파일을 자동으로 가져옵니다.
Anvil은 보안 연구, 버그 바운티 헌팅 및 승인된 침투 테스트 작업을 위해 설계되었습니다. 소유하고 있거나 명시적인 서면 허가를 받은 시스템에서만 사용하십시오.
운영 참고 사항
| 기능 | AnviL | Spartacus | Robber | winPEAS | Procmon |
|---|
| 자동 검색 | ✅ | ✅ | ✅ | ✅ | ❌ |
| 런타임 확인 검색 | ✅ | ❌ | ❌ | ❌ | ✅ |
| 유령 DLL 탐지 | ✅ | ✅ | ❌ | ❌ | ◐ |
| 검색 순서 인식 분석 | ✅ | ❌ | ❌ | ❌ | ❌ |
| ACL 기반 쓰기 가능성 검증 | ✅ (AccessChk) | ◐ | ◐ | 기본 | ❌ |
| 모듈별 신호 필터링 | ✅ (.pmc 필터) | ❌ | ❌ | ❌ | ❌ |
| 거짓 긍정 제거 (게이트 파이프라인) | ✅ | ❌ | ❌ | ❌ | ❌ |
| 서비스 재시작 및 PID 재캡처 | ✅ | ❌ | ❌ | ❌ | ❌ |
| Medium-IL 사용자 시뮬레이션 | ✅ | ❌ | ❌ | ❌ | ❌ |
| DLL 하이재킹 (thick 클라이언트 인식) | ✅ | ❌ | ❌ | ◐ | ❌ |
| COM 하이재킹 상관 분석 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 네임드 파이프 ACL / 가장 분석 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 심볼릭 링크 / 정션 남용 탐지 | ✅ | ❌ | ◐ | ◐ | ❌ |
| 메모리 비밀 (실행 중 프로세스 스캔) | ✅ | ❌ | ❌ | ◐ | ❌ |
| PE 보안 / 완화 분석 | ✅ | ❌ | ❌ | ◐ | ❌ |
| 권한 상승 평가 (비-악용) | ✅ | ✅ | ✅ | ❌ | ❌ |
| 자동 악용 | ❌ | ✅ | ✅ | ❌ | ❌ |
| 신뢰도 / 심각도 점수 매기기 | ✅ (P1–P5) | ❌ | ❌ | ❌ | ❌ |
| 대상별 분석 (exe / svc / pid) | ✅ | ❌ | ❌ | ❌ | ✅ |
| 구조화된 보고 (JSON / HTML) | ✅ | ❌ | ❌ | TXT | ❌ |
| 자체 포함 바이너리 배포 | ✅ | ✅ | ✅ | ✅ | ✅ |
| 모듈 | 플래그 | 검사 내용 |
|---|
| DLL 하이재킹 | dll | .dll에 대한 CreateFile 이벤트 — 유령 DLL 및 쓰기 가능한 디렉터리의 로드된 DLL |
| COM 하이재킹 | com | 표준 사용자에게 쓰기 가능한 COM 서버 레지스트리 키; ProgID에 대한 바이너리 스캔 |
| 바이너리 하이재킹 | binary | .exe에 대한 CreateFile 이벤트 — 유령 EXE 심기 및 쓰기 가능한 EXE 디렉터리 |
| 안전하지 않은 구성 | configs | 쓰기 가능한 디렉터리의 구성 파일 액세스(.ini, .xml, .json, .yaml 등) |
| 설치 디렉터리 | installdir | 루트 ACL, 상승 매니페스트 EXE 및 쓰기 가능한 하위 디렉터리 |
| 메모리 문자열 | memory | 실행 중인 프로세스 메모리 스캔: 자격 증명, 토큰, API 키, JWT, 연결 문자열 |
| 심볼릭 링크 공격 | symlink | 사용자 쓰기 가능한 temp/appdata 경로의 정션 및 심볼릭 링크 벡터 |
| 따옴표 없는 서비스 경로 | unquoted | 중간 유령 디렉터리가 쓰기 가능한 따옴표 없는 ImagePath가 있는 서비스 |
| 레지스트리 권한 상승 | registry | 서비스/애플리케이션 동작을 제어하는 표준 사용자에게 쓰기 가능한 레지스트리 키 |
| PE 보안 플래그 | pesec | 대상 바이너리에서 ASLR, DEP, CFG, SafeSEH, Authenticode 누락 |
| 네임드 파이프 ACL | pipes | 허용적인 DACL 또는 가장 가능 ACE가 있는 네임드 파이프 |
| 바이너리 | 사용 모듈 | 다운로드 |
|---|
Procmon64.exe | 모든 Procmon 기반 모듈 | ProcessMonitor.zip |
handle.exe | 네임드 파이프 ACL 모듈 | Handle.zip |
accesschk.exe | 네임드 파이프 ACL 모듈 — 파이프 DACL 열거 | AccessChk.zip |
| 플래그 | 설명 |
|---|
--procmon PATH | Procmon64.exe 경로. %LOCALAPPDATA%\Anvil\sysinternals\로 복사됨 |
--handle PATH | handle.exe 경로. %LOCALAPPDATA%\Anvil\sysinternals\로 복사됨 |
--accesschk PATH | accesschk.exe 경로. %LOCALAPPDATA%\Anvil\sysinternals\로 복사됨 |
| 플래그 | 기본값 | 설명 |
|---|
--report FILE | — | 보고서 생성 — 확장자가 형식을 결정: .json은 JSON, .html(또는 기타)은 독립형 HTML 보고서. |
--verbose | off | 터미널에 전체 결과 세부 정보 블록 출력. |
--no-color | off | ANSI 색상 출력 비활성화. |
--skip-authenticode | off | Authenticode 서명 검사 건너뛰기(대용량 설치 디렉터리에서 더 빠름). |
--scan-install-dir | off | 설치 디렉터리의 모든 DLL을 PE 보안 검사에 포함. |
--memory-strings STR,... | — | 프로세스 메모리에서 검색할 추가 문자열(쉼표로 구분). |
| 수준 | 레이블 | 일반 CVSS | 의미 |
|---|
| P1 | 치명적 | 8.0 – 8.8 | 자동 트리거 권한 상승 (사용자 상호작용 없음) |
| P2 | 높음 | 7.0 – 7.9 | 사용자 상호작용 또는 약한 트리거로 악용 가능 |
| P3 | 잘못된 구성 | 4.0 – 6.9 | 따옴표 없는 경로, 완화 누락 — 직접 악용 불가능 |
| P4 | 낮은 영향 | 0.1 – 3.9 | 실제 영향이 제한적인 정보 벡터 |
| P5 | 정보 제공 | N/A | 컨텍스트 및 관찰 사항, 취약점 아님 |
| 파일 | 모듈 | 주요 필터 규칙 |
|---|
filters/dll.pmc | DLL 하이재킹 | Operation is CreateFile, Path ends with .dll |
filters/binary.pmc | 바이너리 하이재킹 | Operation is CreateFile, Path ends with .exe |
filters/config.pmc | 안전하지 않은 구성 | Operation is CreateFile (코드에서 확장자 필터) |
filters/com.pmc | COM 하이재킹 | Operation is RegQueryKey, Path contains HKLM |
filters/symlink.pmc | 심볼릭 링크 공격 | Operation is CreateFile |