ATT&CK: T1595.003 Wordlist Scanning · Reconnaissance (TA0043)
서브도메인 열거는 passive 1차 → active 2차 → live 검증 3차로 쪼개는 게 효율적이다. 각 단계 도구가 다르고 역할이 명확하다.
1. passive — subfinder
subfinder -d example.com -silent -all > subs-passive.txt
- 다수의 공개 소스(crt.sh, Shodan, VirusTotal, 등등)를 질의해 서브도메인을 긁는다.
-all: 느리지만 보수적 소스까지 포함. API 키 설정하면 더 많이 나옴 (~/.config/subfinder/provider-config.yaml).- 능동 패킷을 안 보내므로 대상 네트워크에 흔적 X — passive 수집(T1596에 더 가까움)이지만, 이 체인의 1단으로 포함.
2. active — puredns bruteforce
passive가 못 찾는 것: 외부 소스가 모르는 서브도메인(개발/스테이징/내부용). 사전 기반 brute force로 보완:
puredns bruteforce \
/usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
example.com \
-r resolvers.txt \
> subs-active.txt
-r resolvers.txt: 신뢰할 수 있는 리졸버 목록. 공개 리졸버(1.1.1.1, 8.8.8.8 등)를 쓰되, puredns가 “거짓 응답 보내는 리졸버"를 자동 걸러낸다. 이 와일드카드 DNS 처리가 puredns의 핵심 기능.- 리졸버 목록은 trickest/resolvers 저장소에서 받는 게 표준.
massdns 대비 puredns의 이점: wildcard DNS(모든 서브도메인이 같은 IP 리턴) 환경에서 false positive를 자동 제거.
3. 합치고 중복 제거
cat subs-passive.txt subs-active.txt | sort -u > subs-all.txt
wc -l subs-all.txt
4. live 검증 — httpx
이름이 DNS에 있다고 해서 HTTP 서비스가 열려있는 건 아니다. httpx로 포트/프로토콜 체크:
cat subs-all.txt | httpx \
-silent \
-ports 80,443,8080,8443,8000 \
-title -status-code -tech-detect -tls-grab \
-o subs-live.txt
-tech-detect: Wappalyzer 룰로 사용 스택 추정 (nginx/Apache, WordPress, 등).-tls-grab: TLS 인증서 Subject/SAN을 뽑는다 — 여기서 또 다른 서브도메인이 발견되기도 함.-screenshot: Chromium 돌려서 스크린샷. 리뷰 효율 급상승.
5. 다시 돌아가는 피드백 루프
httpx의 -tls-grab 결과에서 새 서브도메인이 나오면:
# TLS SAN에서 추가 호스트 추출
jq -r '.tls.subject_an[]?' subs-live.jsonl 2>/dev/null \
| grep "example.com$" | sort -u > subs-from-tls.txt
# 다시 subs-all.txt에 합치고 2단계부터 반복
이 피드백 1~2회가 유의미한 추가 자산을 뽑는다.
6. 각 도구 역할 요약
| 도구 | 역할 | 특성 |
|---|---|---|
| subfinder | passive 수집 | 흔적 X, 소스 품질 의존 |
| puredns | active brute force | wildcard DNS 자동 처리 |
| httpx | live 검증 + 지문 | HTTP 레이어, 추가 소스 뽑기 |
7. OPSEC
- subfinder: 외부 API 호출만. 대상에 트래픽 X.
- puredns: 공개 리졸버에만 쿼리. 대상 서버의 authoritative NS로는 직접 가지 않음(쿼리 체인 끝에서 결국 가긴 하지만 리졸버가 중간에 섬). 그래도 대량 쿼리는 passive DNS 수집 서비스에 흔적 남음.
- httpx: 실제 HTTP 요청이므로 대상 서버 로그에 UA/IP가 찍힌다.
-H "User-Agent: ..."로 지문 바꾸기.