
탐지 인식 BloodHound 공격 경로 점수 산정 - 목표까지 가장 조용한 경로를 다섯 가지 탐지 계층(audit/EDR/Elastic/MDI/WDAC)과 Azure 전반에 걸쳐 보정합니다.
<p align="center"><img src="https://assets.kitploit.com/production/public/readmes/50019/502beed5defd8b7d32991f173f6339e3214eb604968886518cd026cc2e4d3ee5.png" alt="NoiseHound" width="600"></p>
<h1 align="center">NoiseHound</h1>
<p align="center">
<a href="https://pypi.org/project/noisehound/"><img src="https://img.shields.io/pypi/v/noisehound" alt="PyPI"></a>
<a href="https://github.com/warpedatom/NoiseHound/releases"><img src="https://img.shields.io/github/v/release/warpedatom/NoiseHound" alt="Release"></a>
<a href="https://github.com/warpedatom/noisehound/blob/main/LICENSE"><img src="https://img.shields.io/github/license/warpedatom/NoiseHound" alt="License"></a>
<img src="https://img.shields.io/badge/python-3.10+-3776AB?logo=python&logoColor=white" alt="Python 3.10+">
<a href="https://github.com/warpedatom/NoiseHound/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/warpedatom/NoiseHound/ci.yml?branch=main&label=CI" alt="CI"></a>
<a href="https://github.com/warpedatom/noisehound/blob/main/SECURITY.md"><img src="https://img.shields.io/badge/Security-Policy-green" alt="Security policy"></a>
<a href="https://x.com/warped_atom"><img src="https://img.shields.io/badge/X-@warped__atom-000000?logo=x&logoColor=white" alt="X (Twitter): @warped_atom"></a>
</p>
**탐지 인식 기반 Active Directory 공격 경로 점수화.**
_DreadHost Research | OffsetInspect (PowerShell) 및 OffsetScan (Rust)의 동반 도구_
BloodHound(그리고 그 위에 구축된 PlumHound)는 목표까지 이르는 *하나의* 경로를 찾아냅니다.
NoiseHound는 동일한 그래프 데이터를 수집하여 홉 수 대신 **예상 탐지 비용**을 기준으로
경로의 순위를 다시 매깁니다. 따라서 운영자는 단순히 "어떤 경로가 있는가"가 아니라
"Domain Admin에 도달하는 가장 조용한 방법은 무엇인가"를 물을 수 있습니다.
> **처음 방문하셨나요? [운영자 워크스루](https://github.com/warpedatom/noisehound/blob/main/docs/WALKTHROUGH.md)가 이 도구가 무엇을 하는지
> 가장 빠르게 확인하는 방법입니다** - 설치부터 실제 BloodHound CE 개념 증명(점수가 UI에
> 다시 기록됨), DeadAir 엔진, 블루팀 탐지 격차 보고서까지 스크린샷과 함께 직접 따라 해보는
> 실습 투어입니다.
> **프로젝트 상태 (v1.2.0):** 안정적이며 여러 도메인에 걸친 실제 BloodHound 데이터로
> 테스트되었습니다. **77개 코퍼스 엣지 중 37개가 실험실에서 측정**되었으며, 다섯 개의
> 온프레미스 탐지 계층(Windows 감사, Defender for Endpoint, Elastic SIEM, Defender for
> Identity 런타임 경고, WDAC 감사)과 측정된 Azure/Entra 계층에 걸쳐 있습니다 - 이는
> [`profiles/`](https://github.com/warpedatom/noisehound/blob/main/profiles)에 여섯 개의 드롭인 프로필로 제공되며, 경로 순위를 실제로
> 변경한다는 폐쇄 루프 증명이 포함되어 있습니다([`docs/VALIDATION.md`](https://github.com/warpedatom/noisehound/blob/main/docs/VALIDATION.md)).
> 코퍼스에는 13개의 **Azure/Entra** 엣지가 포함되어 있으며([`docs/AZURE.md`](https://github.com/warpedatom/noisehound/blob/main/docs/AZURE.md)),
> AzureHound 출력에서 바로 수집할 수 있습니다.
> 측정되지 않은 온프레미스 및 모든 Azure 엣지에는 **전문가 추정치**가 적용됩니다.
> 보정 하네스(`noisehound-calibrate`)를 통해 이들 추정치와 사용자 환경 자체가 측정됩니다.
> 보정되지 않은 순위는 근거 있는 지침으로 취급하고, 절대적 진실로 간주하지 마십시오.
> 승인된 인게이지먼트 전용입니다. 이 도구는 테스트에 대한 서면 허가를 받은 시스템을
> 대상으로 OPSEC 계획을 위한 공격 경로를 점수화합니다.
> NoiseHound는 독립적인 커뮤니티 프로젝트입니다. SpecterOps 또는 BloodHound 프로젝트와
> 제휴, 보증 또는 연관 관계가 없으며, BloodHound의 공개 데이터 형식을 사용합니다.
---
## 작동 방식
1. **수집(Ingest)**: BloodHound CE 내보내기 파일(`.zip`), 원시 JSON 파일 또는 내보내기 디렉터리를 내부 그래프로 가져옵니다. 정규화된 `{nodes, edges}` JSON 형식도 오프라인 분석 및 테스트용으로 허용됩니다. AD CS **ESC1-8** 권한 상승 엣지는 BloodHound가 수집한 인증서 템플릿 및 CA 정보로부터 로드 시점에 합성됩니다(아래 참조).
2. **주석(Annotate)**: 엣지 텔레메트리 코퍼스로부터 모든 엣지에 `effective_noise_score`(0-100)를 부여합니다. 여러 권한이 동일한 노드 쌍을 연결하는 경우 가장 조용한 것이 선택됩니다. 코퍼스에 없는 엣지 유형은 보수적인 점수(60)를 기본값으로 사용하여 누락이 과소 보고가 아닌 안전 실패로 이어지도록 합니다. 선택적 **환경 프로파일**은 대상의 선언된 탐지 태세에 맞게 점수를 조정합니다(아래 참조).
3. **해결(Solve)**: 가장 조용한 경로를 찾습니다. 경로 점수는 병목값에 평균을 더한 값(단순 합이 아님)이므로 Dijkstra로 직접 최적화할 수 없습니다. 솔버는 *임계값 스윕*(각각의 고유한 노이즈 수준에 대해 그 수준 이하로 유지되는 가장 조용한 경로)과 제한된 k-최단-가중치 패스를 결합한 뒤, 합집합을 실제 경로 점수로 다시 순위를 매깁니다. 임계값 스윕은 정확성 보루 역할을 합니다. 즉, 순수 합산 가중치 탐색에서는 짧지만 시끄러운 경로보다 낮게 순위가 매겨질 길지만 균일하게 조용한 경로를 드러냅니다.
4. **보고(Report)**: 텍스트, JSON(OffsetInspect 결과 스키마와 호환), 또는 툴셋에 맞게 스타일링된 자체 포함 HTML 보고서로 출력합니다.
### 경로 점수 산정
경로 노이즈는 의도적으로 단순 합이 **아닙니다**. 동일한 탐지를 두 번 트리거한다고 해서 두 배로 시끄러운 것은 아닙니다(SOC 트리아지이며 원시 이벤트 수가 아님). NoiseHound는 다음을 사용합니다:
```
path_score = max(edge_scores) * 0.6 + mean(edge_scores) * 0.4
```
이는 누적 노출도 함께 고려하면서 가장 큰 단일 단계(한 번의 잘못된 단계가 종종 전체 작전을 망치기 때문)에 가중치를 둡니다. 가중치는 설정 가능하며(`--max-weight` / `--mean-weight`), APT29/Caldera 랩에서 실제 탐지 데이터를 확보한 후 경험적으로 조정할 수 있습니다.
각 경로는 또한 **탐지 확률** - 상관된 경보를 유발할 가능성 - 을 보고하며, 이는 가장 큰 단계와 모든 단계의 누적 noisy-OR을 혼합한 것입니다(`--correlation`으로 조정). 이는 노이즈 점수와는 다른 질문에 답합니다: 짧지만 큰 경로가 길지만 조용한 경로보다 전체적으로 적발될 확률이 *더 낮을* 수 있습니다. `--rank-by probability`로 이를 기준으로 순위를 매길 수 있습니다.
### 2단계 엔진 (DeadAir)
대규모 그래프의 경우 해결 작업이 [DeadAir](https://github.com/warpedatom/DeadAir)로 위임됩니다. 이는 Rust 기반의 동반 엔진(OffsetScan-to-OffsetInspect 단계)입니다. NoiseHound는 기능이 풍부한 프런트엔드 - 수집, 코퍼스, 환경/Sigma, 제약 조건, 보고 - 로 남아 준비된 그래프를 해결하는 엔진에 넘기므로, 어느 쪽이든 결과는 동일합니다.
- `--engine auto`(기본값): DeadAir 바이너리가 발견되고 그래프가 큰 경우(>= 5000 노드) DeadAir를 사용하고, 그렇지 않으면 내장 Python 솔버를 사용합니다.
- `--engine python`: 내장 솔버를 강제합니다(바이너리 불필요).
- `--engine rust`: DeadAir를 강제합니다(바이너리가 없으면 오류 발생).
DeadAir는 `$NOISEHOUND_DEADAIR`, 그다음 `PATH`, 그다음 형제 경로인 `../deadair/target/{release,debug}/` 빌드 순으로 탐색됩니다. 대규모 그래프에서 10-100배 더 빠르며(250k 노드 그래프가 Python에서 ~30초 걸리는 반면 ~2초에 해결됨) 바이트 단위로 동일한 순위를 생성합니다. 출력에는 어떤 엔진이 실행되었는지 기록됩니다.
### 다중 목표 및 제약 조건 경로 탐색
노이즈, 홉 수, 탐지 확률은 서로 다른 방향으로 작용하므로, `--pareto`는 단일 승자를 강제하는 대신 **파레토 프런트** - 세 가지 모두에서 다른 어떤 경로에도 지지 않는 모든 경로 - 를 반환합니다. 그리고 실제 작전에는 제약 조건이 있습니다: `--avoid NODE`는 특정 호스트(EDR이 모니터링하는 점프 박스, 허니팟)를 피하도록 경로를 유지하고, `--avoid-edge TYPE`은 특정 기법을 거부합니다(예: `--avoid-edge DCSync`). 둘 다 반복 가능하며 즉석에서 다시 해결됩니다.
```bash
python -m noisehound -i export.zip -s jdoe -o "Domain Admins" --pareto
python -m noisehound -i export.zip -s jdoe -o "Domain Admins" --avoid FILESERVER01 --avoid-edge HasSession
```
## NoiseHound 비교
가중치 기반 BloodHound 경로 탐색은 새로운 것이 아니므로, 여기서 솔직하게 위치를 짚어보겠습니다:
- **BloodHound / BloodHound CE**는 가중치 없는 홉 수를 기준으로 *하나의* 경로를 찾습니다. 노이즈 모델은 없습니다.
- **GoodHound**는 엣지 비용을 할당하고 최저 비용 경로를 찾지만, 그 비용 모델은 탐지 노이즈가 아니라 익스플로잇 난이도와 비즈니스 리스크입니다.
- **PlumHound / ImproHound**는 리포팅과 티어 위반 분석을 수행하며, 둘 다 목표까지 가장 조용한 경로를 다시 풀어내지는 않습니다.
- **탐지 매핑**(Sigma, DeTT&CT, 이벤트 ID-ATT&CK 참조)은 풍부하지만 사람 중심이며 BloodHound 엣지 종류에 키가 맞춰져 있지 않습니다.
NoiseHound의 기여는 이들의 조합입니다: 기계 판독 가능한 BloodHound 엣지-탐지 텔레메트리 코퍼스, 운영자 OPSEC("DA까지 가장 조용한 방법")으로 프레이밍된 노이즈 가중 재해석, 대상의 선언된 태세에 적응하는 환경 모델, 그리고 랩 탐지를 측정된 점수로 바꾸는 캘리브레이션 루프입니다. 그래프 수학은 흔한 것이고, 코퍼스와 프레이밍이 핵심입니다. 그 가치는 코퍼스만큼만 좋을 수 있으며, 그래서 캘리브레이션과 커뮤니티 기여가 일급 요소입니다 - 아래를 참조하세요.
## 설치
```bash
cd NoiseHound
python -m pip install -r requirements.txt # networkx>=3.0
# optional editable install to get the `noisehound` command on PATH:
python -m pip install -e .
```
Python 3.10 이상이 필요합니다.
## 사용법
```bash
# Text summary (default)
python -m noisehound --input export.zip --objective "Domain Admins" --source jdoe
# JSON, for downstream tooling / correlation across the DreadHost suite
python -m noisehound -i export.zip -o "Domain Admins" -s jdoe -f json --out paths.json
# Self-contained HTML report
python -m noisehound -i export.zip -o "Domain Admins" -s jdoe -f html --out report.html
```
먼저, 내보낸 데이터에 대해 파서를 점검하세요 (히스토그램 + 코퍼스 커버리지, 경로 탐색 없음) - 실제 데이터에서 NoiseHound를 검증하는 가장 빠른 방법입니다:
```bash
noisehound-inspect -i export.zip
```
### 라이브 BloodHound CE / Neo4j
zip 대신 `--input`을 BloodHound CE가 채우는 Neo4j 데이터베이스로 지정하면 NoiseHound가 (이미 분석된) 그래프를 Bolt를 통해 직접 읽습니다:
```bash
pip install 'noisehound[neo4j]'
export NEO4J_PASSWORD=bloodhoundcommunityedition # match your BHCE compose
noisehound-inspect -i bolt://localhost:7687
python -m noisehound -i bolt://localhost:7687 -s jdoe -o "Domain Admins"
```
공식 compose로 BloodHound CE(7687 포트에 Neo4j 번들 포함)를 실행합니다:
`curl -L https://ghst.ly/getbhce | docker compose -f - up`.
번들로 제공되는 샘플에 대해 시험해 보세요:
```bash
python -m noisehound -i samples/sample_graph.json -s jdoe -o "Domain Admins" -d CONTOSO.LOCAL
python -m noisehound -i samples/sample_bloodhound_ce.zip -s jdoe -o "Domain Admins"
python -m noisehound -i samples/sample_adcs_ce.zip -s jdoe -o "Domain Admins" # ADCS ESC1
# Full-spectrum export exercising every edge family (sessions, delegation, DCSync, ADCS, trusts):
python -m noisehound -i samples/sample_fullspectrum_ce.zip -s ALICE -o "Domain Admins" -d CONTOSO.LOCAL -k 3
```
마지막 예시는 이 논지의 가장 명확한 시연입니다: Domain Admins로 가는 가장 조용한 경로는 4-hop 세션 경로이며, 3-hop RDP 경로와 1-hop ADCS ESC1보다 *위에* 순위가 매겨집니다 — hop은 가장 많지만 노이즈는 가장 적습니다.
이 샘플은 핵심 가치를 보여줍니다: 가장 조용한 경로는 4-hop 세션 경로(점수 19.9)이며, 2-hop ForceChangePassword 지름길(36.4)보다 *위에* 순위가 매겨집니다. hop이 적다고 해서 더 조용한 것은 아닙니다.
### 블루팀 탐지 격차 모드
가장 조용한 경로는 탐지가 가장 취약한 곳이므로, 방어자를 위해 출력을 뒤집으려면 `--defensive`를 추가하세요: 텔레메트리가 꺼져 있거나 부재하기 때문에 조용한 엣지를 표시하고, 각 엣지를 이를 잡아낼 수 있는 통제 항목에 매핑하며, 가장 조용한 경로 점수를 얼마나 높이는지에 따라 해당 통제 항목의 순위를 매깁니다.
```bash
python -m noisehound -i export.zip -s jdoe -o "Domain Admins" --defensive
```
전체 스펙트럼 샘플에서 Domain Admins로 가는 가장 조용한 경로가 탐지되지 않는 LSASS 접근(`HasSession`, 계측 시 20 -> 65)에 달려 있음을 발견하고, Sysmon Event 10 배포를 권장합니다. 이 한 가지 격차를 메우면 가장 조용한 경로가 19.9에서 48.4로 상승합니다. 이 부분과 나머지 모델이 향하는 방향은 [`docs/ROADMAP.md`](https://github.com/warpedatom/noisehound/blob/main/docs/ROADMAP.md)를 참조하세요.
### 주요 옵션
| 옵션 | 의미 |
|--------|---------|
| `--input, -i` | BloodHound `.zip`, `.json`, 또는 내보내기 디렉터리 |
| `--source, -s` | 시작 주체 (`jdoe` 또는 객체 id) |
| `--objective, -o` | 대상 노드 (`Domain Admins` 또는 객체 id) |
| `--paths, -k` | 반환할 가장 조용한 경로 수 (기본값 5) |
| `--format, -f` | `text` (기본값), `json`, 또는 `html` |
| `--defensive` | 블루팀 관점: 가장 조용한 경로의 탐지 격차 + 수정 사항 |
| `--rank-by` | `noise` (기본값) 또는 `probability` (상관 경보의 P) |
| `--correlation` | P(detected)에 대한 SOC 상관 계수, 0..1 (기본값 0.5) |
| `--pareto` | noise/hops/P(detect)에 대한 파레토 프런티어 반환 |
| `--engine` | `auto` (기본값), `python`, 또는 `rust` (DeadAir 엔진) |
| `--avoid NODE` | 모든 경로에서 노드 제외 (반복 가능) |
| `--avoid-edge TYPE` | 모든 경로에서 엣지 유형 제외 (반복 가능) |
| `--corpus` | 엣지 매핑 코퍼스 디렉터리 재정의 |
| `--environment, -e` | 운영자가 선언한 대상 환경 설정 JSON (점수 조정) |
| `--max-weight` / `--mean-weight` | 점수 가중치 (합이 1.0이어야 함) |
| `--default-noise` | 코퍼스에 없는 엣지 유형의 점수 (기본값 60) |
---
## 환경 프로필
정적 코퍼스 점수는 특정 대상에 4662 객체 감사가 켜져 있는지, Sysmon이 배포되어 있는지, 또는 MDI 같은 ITDR이 실행 중인지 알 수 없습니다. 그러나 이러한 요소들은 엣지의 실제 노이즈를 엄청나게 변화시킵니다 (DCSync는 4662 감사가 없으면 거의 조용하고, 있으면 탐지가 거의 확실합니다). 하나의 숫자가 모든 환경에 맞는다고 가정하는 대신, 대상의 환경 설정을 작은 JSON 파일에 선언하면 NoiseHound가 코퍼스 자체의 텔레메트리 주석에 비추어 점수를 투명하게 조정합니다:
```json
{
"name": "CONTOSO.LOCAL-prod",
"object_auditing_4662": true,
"ds_change_auditing_5136": false,
"edr": "MDI",
"sysmon": true,
"powershell_logging_4104": true,
"adjustments": { "HasSession": 65 }
}
```
조정은 선언된 태세가 함의하는 탐지 하한선을 향해 점수를 *올리기만* 합니다. `adjustments`는 엣지별 하드 오버라이드로, 자체 랩에서 보정한 값을 기록하는 자리입니다. 이는 운영자가 제공하는 값이며 측정된 값이 아닙니다. Phase 2 실시간 검증을 대체하지는 않지만, 정적 코퍼스를 "모든 환경에 대한 단일 숫자"에서 "실제로 존재하는 환경에 대한 숫자"로 바꿔 줍니다. 번들 샘플에서 위 프로필을 선언하면 가장 조용한 경로가 LSASS 덤프 세션 경로에서 디렉터리 쓰기 경로로 뒤집히는데, 이는 호스트 텔레메트리가 활성화된 후에는 올바른 판단입니다.
```bash
python -m noisehound -i samples/sample_graph.json -s jdoe -o "Domain Admins" \
-e samples/env_profile.example.json
```
점수 우선순위: `static -> environment-adjusted -> live (Phase 2)`.
---
## 캘리브레이션 하네스
환경 프로필은 그 안에 넣는 수치만큼만 정확합니다.
`noisehound-calibrate`가 이 순환을 완성합니다: 탐지 랩에서 기법들을 실행하고,
무엇이 탐지되었는지 기록하면, 캘리브레이션된 환경 프로필을 출력합니다.
**이 작업은 이미 수행되었습니다.** [`profiles/`](https://github.com/warpedatom/noisehound/blob/main/profiles)에는 실제 Hyper-V Vulnerable-AD 랩과
랩 Azure 테넌트에서 측정된 여섯 개의 프로필이 포함되어 있습니다 - audit, EDR(Defender for
Endpoint), Elastic SIEM, Defender for Identity, WDAC 계층과 측정된
Azure/Entra 계층, 37개 엣지 - 이는 자동화된 하네스(`lab/`)와 이
도구로 생성되었습니다. 이들을 직접 사용하거나, 직접 측정하십시오:
```bash
# Use a shipped measured profile:
noisehound -i export.zip -s jdoe -o "Domain Admins" -e profiles/vulnad-hyperv-audit.json
# Or measure your own lab:
# 1. noisehound-calibrate --plan -o plan.json (per-edge detection events)
# 2. lab/Invoke-NoiseHoundCalibration.ps1 (run + auto-count -> lab_detections.json)
noisehound-calibrate -i lab_detections.json -o env.calibrated.json
noisehound -i export.zip -s jdoe -o "Domain Admins" -e env.calibrated.json
```
점수 모델은 표본 크기에 대해 솔직한 축소 추정량입니다:
```
p = detections / runs (detection probability)
lab_score = p * severity_loudness + (1 - p) * residual
w = runs / (runs + smoothing) (confidence in the lab)
calibrated = w * lab_score + (1 - w) * corpus_static
```
`lab_score`는 예상 탐지 비용입니다. 즉, 탐지가 발동했을 때의 SOC 심각도이며, 발동하지 않았을 때는 작은 잔여값입니다. 가중치 `w`는 단일 실행이 코퍼스를 압도하지 않도록 하면서도 충분히 샘플링된 결과가 우세하도록 합니다. 예시에서 HasSession은 정적 값 20에서 52로 상승하며(랩이 5회 중 4회 LSASS 덤프를 포착함), Kerberoast는 60에서 34로 하락합니다(전혀 발동하지 않음). `--merge existing.json`을 사용하면 자세 유지 플래그를 유지한 채 새로운 캘리브레이션을 프로파일에 덮어쓸 수 있고, `--smoothing` / `--residual`로 모델을 조정할 수 있습니다.
---
## 배포된 탐지에 대해 점수 매기기 (Sigma)
환경 프로파일과 캘리브레이션은 자기 선언 방식입니다. `noisehound-sigma`는 방어자가 *실제로 작성한* 탐지에 대해 점수를 매깁니다. Sigma 규칙 세트를 지정하면 각 규칙이 어떤 코퍼스 엣지에서 발동할지(엣지의 텔레메트리 이벤트 ID와 ATT&CK 기법을 매칭하여) 계산한 뒤, 커버된 엣지를 높이는 환경 프로파일을 출력합니다. 이는 `--environment`에 그대로 대체 투입할 수 있습니다.
```bash
noisehound-sigma -r ./sigma-rules/ -o env.sigma.json
python -m noisehound -i export.zip -s jdoe -o "Domain Admins" -e env.sigma.json --defensive
```
identity 계층의 경우, **`noisehound-mdi`**는 Microsoft Defender for Identity의 내장 탐지에 대해 동일한 작업을 수행합니다. MDI의 런타임 경고(그리고 `--include-posture` 사용 시 ISPM 평가)를 코퍼스 엣지에 매핑하고 identity 계층 프로파일을 출력합니다. MDI는 도구에 구애받지 않으므로 공격자의 도구와 무관하게 그 커버리지가 유지됩니다.
```bash
noisehound-mdi -o env.mdi.json # + coverage report (which edges MDI watches, and the gaps)
```
**Azure/Entra** 엣지의 경우, **`noisehound-entra`**는 온프레미스 계층을 측정했던 방식과 동일하게 클라우드 계층을 측정합니다. 랩 테넌트에서 `AZ*` 남용을 트리거하고, Entra `directoryAudits` 추적을 내보낸 뒤, 보정된 프로파일(`docs/AZURE_CALIBRATION.md`)에 실제로 기록된 항목을 집계합니다.
```bash
noisehound-entra -a directoryAudits.json -m entra_runs.json --profile-out profiles/lab-tenant-azure.json
```
매칭은 의도적으로 보수적으로 설계되어 있어 결코 격차를 숨기지 않습니다. 규칙은 엣지가 생성하는 이벤트 ID를 참조하고, *그리고* 규칙에 ATT&CK 태그가 있을 때 그 기법이 일치할 경우에만 집계됩니다. 따라서 DS-Access(4662) DCSync 규칙은 단지 이벤트 ID를 공유한다는 이유만으로 LAPS 읽기를 커버하는 것으로 잘못 인정되지 않습니다. 보고서는 규칙이 커버하는 항목과, 더 유용하게는 어떤 규칙도 커버하지 않는 공격 엣지를 모두 나열합니다. `--defensive`와 결합하면, 이는 "내가 배포한 탐지들을 고려할 때, 내 가장 조용한 공격 경로가 여전히 보이지 않는 곳은 어디인가?"라는 질문에 답합니다.
### 라이브 Elastic Security 인벤토리
`noisehound-elastic`은 디스크에 있는 규칙이 아니라, 실행 중인 Elastic Security 스택에서 **현재 실제로 활성화된** 탐지들을 대상으로 같은 질문에 답합니다. Kibana의 읽기 전용 `_find` API(또는 오프라인 내보내기)를 통해 탐지 엔진을 읽고, 각 활성화된 규칙의 ATT&CK 기법과 쿼리에 포함된 Windows 이벤트 코드를 매핑한 뒤, 동일한 `--environment` 커버리지 프로파일을 출력합니다.
```bash
export KIBANA_URL=https://kibana:5601 KIBANA_API_KEY=<base64 ApiKey>
noisehound-elastic -o env.elastic.json # live, read-only
noisehound-elastic --rules-json rules_find.json -o env.elastic.json # offline export
python -m noisehound -i export.zip -s jdoe -o "Domain Admins" -e env.elastic.json --defensive
```
로드 시 NoiseHound는 BloodHound의 ADCS 후처리 작업을 집중적으로 수행하여, 보존된 템플릿/CA 정보로부터 권한 상승 엣지를 합성합니다. 취약한 템플릿에 대한 `Enroll` 권한은 해당 주체에서 도메인의 Domain Admins 그룹(RID 512)으로 이어지는 직접적인 `ADCSESCn` 엣지가 되므로, 인증서 권한 상승도 다른 엣지와 마찬가지로 경로 탐색이 가능하고 점수가 매겨집니다:
| 엣지 | 조건 |
|------|-----------|
| `ADCSESC1` | 등록자가 주체를 지정 + 클라이언트 인증 EKU, 승인/RA 서명 없음 |
| `ADCSESC2` | Any-Purpose / SubCA EKU, 승인 없음 |
| `ADCSESC3` | 등록 에이전트 템플릿 + 동일 CA의 인증 템플릿 |
| `ADCSESC4` | 게시된 템플릿에 대한 위험한 쓰기 제어 |
| `ADCSESC5` | CA 객체 또는 이를 호스팅하는 컴퓨터에 대한 제어 |
| `ADCSESC6` | CA에 `EDITF_ATTRIBUTESUBJECTALTNAME2`가 설정됨 |
| `ADCSESC7` | CA에 대한 `ManageCA` / `ManageCertificates` |
| `ADCSESC8` | 취약한 HTTP 웹 등록 엔드포인트 (coerce + NTLM relay) |
사용해 보기: `python -m noisehound -i samples/sample_adcs_ce.zip -s jdoe -o "Domain Admins"`.
문서화된 단순화 (더 많은 경로를 표시하는 방향으로 안전하게 실패함): CA 수준의 등록 제한은 모델링되지 않음 (템플릿 등록이 충분한 것으로 간주됨); ESC5는 모든 PKI 컨테이너가 아닌 CA 객체와 그 호스트만 포함함; ESC9/10/13은 범위 밖임. 후처리된 내보내기에 이미 존재하는 합성 ESC 엣지는 보존됩니다.
---
## 코퍼스 (`edge_mappings/`)
엣지-텔레메트리 코퍼스가 이 도구의 실제 핵심 자산(IP)이며, 코드는 그 위에서 동작하는 비교적 단순한 그래프 연산입니다. 각 `edge_mappings/<Edge>.json`은 BloodHound 엣지 유형을 해당 탐지 표면에 매핑합니다:
- 예상 텔레메트리 소스 (Windows 보안 이벤트 ID, Sysmon 이벤트 ID, 네트워크, EDR/ITDR 휴리스틱)와 소스별 신뢰도 및 관련 감사가 기본적으로 켜져 있는지 여부
- 정적 노이즈 점수 (0-100)
- MITRE 기법, 전제 권한, 일반적인 악용 프리미티브, 그리고 참고 사항
```json
{
"edge_type": "DCSync",
"static_noise_score": 85,
"telemetry": [
{"source": "windows_security", "event_id": 4662,
"detail": "Directory Service Access - requires object auditing (default OFF)",
"reliability": "high_if_auditing_enabled", "default_enabled": false},
{"source": "edr_heuristic", "product_class": "MDI",
"detail": "Non-DC hosts issuing DRSGetNCChanges - high fidelity",
"reliability": "high"}
],
"mitre_technique": "T1003.006",
"notes": "Assumes default audit policy (mostly OFF) but high EDR/MDI coverage."
}
```
코퍼스 확장이 대부분의 지속적인 노력이 투입되어야 할 부분입니다. 새 JSON 파일을 추가하고 스키마를 유지하면(로드 시 검증됨) 자동으로 인식됩니다. v0.3은 경로 탐색에 중요한 ACL 남용, Kerberos, 위임, ADCS ESC1-8, LAPS/gMSA, GPO, 트러스트, 액세스 권한 엣지를 아우르는 43개의 엣지 유형을 제공합니다.
점수는 DreadHost Red Team Operator Playbook 노이즈 매트릭스(Windows/Sysmon 이벤트 매핑, 기법 노이즈 등급)와 표준 AD 탐지 사실을 기반으로 시드됩니다. 자체 랩 탐지 데이터에 맞춰 조정하십시오.
---
## 로드맵
- **Azure / Entra ID 커버리지 (기반 제공됨, 확장 중).** 이제 13개의 `AZ*` 공격 경로 엣지가 Entra 네이티브 탐지 텔레메트리와 함께 제공됩니다 - [`docs/AZURE.md`](https://github.com/warpedatom/noisehound/blob/main/docs/AZURE.md) 참조. AzureHound를 통해 BloodHound CE로 수집된 Azure 데이터는 현재 점수가 매겨지며(`noisehound -o "Global Administrator"`), AzureHound 네이티브 수집과 측정된 Azure/Entra 캘리브레이션 티어(`noisehound-entra`, `profiles/lab-tenant-azure.json`)도 이제 제공됩니다. 다음 단계: Entra 포스처 프로파일(MDCA / ID Protection / Sentinel)과 하이브리드 엣지(Entra Connect / PHS-PTA)로 **MDI**가 온프레미스/클라우드 경계 전반에 기여하도록 하는 것입니다.
- **캘리브레이션 완료 - 37/77 측정됨, 계속 진행 중.** 남은 약 40개 엣지(강제/릴레이, ADCS ESC2-13, 베어메탈에서의 CanRDP), 더 깊은 다중 환경 캘리브레이션, 다중 EDR 코퍼스(MDE와 함께 CrowdStrike/S1), 그리고 `--tooling` 축을 넓히기 위한 엣지별 툴링 캘리브레이션.
- **ADCS ESC10a/10b/13 합성** (ESC1-9 합성은 현재 제공됨).
제공됨: Rust 엔진([DeadAir](https://github.com/warpedatom/DeadAir), `--engine` 디스패치), 라이브 Neo4j Bolt 수집(`--input bolt://...`), 선택 가능한 **`--tooling`** 축(호스트 내 기성 도구 vs 원격/네이티브; `docs/TOOLING_AXIS.md`), Phase 2 **`--live-scores`** 훅(측정된 점수가 코퍼스/환경을 재정의), 그리고 **`noisehound-mdi`**(Defender for Identity 커버리지 -> 아이덴티티 티어 프로파일). 남은 MDI 작업은 랩 게이트 방식의 *런타임 경보 캘리브레이션*(`docs/CALIBRATION.md`)입니다.
## 기여
코퍼스는 커뮤니티가 확장 가능하며, 바로 이 부분이 기여가 가장 중요한 곳입니다. 엣지 추가는 로드 시 및 CI에서 검증되는 하나의 JSON 파일입니다:
```bash
noisehound-validate # schema + consistency checks over the corpus
python -m pytest tests/ -q
```
스키마, 점수 가이드, PR 지침은 [CONTRIBUTING.md](https://github.com/warpedatom/noisehound/blob/main/CONTRIBUTING.md)를, 공식 엣지 스키마는 [`docs/edge_schema.json`](https://github.com/warpedatom/noisehound/blob/main/docs/edge_schema.json)을 참조하세요.
## 랩 환경에 맞춘 보정
30개의 엣지는 측정되어 있으며([`profiles/`](https://github.com/warpedatom/noisehound/blob/main/profiles) 참조), 나머지는 직접 측정하기 전까지는 추정치이며 모든 환경은 서로 다릅니다. [`docs/CALIBRATION.md`](https://github.com/warpedatom/noisehound/blob/main/docs/CALIBRATION.md)는 랩 토폴로지, 코퍼스의 이벤트 ID가 발생하도록 하는 정확한 Windows 감사 정책 및 Sysmon 구성, 엣지별 실습 런북, Caldera를 통한 APT29 현실성 계층, 그리고 결과를 보정된 프로파일로 컴파일하는 방법을 담은 완전한 플레이북입니다. `noisehound-calibrate --template -o lab_detections.json`으로 시작하세요.
[`lab/`](https://github.com/warpedatom/noisehound/blob/main/lab) 키트는 탐지 계측을 자동화합니다. `Enable-Telemetry.ps1`은 감사 정책, 스크립트 블록 로깅, DCSync SACL, Sysmon을 활성화하고, `Collect-Detections.ps1`은 지정된 시간 범위 내에 발생한 항목을 집계합니다. 이 키트는 취약한 도메인 자체를 재구현하는 대신 [GOAD](https://github.com/Orange-Cyberdefense/GOAD) 또는 [Vulnerable-AD](https://github.com/WazeHell/vulnerable-AD)(또는 기존의 모든 훈련용 랩 AD)에 의존합니다.
## 책임 있는 사용
NoiseHound는 승인된 보안 테스트, 퍼플팀 훈련, 탐지 엔지니어링, 연구를 위한 것입니다. 이미 수집한 BloodHound 데이터를 읽고 순위를 계산할 뿐, 대상에 대해 아무것도 실행하지 않습니다. 명시적인 서면 승인이 있는 경우에만 사용하세요. 기여에는 대상별 데이터나 실제 참여 데이터를 포함해서는 안 됩니다.
## 테스트
```bash
python -m pytest tests/ # with pytest
python tests/test_noisehound.py # dependency-light smoke run
```
## 레이아웃
```
noisehound/ engine: schema, corpus, ingest, adcs, annotate, environment,
solver, report, cli, calibrate
edge_mappings/ the telemetry corpus (one JSON per edge type) - the IP
samples/ sample_graph.json, sample_bloodhound_ce.zip, sample_adcs_ce.zip,
sample_fullspectrum_ce.zip, env_profile.example.json,
lab_detections.example.json, sample_report.html
tests/ unit + end-to-end tests
```