用途
dns-recon 是一个面向安全侦察的 DNS 技能,使用 dig、host 和 nslookup 对目标域名执行完整的 DNS 记录查询、区域传送(AXFR)尝试与 DNSSEC 核验。
适用场景:
- 梳理域名的邮件服务器、名称服务器、IP 段等基础设施
- 检测配置错误的区域传送缺陷
- 审计 SPF/DKIM/DMARC 配置状态
- 识别子域名接管候选目标
主要能力
- 查询基础记录:A、AAAA、MX、NS、TXT、CNAME、SOA
- 检查邮件安全记录:SPF、DMARC(_dmarc 前缀)、DKIM(default 选择器)
- 提取名称服务器并尝试区域传送(AXFR),判断是否被拒绝、成功或超时
- 检查 DNSSEC:查询 DNSKEY 与 DS 记录,判断是否启用
- 将结果写入输出文件,并打印 A/MX/NS 记录摘要
前置条件
安装 dnsutils 包(包含 dig、host、nslookup):
# Ubuntu/Debian
sudo apt-get install -y dnsutils
# CentOS/RHEL
sudo yum install -y bind-utils
环境变量 SECSKILL_TARGET_DOMAIN:目标域名。
输入变量
| 变量 | 必填 | 说明 |
|---|---|---|
| SECSKILL_TARGET_DOMAIN | 是 | 要查询的域名(例如 example.com) |
| SECSKILL_OUTPUT_DIR | 否 | 保存结果的目录(默认:./output) |
| SECSKILL_DNS_RESOLVER | 否 | 使用的 DNS 解析器 IP(默认:系统默认) |
工作流程
步骤 1:准备环境
export TARGET="${SECSKILL_TARGET_DOMAIN:?Set the SECSKILL_TARGET_DOMAIN environment variable}"
export OUTDIR="${SECSKILL_OUTPUT_DIR:-./output}"
export RESOLVER="${SECSKILL_DNS_RESOLVER:-}"
mkdir -p "$OUTDIR"
RESOLVER_OPT=""
[ -n "$RESOLVER" ] && RESOLVER_OPT="@${RESOLVER}"
echo "[*] Starting DNS recon: $TARGET"
步骤 2:查询基础记录(A、AAAA、MX、NS、TXT、CNAME)
OUTFILE="$OUTDIR/dns_records_${TARGET}.txt"
echo "===== DNS Record Query: $TARGET =====" > "$OUTFILE"
echo "Query time: $(date -u '+%Y-%m-%dT%H:%M:%SZ')" >> "$OUTFILE"
echo "" >> "$OUTFILE"
for RTYPE in A AAAA MX NS TXT CNAME SOA; do
echo "--- ${RTYPE} record ---" | tee -a "$OUTFILE"
dig $RESOLVER_OPT "$TARGET" "$RTYPE" +noall +answer 2>/dev/null \
| tee -a "$OUTFILE"
echo "" >> "$OUTFILE"
done
echo "[+] Basic record query complete"
步骤 3:检查邮件安全记录(SPF、DKIM、DMARC)
echo "--- Email security records ---" | tee -a "$OUTFILE"
echo "[SPF]" | tee -a "$OUTFILE"
dig $RESOLVER_OPT "$TARGET" TXT +short 2>/dev/null \
| grep -i "v=spf" | tee -a "$OUTFILE"
echo "[DMARC]" | tee -a "$OUTFILE"
dig $RESOLVER_OPT "_dmarc.${TARGET}" TXT +short 2>/dev/null \
| tee -a "$OUTFILE"
echo "[DKIM - default selector]" | tee -a "$OUTFILE"
dig $RESOLVER_OPT "default._domainkey.${TARGET}" TXT +short 2>/dev/null \
| tee -a "$OUTFILE"
echo "[+] Email security record check complete"
步骤 4:提取名称服务器并尝试区域传送
echo "" >> "$OUTFILE"
echo "--- Zone Transfer (AXFR) Attempts ---" | tee -a "$OUTFILE"
NS_LIST=$(dig $RESOLVER_OPT "$TARGET" NS +short 2>/dev/null | sed 's/\.$//')
if [ -z "$NS_LIST" ]; then
echo "[-] No name servers found." | tee -a "$OUTFILE"
else
echo "$NS_LIST" | while read -r NS; do
echo "[*] Attempting zone transfer from: $NS..." | tee -a "$OUTFILE"
RESULT=$(dig @"$NS" "$TARGET" AXFR 2>/dev/null)
if echo "$RESULT" | grep -q "Transfer failed\|connection refused\|REFUSED\|timed out"; then
echo "[-] $NS: Zone transfer refused (expected)" | tee -a "$OUTFILE"
elif echo "$RESULT" | grep -q "XFR size"; then
echo "[!] $NS: Zone transfer succeeded! Vulnerability found" | tee -a "$OUTFILE"
echo "$RESULT" >> "$OUTFILE"
else
echo "[-] $NS: No response or unknown result" | tee -a "$OUTFILE"
fi
done
fi
步骤 5:检查 DNSSEC
echo "" >> "$OUTFILE"
echo "--- DNSSEC Check ---" | tee -a "$OUTFILE"
DNSKEY=$(dig $RESOLVER_OPT "$TARGET" DNSKEY +short 2>/dev/null)
DS=$(dig $RESOLVER_OPT "$TARGET" DS +short 2>/dev/null)
if [ -n "$DNSKEY" ] || [ -n "$DS" ]; then
echo "[+] DNSSEC enabled" | tee -a "$OUTFILE"
echo "DNSKEY: $DNSKEY" >> "$OUTFILE"
echo "DS: $DS" >> "$OUTFILE"
else
echo "[-] DNSSEC not configured" | tee -a "$OUTFILE"
fi
echo "[+] DNS recon complete: $OUTFILE"
步骤 6:打印摘要
echo ""
echo "===== DNS Recon Summary ====="
echo "Target : $TARGET"
echo "A records : $(dig $RESOLVER_OPT $TARGET A +short 2>/dev/null | tr '\n' ' ')"
echo "MX records: $(dig $RESOLVER_OPT $TARGET MX +short 2>/dev/null | tr '\n' ' ')"
echo "NS records: $(dig $RESOLVER_OPT $TARGET NS +short 2>/dev/null | tr '\n' ' ')"
echo "Output : $OUTFILE"
echo "=============================="
完成条件
- 所有记录类型均已查询
- 区域传送尝试结果已记录(无论成功或失败)
- DNSSEC 状态已核验
- 输出文件已创建
失败模式
| 症状 | 原因 | 解决方式 |
|---|---|---|
| dig: command not found | 未安装 dnsutils | 运行 apt-get install dnsutils |
| 所有查询超时 | 防火墙或 DNS 屏蔽 | 指定其他解析器(SECSKILL_DNS_RESOLVER=8.8.8.8) |
| 区域传送结果为空 | 被正确拒绝 | 探索其他攻击向量 |
| NXDOMAIN 响应 | 域名拼写错误或域名不存在 | 核对域名拼写 |
注意事项
- 若发现区域传送缺陷,应立即在报告中记录。这属于高严重性发现。
- TXT 记录可能包含内部基础设施线索和服务认证令牌。
- 也可使用 host -l 命令进行区域传送:
host -l $TARGET $NAMESERVER - SPF 的 ~all 或 +all 设置易受欺骗攻击,应单独报告。