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까지 뽑아서 가장 유용하지만 트래픽/시간이 큼.
  • Session collection은 호스트에 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로 원격 수집이 지문이 다름.
  • Session collection은 다수 호스트에 질의 — IDS 룰이 쉽게 걸림. -c Group,Trusts,ACL만으로도 공격 경로 식별에 꽤 충분.
  • 수집 결과 ZIP의 파일 이름 패턴(timestamp_users.json 등)은 특이해서 전송 중 파일 이름을 흔한 걸로 바꾸는 게 좋음.

참고