buggy HunterSubdomain enumeration and takeover identification — passive/active discovery, dangling DNS patterns, and scope expansion strategy.
Subdomain takeover is high-value because it allows an attacker to serve content from a trusted, company-owned domain — bypassing browser same-origin trust, phishing filters, and user skepticism simultaneously.
Highest payout contexts:
new., preview., course., delivery., addons-preview.) — abandoned after feature launchesDNS signals:
CNAME pointing to *.github.io, *.gitlab.io, *.fastly.net, *.herokudns.com, *.wordpress.com, *.uservoice.com, *.zendesk.com, *.s3.amazonaws.com, *.azurewebsites.net, *.netlify.appSERVFAIL on the CNAME target while the parent record still exists"There isn't a GitHub Pages site here""NoSuchBucket" (S3)"The specified bucket does not exist""No such app" (Heroku)"Sorry, this shop is currently unavailable" (Shopify)"This UserVoice subdomain is available""Do you want to register" (any domain parking page)"Fastly error: unknown domain"X-Served-By: cache-* (Fastly), X-GitHub-Request-Id, Server: NetlifyCNAME chain resolving to provider infrastructure but returning provider 404*.fastly.net) rather than company domainsubfinder -d target.com -all
- amass enum -passive -d target.com
- assetfinder --subs-only target.com
- Certificate transparency: crt.sh/?q=%.target.com
cat subdomains.txt | dnsx -a -cname -o resolved.txtnuclei or subjack: subjack -w subdomains.txt -t 100 -timeout 30 -ssl -c fingerprints.json
nuclei -l subdomains.txt -t takeovers/dig CNAME subdomain.target.com — confirm CNAME exists
- dig A <cname-target> — confirm NXDOMAIN or no resolution
- curl -sk https://subdomain.target.com — check for provider error string
<username>.github.io/<repo> or org page is unclaimed
- GitLab Pages: check project namespace
- S3: attempt aws s3api create-bucket --bucket <bucketname>
- UserVoice/Zendesk/WordPress: visit registration URL
- Fastly: check if origin hostname is unregistered
subdomain.target.com
domain=.target.com)?
- Is it referenced in the app's CSP?
- Can it receive authenticated API calls?
Bulk CNAME extraction and NXDOMAIN detection:
# Extract CNAMEs and check if target resolves while read sub; do cname=$(dig +short CNAME "$sub" | head -1) if [ -n "$cname" ]; then result=$(dig +short A "$cname") if [ -z "$result" ]; then echo "[POTENTIAL] $sub -> $cname (NXDOMAIN)" fi fi done < subdomains.txtNuclei takeover scan:
nuclei -l subdomains.txt -t ~/nuclei-templates/http/takeovers/ -severity medium,high,criticalsubjack with SSL:
subjack -w subdomains.txt -t 100 -timeout 30 -ssl -c $GOPATH/src/github.com/haccer/subjack/fingerprints.json -vProvider fingerprint grep patterns:
curl -sk "https://$subdomain" | grep -iE \ "there isn't a github pages|no such bucket|no such app|this uservoice|fastly error: unknown domain|do you want to register|sorry, this shop|project not found|404 not found|unclaimed"Check if subdomain is in scope for cookies (shared parent domain):
curl -Isk "https://target.com" | grep -i "set-cookie" | grep "domain=.target.com"Fastly-specific detection:
curl -sI "https://subdomain.target.com" -H "Host: subdomain.target.com" | grep -i "fastly\|x-served-by\|x-cache" curl -sk "https://subdomain.target.com" | grep -i "fastly error"S3 unclaimed bucket check:
aws s3api head-bucket --bucket <extracted-bucket-name> 2>&1 | grep -i "NoSuchBucket\|403\|404"GitLab Pages specific:
dig CNAME sub.target.com # If pointing to *.gitlab.io — visit the gitlab.io URL directly # 404 from gitlab.io project = claimablecourse., new., preview., beta. subdomains provisioned for a product launch, pointed at a third-party, then forgotten when the campaign ends.*.target.com pointing to a cloud provider means any unclaimed subdomain potentially resolves to claimable infrastructure.oberlo.com under Shopify) retain CNAMEs to services that are no longer paid for.Defense: Manual fingerprint review before publishing
*.target.com wildcards often include subdomains implicitly. Escalate impact to get it in scope.postMessage targetOrigin checks in JS.domain=.target.com scope, and may have OAuth/SSO flows hijacked. Depending on CSP configuration, XSS against the main application may be possible.
dig CNAME subdomain.target.com → confirms CNAME to provider
- curl -sk https://subdomain.target.com → confirms provider error string
- Visit provider registration page → confirms namespace is available
- Screenshots of all three steps = reproducible in under 10 minutes
If you cannot show the provider resource is currently unclaimed and claimable, it is not a valid report.
Scenario A — Trusted Brand Phishing via Abandoned SaaS (Snapchat/UserVoice) An attacker finds feedback.snapchat.com CNAME pointing to a UserVoice subdomain. The UserVoice account was cancelled but the DNS record remained. The attacker registers the matching UserVoice subdomain for free, gaining control of feedback.snapchat.com. Any user navigating to that URL — perhaps from old bookmarks or Google results — sees attacker-controlled content on a Snapchat-branded domain. Since the domain is trusted by browsers, phishing campaigns sent from this subdomain bypass email security filters that check domain reputation.
Scenario B — CDN Origin Takeover Enabling Same-Origin Attacks (Mozilla/Fastly) addons-preview-cdn.mozilla.net had a CNAME pointing to a Fastly origin hostname that was no longer registered to Mozilla's Fastly account. An attacker could create a Fastly service claiming that origin hostname, causing all requests to addons-preview-cdn.mozilla.net to be routed to attacker-controlled Fastly infrastructure. Since the subdomain shares the mozilla.net domain, it could be leveraged to serve malicious CDN assets that appear to come from Mozilla's infrastructure, potentially bypassing CSP rules that allowlist *.mozilla.net.
Scenario C — Staging Subdomain Abandoned Post-Product Migration (Rails/GitHub Pages) new.rubyonrails.org was pointed at a GitHub Pages deployment for a website redesign project. After the new site launched and the old GitHub repo was deleted or made private, the DNS CNAME remained. An attacker could fork or create a matching GitHub Pages repository and claim the namespace, serving content under new.rubyonrails.org. Because this is the official Ruby on Rails domain, any content served there — including fake download links or malicious gems — carries the full trust of the Rails brand.
The following real, verified bug-bounty / coordinated-disclosure cases extend this skill with modern provider fingerprints (Vercel/Azure cloudapp/Zendesk/Shopify era) and explicit ATO-chain examples.
cloudapp.azure.com subdomains + wildcard *.visualstudio.com OAuth reply_to → 1-click ATO ([Binary Security writeup](https://www.binarysecurity.no/posts/2022/11/azure-devops-takeover))cloudapp.azure.com regional-pool dangling CNAME — chained to ATO
- ATO chain: YES — app.vssps.visualstudio.com/_signin?reply_to=https://feedsprodwcus0dr.feeds.visualstudio.com/ whitelisted any *.visualstudio.com. Attacker claimed the dangling Azure VM hostnames, then crafted sign-in URLs that returned JWT + FedAuth tokens to attacker-controlled endpoints
- Claim flow: identify dangling cloudapp.azure.com CNAME, deploy a free-tier VM in the same Azure region requesting the exact released hostname, Azure re-issues the name first-come-first-serve
- Year: reported Feb 2021, disclosed Nov 2022 — MSRC explicitly out-of-scope (relied on subdomain takeover), $0
admin-support.xyz.com → unclaimed Zendesk → email interception → ATO ([Writeup by 0xprial](https://0xprial.com/the-art-of-zendesk-hijacking/))xyzdocs.zendesk.com host-mapping
- ATO chain: YES — researcher configured email forwarding on the hijacked Zendesk instance, intercepted support@xyz.com tickets containing payment info + password-reset emails, then triggered password resets on customer accounts that delivered reset links into the attacker's Zendesk inbox
- Claim flow: dig CNAME returns xyzdocs.zendesk.com (unregistered) → register free Zendesk trial → add xyzdocs as subdomain → enable host-mapping for admin-support.xyz.com
- Year: 2023 — $2,000 (Critical: $1,500 base + $500 chain bonus)
proxies.sifchain.finance → dead Vercel project ([H1 #1487793](https://hackerone.com/reports/1487793))cname.vercel-dns.com) after project deletion
- Impact: crypto-DEX phishing — proxies. subdomain trusted for RPC proxy routing; attacker could serve malicious wallet-drain JS under a "trusted" subdomain
- Claim flow: subdomain returns Vercel 404 DEPLOYMENT_NOT_FOUND → create free Vercel project → Settings → Domains → add proxies.sifchain.finance — Vercel verifies the existing CNAME and auto-issues TLS without out-of-band ownership proof
- Year: 2022 — Sifchain treated as Critical (web3 phishing vector)
assets.target.com → unclaimed Fastly service ([Writeup](https://medium.com/@sohailahmed0x0/fastly-subdomain-takeover-leading-to-bounty-reward-5fff711d0518))assets. for script-src
- Claim flow: subdomain returns Fastly error: unknown domain. Please check that this domain has been added to a service → sign up for Fastly free trial → create new CDN service → attach assets.target.com as the service domain — Fastly accepts without out-of-band ownership proof
- Root cause: Fastly historically does not verify CNAME ownership on service-creation; any CNAME pointing into Fastly's anycast can be attached to a fresh service
- Year: 2025 — 4-figure bounty ($1,000-$9,999)
Subdomain takeover by itself is Low-Medium / Informational on most mature programs — defacement of a non-business-critical subdomain is unsexy. The chain payout is 10-100x the standalone. Every takeover should be evaluated against the five chains below before submission. If none apply, you have a Low; if one applies, you have a High; if two compose, you have a Critical.
redirect_uri Whitelist → Auth-Code Theft → 1-Click ATOredirect_uri allowlist via /oauth/authorize flow. Look for any wildcard *.target.com or any takeover-candidate hostname in the static list (e.g., feedsprod.feeds.visualstudio.com, legacy.target.com)./oauth/authorize?redirect_uri=https://legacy.target.com/cb&response_type=code&client_id=<legit>. Victim's browser already has session → auth happens transparently → auth code lands on attacker host. Exchange via token endpoint → ATO.cloudapp.azure.com + wildcard *.visualstudio.com reply_to chain (Binary Security, Nov 2022 — Disclosed Report Citation #12). Multiple H1 disclosures on SaaS programs with permissive OAuth allowlists.app.target.com). If Set-Cookie has Domain=.target.com (parent-scoped) instead of host-only, cookies bleed to every sibling subdomain — including taken-over ones.legacy.target.com, feedback.target.com, assets.target.com). The taken-over host can now Set-Cookie for the parent domain.Set-Cookie: SESSIONID=<attacker_session>; Domain=.target.com via a script on the taken-over host. Victim visits app.target.com with attacker's session cookie attached. Server treats them as the attacker's account → session-fixation ATO.__Host- prefixed session cookie.hunt-auth-bypass Duende BFF Attack Class 2 (cookie-domain wildcarding turns subdomain takeover into session fixation). Affirm S3-bucket-takeover cookie-scope class — Disclosed Report Citation #14 (2022).script-src Includes the Taken-Over Host → Persistent Stored XSS on Main Appscript-src 'self' assets.target.com cdn.target.com legacy.target.com ....<script src="//taken-over-host/x.js"> because the host is on the CSP allowlist. JS executes with main-app origin — full session access, can call any same-origin API.proxies.sifchain.finance Vercel takeover — Disclosed Report Citation #14 (web3 phishing); pattern documented in multiple H1 disclosures 2020-2024.Access-Control-Allow-Origin Regex Match → Credentialed Cross-Origin API ReadAccess-Control-Allow-Origin that includes *.target.com or target.com.* (the second is a common bug).target.com.attacker.com host if suffix-match is broken).fetch('https://api.target.com/account', {credentials:'include'}). CORS preflight passes. Server returns credentialed response. Attacker's JS reads it.hunt-api-misconfig CORS subsection. Pairs with hunt-misc step 1 (CORS regex enumeration).selector1._domainkey.target.com), SPF includes (include:_spf.takeover-candidate.com), MX records (mx.target.com → defunct-provider.example).@target.com.From: support@target.com to victim. Recipient mail server passes SPF + DKIM checks (because the takeover server is now authorised). Email lands in inbox with target.com brand, no security warning.offensive-osint.The five chains above are exhaustive in practice — virtually every senior-tier subdomain-takeover payout maps to one of them. Before reporting any takeover, run through the checklist:
redirect_uri allowlist — does the taken-over host appear? → Chain 1, Critical.Domain=.target.com? → Chain 2, High.script-src — does the taken-over host appear in the allowlist? → Chain 3, Critical.Cross-references:
hunt-oauth — Chain 1 (redirect_uri bypass class)hunt-auth-bypass Duende BFF Attack Class 2 — Chain 2 (cookie scoping)hunt-xss Chain 4 — Chain 3 (CSP bypass via trusted-origin JS)hunt-api-misconfig CORS section — Chain 4offensive-osint email-security section — Chain 5hunt-cloud-misconfig — Most stale CNAMEs point at deleted cloud assets (S3, CloudFront, Heroku). Chain primitive: Cloud misconfig (S3 deleted) + hunt-subdomain → unclaimed CNAME points to bucket → claim bucket name → full subdomain control.hunt-oauth — A takeover on an OAuth redirect_uri host = persistent ATO across the entire SSO surface. Chain primitive: Subdomain takeover at auth.target.com + OAuth redirect_uri allowlist → auth code theft → ATO every user that re-authenticates.hunt-api-misconfig — CORS regexes routinely allowlist a takeoverable subdomain. Chain primitive: Subdomain takeover + CORS *.target.com with credentials → credentialed cross-origin API read → mass IDOR.hunt-xss — A claimed subdomain is same-origin to session-cookie-domain siblings. Chain primitive: Subdomain takeover at feedback.target.com + cookie scope .target.com → JS hosted on takeover host reads main-app cookies → session hijack.security-arsenal — Load the 27+ Subdomain Takeover Fingerprint Table (NoSuchBucket, "no such app", GitHub Pages 404 strings, Heroku, Shopify, Fastly) and the subzy/subjack automation patterns.triage-validation — Apply the Unique-Marker gate: takeover claim is informational on its own; submit only after publishing a unique HTML marker on the claimed host AND demonstrating a downstream impact (cookie read, OAuth chain, CSP bypass).Questions about Subdomain Hunter?