projectdiscovery/dnsx

GitHub: projectdiscovery/dnsx

dnsx 是一个用 Go 编写的高性能 DNS 工具包,支持多种记录类型查询、子域名暴力破解、通配符过滤以及 CDN/ASN 信息识别。

Stars: 2672 | Forks: 299

dnsx

一个快速且多功能的 DNS 工具包,专为运行 DNS 查询而设计

功能安装用法运行 `dnsx`通配符注意事项加入 Discord

`dnsx` 是一个快速且多功能的 DNS 工具包,旨在通过 [retryabledns](https://github.com/projectdiscovery/retryabledns) 库运行各种探测。它支持多种 DNS 查询、用户提供的解析器、类似于 [shuffledns](https://github.com/projectdiscovery/shuffledns) 的 DNS 通配符过滤等功能。 # 功能

dnsx

- 简单且方便的 DNS 记录查询工具。 - 支持 **A, AAAA, CNAME, PTR, NS, MX, TXT, SRV, SOA** 查询 - 支持 DNS **解析** / **暴力破解** - 支持自定义 **resolver** 输入 - 支持多种解析器格式 **(TCP/UDP/DOH/DOT)** - 支持 **stdin** 和 **stdout** - 支持自动 **wildcard**(通配符)处理 # 安装说明 `dnsx` 需要 **go1.21** 才能成功安装。运行以下命令以安装最新版本: ``` go install -v github.com/projectdiscovery/dnsx/cmd/dnsx@latest ``` # 用法 ``` dnsx -h ``` 这将显示该工具的帮助信息。以下是它支持的所有开关。 ``` 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 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) -wd, -wildcard-domain string domain name for wildcard filtering (other flags will be ignored - only json output is supported) ``` ## 运行 dnsx ### DNS 解析 从通过各种来源获取的被动子域名列表中筛选活跃的主机名: ``` 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 ``` 打印给定子域名列表的 **A** 记录: ``` 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] ``` 提取给定子域名列表的 **A** 记录: ``` 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 ``` 提取给定子域名列表的 **CNAME** 记录: ``` 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] ``` 提取给定子域名列表的 **ASN** 记录: ``` 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] ``` 对给定的(子)域名列表使用 [dns status code](https://github.com/projectdiscovery/dnsx/wiki/RCODE-ID-VALUE-Mapping) 进行探测: ``` 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] ``` 使用 `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 ``` 使用 `PTR` 查询从给定的 ASN 提取子域名: ``` 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 ``` ### DNS 暴力破解 使用 `d` 和 `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 ``` 使用单个或多个关键词输入对目标子域名进行暴力破解,因为 `d` 或 `w` 标志支持文件或逗号分隔的关键词输入: ``` 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 ``` 所有输入类型(`-list`、`-domain`、`-wordlist`)都接受来自 **stdin** 的值。`-list` 标志默认为 `stdin`,但对于其他输入类型,可以通过添加 `-`(短横线)作为参数来实现同样的效果: ``` 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 ``` #### 基于占位符字典的 DNS 暴力破解 ``` $ 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] ``` ### 通配符过滤 `dnsx` 的一个特殊功能是它能够处理 **多级 DNS 通配符**,并且只需极少量的 DNS 请求即可完成。有时所有的子域名都会被解析,这会导致输出中出现大量垃圾数据。`dnsx` 处理此问题的方法是跟踪有多少个子域名指向同一个 IP,如果子域名的数量超过某个阈值,它将对该 IP 的主机各级进行迭代通配符检查。 ``` dnsx -l subdomain_list.txt -wd airbnb.com -o output.txt ``` ### 将 Dnsx 作为库使用 可以直接在你的 Golang 程序中使用该库。以下代码片段是在 Golang 程序中使用的示例。有关详细的包配置和用法,请参阅 [此处](https://pkg.go.dev/github.com/projectdiscovery/dnsx@v1.1.0/libs/dnsx)。 ``` 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` 检查 **A** 记录。 - 默认情况下,`dnsx` 使用 Google、Cloudflare、Quad9 [resolver](https://github.com/projectdiscovery/dnsx/blob/43af78839e237ea8cbafe571df1ab0d6cbe7f445/libs/dnsx/dnsx.go#L31)。 - 可以使用 `r` 标志加载自定义解析器列表。 - 域名(`wd`)输入对于通配符消除是必须的。 - 使用通配符过滤时不能使用 DNS 记录标志。 - DNS 解析(`l`)和 DNS 暴力破解(`w`)不能同时使用。 - VPN 运营商倾向于过滤高流量的 DNS/UDP 数据包,因此该工具可能会遇到丢包情况(例如 [Mullvad VPN](https://github.com/projectdiscovery/dnsx/issues/221))。请查看 [此潜在解决方案](./MULLVAD.md)。 `dnsx` 由 [projectdiscovery](https://projectdiscovery.io) 团队用 🖤 制作。
标签:C2日志可视化, CDN识别, DNS工具, DNS查询, DNS解析, DNS记录, EVTX分析, EVTX分析, GitHub, Go语言, PoC, reconnaissance, 二进制发布, 子域名枚举, 开源工具, 开源项目, 指纹识别, 插件系统, 日志审计, 暴力破解, 泛解析过滤, 程序破解, 系统安全, 网络安全, 隐私保护