为什么是这三件套
红队工作的第一步永远不是「打」,而是「知道有什么」。资产测绘做不干净,后面的漏洞利用全是碰运气。
传统做法是拿一份子域字典跑爆破,再手工点开每个站点看。这套流程的问题很现实:慢、漏、无法复现。而 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:流水线止于「验证」,利用永远是人工决策。
六、控制噪音:别把授权方打挂
真实项目里,扫描导致业务抖动是常见的投诉来源。三条硬规则:
- 限速:
-rate-limit从 20 开始,观察目标响应时间再往上调。 - 避开业务高峰:和大促、开盘、直播这类时间点错开。
- 排除敏感路径:登录、支付、上传接口用
-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 条,后果自负。
- 1、本网站名称: 星宇安全实验室
- 2、本站永久网址:https://bk.zhaozhiqiang.pw/
- 3、本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
- 4、本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
- 5、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
- 6、本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
- 7、文章版权归作者所有,未经允许请勿转载。















暂无评论内容