
탐지 인식 BloodHound 공격 경로 점수 산정 - 목표까지 가장 조용한 경로를 다섯 가지 탐지 계층(audit/EDR/Elastic/MDI/WDAC)과 Azure 전반에 걸쳐 보정합니다.

탐지 인식 기반 Active Directory 공격 경로 점수화. DreadHost Research | OffsetInspect (PowerShell) 및 OffsetScan (Rust)의 동반 도구
BloodHound(그리고 그 위에 구축된 PlumHound)는 목표까지 이르는 하나의 경로를 찾아냅니다. NoiseHound는 동일한 그래프 데이터를 수집하여 홉 수 대신 예상 탐지 비용을 기준으로 경로의 순위를 다시 매깁니다. 따라서 운영자는 단순히 "어떤 경로가 있는가"가 아니라 "Domain Admin에 도달하는 가장 조용한 방법은 무엇인가"를 물을 수 있습니다.
처음 방문하셨나요? 운영자 워크스루가 이 도구가 무엇을 하는지 가장 빠르게 확인하는 방법입니다 - 설치부터 실제 BloodHound CE 개념 증명(점수가 UI에 다시 기록됨), DeadAir 엔진, 블루팀 탐지 격차 보고서까지 스크린샷과 함께 직접 따라 해보는 실습 투어입니다.
프로젝트 상태 (v1.2.0): 안정적이며 여러 도메인에 걸친 실제 BloodHound 데이터로 테스트되었습니다. 77개 코퍼스 엣지 중 37개가 실험실에서 측정되었으며, 다섯 개의 온프레미스 탐지 계층(Windows 감사, Defender for Endpoint, Elastic SIEM, Defender for Identity 런타임 경고, WDAC 감사)과 측정된 Azure/Entra 계층에 걸쳐 있습니다 - 이는
profiles/에 여섯 개의 드롭인 프로필로 제공되며, 경로 순위를 실제로 변경한다는 폐쇄 루프 증명이 포함되어 있습니다(docs/VALIDATION.md). 코퍼스에는 13개의 Azure/Entra 엣지가 포함되어 있으며(docs/AZURE.md), AzureHound 출력에서 바로 수집할 수 있습니다. 측정되지 않은 온프레미스 및 모든 Azure 엣지에는 전문가 추정치가 적용됩니다. 보정 하네스(noisehound-calibrate)를 통해 이들 추정치와 사용자 환경 자체가 측정됩니다. 보정되지 않은 순위는 근거 있는 지침으로 취급하고, 절대적 진실로 간주하지 마십시오.
승인된 인게이지먼트 전용입니다. 이 도구는 테스트에 대한 서면 허가를 받은 시스템을 대상으로 OPSEC 계획을 위한 공격 경로를 점수화합니다.
NoiseHound는 독립적인 커뮤니티 프로젝트입니다. SpecterOps 또는 BloodHound 프로젝트와 제휴, 보증 또는 연관 관계가 없으며, BloodHound의 공개 데이터 형식을 사용합니다.
.zip), 원시 JSON 파일 또는 내보내기 디렉터리를 내부 그래프로 가져옵니다. 정규화된 {nodes, edges} JSON 형식도 오프라인 분석 및 테스트용으로 허용됩니다. AD CS ESC1-8 권한 상승 엣지는 BloodHound가 수집한 인증서 템플릿 및 CA 정보로부터 로드 시점에 합성됩니다(아래 참조).effective_noise_score(0-100)를 부여합니다. 여러 권한이 동일한 노드 쌍을 연결하는 경우 가장 조용한 것이 선택됩니다. 코퍼스에 없는 엣지 유형은 보수적인 점수(60)를 기본값으로 사용하여 누락이 과소 보고가 아닌 안전 실패로 이어지도록 합니다. 선택적 환경 프로파일은 대상의 선언된 탐지 태세에 맞게 점수를 조정합니다(아래 참조).경로 노이즈는 의도적으로 단순 합이 아닙니다. 동일한 탐지를 두 번 트리거한다고 해서 두 배로 시끄러운 것은 아닙니다(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로 이를 기준으로 순위를 매길 수 있습니다.
대규모 그래프의 경우 해결 작업이 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). 둘 다 반복 가능하며 즉석에서 다시 해결됩니다.
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
가중치 기반 BloodHound 경로 탐색은 새로운 것이 아니므로, 여기서 솔직하게 위치를 짚어보겠습니다:
NoiseHound의 기여는 이들의 조합입니다: 기계 판독 가능한 BloodHound 엣지-탐지 텔레메트리 코퍼스, 운영자 OPSEC("DA까지 가장 조용한 방법")으로 프레이밍된 노이즈 가중 재해석, 대상의 선언된 태세에 적응하는 환경 모델, 그리고 랩 탐지를 측정된 점수로 바꾸는 캘리브레이션 루프입니다. 그래프 수학은 흔한 것이고, 코퍼스와 프레이밍이 핵심입니다. 그 가치는 코퍼스만큼만 좋을 수 있으며, 그래서 캘리브레이션과 커뮤니티 기여가 일급 요소입니다 - 아래를 참조하세요.
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 이상이 필요합니다.
# 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를 검증하는 가장 빠른 방법입니다:
noisehound-inspect -i export.zip
zip 대신 --input을 BloodHound CE가 채우는 Neo4j 데이터베이스로 지정하면 NoiseHound가 (이미 분석된) 그래프를 Bolt를 통해 직접 읽습니다:
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.
번들로 제공되는 샘플에 대해 시험해 보세요: