
dnsx는 사용자가 제공한 리졸버 목록을 사용하여 원하는 여러 DNS 쿼리를 실행할 수 있는 빠르고 다목적 DNS 툴킷입니다.
기능 • 설치 • 사용법 • dnsx 실행 • 와일드카드 • 참고사항 • Discord 참여
dnsx는 retryabledns 라이브러리를 통해 다양한 프로브를 실행하도록 설계된 빠르고 다목적 DNS 툴킷입니다. 여러 DNS 쿼리, 사용자 제공 리졸버, shuffledns와 유사한 DNS 와일드카드 필터링 등을 지원합니다.
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
-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)
다양한 소스에서 얻은 패시브 서브도메인 목록에서 활성 호스트 이름을 필터링합니다:
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 상태 코드를 사용하여 프로브:
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
-output-template (-ot) 플래그는 기본 대괄호 레이아웃(예: example.com [A] [104.20.23.154]) 대신 템플릿을 사용하여 출력 형식을 사용자 정의할 수 있습니다. 명령줄에 템플릿을 직접 지정하여 해석된 데이터가 표시되는 방식을 제어합니다.
템플릿 변수는 JSONL 출력(-json)에 사용된 것과 동일한 필드 이름에 매핑되므로 다음 중 하나를 {{field}}로 참조할 수 있습니다:
host, a, aaaa, cname, ns, txt, mx, srv, ptr, soa, caa, ttl, resolver, status_code, cdn-name, cdn-type, , . 편의상 별칭은 와 레코드를 결합하여 보관합니다.
여러 값이 있는 레코드(예: 여러 A 레코드)는 단일 필드 내에서 쉼표로 결합됩니다.
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] 지정된 필드가 존재하지 않거나 값이 없으면 출력에서 생략됩니다.
-output-template은-json또는-raw와 함께 사용할 수 없습니다.
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
$ 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
단일 실행에서 여러 도메인에 걸쳐 와일드카드 DNS를 자동으로 감지하고 필터링하면서 선택한 출력 모드를 유지하려면:
dnsx -l subdomain_list.txt -auto-wildcard -o output.txt
-auto-wildcard와 -wd / -wildcard-domain은 상호 배타적입니다. 기존의 수동 단일 도메인 와일드카드 필터링 흐름을 사용하려면 -wd를 사용하고, 혼합 도메인 입력에서 와일드카드 루트를 자동으로 감지하려면 -auto-wildcard를 사용하십시오.
Go 프로그램에서 라이브러리를 직접 사용할 수 있습니다. 다음 코드 스니펫은 Go 프로그램에서 사용하는 예입니다. 자세한 패키지 구성 및 사용법은 여기를 참조하세요.
package main
import (
"fmt"
"github.com/projectdiscovery/dnsx/libs/dnsx"
)
func main() {
// 기본 옵션으로 DNS 리졸버 생성
dnsClient, err := dnsx.New(dnsx.DefaultOptions)
if err != nil {
fmt.Printf("err: %v\n", err)
return
}
// DNS A 질의 후 해당 IP 반환
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)
}
// 쿼리
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 리졸버를 사용합니다.r 플래그를 사용하여 사용자 정의 리졸버 목록을 로드할 수 있습니다.-auto-wildcard는 단일 실행에서 여러 등록 가능한 루트에 걸쳐 와일드카드 도메인을 자동으로 감지합니다.-wd)은 수동 와일드카드 필터링에만 필요하며 -auto-wildcard와 함께 사용할 수 없습니다.-wd를 사용한 수동 와일드카드 필터링 시 다른 DNS 레코드 플래그는 무시되며 JSON 출력이 권장됩니다.l)과 DNS 무차별 대입(w)은 함께 사용할 수 없습니다.dnsx는 projectdiscovery 팀이 🖤로 만들었습니다.
asnquery-time{{ip}}AAAAA