BloodHound
BloodHound แปลงความสัมพันธ์ที่ซับซ้อนใน Active Directory ให้เป็นกราฟ เพื่อหา attack path สู่เป้าหมาย (มัก Domain Admin) โดยอัตโนมัติ บทนี้ลงลึกการตั้งค่า, การ import, pre-built queries ทั้งหมด, การอ่าน edge และ abuse, custom Cypher, และ workflow การหาเส้นทาง (เนื้อหาเพื่อทดสอบในระบบที่ได้รับอนุญาตเท่านั้น)
1. BloodHound ทำอะไร
AD ขนาดใหญ่มีความสัมพันธ์ซับซ้อนมาก (ใครเป็นสมาชิก group ไหน, ใคร admin เครื่องไหน, ใครมีสิทธิ์เหนือ object ใด) ที่มนุษย์ตามด้วยมือไม่ไหว BloodHound เก็บข้อมูลเหล่านี้ (ผ่าน SharpHound) ใส่ graph database (neo4j) แล้วให้เราถามว่า 'จากจุดที่ฉันยืนอยู่ ไปถึง Domain Admin ได้ทางไหนบ้าง' — แสดงเป็นเส้นทางกราฟ พลิกการโจมตี AD จากการเดาเป็นการหา path ที่เป็นระบบ
2. ตั้งค่าและ import
# เริ่ม neo4j
sudo neo4j start
# เปิด http://localhost:7474 ตั้งรหัส (ครั้งแรก neo4j:neo4j)
# เปิด BloodHound GUI
bloodhound
# login เข้า neo4j
# import: ลากไฟล์ .json/.zip จาก SharpHound เข้าหน้าต่าง BloodHound
# (collection ดูหัวข้อ SharpHound)3. Pre-built Analysis queries (เริ่มจากนี่)
- Find Shortest Paths to Domain Admins — เส้นทางสั้นสุดสู่ DA (เริ่มเสมอ)
- Shortest Paths from Owned Principals — จากบัญชีที่เราคุม (mark owned ก่อน — สำคัญสุด)
- Find Principals with DCSync Rights — ใครทำ DCSync ได้ (→ dump krbtgt)
- Find Kerberoastable Accounts — เป้า Kerberoasting (ดูหัวข้อนั้น)
- Find AS-REP Roastable Users — เป้า AS-REP
- Computers where Domain Users are Local Admin — เครื่องที่เข้าได้กว้าง
- Shortest Path to Unconstrained Delegation — เป้าหมายสูง
- Find Computers with Unsupported OS — เครื่องเก่า/ช่องโหว่
4. อ่าน edge และวิธี abuse
| edge | ความหมาย | abuse |
|---|---|---|
| MemberOf | เป็นสมาชิก group | ได้สิทธิ์ของ group |
| AdminTo | local admin ของเครื่อง | login → dump credential |
| HasSession | มี session บนเครื่อง | ขโมย token/credential |
| GenericAll | คุม object เต็ม | เปลี่ยนรหัส/เพิ่มสมาชิก (ดู ACL Abuse) |
| GenericWrite | เขียน attribute | ตั้ง SPN (targeted Kerberoast) |
| WriteDacl | แก้ DACL ได้ | ให้สิทธิ์ตัวเองเพิ่ม |
| WriteOwner | เปลี่ยนเจ้าของ object | ยึด object |
| ForceChangePassword | เปลี่ยนรหัส user | ยึดบัญชี |
| AllowedToDelegate | constrained delegation | ปลอมตัวเป็น user อื่น |
| DCSync | สิทธิ์ replicate | dump hash ทั้งโดเมน (ดู DCSync) |
5. Custom Cypher queries
// users ที่ kerberoastable (มี SPN)
MATCH (u:User {hasspn:true}) RETURN u
// path จาก owned ไป Domain Admins
MATCH p=shortestPath((n {owned:true})-[*1..]->(g:Group))
WHERE g.name STARTS WITH "DOMAIN ADMINS" RETURN p
// ทุก edge ที่ user เรามีต่อ object อื่น
MATCH p=(u:User {name:"[email protected]"})-[r]->(n) RETURN p
// หาเครื่องที่ DA มี session อยู่ (ไปยึด)
MATCH (u:User)-[:MemberOf*1..]->(g:Group {name:"DOMAIN [email protected]"})
MATCH (c:Computer)-[:HasSession]->(u) RETURN c,u
// computers ที่ unconstrained delegation
MATCH (c:Computer {unconstraineddelegation:true}) RETURN c
// นับ path สั้นสุดจากทุก owned ไป high-value
MATCH p=shortestPath((n {owned:true})-[*1..]->(m {highvalue:true})) RETURN p6. Workflow
- 1collect ด้วย SharpHound (-c All) → import .zip
- 2Mark บัญชีที่คุมได้เป็น Owned (คลิกขวา node)
- 3รัน 'Shortest Paths from Owned to Domain Admins'
- 4ตามแต่ละ edge — คลิกดู Abuse Info
- 5abuse ทีละขั้น (Kerberoast→crack, ACL abuse, session theft)
- 6ถึง DCSync rights → dump krbtgt → Golden Ticket (ดูหมวด AD)
7. Quick Reference
- เปลี่ยนความสัมพันธ์ AD เป็นกราฟ → หา attack path
- setup: neo4j start → bloodhound → import .zip จาก SharpHound
- เริ่ม: Mark as Owned → Shortest Paths from Owned
- pre-built: Path to DA, DCSync Rights, Kerberoastable
- edge: GenericAll/WriteDacl/ForceChangePassword/HasSession/DCSync
- คลิก edge → Abuse Info (คำสั่งทีละขั้น)
- Cypher: shortestPath จาก owned:true ไป highvalue:true
🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ
สมมติเพิ่งเจอโจทย์ AD (CTF/lab) มีแค่ Kali เปล่าๆ และ IP ของ DC หรือ credential ต่ำๆ 1 ชุด ยังไม่รู้จะไปทางไหนต่อ — BloodHound คือจุดที่ควรทำก่อนเสมอเมื่อมี foothold ในโดเมน เพราะมันเปลี่ยนการเดาให้กลายเป็นการหา path ที่เป็นระบบ ทำตามนี้ทีละขั้น
- 1เช็คว่าเจอ DC/โดเมนไหม:
nmap -p88,389,445,636,3268 <IP>— 389/445/88 เปิด = น่าจะเป็น DC - 2ยังไม่มี creds เลย ให้ลอง null session ก่อน:
netexec smb <IP> -u '' -p ''หรือldapsearch -x -H ldap://<IP> -b 'dc=domain,dc=local' - 3พอมี creds อย่างน้อย 1 ชุด ยืนยันว่าใช้ได้จริง:
netexec smb <IP> -u user -p pass - 4เก็บข้อมูลทั้งโดเมน:
bloodhound-python -u user -p pass -d domain.local -ns <DC_IP> -c All - 5เปิด BloodHound CE:
docker compose up -dเข้า http://localhost:8080 แล้ว upload ไฟล์ .zip ที่ได้ - 6คลิกขวาที่ node ของ user ที่เรามี → Mark as Owned
- 7รัน pre-built query 'Shortest Paths from Owned Principals' — ดูว่ามีเส้นทางตรงไป Domain Admins ไหม
- 8ยังไม่เห็น ให้รัน query เสริม: 'Find Kerberoastable Accounts', 'Find AS-REP Roastable Users', 'Find Principals with DCSync Rights'
- 9เจอ edge ไหน → ไปทำเทคนิคนั้นต่อทันที (ดู flow ด้านล่าง); ไม่เจอเลย → กลับไปหา cred ใหม่/มุมอื่นแล้วเก็บซ้ำ
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| ตรวจพอร์ต AD/DC | nmap | - | - |
| ทดสอบ null session/creds | netexec (crackmapexec) | apt install netexec | - |
| query LDAP ตรงๆ | ldapsearch | - | - |
| เก็บข้อมูลกราฟ AD | - | pipx install bloodhound (bloodhound-python) | - |
| รัน BloodHound GUI/วิเคราะห์ | - | BloodHound CE (docker compose up -d) | - |
| อ้างอิง edge/abuse info | - | - | bloodhound.readthedocs.io |
| หา syntax คำสั่ง AD ต่างๆ | - | - | wadcoms.github.io |
| อ้างอิงเทคนิค AD ละเอียด | - | - | thehacker.recipes, orange-cyberdefense mindmap |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้