<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mika</title>
    <description>The latest articles on DEV Community by Mika (@mikaww1).</description>
    <link>https://dev.to/mikaww1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3887366%2F596a03dc-6eb6-435b-b923-469278970244.png</url>
      <title>DEV Community: Mika</title>
      <link>https://dev.to/mikaww1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mikaww1"/>
    <language>en</language>
    <item>
      <title>How to Audit Your DNS Records for Subdomain Takeover Vulnerabilities</title>
      <dc:creator>Mika</dc:creator>
      <pubDate>Wed, 13 May 2026 19:37:11 +0000</pubDate>
      <link>https://dev.to/mikaww1/how-to-audit-your-dns-records-for-subdomain-takeover-vulnerabilities-4380</link>
      <guid>https://dev.to/mikaww1/how-to-audit-your-dns-records-for-subdomain-takeover-vulnerabilities-4380</guid>
      <description>&lt;p&gt;If you run a website, manage infrastructure, or work in DevOps — there's a good chance you have at least one forgotten subdomain pointing at a service you no longer use.&lt;/p&gt;

&lt;p&gt;It's not negligence. It's just how the web works. Teams spin up services constantly — staging environments, marketing landing pages, support portals, documentation sites — and when those services get shut down, DNS records are rarely the first thing anyone thinks about.&lt;/p&gt;

&lt;p&gt;The problem is that a forgotten DNS record isn't just clutter. It can be a serious security vulnerability.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's the risk?
&lt;/h2&gt;

&lt;p&gt;When a subdomain points to an external service via a CNAME record, and that service is no longer configured, an attacker can register the unclaimed service and take control of your subdomain.&lt;/p&gt;

&lt;p&gt;This is called a &lt;strong&gt;subdomain takeover&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;staging.yourcompany.com  →  CNAME  →  old-app.herokuapp.com  →  ❌ unclaimed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An attacker who notices this can register &lt;code&gt;old-app.herokuapp.com&lt;/code&gt; and immediately control what appears at &lt;code&gt;staging.yourcompany.com&lt;/code&gt; — a URL that looks completely legitimate to anyone visiting it.&lt;/p&gt;

&lt;p&gt;From there they can serve phishing pages, steal session cookies, bypass Content Security Policy, or just damage your brand.&lt;/p&gt;

&lt;p&gt;It sounds obscure, but it appears regularly in bug bounty reports and has been found on domains belonging to major companies.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 — Discover all your subdomains
&lt;/h2&gt;

&lt;p&gt;Before you can audit your DNS records, you need to know what subdomains exist. Most teams don't have a complete inventory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Certificate Transparency logs&lt;/strong&gt; are the easiest starting point. Every SSL certificate issued for your domain is publicly logged, which means you can query these logs to find subdomains that have had certificates issued.&lt;/p&gt;

&lt;p&gt;Go to &lt;a href="https://crt.sh" rel="noopener noreferrer"&gt;crt.sh&lt;/a&gt; and search for &lt;code&gt;%.yourdomain.com&lt;/code&gt; — it will return every subdomain that's ever had a certificate.&lt;/p&gt;

&lt;p&gt;Alternatively, tools like &lt;a href="https://www.subdomainchecker.com" rel="noopener noreferrer"&gt;SubdomainChecker&lt;/a&gt; have an Enumerate mode that does this automatically — enter your root domain and it queries certificate transparency logs and checks each subdomain for takeover vulnerabilities in one step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you're looking for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subdomains you don't recognize&lt;/li&gt;
&lt;li&gt;Subdomains for services you no longer use&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  - Old staging, dev, or test environments
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Step 2 — Check each subdomain's CNAME records
&lt;/h2&gt;

&lt;p&gt;For each subdomain, check what it points to. You can do this with &lt;code&gt;dig&lt;/code&gt; or &lt;code&gt;nslookup&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig CNAME staging.yourcompany.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look at what the CNAME points to. Ask yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this service still active?&lt;/li&gt;
&lt;li&gt;Do we still use this service?&lt;/li&gt;
&lt;li&gt;Who owns this service account?
If you can't answer these questions confidently, that subdomain needs attention.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 3 — Check for takeover fingerprints
&lt;/h2&gt;

&lt;p&gt;For each subdomain that points to an external service, visit the URL and look at what it returns. Most platforms return a specific error page when a service is unconfigured:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Vulnerable fingerprint&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Pages&lt;/td&gt;
&lt;td&gt;"There isn't a GitHub Pages site here"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heroku&lt;/td&gt;
&lt;td&gt;"No such app"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS S3&lt;/td&gt;
&lt;td&gt;"NoSuchBucket"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vercel&lt;/td&gt;
&lt;td&gt;"The deployment could not be found"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Netlify&lt;/td&gt;
&lt;td&gt;"Not Found - Request ID"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zendesk&lt;/td&gt;
&lt;td&gt;"Help Center Closed"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shopify&lt;/td&gt;
&lt;td&gt;"Sorry, this shop is currently unavailable"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you see one of these messages on your own subdomain — it's vulnerable.&lt;/p&gt;

&lt;p&gt;Doing this manually for every subdomain is tedious. &lt;a href="https://www.subdomainchecker.com" rel="noopener noreferrer"&gt;SubdomainChecker&lt;/a&gt; automates this — it follows the full CNAME chain, checks fingerprints against 80+ services, and tells you exactly which subdomains are vulnerable and why.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 — Fix vulnerable subdomains
&lt;/h2&gt;

&lt;p&gt;For each vulnerable subdomain you find, you have two options:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option A — Delete the DNS record&lt;/strong&gt;&lt;br&gt;
If you no longer need the subdomain, just remove the CNAME record from your DNS settings. This is the cleanest fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option B — Reconfigure the service&lt;/strong&gt;&lt;br&gt;
If you still need the subdomain, reconfigure the external service properly so the subdomain points to an active, claimed resource.&lt;/p&gt;

&lt;p&gt;Either way, act quickly. A dangling CNAME is a ticking clock.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — Set up ongoing monitoring
&lt;/h2&gt;

&lt;p&gt;A one-time audit isn't enough. New subdomains get created and services get decommissioned all the time. The fix is to make DNS auditing part of your regular process.&lt;/p&gt;

&lt;p&gt;A few practical approaches:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add it to your offboarding checklist&lt;/strong&gt; — whenever a service gets decommissioned, DNS cleanup should be one of the first steps, not an afterthought.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run periodic checks&lt;/strong&gt; — set a calendar reminder to run a subdomain takeover check every quarter, especially after infrastructure changes or migrations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automate it&lt;/strong&gt; — if you have a larger infrastructure, use the &lt;a href="https://rapidapi.com/mikaww1/api/subdomain-takeover-checker" rel="noopener noreferrer"&gt;SubdomainChecker API&lt;/a&gt; to run automated checks as part of your CI/CD pipeline or security monitoring workflow. The API has a bulk endpoint that checks up to 25 subdomains per request.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 10-minute audit
&lt;/h2&gt;

&lt;p&gt;If you want to do a quick audit right now:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://crt.sh" rel="noopener noreferrer"&gt;crt.sh&lt;/a&gt; and search &lt;code&gt;%.yourdomain.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Copy the list of subdomains&lt;/li&gt;
&lt;li&gt;Paste them into &lt;a href="https://www.subdomainchecker.com" rel="noopener noreferrer"&gt;SubdomainChecker&lt;/a&gt; using Bulk mode&lt;/li&gt;
&lt;li&gt;Review any results flagged as VULNERABLE or UNKNOWN
Or use Enumerate mode to do steps 1-3 automatically.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The whole thing takes about 10 minutes. For most small to medium websites, you'll either find nothing (good) or find one or two forgotten subdomains that need cleanup (also good — better you find them than an attacker).&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Subdomain takeovers happen when a CNAME points to an unclaimed external service&lt;/li&gt;
&lt;li&gt;They're common because DNS cleanup is easy to forget&lt;/li&gt;
&lt;li&gt;Discovery: use certificate transparency logs to find all your subdomains&lt;/li&gt;
&lt;li&gt;Detection: check CNAME targets and look for known vulnerable fingerprints&lt;/li&gt;
&lt;li&gt;Fix: delete the DNS record or reconfigure the service&lt;/li&gt;
&lt;li&gt;Prevention: make DNS auditing part of your regular process&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>devops</category>
      <category>webdev</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Top 10 Services Most Vulnerable to Subdomain Takeover (And How to Detect Them)</title>
      <dc:creator>Mika</dc:creator>
      <pubDate>Tue, 28 Apr 2026 11:51:54 +0000</pubDate>
      <link>https://dev.to/mikaww1/top-10-services-most-vulnerable-to-subdomain-takeover-and-how-to-detect-them-4a06</link>
      <guid>https://dev.to/mikaww1/top-10-services-most-vulnerable-to-subdomain-takeover-and-how-to-detect-them-4a06</guid>
      <description>&lt;p&gt;Subdomain takeovers are one of the most underrated vulnerabilities in web security. They're easy to miss, surprisingly common, and can have serious consequences — phishing pages served under your own domain, session cookie theft, or brand damage.&lt;/p&gt;

&lt;p&gt;The attack always follows the same pattern: a subdomain points to an external service via a CNAME record, the service gets deprovisioned, but nobody removes the DNS record. The subdomain is now dangling — and claimable by anyone.&lt;/p&gt;

&lt;p&gt;Here are the 10 services where this happens most often, along with the fingerprint that gives it away.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. GitHub Pages
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fingerprint:&lt;/strong&gt; &lt;code&gt;There isn't a GitHub Pages site here&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;GitHub Pages is one of the most common culprits. Developers frequently set up &lt;code&gt;docs.example.com&lt;/code&gt; or &lt;code&gt;blog.example.com&lt;/code&gt; pointing to a GitHub Pages site, then delete the repository or disable Pages without removing the CNAME record.&lt;/p&gt;

&lt;p&gt;Anyone can create a GitHub Pages site at the dangling address and immediately serve content under your subdomain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example CNAME chain:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docs.example.com → username.github.io → ❌ unclaimed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Heroku
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fingerprint:&lt;/strong&gt; &lt;code&gt;No such app&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Heroku is a classic. Staging environments, side projects, and old prototypes frequently get deleted while their DNS records live on. The "No such app" page is one of the most recognizable takeover signals in bug bounty hunting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example CNAME chain:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;staging.example.com → old-app.herokuapp.com → ❌ unclaimed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. AWS S3
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fingerprint:&lt;/strong&gt; &lt;code&gt;NoSuchBucket&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;S3 buckets configured for static website hosting are highly susceptible. When a bucket is deleted, the subdomain pointing to it becomes claimable by anyone who creates a new bucket with the same name in the same region.&lt;/p&gt;

&lt;p&gt;This one is particularly dangerous because S3 buckets can serve arbitrary files — including HTML pages and scripts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example CNAME chain:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;assets.example.com → example-assets.s3-website-us-east-1.amazonaws.com → ❌ bucket deleted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Vercel
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fingerprint:&lt;/strong&gt; &lt;code&gt;The deployment could not be found&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Vercel deployments are spun up and torn down constantly. When a project gets deleted or a custom domain gets removed from a Vercel project without cleaning up DNS, the subdomain dangles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example CNAME chain:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app.example.com → cname.vercel-dns.com → ❌ project deleted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Netlify
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fingerprint:&lt;/strong&gt; &lt;code&gt;Not Found - Request ID&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Same story as Vercel. Netlify sites get deleted all the time — marketing landing pages, campaign microsites, A/B test variants. The DNS record outlives the site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example CNAME chain:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;landing.example.com → example.netlify.app → ❌ site deleted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Azure
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fingerprint:&lt;/strong&gt; &lt;code&gt;404 Web Site not found&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Azure has multiple vulnerable services — App Service, Front Door, CDN, Traffic Manager. Enterprise companies running on Azure often have dozens of subdomains pointing to Azure resources, and decommissioning processes don't always include DNS cleanup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example CNAME chain:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;portal.example.com → example.azurewebsites.net → ❌ app deleted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Shopify
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fingerprint:&lt;/strong&gt; &lt;code&gt;Sorry, this shop is currently unavailable&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;E-commerce businesses frequently set up custom subdomains for their Shopify stores — &lt;code&gt;shop.example.com&lt;/code&gt; or &lt;code&gt;store.example.com&lt;/code&gt;. When they migrate platforms or shut down the store, the CNAME often stays.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example CNAME chain:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;shop.example.com → example.myshopify.com → ❌ shop closed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Zendesk
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fingerprint:&lt;/strong&gt; &lt;code&gt;Help Center Closed&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Support portals are a goldmine for subdomain takeovers. Companies set up &lt;code&gt;help.example.com&lt;/code&gt; or &lt;code&gt;support.example.com&lt;/code&gt; pointing to Zendesk, then migrate to a different support platform without cleaning up DNS.&lt;/p&gt;

&lt;p&gt;A takeover here is particularly dangerous — users trusting a support subdomain might enter credentials or sensitive information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example CNAME chain:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;help.example.com → example.zendesk.com → ❌ account closed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  9. Ghost / Ghost.io
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fingerprint:&lt;/strong&gt; &lt;code&gt;Domain not configured&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ghost is a popular blogging platform. &lt;code&gt;blog.example.com&lt;/code&gt; pointing to a Ghost instance is extremely common, and when companies rebrand or migrate their blog, the DNS record is often forgotten.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example CNAME chain:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;blog.example.com → example.ghost.io → ❌ site not configured
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  10. Fastly
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fingerprint:&lt;/strong&gt; &lt;code&gt;Fastly error: unknown domain&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;CDN takeovers are less common but high impact. Fastly serves content for massive amounts of web traffic, and a dangling CNAME to a Fastly endpoint means an attacker could potentially intercept or serve content to users expecting your site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example CNAME chain:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cdn.example.com → example.global.ssl.fastly.net → ❌ service not configured
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How to detect these vulnerabilities
&lt;/h2&gt;

&lt;p&gt;Detection comes down to two things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Check for NXDOMAIN&lt;/strong&gt;&lt;br&gt;
Follow the full CNAME chain. If the final destination returns NXDOMAIN — the domain doesn't exist in DNS — you have a dangling CNAME regardless of the service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Check for service fingerprints&lt;/strong&gt;&lt;br&gt;
If the target resolves but returns one of the error messages above, the service exists but isn't configured for that domain. That's your takeover signal.&lt;/p&gt;

&lt;p&gt;You can check any subdomain automatically using &lt;strong&gt;&lt;a href="https://www.subdomainchecker.com" rel="noopener noreferrer"&gt;SubdomainChecker&lt;/a&gt;&lt;/strong&gt; — it follows CNAME chains, checks fingerprints against 80+ services, and even enumerates subdomands from certificate transparency logs so you don't have to find them manually.&lt;/p&gt;

&lt;p&gt;There's also a free API if you want to integrate takeover detection into your own recon pipeline: &lt;strong&gt;&lt;a href="https://rapidapi.com/mikaww1/api/subdomain-takeover-checker" rel="noopener noreferrer"&gt;RapidAPI&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How to protect yourself
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Keep a DNS inventory&lt;/strong&gt; — know what every subdomain points to&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove DNS records before decommissioning services&lt;/strong&gt; — DNS cleanup should be step one, not an afterthought&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit regularly&lt;/strong&gt; — run a takeover check every few months, especially after infrastructure changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automate it&lt;/strong&gt; — use the API to run checks automatically as part of your CI/CD pipeline or security monitoring&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Subdomain takeovers are preventable. The vulnerability only exists because of forgotten DNS records — and a 30-second check is all it takes to find them.&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>I Ran a Subdomain Takeover Checker on GitHub.com and Found a Vulnerable Subdomain</title>
      <dc:creator>Mika</dc:creator>
      <pubDate>Wed, 22 Apr 2026 19:23:42 +0000</pubDate>
      <link>https://dev.to/mikaww1/i-ran-a-subdomain-takeover-checker-on-githubcom-and-found-a-vulnerable-subdomain-5ba2</link>
      <guid>https://dev.to/mikaww1/i-ran-a-subdomain-takeover-checker-on-githubcom-and-found-a-vulnerable-subdomain-5ba2</guid>
      <description>&lt;p&gt;I've been building a tool that checks subdomains for takeover vulnerabilities. Yesterday I decided to test it on a well-known target — github.com — just to see what it would find.&lt;/p&gt;

&lt;p&gt;I wasn't expecting much. GitHub is a massive, well-maintained platform with a serious security team. But within seconds of running the enumeration, one result came back red:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brandguide.github.com — VULNERABLE
Service: github.io
Reason: Unconfigured fingerprint found for github.io
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fby1b37o2in2nsmsqtc62.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fby1b37o2in2nsmsqtc62.png" alt="Results" width="671" height="711"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What does this mean?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;brandguide.github.com&lt;/code&gt; has a CNAME record pointing to a GitHub Pages address that is no longer configured. The page returns GitHub's classic "There isn't a GitHub Pages site here" message — which is the exact fingerprint that indicates an unclaimed Pages site.&lt;/p&gt;

&lt;p&gt;In theory, anyone could create a GitHub Pages site at that address and serve content under &lt;code&gt;brandguide.github.com&lt;/code&gt; — a subdomain that looks like it belongs to GitHub.&lt;/p&gt;

&lt;p&gt;This is a textbook subdomain takeover.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the tool found it
&lt;/h2&gt;

&lt;p&gt;The tool uses two steps to detect takeovers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Enumerate subdomains via certificate transparency logs&lt;/strong&gt;&lt;br&gt;
Certificate authorities are required to publicly log every SSL certificate they issue. By querying &lt;a href="https://crt.sh" rel="noopener noreferrer"&gt;crt.sh&lt;/a&gt;, you can discover subdomains that have had certificates issued — no scanning, no probing, just reading public records.&lt;/p&gt;

&lt;p&gt;For github.com this returned dozens of subdomains instantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — Check each subdomain for takeover vulnerabilities&lt;/strong&gt;&lt;br&gt;
For each subdomain, the tool follows the full CNAME chain. If the final destination returns NXDOMAIN (the domain doesn't exist) or matches a known "unconfigured" fingerprint from services like GitHub Pages, Heroku, Vercel, AWS S3, and 80+ others — it flags the subdomain as vulnerable.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;brandguide.github.com&lt;/code&gt; passed through the CNAME chain check and matched the GitHub Pages fingerprint. Result: vulnerable.&lt;/p&gt;

&lt;h2&gt;
  
  
  This happens more than you think
&lt;/h2&gt;

&lt;p&gt;GitHub is not unique here. Subdomains get created for marketing campaigns, staging environments, documentation sites, and internal tools — then the service gets decommissioned, but nobody cleans up the DNS record.&lt;/p&gt;

&lt;p&gt;It's not a sign of negligence. It's just the natural entropy of running infrastructure at scale. The DNS record outlives the service by months or years, quietly waiting for someone to notice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I did with the finding
&lt;/h2&gt;

&lt;p&gt;Nothing — I don't own github.com and have no intention of claiming the subdomain. This article is purely educational. If you work at GitHub and are reading this, consider this a friendly heads up.&lt;/p&gt;

&lt;p&gt;If you want to check your own domains, the tool is free to use:&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://www.subdomainchecker.com" rel="noopener noreferrer"&gt;subdomainchecker.com&lt;/a&gt;&lt;/strong&gt; — paste in a root domain, it enumerates subdomains via crt.sh and checks each one automatically&lt;/p&gt;

&lt;p&gt;There's also a public API if you want to integrate it into your own recon pipeline:&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://rapidapi.com/mikaww1/api/subdomain-takeover-checker" rel="noopener noreferrer"&gt;RapidAPI — Subdomain Takeover Checker&lt;/a&gt;&lt;/strong&gt; — free tier available&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Subdomain takeovers are real and happen even at large companies&lt;/li&gt;
&lt;li&gt;Certificate transparency logs are a goldmine for passive subdomain enumeration&lt;/li&gt;
&lt;li&gt;Automated fingerprint checking makes it trivial to scan dozens of subdomains in seconds&lt;/li&gt;
&lt;li&gt;Always clean up your DNS records when you decommission a service&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>dns</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Subdomain takeovers are still embarrassingly common...</title>
      <dc:creator>Mika</dc:creator>
      <pubDate>Sun, 19 Apr 2026 13:04:44 +0000</pubDate>
      <link>https://dev.to/mikaww1/subdomain-takeovers-are-still-embarrassingly-common-3ck7</link>
      <guid>https://dev.to/mikaww1/subdomain-takeovers-are-still-embarrassingly-common-3ck7</guid>
      <description>&lt;p&gt;You've probably heard of domain hijacking — but subdomain takeovers are sneakier, more common, and surprisingly easy to miss.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a subdomain takeover?
&lt;/h2&gt;

&lt;p&gt;When a company sets up a service like a blog, a shop, or a staging environment, they often point a subdomain at an external platform using a DNS record called a CNAME.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;shop.example.com → CNAME → example.myshopify.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells the internet: "when someone visits shop.example.com, send them to our Shopify store."&lt;/p&gt;

&lt;p&gt;Now imagine the company shuts down that Shopify store — but forgets to delete the DNS record. The CNAME is still there, pointing at a Shopify address that no longer exists.&lt;/p&gt;

&lt;p&gt;An attacker can register that Shopify store and suddenly controls &lt;code&gt;shop.example.com&lt;/code&gt;. They can serve phishing pages, steal cookies, or damage the brand — all from what looks like a legitimate company subdomain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why does this keep happening?
&lt;/h2&gt;

&lt;p&gt;Because DNS cleanup is boring and easy to forget. Teams spin up new services all the time — staging environments, marketing landing pages, support portals — and when those services get decommissioned, the DNS records are often left behind.&lt;/p&gt;

&lt;p&gt;It's not a sophisticated attack. It just requires patience and a good eye for dangling CNAMEs.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you detect it?
&lt;/h2&gt;

&lt;p&gt;Detection comes down to two steps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Follow the CNAME chain&lt;/strong&gt;&lt;br&gt;
Resolve the subdomain and follow every CNAME until you reach the final destination. If the final target returns NXDOMAIN (the domain doesn't exist in DNS), that's a strong signal of a dangling CNAME.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — Check for service fingerprints&lt;/strong&gt;&lt;br&gt;
If the target resolves but the service isn't configured, most platforms return a recognizable error page. For example, an unclaimed GitHub Pages site returns &lt;em&gt;"There isn't a GitHub Pages site here"&lt;/em&gt;. Checking for these fingerprints confirms whether a takeover is possible.&lt;/p&gt;

&lt;p&gt;One important caveat: wildcard DNS can cause false positives. If a parent domain resolves any random subdomain (like &lt;code&gt;random123.example.com&lt;/code&gt;), you need to account for that before flagging something as vulnerable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking your own subdomains
&lt;/h2&gt;

&lt;p&gt;If you're a developer or sysadmin, it's worth periodically auditing your DNS records — especially for subdomains pointing at third-party services you may have stopped using.&lt;/p&gt;

&lt;p&gt;I built a free API that automates this entire process. It follows CNAME chains, checks fingerprints against 80+ services (AWS S3, Azure, Heroku, Vercel, Netlify, GitHub Pages, Shopify, Zendesk and more), handles wildcard detection, and returns a confidence level with each result.&lt;/p&gt;

&lt;p&gt;There's also a bulk endpoint that checks up to 25 subdomains at once — useful if you have a large number of subdomains to audit.&lt;/p&gt;

&lt;p&gt;You can try it here: &lt;a href="https://rapidapi.com/mikaww1/api/subdomain-takeover-checker" rel="noopener noreferrer"&gt;Subdomain Takeover Checker API&lt;/a&gt; — free tier available, no credit card needed.&lt;/p&gt;

&lt;p&gt;Or check out the website: &lt;a href="https://www.subdomainchecker.com" rel="noopener noreferrer"&gt;subdomainchecker.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Subdomain takeovers happen when a CNAME points to an unclaimed external service&lt;/li&gt;
&lt;li&gt;They're common because DNS records are rarely cleaned up when services are decommissioned&lt;/li&gt;
&lt;li&gt;Detection involves checking for NXDOMAIN and known service fingerprints&lt;/li&gt;
&lt;li&gt;Audit your subdomains regularly — especially after decommissioning any third-party service&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cybersecurity</category>
      <category>webdev</category>
      <category>security</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
