第一次跑 theHarvester,我敲的是这一句:
bash
theHarvester -d example.com -b all
屏幕上开始刷。先是横幅,接着一行行 Searching,然后隔几行冒出一句 [!] Missing API key for xxx。等了几分钟,翻上去一看,大半行都是这种提示,真正有结果的没几个。
我以为装坏了,重装了一遍,还是一样。后来才明白两件事:-b all 是把 51 个源按顺序挨个跑一遍,跑完要几分钟到几十分钟;没填 key 的源不报错,打一行提示就跳过。换成 -b crtsh,rapiddns,两个源,很快就出来了。
下面按"装好、跑通、看懂、落盘"的顺序写。文里的版本号、路径、输出都来自 Kali 上那个 4.10.1,GitHub master 上是另一套形态,我单独用一节说差别,免得你照着网上的截图敲参数结果报错。
一、授权这件事得先定
theHarvester 干的事是:把你给的域名或者公司名,拿到一堆第三方数据源上查一遍,把查到的子域名、邮箱、IP、URL、ASN、人名、泄露记录整理成清单。
查询发生在别人的服务器上,目标机不会收到包。听起来很温和,但你的目标字符串会发给每一个参与查询的数据源。README 的原话是这么写的:被动只代表目标没有被直接接触,被选中的提供商照样会收到目标字符串。
所以两件事得先定。
自己买的域名、公司内部授权的资产、nmap.org 和 owasp.org 这种公开演示域,随便跑。别人的域名,没有书面授权就别碰。《刑法》第 285 条、286 条不是摆着吓人的,README 里也留了一句:只在已授权的安全评估早期阶段使用,只对自有或明确许可的目标运行。
另一件是隐私。邮箱、人名、泄露记录这三类结果,在授权范围内的社工演练里有用,拿去做推广或者钓鱼就是另一码事。
二、它吐出来的只有七类东西
屏幕上是按段显示的:IP 段、邮箱段、人名段、主机名段。哪段没货,它就明说一句 No IPs found.,不会留个空白让你猜。
| 结果 | 从哪来 | 拿来做什么 |
|---|---|---|
| 主机名、子域名 | 证书透明日志、被动 DNS、搜索引擎 | 主要收获 |
| 邮箱 | 搜索引擎、泄露库、猎头库 | 社工演练素材 |
| IP | 被动 DNS、RapidDNS | 圈网段 |
| URL | 搜索引擎、归档站 | 报告素材 |
| ASN | 路由库 | 圈网段 |
| 人名 | 职业库 | 社工评估 |
| 泄露事件名 | haveibeenpwned 这类 | 凭据有没有漏过 |
要说清楚它的性质:结果是快照,不是台账。每次跑都重新查一遍,不增量、不建库、不存历史。想对比两次跑出来的差别,得靠自己把 -f 生成的文件留住。
三、先认清你装的是哪一代
新手最容易在这里卡住。Kali 预装的 4.10.1 和 GitHub master 上面那一版,参数不是一套。
| Kali 的 4.10.1 | master 新一代 | |
|---|---|---|
| 装法 | apt install theharvester |
uv sync,Python 3.14 |
| 源数量 | -h 里列 51 个 |
源表 60 个 |
-b all |
51 个源串着全跑,慢 | 只跑 P0 被动源 |
-f 产物 |
.json + .xml |
.jsonl + .json + .xml |
| 图形界面 | 没有 | HarvestView,本地 127.0.0.1:5000 |
| 并发 | 单线程逐源 | -j / --source-workers |
| 按能力选源 | 没有 | -b subdomains / emails 之类 |
判别办法三个,随便挑:-h 第一屏的版本行;-h 里有没有 -j、--no-hosts 这种旗标;跑一次带 -f 的命令,看目录里有没有多出 .jsonl。
网上教程混着两代的截图,照抄很容易得出"参数坏了"的结论。以你自己机器上的 -h 为准。Kali 那个稳定版够用,不必为了并发和新格式去折腾 Python 3.14。
四、自检,顺便认三个配置文件
bash
dpkg -s theharvester | grep -E 'Version|Description'
text
Version: 4.10.1-0kali2
Description: tool for gathering e-mail accounts and subdomain names from public sources
theHarvester 和 theharvester 两个入口都软链到同一个 Python 脚本,大小写不用纠结。
配置全在 /etc/theHarvester,就三样东西。api-keys.yaml 放各家 key。proxies.yaml 是 -p 用的代理列表。wordlists/ 底下是内置词表,api_endpoints.txt、dns-big.txt、dns-names.txt、dorks.txt、names_small.txt,爆破和端点扫描要用到。
另外每次运行第一行都会打一句 Read proxies.yaml from /etc/theHarvester/proxies.yaml。这是后台读代理配置,正常现象,不是报错。
五、三条命令跑通
第一发,证书透明日志,免 key:
bash
theHarvester -d nmap.org -b crtsh
回显(实录):
text
[*] Target: nmap.org
[*] Searching CRTsh.
[*] No IPs found.
[*] No emails found.
[*] No people found.
[*] Hosts found: 2
---------------------
issues.nmap.org
svn.nmap.org
两台。crtsh 查的是 HTTPS 证书里的 SAN 字段,哪个子域签过公开证书才会留痕,没签过的自然不出现。
第二发,被动 DNS:
bash
theHarvester -d nmap.org -b rapiddns
87 台,一行一个"子域名:IP":
text
[*] Hosts found: 87
---------------------
ac.nmap.org:50.116.1.184
acp.nmap.org:50.116.1.184
u.nmap.org:50.116.1.184
uni.nmap.org:50.116.1.184
users.nmap.org:50.116.1.184
...
www7a.nmap.org:50.116.1.184
同一个域名,换个源,2 台变 87 台。IP 全是同一个,也就是说这些子域都落在同一台服务器上。
第三发,逗号连多个源:
bash
theHarvester -d nmap.org -b crtsh,rapiddns,otx
它顺序打出几条 Searching 行,几个源都跑。4.10.1 是串行的,源加得越多越慢。
-l 管每个源取回多少条,默认 500;-S 100 从第 100 条开始,算是翻页。-d 一次只吃一个目标,写成 -d a.com,b.com 不会跑两个域,得写两条命令或者套个循环。
六、空结果不算工具坏了
这事我碰过不止一次。同一个 -d nmap.org -b crtsh,早上跑出 2 台,下午再跑一次是 0 台。otx 那次也是空的,换成 rapiddns 立刻 87 台。
原因大多在源头那头:证书日志本身有延迟,搜索引擎会按 robots 和限流挡你,被动 DNS 库的收录范围也不一样。单次空手说明不了什么,多换两个源再判断。
所以第一次先挑两三个免 key 的源,-b crtsh,otx,rapiddns 这种组合,看哪边有货。全空的时候先别怀疑工具,换个源试试。
还有一个容易误判的:dnsdumpster 在 4.10.1 上没 key 也能跑,60 秒实测空结果,不报错。但 master 那份源表里它已经标成必须填 key 了,上游在收紧。老教程说它免 key,别全信。
七、源怎么挑
-h 里 -b 能填的源一共 51 个,一长串名字,看着头晕。按有没有 key 分两堆就清楚了。
免 key 能跑的常用组合:crtsh、certspotter、otx、rapiddns、hackertarget、gitlab、urlscan、waybackarchive、thc、subdomaincenter、hudsonrock、baidu、duckduckgo、yahoo。haveibeenpwned 也免 key,但它只回泄露记录。
要 key 的:shodan、virustotal、hunter(查邮箱)、censys、securityTrails、intelx、fofa、zoomeye、tomba、dnsdumpster。没填不是崩溃,是打一行 Missing API key 然后跳过。
官方 README 还有一套源的分级,叫 P0、P1、P2,选源的时候有用:
| 分级 | 意思 | 碰目标吗 |
|---|---|---|
| P0 | 查第三方数据集,流量不直接打向目标 | 不碰 |
| P1 | 以 DNS 名义查询,解析、爆破、逆向都算 | 轻碰 DNS |
| P2 | 直接连目标端点,HTTP、TLS、截图、端口 | 碰,要授权 |
粗暴理解:P0 是别人替你查,P1 是问 DNS,P2 是直接打到目标脸上。纯被动收情报,-b 里放 P0 的源就够了。
按需求挑的话,我平时这么配:
| 想要什么 | 用哪组 |
|---|---|
| 子域名,要快 | -b crtsh,rapiddns,otx |
| 邮箱、人名 | -b baidu,yahoo 免 key 起步;有 key 加 hunter、rocketreach |
| 凭据泄露 | -b haveibeenpwned |
| 代码泄露 | -b github-code、-b gitlab、-b bitbucket |
| 全家桶 | -b all,慢,且每个要 key 的源都打一条提示 |
八、填 key 只动一个文件
api-keys.yaml 的模板长这样,开头几十行都是空的:
text
apikeys:
bevigil:
key:
bitbucket:
key:
填的时候保持两个空格缩进,把值贴到冒号后面:
yaml
apikeys:
hunter:
key: hXXXXXX...
censys:
id: 1a2b.....
secret: 9z8y...
censys 是唯一要两个字段的源,模板里已经留了 id 和 secret 两行,别的都是单个 key。
填完做一件事:chmod 600 /etc/theHarvester/api-keys.yaml。README 也写了,填过的配置文件和 key 不要提交到任何仓库。
代理走 proxies.yaml,填 HTTP 或 SOCKS5 列表,运行时加 -p 让所有源都经代理转发。想藏住"谁在查这个域名",就靠这个。我实测只到"运行首行"这个层面,具体行为按 -h 和 README 写的来。
九、落盘:-f 出两个文件
bash
theHarvester -d nmap.org -b otx -f th-otx
收尾会打三行:
text
[*] Reporting started.
[*] XML File saved.
[*] JSON File saved.
那次 otx 空手,两个文件都是小的:
text
th-otx.json:
{"cmd":"-d nmap.org -b otx -f th-otx","hosts":[],"shodan":[]}
th-otx.xml:
<?xml version="1.0" encoding="UTF-8"?><theHarvester><cmd>-d nmap.org -b otx -f th-otx</cmd></theHarvester>
-f 后面不用写扩展名,NAME 给什么,它就自己拼成 .json 和 .xml 两个。
看 json 的方法:cmd 是你那条命令的回放;hosts 数组装子域名,有 IP 的时候写成"子域名:IP";shodan 数组装 -s 的收获。邮箱、URL、人名有货时,对应字段会出现。
有个细节值得留意:屏幕上结果按段显示,json 里是几个并列的数组。别拿屏幕上的顺序去对 json 里的下标,两边不是一个排列方式。要喂脚本就读 json,要看大概就盯屏幕。
新一代还有第三个 .jsonl,一行一条记录,配 jq 方便。4.10.1 没有这个格式。
十、会碰目标的开关,单独说
下面这些不只查数据集,会往目标那边伸手,用之前先确认授权范围。
| 开关 | 干什么 |
|---|---|
-r / -r resolvers.txt |
对查到的子域做 DNS 解析,拿存活 IP |
-n |
查 NS 记录 |
-c 加 -w 词表 |
子域爆破,直接打 DNS |
-e DNS_SERVER |
指定 DNS 服务器 |
-t |
检测子域接管 |
-s |
用 Shodan API 取主机服务信息,要有 key |
--screenshot 目录 |
对查到的域名批量截图,比较重 |
-a 加 -w 词表 |
扫 API 端点 |
-p |
走 proxies.yaml 里的代理 |
-q |
安静模式,关掉 Missing API key 提示 |
-c 和 -t 要格外小心,一个在爆破,一个在试探接管,都属于会留下痕迹的动作。--screenshot 依赖本机有浏览器程序,可能得装 playwright 之类,装不上就别硬跑。
只想知道"这个 IP 开了什么"又不想自己碰,用 -s 让 Shodan 代劳,前提是 api-keys.yaml 里 shodan 那行填好了。
十一、常见错误对照
| 现象 | 大概是什么原因 | 怎么办 |
|---|---|---|
| 所有源都空手 | 多半是真没数据或者被限流,工具本身没坏 | 换源重试,比如换 -b rapiddns |
| 重定向到文件、timeout 杀掉后文件 0 字节 | Python 输出到文件时是全缓冲,进程被杀缓冲区丢了 | 用 python3 -u 跑,或者让 stdout 留在终端 |
-b all 半天没动静 |
51 个源串行,每个源都有自己的网络等待 | 先挑两三个免 key 源出结果 |
| 满屏 Missing API key | 模板里的 key 全空 | 要用哪个源填哪个,或者加 -q |
| 某个源报错,错误信息是空的 | 上游接口变了,或者网络抖动 | 换源,标了必须 key 的先填 key |
-f 出来的 json 比屏幕少 |
屏幕按段显示,json 是并列数组 | 用屏幕看概貌,json 喂脚本 |
| 网上教程的源名报错 | 两代源表不一样,大小写也照抄不了 | 以本机 -h 的 51 个名字为准 |
-j、-b subdomains 在本机报错 |
那是新一代的旗标 | 按 4.10.1 的语法来 |
十二、命令速查
bash
# 自检
which theHarvester && dpkg -s theharvester | grep Version
theHarvester -h
# 最小被动收割,前提是目标已授权
theHarvester -d nmap.org -b crtsh,rapiddns,otx
# 落盘,方便后面对照
python3 -u theHarvester -d nmap.org -b crtsh,rapiddns -f rep1
# 限量与翻页
theHarvester -d nmap.org -b crtsh -l 200 -S 0
# 关掉 Missing 提示
theHarvester -d nmap.org -b crtsh,otx -q
# 邮箱、人名方向
theHarvester -d owasp.org -b baidu,yahoo
# 解析与 NS,属于 P1
theHarvester -d nmap.org -b crtsh -r
theHarvester -d nmap.org -b crtsh -n
theHarvester -d nmap.org -b crtsh -e 1.1.1.1
# 爆破,P1
theHarvester -d nmap.org -b crtsh -c -w /etc/theHarvester/wordlists/dns-names.txt
# 接管检测、Shodan、截图,P2
theHarvester -d nmap.org -b crtsh -t
theHarvester -d nmap.org -b crtsh -s
theHarvester -d nmap.org -b crtsh --screenshot ./shots/
# 全源,慢,日志留一份
python3 -u theHarvester -d nmap.org -b all -q | tee full.log
我现在的固定做法是:一次跑两三个源,带 -f 存下来,文件名带上日期。过一周再跑一次,把两个 json 拿出来对照,能看出哪些子域是新冒出来的。它不给你做增量,这件事只能自己动手。