คลัง
active-directory

BloodHound

BloodHound แปลงความสัมพันธ์ที่ซับซ้อนใน Active Directory ให้เป็นกราฟ เพื่อหา attack path สู่เป้าหมาย (มัก Domain Admin) โดยอัตโนมัติ บทนี้ลงลึกการตั้งค่า, การ import, pre-built queries ทั้งหมด, การอ่าน edge และ abuse, custom Cypher, และ workflow การหาเส้นทาง (เนื้อหาเพื่อทดสอบในระบบที่ได้รับอนุญาตเท่านั้น)

IntermediateAdvanced#bloodhound#active-directory#attack-path#graph#cypher#neo4j#ctf

1. BloodHound ทำอะไร

AD ขนาดใหญ่มีความสัมพันธ์ซับซ้อนมาก (ใครเป็นสมาชิก group ไหน, ใคร admin เครื่องไหน, ใครมีสิทธิ์เหนือ object ใด) ที่มนุษย์ตามด้วยมือไม่ไหว BloodHound เก็บข้อมูลเหล่านี้ (ผ่าน SharpHound) ใส่ graph database (neo4j) แล้วให้เราถามว่า 'จากจุดที่ฉันยืนอยู่ ไปถึง Domain Admin ได้ทางไหนบ้าง' — แสดงเป็นเส้นทางกราฟ พลิกการโจมตี AD จากการเดาเป็นการหา path ที่เป็นระบบ

เนื้อหานี้เพื่อการทดสอบเจาะระบบที่ได้รับอนุญาต (engagement/lab/CTF) เท่านั้น
Active Directory — เส้นทางสู่ Domain Admin
Initial access (user ในโดเมน)
หา attack path ใน BloodHound
Shortest Path to DA / Kerberoastable / ACL
หา quick win
SPN accountKerberoasting → crack
no-preauthAS-REP Roasting
ACL / delegation misconfig
GenericAll/WriteDaclACL Abuse
DCSync rightsDCSync → krbtgt
Domain Admin / ยึดโดเมน

2. ตั้งค่าและ import

เริ่ม neo4j + BloodHound + import
# เริ่ม neo4j
sudo neo4j start
# เปิด http://localhost:7474 ตั้งรหัส (ครั้งแรก neo4j:neo4j)

# เปิด BloodHound GUI
bloodhound
# login เข้า neo4j

# import: ลากไฟล์ .json/.zip จาก SharpHound เข้าหน้าต่าง BloodHound
# (collection ดูหัวข้อ SharpHound)
BloodHound Community Edition (BHCE) รุ่นใหม่ใช้ docker-compose; รุ่น legacy ใช้ neo4j + GUI ตามนี้

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 — เครื่องเก่า/ช่องโหว่
ขั้นแรกเสมอ: หา node ของบัญชีที่คุมได้ → คลิกขวา → Mark as Owned → รัน 'Shortest Paths from Owned Principals' = เห็นเส้นทางจริงจากจุดที่ยืนไป DA

4. อ่าน edge และวิธี abuse

edgeความหมายabuse
MemberOfเป็นสมาชิก groupได้สิทธิ์ของ group
AdminTolocal admin ของเครื่องlogin → dump credential
HasSessionมี session บนเครื่องขโมย token/credential
GenericAllคุม object เต็มเปลี่ยนรหัส/เพิ่มสมาชิก (ดู ACL Abuse)
GenericWriteเขียน attributeตั้ง SPN (targeted Kerberoast)
WriteDaclแก้ DACL ได้ให้สิทธิ์ตัวเองเพิ่ม
WriteOwnerเปลี่ยนเจ้าของ objectยึด object
ForceChangePasswordเปลี่ยนรหัส userยึดบัญชี
AllowedToDelegateconstrained delegationปลอมตัวเป็น user อื่น
DCSyncสิทธิ์ replicatedump hash ทั้งโดเมน (ดู DCSync)
คลิกที่ edge ใดๆ ในกราฟ → tab 'Abuse Info' มีคำอธิบาย + คำสั่งทีละขั้น (ทั้ง Windows/Linux) สำหรับ abuse edge นั้น — ใช้เป็นคู่มือ exploit ได้เลย

5. Custom Cypher queries

Cypher ที่มีประโยชน์
// 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:"USER@DOMAIN.LOCAL"})-[r]->(n) RETURN p

// หาเครื่องที่ DA มี session อยู่ (ไปยึด)
MATCH (u:User)-[:MemberOf*1..]->(g:Group {name:"DOMAIN ADMINS@DOMAIN.LOCAL"})
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 p
พิมพ์ Cypher ในช่อง Raw Query (ล่าง); STARTS WITH/CONTAINS match ชื่อ; owned:true = node ที่ mark

6. Workflow

  1. 1collect ด้วย SharpHound (-c All) → import .zip
  2. 2Mark บัญชีที่คุมได้เป็น Owned (คลิกขวา node)
  3. 3รัน 'Shortest Paths from Owned to Domain Admins'
  4. 4ตามแต่ละ edge — คลิกดู Abuse Info
  5. 5abuse ทีละขั้น (Kerberoast→crack, ACL abuse, session theft)
  6. 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. 1เช็คว่าเจอ DC/โดเมนไหม: nmap -p88,389,445,636,3268 <IP> — 389/445/88 เปิด = น่าจะเป็น DC
  2. 2ยังไม่มี creds เลย ให้ลอง null session ก่อน: netexec smb <IP> -u '' -p '' หรือ ldapsearch -x -H ldap://<IP> -b 'dc=domain,dc=local'
  3. 3พอมี creds อย่างน้อย 1 ชุด ยืนยันว่าใช้ได้จริง: netexec smb <IP> -u user -p pass
  4. 4เก็บข้อมูลทั้งโดเมน: bloodhound-python -u user -p pass -d domain.local -ns <DC_IP> -c All
  5. 5เปิด BloodHound CE: docker compose up -d เข้า http://localhost:8080 แล้ว upload ไฟล์ .zip ที่ได้
  6. 6คลิกขวาที่ node ของ user ที่เรามี → Mark as Owned
  7. 7รัน pre-built query 'Shortest Paths from Owned Principals' — ดูว่ามีเส้นทางตรงไป Domain Admins ไหม
  8. 8ยังไม่เห็น ให้รัน query เสริม: 'Find Kerberoastable Accounts', 'Find AS-REP Roastable Users', 'Find Principals with DCSync Rights'
  9. 9เจอ edge ไหน → ไปทำเทคนิคนั้นต่อทันที (ดู flow ด้านล่าง); ไม่เจอเลย → กลับไปหา cred ใหม่/มุมอื่นแล้วเก็บซ้ำ
จาก creds ต่ำ → เห็น path → ลงมือ
มี creds ต่ำ 1 ชุด หรือแค่ null session (ยืนยันแล้วว่าเจอ DC)
nmap -p88,389,445,3268 <DC-IP>
✅ มี valid creds (user:pass หรือ hash)→ เก็บข้อมูลด้วย bloodhound-python
❌ ไม่มี creds เลย มีแต่ null session→ ลอง anonymous LDAP/null session ก่อน
ลอง null session
netexec smb DC_IP -u '' -p '' ; ldapsearch -x -H ldap://DC -b 'dc=...'
✅ query ได้ (anonymous bind เปิด)→ ได้ user list ไปลอง AS-REP Roasting แบบไม่ auth
❌ ปิดหมด ทำอะไรไม่ได้→ ต้องหา foothold ใหม่ (web app/phishing/leak) ก่อน
เก็บข้อมูลด้วย bloodhound-python -c All
bloodhound-python -u user -p pass -d domain.local -ns DC_IP -c All
✅ เก็บสำเร็จ ได้ .zip→ import เข้า BloodHound CE + Mark as Owned
❌ error (clock skew/LDAP fail)→ ไปดูวิธีแก้ที่หัวข้อ SharpHound แล้วลองใหม่
Mark as Owned → รัน Shortest Paths from Owned Principals
✅ เจอ path ตรงถึง Domain Admins→ ดู edge แต่ละอันแล้วไล่ทำตาม
❌ ไม่เจอ path จาก node นี้→ ลอง pre-built query อื่น (Kerberoastable/ASREP/DCSync)
เจอ edge ตรง — เป็นแบบไหน?
HasSPN / Kerberoastable→ ไป Kerberoasting
DONT_REQUIRE_PREAUTH→ ไป ASREP Roasting
GenericAll/WriteDacl/AddMember ฯลฯ→ ไป ACL Abuse
AllowedToDelegate/Unconstrained/RBCD→ ไป Delegation Abuse
DCSync rights→ ไป DCSync ตรงๆ
ยังไม่เจอ path — ลอง query กว้างขึ้นทั้งโดเมน
เจอ Kerberoastable/ASREP accounts บ้าง→ ยิงรวมแล้ว crack ดูก่อน
ไม่เจอจริงๆ ตันสนิท→ กลับไปหา cred ใหม่/host อื่น แล้วเก็บซ้ำ
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
ตรวจพอร์ต AD/DCnmap--
ทดสอบ null session/credsnetexec (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
🚑 ถ้าตันสนิท ลองท่าถัดไป: Kerberoasting (เจอ SPN account) · AS-REP Roasting (เจอ user ปิด pre-auth หรือยังไม่มี creds เลย) · ACL Abuse (เจอ edge GenericAll/WriteDacl) · SharpHound (ถ้า bloodhound-python เก็บข้อมูลไม่สำเร็จ ลอง collector อื่น) · DCSync (ถ้า BloodHound ชี้ว่ามีสิทธิ์ replication อยู่แล้ว)

โน้ตของฉัน

ยังไม่มีโน้ตสำหรับหัวข้อนี้