
dnsx는 사용자가 제공한 리졸버 목록을 사용하여 원하는 여러 DNS 쿼리를 실행할 수 있는 빠르고 다목적 DNS 툴킷입니다.
<h1 align="center">
<img src="https://assets.kitploit.com/production/public/readmes/3923/abdf7c5ef50e7d740b96aad5a151b9ac75700de029a681a6b3dc6b51efe45b7d.png" alt="dnsx" width="200px">
<br>
</h1>
<h4 align="center">DNS 쿼리 실행을 위해 설계된 빠르고 다목적 DNS 툴킷</h4>
<p align="center">
<a href="https://goreportcard.com/report/github.com/projectdiscovery/dnsx"><img src="https://goreportcard.com/badge/github.com/projectdiscovery/dnsx"></a>
<a href="https://github.com/projectdiscovery/dnsx/issues"><img src="https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat"></a>
<a href="https://github.com/projectdiscovery/dnsx/releases"><img src="https://img.shields.io/github/release/projectdiscovery/dnsx"></a>
<a href="https://twitter.com/pdiscoveryio"><img src="https://img.shields.io/twitter/follow/pdiscoveryio.svg?logo=twitter"></a>
<a href="https://discord.gg/projectdiscovery"><img src="https://img.shields.io/discord/695645237418131507.svg?logo=discord"></a>
</p>
<p align="center">
<a href="#features">기능</a> •
<a href="#installation-instructions">설치</a> •
<a href="#usage">사용법</a> •
<a href="#running-dnsx">`dnsx` 실행</a> •
<a href="#wildcard-filtering">와일드카드</a> •
<a href="#-notes">참고사항</a> •
<a href="https://discord.gg/projectdiscovery">Discord 참여</a>
</p>
---
`dnsx`는 [retryabledns](https://github.com/projectdiscovery/retryabledns) 라이브러리를 통해 다양한 프로브를 실행하도록 설계된 빠르고 다목적 DNS 툴킷입니다. 여러 DNS 쿼리, 사용자 제공 리졸버, [shuffledns](https://github.com/projectdiscovery/shuffledns)와 같은 DNS 와일드카드 필터링 등을 지원합니다.
# 기능
<h1 align="left">
<img src="https://assets.kitploit.com/production/public/readmes/3923/e0be49be16e94055f8ca00845ffa701135d23cba6aca284260e6208fa8c20026.png" alt="dnsx" width="700px"></a>
<br>
</h1>
- DNS 레코드를 쿼리하는 간단하고 편리한 유틸리티.
- **A, AAAA, CNAME, PTR, NS, MX, TXT, SRV, SOA** 쿼리 지원
- DNS **해석(Resolution)** / **브루트포스(Brute-force)** 지원
- 사용자 정의 **리졸버(resolver)** 입력 지원
- 다양한 리졸버 형식 **(TCP/UDP/DOH/DOT)** 지원
- **stdin** 및 **stdout** 지원
- 자동 **와일드카드** 처리 지원
# 설치 지침
`dnsx`를 성공적으로 설치하려면 **go1.21**이 필요합니다. 최신 버전을 설치하려면 다음 명령을 실행하세요:
```sh
go install -v github.com/projectdiscovery/dnsx/cmd/dnsx@latest
```
# 사용법
```sh
dnsx -h
```
이 명령은 도구에 대한 도움말을 표시합니다. 지원하는 모든 스위치는 다음과 같습니다.
```console
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)
-aw, -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)
```
## dnsx 실행
### DNS 해석
다양한 소스에서 얻은 패시브 서브도메인 목록에서 활성 호스트 이름을 필터링합니다:
```console
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** 레코드를 출력합니다:
```console
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** 레코드를 추출합니다:
```console
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** 레코드를 추출합니다:
```console
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** 레코드를 추출합니다:
```console
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 상태 코드](https://github.com/projectdiscovery/dnsx/wiki/RCODE-ID-VALUE-Mapping)를 사용하여 프로브합니다:
```console
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` 쿼리를 사용하여 주어진 네트워크 범위에서 서브도메인을 추출합니다:
```console
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에서 서브도메인을 추출합니다:
```console
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`, `asn`, `query-time`. 편의를 위한 `{{ip}}` 별칭은 결합된 `A` 및 `AAAA` 레코드를 담고 있습니다.
여러 값을 가진 레코드(예: 여러 개의 `A` 레코드)는 단일 필드 내에서 쉼표로 연결됩니다.
```console
echo example.com | dnsx -silent -a -ot '{{host}} {{a}}'
example.com 104.20.23.154,172.66.147.243
```
```console
echo example.com | dnsx -silent -a -ot '{{ip}} - {{host}}'
104.20.23.154,172.66.147.243 - example.com
```
> [!NOTE]
> 지정된 필드가 존재하지 않거나 값을 포함하지 않으면 출력에서 단순히 생략됩니다. `-output-template`은 `-json` 또는 `-raw`와 함께 사용할 수 없습니다.
---------
### DNS 브루트포스
`d` 및 `w` 플래그를 사용하여 주어진 도메인 또는 도메인 목록에 대한 서브도메인을 브루트포스합니다:
```console
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` 플래그가 파일 또는 쉼표로 구분된 키워드 입력을 지원하므로, 단일 또는 여러 키워드 입력을 사용하여 대상 서브도메인을 브루트포스합니다:
```console
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`을 사용하지만, 다른 입력 유형의 경우 매개변수로 `-`(대시)를 추가하여 동일한 결과를 얻을 수 있습니다:
```console
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 브루트포스
```bash
$ cat tld.txt
com
by
de
be
al
bi
cg
dj
bs
```
```console
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에 대한 호스트의 모든 레벨에서 와일드카드를 반복적으로 확인하는 것입니다.
```console
dnsx -l subdomain_list.txt -wd airbnb.com -o output.txt
```
선택한 출력 모드를 유지하면서 단일 실행에서 여러 도메인에 걸쳐 와일드카드 DNS를 자동으로 감지하고 필터링하려면:
```console
dnsx -l subdomain_list.txt -auto-wildcard -o output.txt
```
`-auto-wildcard`와 `-wd` / `-wildcard-domain`은 상호 배타적입니다. 기존의 수동 단일 도메인 와일드카드 필터링 흐름을 원할 때는 `-wd`를 사용하고, 혼합 도메인 입력에 걸쳐 dnsx가 와일드카드 루트를 자동으로 감지하도록 하려면 `-auto-wildcard`를 사용하세요.
---
### 라이브러리로서의 Dnsx
golang 프로그램에서 라이브러리를 직접 사용할 수 있습니다. 다음 코드 스니펫은 golang 프로그램에서의 사용 예시입니다. 자세한 패키지 구성 및 사용법은 [여기](https://pkg.go.dev/github.com/projectdiscovery/[email protected]/libs/dnsx)를 참조하세요.
```go
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 [리졸버](https://github.com/projectdiscovery/dnsx/blob/43af78839e237ea8cbafe571df1ab0d6cbe7f445/libs/dnsx/dnsx.go#L31)를 사용합니다.
- 사용자 정의 리졸버 목록은 `r` 플래그를 사용하여 로드할 수 있습니다.
- `-auto-wildcard`는 단일 실행에서 여러 등록 가능 루트에 걸쳐 와일드카드 도메인을 자동으로 감지합니다.
- 도메인 이름(`-wd`)은 수동 와일드카드 필터링에만 필요하며 `-auto-wildcard`와 함께 사용할 수 없습니다.
- `-wd`를 사용한 수동 와일드카드 필터링 시 다른 DNS 레코드 플래그는 무시되며 JSON 출력을 권장합니다.
- DNS 해석(`l`)과 DNS 브루트포싱(`w`)은 함께 사용할 수 없습니다.
- VPN 운영자는 높은 DNS/UDP 트래픽을 필터링하는 경향이 있으므로 도구에서 패킷 손실이 발생할 수 있습니다(예: [Mullvad VPN](https://github.com/projectdiscovery/dnsx/issues/221)). [이 잠재적 해결책](https://github.com/projectdiscovery/dnsx/blob/dev/MULLVAD.md)을 확인하세요.
`dnsx`는 [projectdiscovery](https://projectdiscovery.io) 팀이 🖤로 만들었습니다.