ATT&CK: T1087 Account Discovery, T1069 Permission Groups Discovery, T1482 Domain Trust Discovery · Discovery (TA0007)
BloodHound는 AD 환경의 관계 그래프를 Neo4j에 저장하고, “이 사용자에서 Domain Admin까지의 최단 경로"처럼 그래프 쿼리로 공격 경로를 찾는다. 수집은 SharpHound(또는 BloodHound.py), 시각화·분석은 BloodHound GUI/BloodHound CE.
1. 구성 요소
| 역할 | 도구 |
|---|---|
| 수집 (Windows) | SharpHound (.exe / .ps1) |
| 수집 (Linux/원격) | BloodHound.py (Impacket 기반) |
| 저장소 | Neo4j |
| 분석 UI | BloodHound Legacy / BloodHound CE (현행) |
2. SharpHound 수집
도메인 조인된 Windows에서 일반 사용자 권한만 있어도 상당 부분 수집 가능:
# 핵심 collection method
.\SharpHound.exe -c All
# 조용히: 소수 collection만
.\SharpHound.exe -c Group,LocalAdmin,Session,Trusts
-c All은 ACL까지 뽑아서 가장 유용하지만 트래픽/시간이 큼.Sessioncollection은 호스트에 WMI/SMB 질의 — 노이즈 큼.- 결과는
.zip(ZIP 안에 JSON들) 하나로 떨어짐 → BloodHound UI에 그대로 업로드.
3. BloodHound.py (원격, Linux에서)
pipx install bloodhound
bloodhound-python -u alice -p 'Password' \
-d corp.local -ns 10.0.0.10 \
-c All --zip
도메인 조인 없이도 LDAP + SMB로 비슷한 결과.
4. BloodHound CE (최신) 띄우기
Docker 한 줄:
curl -L https://ghst.ly/getbhce -o docker-compose.yml
docker compose up -d
# http://localhost:8080 (기본 admin 자격은 로그에 출력)
ZIP 업로드 후 쿼리.
5. 유용한 분석 쿼리 (Cypher)
사전정의 쿼리로 커버 안 되는 패턴은 Cypher 직접:
-- Kerberoastable 사용자 중 그룹에서 특정 자산에 접근 가능한 조합
MATCH p=(u:User {hasspn:true})-[*1..3]->(c:Computer)
WHERE c.enabled = true
RETURN p LIMIT 25
-- 특정 사용자가 가진 모든 outbound 권한 (ACL 포함)
MATCH p=(u:User {name:"ALICE@CORP.LOCAL"})-[r]->(x)
RETURN p
-- Tier 0 자산으로의 최단 경로
MATCH p=shortestPath((u:User {owned:true})-[*1..]->(g:Group {name:"DOMAIN ADMINS@CORP.LOCAL"}))
RETURN p
6. 블루팀 활용
BloodHound는 방어 측에서 더 가치 있을 수도 있다:
- “현재 설정에서 Domain Admin으로 가는 경로가 몇 개인가?” → 설계 결함 발견.
- Tier 모델(0/1/2) 분리 검증.
- 신규 ACL 변경이 공격 경로를 열지 않는지 PR 전 사전 체크.
BloodHound Enterprise(상용)는 이 블루팀 유즈케이스에 특화.
7. 수집 OPSEC
- SharpHound 바이너리 시그니처는 EDR 대부분 탐지. ps1 버전 + AMSI 처리 또는 BloodHound.py로 원격 수집이 지문이 다름.
Sessioncollection은 다수 호스트에 질의 — IDS 룰이 쉽게 걸림.-c Group,Trusts,ACL만으로도 공격 경로 식별에 꽤 충분.- 수집 결과 ZIP의 파일 이름 패턴(
timestamp_users.json등)은 특이해서 전송 중 파일 이름을 흔한 걸로 바꾸는 게 좋음.