Free tools / DNS and network

Subdomain Finder

Finds the hosts under a domain and flags the ones that look private.

What this tool does

Every host you publish is a way in. The ones that get attacked are rarely the main website: they are the staging copy with last year's code, the admin panel somebody opened for a week, the old VPN endpoint nobody switched off. Nothing lists them for you, so most teams have no inventory of their own names.

DNS cannot be asked for the names under a domain, so they have to be found. This tool reads the public certificate logs, which record a name every time a certificate is issued for it, and tries the host names that nearly every domain uses. Each candidate is resolved, and what answered is listed with its address. Names that look internal are marked, because those are the ones worth a decision.

Reading the result

From certificate logs
The name appeared in a public certificate. Those logs are permanent and anyone can read them.
Tried as a common name
A host name most domains use, which we looked up to see whether it exists here.
CNAME to A
The name is an alias that ends at an address. The alias target is shown beside it.
Worth checking
The name reads like a test, admin or internal system. It may still be fine; it should be a decision, not an accident.
Names tried
How many candidates were looked up. A name nobody guessed and no certificate covers cannot be found this way.

Where the names come from

There is no question in DNS that means list everything under this domain. The one mechanism that does it, a zone transfer, is refused by every properly run nameserver, and should be. So a name is only found if something public points at it, or if somebody guesses it. Both sources are used here, and each has a blind spot worth knowing.

SourceFindsMisses
Certificate Transparency logsAny host that has had a publicly trusted certificate issued for it, including ones deleted years ago.Hosts covered by a wildcard certificate, hosts with no certificate, and anything on a private certificate authority.
Common host namesThe hosts most domains run: www, mail, vpn, api, staging and the rest.Anything named in a way nobody would guess.
Your own DNS zoneEverything, because it is the authoritative list.Nothing, but only the domain's owner can export it.
Search engines and archivesHosts that were linked from somewhere public.Anything never linked, which is most internal systems.
Note. A wildcard certificate is good for privacy and bad for your own inventory: it hides host names from the logs, including from you.

What to do with a name you did not expect

Finding a host is not the same as finding a problem. Work through them in this order, because the first two can be settled in minutes and the rest need an owner.

  1. Decide whether it should exist. A staging copy of a site, a demo from a project that ended, an admin panel opened for a migration: if it is finished, remove the DNS record and shut the host down.
  2. If it should exist but not for everyone, put it behind the VPN or an allow list. A login page on the internet is a login page everyone can attack.
  3. Check what it is actually running. An old host is usually an unpatched host, and it often shares credentials or a network with something that matters.
  4. Check the certificate. A host still serving an expired or mismatched certificate teaches your users to click through warnings.
  5. Write the name down. An inventory that is updated when things are built is the only way this stops being a surprise.

The dangling record, and why it is worse than it looks

The worst finding is not a forgotten server. It is a name that points at a cloud service that no longer exists: a CNAME to a storage bucket, a site host or a help desk that was deleted while the DNS record stayed. On many services anyone can create a resource with that name and start serving content, on your domain, with a valid certificate. Cookies scoped to the parent domain can go with it.

The fix is the same every time: delete the DNS record when you delete the thing it points at, and make that part of how a service is decommissioned rather than something somebody remembers.

Doing this from your own machine

The same two sources, asked directly. The first queries a certificate log, the second resolves a list of candidate names, and the third asks whether a zone transfer is allowed, which it should not be.

curl -s 'https://crt.sh/?q=%25.example.com&output=json' | 
  python3 -c 'import json,sys;print(*sorted({n for r in json.load(sys.stdin) for n in r["name_value"].split()}),sep="\n")'
for h in www mail vpn api staging admin; do host $h.example.com; done
dig AXFR example.com @ns1.example.com

Use it with

Standards and references

Questions people ask

Is this legal to run on a domain I do not own?

Everything here is a public certificate log and ordinary DNS lookups, which is the same information a browser uses. Nothing is sent to the hosts themselves. Still, act on what you find only for domains you own or are permitted to test.

Why does it miss names I know exist?

A wildcard certificate covers every host under a domain without naming any of them, so those names never reach the logs. If the host name is not one of the common ones either, nothing public points to it. The result says when a wildcard is in use.

A name here no longer exists. Why is it listed?

It is listed because it still resolves. A name that resolves to a service you have deleted is worse than one that does not resolve at all: somebody else can often claim the service and serve content on your name.

How do I get a complete list?

From your own DNS zone, which your provider can export. Use this tool to find what is published that your zone file does not explain.

Related tools

Want the whole exposed surface? The domain exposure check takes the names found here further: breaches, public code, dangling records and the certificates behind each host. Run the exposure check →