红队资产侦察三件套:subfinder + httpx + nuclei 从子域到漏洞的完整链路

为什么是这三件套

红队工作的第一步永远不是「打」,而是「知道有什么」。资产测绘做不干净,后面的漏洞利用全是碰运气。

传统做法是拿一份子域字典跑爆破,再手工点开每个站点看。这套流程的问题很现实:慢、漏、无法复现。而 ProjectDiscovery 这套工具把流程拆成了三个职责清晰的阶段:

阶段 工具 回答的问题
① 资产发现 subfinder 这个域名下有哪些子域?
② 存活与指纹 httpx 哪些真的活着?跑的是什么技术栈?
③ 漏洞验证 nuclei 已知的模板化漏洞有没有命中?

三者用管道串起来,就是一条可复现、可增量跑的流水线。本文给完整命令和编排脚本。

合规前提:以下所有操作只对你自己拥有的资产或书面授权范围内的目标执行。扫描未授权目标在国内可能触犯《网络安全法》与《刑法》第 285 条。动手前先把授权范围写成一个 scope.txt,扫之前逐条核对,这是职业习惯,不是形式。

一、安装

Kali / Debian 系

sudo apt update
sudo apt install -y subfinder nuclei httpx-toolkit naabu

注意一个坑:httpx 有两个同名项目。一个是 Python 的 HTTP 客户端库,一个是 ProjectDiscovery 的探测工具。Kali 仓库里为了避免冲突,把后者打包成 httpx-toolkit,可执行文件名仍然是 httpx。如果你 pip install httpx 了,命令行会被覆盖,症状是执行 httpx -l 报参数错误。

通用安装(Go 环境)

go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest
go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
go install -v github.com/projectdiscovery/naabu/v2/cmd/naabu@latest

装完记得把 $(go env GOPATH)/bin 加进 PATH。

初始化 nuclei 模板

nuclei -update-templates
nuclei -tl | wc -l      # 看模板数量,正常几千到上万

二、阶段一:子域枚举

subfinder -d example.com -all -silent -o subs.txt
wc -l subs.txt

-all 表示使用全部被动源(证书透明日志、搜索引擎、DNS 数据集等)。这一步不向目标发包,是纯被动收集,隐蔽性最好。

几个实践要点

  • 配置 API Key:~/.config/subfinder/provider-config.yaml 里填上 Shodan、Censys、SecurityTrails 等密钥,结果数量能翻几倍。不填也能跑,但只能拿到公开源。
  • 被动收集不完整:它拿不到「从未被公开记录过」的子域。需要爆破时用 dnsx + 字典补,但这会产生 DNS 查询,隐蔽性下降。
  • 去重与规范化:sort -u 之后还要过滤掉泛解析(wildcard DNS)产生的假记录。
sort -u subs.txt -o subs.txt
# 检查泛解析:随便编一个不存在的子域,如果也能解析出来,说明有 wildcard
dig random-nonexist-12345.example.com +short

三、阶段二:存活探测与指纹

子域列表里可能有几千条,其中一半是死的。直接扫会浪费大量时间,也容易触发告警。用 httpx 先筛:

httpx -l subs.txt -silent \
  -status-code -title -tech-detect -web-server -cdn \
  -threads 50 -timeout 10 \
  -o alive.txt

参数怎么选

参数 作用 建议
-status-code 返回状态码 必开,用来过滤 404/502
-title 页面标题 必开,能快速识别后台/默认页
-tech-detect 技术栈识别 必开,决定后面用哪些模板
-cdn 标记是否走 CDN 重要,CDN 后面的 IP 扫了也没意义
-threads 并发数 授权范围内 50,公网保守用 20
-favicon favicon 哈希 做资产关联时很有用,同一个哈希往往是同一套系统

结果怎么读

输出里最有价值的三类:

  • 200 且标题是「后台登录」「phpMyAdmin」 —— 直接是入口
  • 403 但页面有内容 —— 目录存在但被拦,值得试路径绕过
  • 相同 favicon 哈希的多个域名 —— 同一套系统部署在多处,一处有洞往往处处有洞

四、阶段三:漏洞验证

nuclei 是基于模板的验证器,不是「扫描器」——它的价值在于把已知漏洞的 PoC 标准化,而不是发现未知漏洞。

nuclei -l alive.txt \
  -severity critical,high \
  -rate-limit 50 \
  -stats \
  -o vulns.txt

必须先读模板再跑

这是新手最容易忽略的一步。nuclei 的模板是明文的 YAML,跑之前应该知道它到底发了什么请求:

nuclei -tl | grep -i apache
cat ~/nuclei-templates/http/cves/2021/CVE-2021-41773.yaml

读模板有两个好处:理解命中原理(判断误报)、以及知道它会不会对目标造成副作用(有些模板会写文件、传 webshell)。在有业务流量的生产环境,带写入动作的模板不要跑。

只跑与指纹匹配的模板

nuclei -l alive.txt -tags apache,spring -severity high,critical -o vulns.txt

全量跑一万个模板,既慢又吵;按 httpx 识别出的技术栈挑 -tags,命中率更高、噪音更小。

五、编排成一条流水线

#!/usr/bin/env bash
# recon.sh —— 只对授权目标使用
set -euo pipefail

DOMAIN="${1:?用法: ./recon.sh example.com}"
OUT="recon/${DOMAIN}/$(date +%Y%m%d-%H%M)"
mkdir -p "$OUT"

echo "[1/4] 子域枚举"
subfinder -d "$DOMAIN" -all -silent -o "$OUT/subs.txt"
sort -u "$OUT/subs.txt" -o "$OUT/subs.txt"
echo "      发现 $(wc -l < "$OUT/subs.txt") 个子域"

echo "[2/4] 存活探测"
httpx -l "$OUT/subs.txt" -silent \
      -status-code -title -tech-detect -cdn \
      -threads 50 -timeout 10 \
      -o "$OUT/alive.txt"
echo "      存活 $(wc -l < "$OUT/alive.txt") 个"

echo "[3/4] 漏洞验证"
nuclei -l "$OUT/alive.txt" \
       -severity critical,high \
       -rate-limit 50 -stats \
       -o "$OUT/vulns.txt" || true

echo "[4/4] 完成,结果在 $OUT"
ls -lh "$OUT"

几个设计上的考虑:

  • 按「域名 + 时间戳」建目录,每次跑都是独立快照,方便对比「这次比上次多了什么」。
  • set -euo pipefail:任何一步失败立即停,避免拿残缺数据往下跑。
  • nuclei || true:nuclei 在没有命中时返回非 0,不加这个会导致脚本整体失败。
  • 不自动 exploit:流水线止于「验证」,利用永远是人工决策。

六、控制噪音:别把授权方打挂

真实项目里,扫描导致业务抖动是常见的投诉来源。三条硬规则:

  1. 限速:-rate-limit 从 20 开始,观察目标响应时间再往上调。
  2. 避开业务高峰:和大促、开盘、直播这类时间点错开。
  3. 排除敏感路径:登录、支付、上传接口用 -exclude 排除,避免触发账号锁定或产生脏数据。
nuclei -l alive.txt -rate-limit 20 \
  -exclude "/login,/pay,/upload" \
  -severity high,critical -o vulns.txt

七、结果收敛与报告

原始输出不能直接给客户。至少要处理三件事:

  • 去重:同一个漏洞在多个子域重复命中,合并成一条并列出受影响资产。
  • 人工复现:每一条都要用 curl 手工验证一次,记录请求和响应。
  • 分级:按「可利用性 × 影响面」排序,而不是照搬模板的 severity。
nuclei -l alive.txt -jsonl -o vulns.jsonl
# 按模板名聚合
jq -r '.info.name' vulns.jsonl | sort | uniq -c | sort -rn

八、常见坑

现象 原因 处理
httpx: unrecognized arguments 装成了 Python 的 httpx 库 卸载 Python 包,改用 httpx-toolkit
subfinder 结果很少 没配 API Key 填 provider-config.yaml
大量 404 子域 泛解析 wildcard 用随机子域验证并过滤
nuclei 命中但打不开 模板基于版本指纹,实际已修复 人工复现确认,别直接写进报告
扫描中途目标 502 并发过高 降 -threads 和 -rate-limit
CDN 后面的 IP 扫不出东西 扫到的是边缘节点 用 -cdn 标记并单独处理,找真实源站

九、这套流程的边界

说清楚它不能做什么,比吹它能做什么更有价值:

  • 发现不了逻辑漏洞:越权、支付篡改、并发竞争,这些都靠人理解和业务建模,模板无能为力。
  • 发现不了 0day:nuclei 只验证「已知的」。
  • 替代不了手工:它能把你从「找资产」里解放出来,但不能替你「想攻击路径」。
  • 不等于隐蔽:被动收集隐蔽,但 httpx 和 nuclei 都会留下大量请求日志,蓝队看得一清二楚。

十、小结

把链路记成一句话:subfinder 找面 → httpx 筛点 → nuclei 验伤。

三个工具各自都很简单,价值在于串联方式和两个纪律:先写 scope 再动手、命中必须人工复现。缺了这两条,工具越好用,越容易出事。

延伸阅读:


免责声明:本文所述工具与方法仅用于自有资产的安全评估、授权范围内的渗透测试与防御建设。未经授权对他人系统进行扫描、探测或攻击,可能触犯《中华人民共和国网络安全法》《刑法》第 285 条,后果自负。

© 版权声明
THE END
喜欢就支持一下吧
点赞15赞赏 分享
相关推荐
评论 抢沙发

请登录后发表评论

    暂无评论内容