
dnsx est un kit d'outils DNS rapide et polyvalent permettant d'exécuter plusieurs requêtes DNS de votre choix avec une liste de résolveurs fournis par l'utilisateur.
Fonctionnalités • Installation • Utilisation • Exécuter `dnsx` • Wildcard • Remarques • Rejoindre Discord
dnsx est un toolkit DNS rapide et polyvalent conçu pour exécuter diverses sondes via la bibliothèque retryabledns. Il prend en charge de multiples requêtes DNS, des résolveurs fournis par l'utilisateur, le filtrage DNS des wildcards comme shuffledns, etc.
dnsx nécessite go1.21 pour être installé correctement. Exécutez la commande suivante pour installer la dernière version :
go install -v github.com/projectdiscovery/dnsx/cmd/dnsx@latest
dnsx -h
Ceci affichera l'aide de l'outil. Voici tous les commutateurs pris en charge.
INPUT:
-l, -list string list of sub(domains)/hosts to resolve (file or stdin)
-d, -domain string list of domain to bruteforce (file or comma separated or stdin)
-w, -wordlist string list of words to bruteforce (file or comma separated or stdin)
QUERY:
-a query A record (default)
-aaaa query AAAA record
-cname query CNAME record
-ns query NS record
-txt query TXT record
-srv query SRV record
-ptr query PTR record
-mx query MX record
-soa query SOA record
-any query ANY record
-axfr query AXFR
-caa query CAA record
-recon query all the dns records (a,aaaa,cname,ns,txt,srv,ptr,mx,soa,axfr,caa)
-e, -exclude-type value dns query type to exclude (a,aaaa,cname,ns,txt,srv,ptr,mx,soa,axfr,caa) (default none)
FILTER:
-re, -resp display dns response
-ro, -resp-only display dns response only
-rc, -rcode string filter result by dns status code (eg. -rcode noerror,servfail,refused)
PROBE:
-cdn display cdn name
-asn display host asn information
RATE-LIMIT:
-t, -threads int number of concurrent threads to use (default 100)
-rl, -rate-limit int number of dns request/second to make (disabled as default) (default -1)
UPDATE:
-up, -update update dnsx to latest version
-duc, -disable-update-check disable automatic dnsx update check
OUTPUT:
-o, -output string file to write output
-j, -json write output in JSONL(ines) format
-omit-raw, -or omit raw dns response from jsonl output
-ot, -output-template string custom output template (e.g. -ot '{{host}} {{a}}')
DEBUG:
-hc, -health-check run diagnostic check up
-silent display only results in the output
-v, -verbose display verbose output
-raw, -debug display raw dns response
-stats display stats of the running scan
-version display version of dnsx
-nc, -no-color disable color in output
OPTIMIZATION:
-retry int number of dns attempts to make (must be at least 1) (default 2)
-hf, -hostsfile use system host file
-trace perform dns tracing
-trace-max-recursion int Max recursion for dns trace (default 32767)
-resume resume existing scan
-stream stream mode (wordlist, wildcard, stats and stop/resume will be disabled)
-timeout value maximum time to wait for a DNS query to complete (default 3s)
CONFIGURATIONS:
-auth configure projectdiscovery cloud (pdcp) api key (default true)
-r, -resolver string list of resolvers to use (file or comma separated)
-wt, -wildcard-threshold int wildcard filter threshold (default 5)
-auto-wildcard automatically detect wildcard domains for filtering
-wd, -wildcard-domain string domain name for manual wildcard filtering (mutually exclusive with -auto-wildcard; other flags will be ignored - json output recommended)
Filtrer les noms d'hôtes actifs à partir de la liste des sous-domaines passifs, obtenus à partir de diverses sources :
subfinder -silent -d hackerone.com | dnsx -silent
a.ns.hackerone.com
www.hackerone.com
api.hackerone.com
docs.hackerone.com
mta-sts.managed.hackerone.com
mta-sts.hackerone.com
resources.hackerone.com
b.ns.hackerone.com
mta-sts.forwarding.hackerone.com
events.hackerone.com
support.hackerone.com
Afficher les enregistrements A pour la liste donnée de sous-domaines :
subfinder -silent -d hackerone.com | dnsx -silent -a -resp
www.hackerone.com [104.16.100.52]
www.hackerone.com [104.16.99.52]
hackerone.com [104.16.99.52]
hackerone.com [104.16.100.52]
api.hackerone.com [104.16.99.52]
api.hackerone.com [104.16.100.52]
mta-sts.forwarding.hackerone.com [185.199.108.153]
mta-sts.forwarding.hackerone.com [185.199.109.153]
mta-sts.forwarding.hackerone.com [185.199.110.153]
mta-sts.forwarding.hackerone.com [185.199.111.153]
a.ns.hackerone.com [162.159.0.31]
resources.hackerone.com [52.60.160.16]
resources.hackerone.com [3.98.63.202]
resources.hackerone.com [52.60.165.183]
resources.hackerone.com [read.uberflip.com]
mta-sts.hackerone.com [185.199.110.153]
mta-sts.hackerone.com [185.199.111.153]
mta-sts.hackerone.com [185.199.109.153]
mta-sts.hackerone.com [185.199.108.153]
gslink.hackerone.com [13.35.210.17]
gslink.hackerone.com [13.35.210.38]
gslink.hackerone.com [13.35.210.83]
gslink.hackerone.com [13.35.210.19]
b.ns.hackerone.com [162.159.1.31]
docs.hackerone.com [185.199.109.153]
docs.hackerone.com [185.199.110.153]
docs.hackerone.com [185.199.111.153]
docs.hackerone.com [185.199.108.153]
support.hackerone.com [104.16.51.111]
support.hackerone.com [104.16.53.111]
mta-sts.managed.hackerone.com [185.199.108.153]
mta-sts.managed.hackerone.com [185.199.109.153]
mta-sts.managed.hackerone.com [185.199.110.153]
mta-sts.managed.hackerone.com [185.199.111.153]
Extraire les enregistrements A pour la liste donnée de sous-domaines :
subfinder -silent -d hackerone.com | dnsx -silent -a -resp-only
104.16.99.52
104.16.100.52
162.159.1.31
104.16.99.52
104.16.100.52
185.199.110.153
185.199.111.153
185.199.108.153
185.199.109.153
104.16.99.52
104.16.100.52
104.16.51.111
104.16.53.111
185.199.108.153
185.199.111.153
185.199.110.153
185.199.111.153
Extraire les enregistrements CNAME pour la liste donnée de sous-domaines :
subfinder -silent -d hackerone.com | dnsx -silent -cname -resp
support.hackerone.com [hackerone.zendesk.com]
resources.hackerone.com [read.uberflip.com]
mta-sts.hackerone.com [hacker0x01.github.io]
mta-sts.forwarding.hackerone.com [hacker0x01.github.io]
events.hackerone.com [whitelabel.bigmarker.com]
Extraire les enregistrements ASN pour la liste donnée de sous-domaines :
subfinder -silent -d hackerone.com | dnsx -silent -asn
b.ns.hackerone.com [AS13335, CLOUDFLARENET, US]
a.ns.hackerone.com [AS13335, CLOUDFLARENET, US]
hackerone.com [AS13335, CLOUDFLARENET, US]
www.hackerone.com [AS13335, CLOUDFLARENET, US]
api.hackerone.com [AS13335, CLOUDFLARENET, US]
support.hackerone.com [AS13335, CLOUDFLARENET, US]
Sonder à l'aide du code d'état DNS sur la liste donnée de (sous-)domaines :
subfinder -silent -d hackerone.com | dnsx -silent -rcode noerror,servfail,refused
ns.hackerone.com [NOERROR]
a.ns.hackerone.com [NOERROR]
b.ns.hackerone.com [NOERROR]
support.hackerone.com [NOERROR]
resources.hackerone.com [NOERROR]
mta-sts.hackerone.com [NOERROR]
www.hackerone.com [NOERROR]
mta-sts.forwarding.hackerone.com [NOERROR]
docs.hackerone.com [NOERROR]
Extraire les sous-domaines d'une plage réseau donnée à l'aide de la requête PTR :
echo 173.0.84.0/24 | dnsx -silent -resp-only -ptr
cors.api.paypal.com
trinityadminauth.paypal.com
cld-edge-origin-api.paypal.com
appmanagement.paypal.com
svcs.paypal.com
trinitypie-serv.paypal.com
ppn.paypal.com
pointofsale-new.paypal.com
pointofsale.paypal.com
slc-a-origin-pointofsale.paypal.com
fpdbs.paypal.com
Extraire les sous-domaines d'un ASN donné à l'aide de la requête PTR :
echo AS17012 | dnsx -silent -resp-only -ptr
apiagw-a.paypal.com
notify.paypal.com
adnormserv-slc-a.paypal.com
a.sandbox.paypal.com
apps2.paypal-labs.com
pilot-payflowpro.paypal.com
www.paypallabs.com
paypal-portal.com
micropayments.paypal-labs.com
minicart.paypal-labs.com
L'option -output-template (-ot) vous permet de personnaliser le format de sortie à l'aide d'un modèle, au lieu de la disposition par défaut entre crochets (par exemple example.com [A] [104.20.23.154]). Vous spécifiez le modèle directement sur la ligne de commande pour contrôler la façon dont les données résolues sont présentées.
Les variables du modèle correspondent aux mêmes noms de champs utilisés dans la sortie JSONL (-json), donc n'importe lequel des éléments suivants peut être référencé comme {{field}} :
host, a, aaaa, cname, ns, txt, mx, srv, ptr, soa, caa, ttl, resolver, status_code, cdn-name, cdn-type, , . Un alias pratique contient les enregistrements combinés et .
Les enregistrements avec plusieurs valeurs (par exemple plusieurs enregistrements A) sont joints par des virgules dans un seul champ.
echo example.com | dnsx -silent -a -ot '{{host}} {{a}}'
example.com 104.20.23.154,172.66.147.243
echo example.com | dnsx -silent -a -ot '{{ip}} - {{host}}'
104.20.23.154,172.66.147.243 - example.com
[!NOTE] Si un champ spécifié n'existe pas ou ne contient pas de valeur, il est simplement omis de la sortie.
-output-templatene peut pas être combiné avec-jsonou-raw.
Brute force de sous-domaines pour un domaine ou une liste de domaines donné à l'aide des options d et w :
dnsx -silent -d facebook.com -w dns_worldlist.txt
blog.facebook.com
booking.facebook.com
api.facebook.com
analytics.facebook.com
beta.facebook.com
apollo.facebook.com
ads.facebook.com
box.facebook.com
alpha.facebook.com
apps.facebook.com
connect.facebook.com
c.facebook.com
careers.facebook.com
code.facebook.com
Brute force de sous-domaines ciblés en utilisant une ou plusieurs entrées de mots-clés, car les options d ou w prennent en charge les entrées de fichier ou de mots-clés séparés par des virgules :
dnsx -silent -d domains.txt -w jira,grafana,jenkins
grafana.1688.com
grafana.8x8.vc
grafana.airmap.com
grafana.aerius.nl
jenkins.1688.com
jenkins.airbnb.app
jenkins.airmap.com
jenkins.ahn.nl
jenkins.achmea.nl
jira.amocrm.com
jira.amexgbt.com
jira.amitree.com
jira.arrival.com
jira.atlassian.net
jira.atlassian.com
Les valeurs sont acceptées depuis stdin pour tous les types d'entrée (-list, -domain, -wordlist). L'option -list prend par défaut stdin, mais on peut obtenir le même résultat pour les autres types d'entrée en ajoutant un - (tiret) comme paramètre :
cat domains.txt | dnsx -silent -w jira,grafana,jenkins -d -
grafana.1688.com
grafana.8x8.vc
grafana.airmap.com
grafana.aerius.nl
jenkins.1688.com
jenkins.airbnb.app
jenkins.airmap.com
jenkins.ahn.nl
jenkins.achmea.nl
jira.amocrm.com
jira.amexgbt.com
jira.amitree.com
jira.arrival.com
jira.atlassian.net
jira.atlassian.com
$ cat tld.txt
com
by
de
be
al
bi
cg
dj
bs
dnsx -d google.FUZZ -w tld.txt -resp
_ __ __
__| | _ __ ___ \ \/ /
/ _' || '_ \ / __| \ /
| (_| || | | |\__ \ / \
\__,_||_| |_||___//_/\_\ v1.1.2
projectdiscovery.io
google.de [142.250.194.99]
google.com [142.250.76.206]
google.be [172.217.27.163]
google.bs [142.251.42.35]
google.bi [216.58.196.67]
google.al [216.58.196.68]
google.by [142.250.195.4]
google.cg [142.250.183.131]
google.dj [142.250.192.3]
Une fonctionnalité spéciale de dnsx est sa capacité à gérer les wildcards DNS multi-niveaux, et ce avec un nombre très réduit de requêtes DNS. Parfois, tous les sous-domaines résolvent, ce qui génère beaucoup de bruit dans la sortie. La façon dont dnsx gère cela est en gardant une trace du nombre de sous-domaines pointant vers une IP et si le nombre de sous-domaines dépasse un certain seuil, il vérifiera les wildcards sur tous les niveaux des hôtes pour cette IP de manière itérative.
dnsx -l subdomain_list.txt -wd airbnb.com -o output.txt
Pour détecter et filtrer automatiquement les wildcards DNS sur plusieurs domaines en une seule exécution tout en conservant le mode de sortie sélectionné :
dnsx -l subdomain_list.txt -auto-wildcard -o output.txt
-auto-wildcard et -wd / -wildcard-domain sont mutuellement exclusifs. Utilisez -wd lorsque vous souhaitez conserver le flux de filtrage manuel des wildcards sur un seul domaine ; utilisez -auto-wildcard lorsque vous souhaitez que dnsx détecte automatiquement les racines de wildcards sur des entrées multi-domaines.
Il est possible d'utiliser la bibliothèque directement dans vos programmes Go. Les extraits de code suivants sont un exemple d'utilisation dans des programmes Go. Veuillez vous référer ici pour la configuration détaillée du package et son utilisation.
package main
import (
"fmt"
"github.com/projectdiscovery/dnsx/libs/dnsx"
)
func main() {
// Create DNS Resolver with default options
dnsClient, err := dnsx.New(dnsx.DefaultOptions)
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
// DNS A question and returns corresponding IPs
result, err := dnsClient.Lookup("hackerone.com")
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
for idx, msg := range result {
fmt.Printf("%d: %s\n", idx+1, msg)
}
// Query
rawResp, err := dnsClient.QueryOne("hackerone.com")
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
fmt.Printf("rawResp: %v\n", rawResp)
jsonStr, err := rawResp.JSON()
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
fmt.Println(jsonStr)
return
}
dnsx vérifie l'enregistrement A.dnsx utilise les résolveurs Google, Cloudflare, Quad9 resolver.-r.-auto-wildcard détecte automatiquement les domaines wildcard sur plusieurs racines enregistrables en une seule exécution.-wd) est requis uniquement pour le filtrage manuel des wildcards et ne peut pas être utilisé avec -auto-wildcard.-wd, les autres options d'enregistrement DNS sont ignorées et la sortie JSON est recommandée.-l) et le brute-force DNS (-w) ne peuvent pas être utilisés ensemble.dnsx est fait avec 🖤 par l'équipe projectdiscovery.
asnquery-time{{ip}}AAAAA