hunt-subdomain – DevOps & Infrastructure skill for AI agents
Hunting skill for subdomain takeover vulnerabilities. Includes modern provider fingerprints — Microsoft Azure DevOps `cloudapp.azure.com` regional-pool re-issue (1-click OAuth ATO via wildcard `reply_to`, Binary Security), Zendesk help-desk takeover → email interception → password reset chain (0xprial writeup), Vercel
Install the hunt-subdomain skill with one command
Pick the tool you use, copy the command and paste it in your terminal. The skill lands in that tool's skills folder and is ready in your next session.
Claude Code
mkdir -p ~/.claude/skills && curl -fsSL https://skill.dn1nguoi.com/z/hunt-subdomain-0eb4a.tgz | tar xz -C ~/.claude/skills
Call it in Claude Code: /hunt-subdomain – then describe the task you want done.
Codex
mkdir -p ~/.codex/skills && curl -fsSL https://skill.dn1nguoi.com/z/hunt-subdomain-0eb4a.tgz | tar xz -C ~/.codex/skills
Call it in Codex: $hunt-subdomain – then describe the task you want done.
Hermes Agent
mkdir -p ~/.hermes/skills && curl -fsSL https://skill.dn1nguoi.com/z/hunt-subdomain-0eb4a.tgz | tar xz -C ~/.hermes/skills
Call it in Hermes Agent: /hunt-subdomain – then describe the task you want done.
DeepSeek
mkdir -p ~/.deepcode/skills && curl -fsSL https://skill.dn1nguoi.com/z/hunt-subdomain-0eb4a.tgz | tar xz -C ~/.deepcode/skills
Call it in DeepSeek: /hunt-subdomain – then describe the task you want done.
SKILL.md content
Crown Jewel Targets
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:
- Subdomains of major SaaS brands (Shopify, Snapchat, Mozilla, Yelp) where the trusted domain has user session context
- CDN-backed subdomains (Fastly, CloudFront) where CNAME points to unclaimed origins
- Third-party service integrations: UserVoice, WordPress.com, GitHub Pages, GitLab Pages, Heroku, Zendesk
- Preview/staging/dev subdomains (
new.,preview.,course.,delivery.,addons-preview.) — abandoned after feature launches - Subdomains used for OAuth redirect URIs or SSO endpoints — these pay highest
Asset types that matter most:
- CNAME records pointing to deprovisioned third-party services
- NS delegations to abandoned zones
- A records pointing to unallocated cloud IPs (less common)
- GitLab/GitHub Pages with unclaimed project namespaces
---
Attack Surface Signals
DNS signals:
CNAMEpointing to*.github.io,*.gitlab.io,*.fastly.net,*.herokudns.com,*.wordpress.com,*.uservoice.com,*.zendesk.com,*.s3.amazonaws.com,*.azurewebsites.net,*.netlify.app- NXDOMAIN or
SERVFAILon the CNAME target while the parent record still exists - NS records delegating to registrars where the zone is no longer registered
HTTP response signals:
"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)- HTTP 404 with provider-specific error templates
- Fastly:
"Fastly error: unknown domain" "404 Web Site not found"(Azure App Service)
Tech stack signals:
- Response headers:
X-Served-By: cache-*(Fastly),X-GitHub-Request-Id,Server: Netlify CNAMEchain resolving to provider infrastructure but returning provider 404- SSL cert issued to provider wildcard (
*.fastly.net) rather than company domain
---
Step-by-Step Hunting Methodology
1. Enumerate all subdomains for the target using passive + active sources:
subfinder -d target.com -allamass enum -passive -d target.comassetfinder --subs-only target.com- Certificate transparency:
crt.sh/?q=%.target.com
2. Resolve all subdomains and flag those with:
- NXDOMAIN responses
- CNAME pointing to a third-party provider
cat subdomains.txt | dnsx -a -cname -o resolved.txt
3. Cross-reference CNAMEs against known vulnerable provider fingerprints using nuclei or subjack:
subjack -w subdomains.txt -t 100 -timeout 30 -ssl -c fingerprints.json
nuclei -l subdomains.txt -t takeovers/
4. Manual verification for each flagged subdomain:
dig CNAME subdomain.target.com— confirm CNAME existsdig A <cname-target>— confirm NXDOMAIN or no resolutioncurl --max-time 30 --connect-timeout 10 -sk https://subdomain.target.com— check for provider error string
5. Confirm claimability — attempt to register the resource:
- GitHub Pages: check if
<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
6. Claim the resource (only enough to prove control — do NOT serve malicious content):
- Create a minimal index page with your HackerOne username and a timestamp
- Take screenshot showing your content served on
subdomain.target.com
7. Document the chain: CNAME record → provider target → unclaimed resource → your content
8. Assess impact escalation:
- Does the subdomain appear in OAuth redirect allowlists?
- Does it share cookies with parent domain (
domain=.target.com)? - Is it referenced in the app's CSP?
- Can it receive authenticated API calls?
9. Write report before releasing the claim (some programs want to verify first)
---
Payload & Detection Patterns
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 --max-time 30 --connect-timeout 10 -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 --max-time 30 --connect-timeout 10 -Isk "https://target.com" | grep -i "set-cookie" | grep "domain=.target.com"Fastly-specific detection:
curl --max-time 30 --connect-timeout 10 -sI "https://subdomain.target.com" -H "Host: subdomain.target.com" | grep -i "fastly\|x-served-by\|x-cache"
curl --max-time 30 --connect-timeout 10 -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 = claimable---
Common Root Causes
1. Service offboarding without DNS cleanup — Developer removes a Heroku app, UserVoice account, or WordPress site but never deletes the CNAME record. DNS lives forever; service does not.
2. Staging/preview infrastructure abandoned post-launch — course., new., preview., beta. subdomains provisioned for a product launch, pointed at a third-party, then forgotten when the campaign ends.
3. Subdomain provisioned by a third-party team — Marketing sets up a UserVoice or Zendesk subdomain via IT, product sunset kills it, but DNS is owned by engineering who doesn't know.
4. CDN misconfiguration without origin validation — Fastly and similar CDNs historically allowed any domain to "claim" a backend hostname by creating a service pointing to it. Unregistered origin hostnames become claimable.
5. GitHub/GitLab Pages namespace not reserved — Organization renames, user accounts deleted, or repos made private/deleted while the Pages CNAME still points to the old namespace.
6. Wildcard DNS entries — *.target.com pointing to a cloud provider means *any* unclaimed subdomain potentially resolves to claimable infrastructure.
7. Acquired/divested company DNS not cleaned — Post-acquisition, former brand subdomains (like oberlo.com under Shopify) retain CNAMEs to services that are no longer paid for.
---
Bypass Techniques
Defense: Manual fingerprint review before publishing
- Bypass: Use alternative error strings — providers change their 404 pages. Maintain an up-to-date fingerprint list. Some providers show *different* errors on HTTP vs HTTPS. Test both.
Defense: Scope restrictions (only main domain in scope)
- Bypass: Check program's asset list carefully —
*.target.comwildcards often include subdomains implicitly. Escalate impact to get it in scope.
Defense: "Can't reproduce" responses due to timing
- Bypass: Screenshot immediately after claiming. Record a video walkthrough. The window can be short for popular subdomains.
Defense: HTTPS certificate mismatch blocking proof
- Bypass: Some providers (GitHub Pages, Netlify) auto-provision TLS for claimed domains. Others don't — show HTTP takeover and note TLS would be resolved by provider on claim.
Defense: Provider-side validation (Fastly verifying domain ownership)
- Bypass: Some Fastly configurations don't validate origin hostnames. Check if the CNAME target is a generic Fastly backend hostname vs. a customer-verified one. Try claiming anyway and observe behavior.
Defense: Rate limiting on subdomain enumeration
- Bypass: Use passive-only sources (SecurityTrails, Shodan, crt.sh, VirusTotal) to avoid triggering WAF/IDS. DNS resolution doesn't touch the web server.
Defense: Program claims "low severity / no impact"
- Bypass: Demonstrate same-origin cookie theft, OAuth redirect abuse, or CSP bypass to escalate. Find if the subdomain is listed in any `po
… (full content is in the download package)
Related skills
- block-storage – Manage block storage volumes and LVM. Configure cloud block storage and local disks. Use…
- blue-green-deploy – Configure zero-downtime deployment strategies including blue-green, canary, and rolling…
- prometheus-configuration – Set up Prometheus for comprehensive metric collection, storage, and monitoring of…
- gcp-cloud-architect – Design GCP architectures for startups and enterprises. Use when asked to design Google…
- bumblebee – Run Bumblebee supply-chain inventory and exposure scans on macOS/Linux to detect…
- cdk-patterns – Common AWS CDK patterns and constructs for building cloud infrastructure with…
- offensive-osint – Operational arsenal for authorized external red-team and bug-bounty recon. Concrete…
- circleci – Configure CircleCI workflows and orbs for continuous integration and deployment.