第一次跑 theHarvester,我敲的是这一句:
theHarvester-dexample.com-ball屏幕上开始刷。先是横幅,接着一行行 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。
四、自检,顺便认三个配置文件
dpkg-stheharvester|grep-E'Version|Description'Version: 4.10.1-0kali2 Description: tool for gathering e-mail accounts and subdomain names from public sourcestheHarvester和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:
theHarvester-dnmap.org-bcrtsh回显(实录):
[*] 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:
theHarvester-dnmap.org-brapiddns87 台,一行一个"子域名:IP":
[*] 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 全是同一个,也就是说这些子域都落在同一台服务器上。
第三发,逗号连多个源:
theHarvester-dnmap.org-bcrtsh,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的模板长这样,开头几十行都是空的:
apikeys: bevigil: key: bitbucket: key:填的时候保持两个空格缩进,把值贴到冒号后面:
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出两个文件
theHarvester-dnmap.org-botx-fth-otx收尾会打三行:
[*] Reporting started. [*] XML File saved. [*] JSON File saved.那次 otx 空手,两个文件都是小的:
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 的语法来 |
十二、命令速查
# 自检whichtheHarvester&&dpkg-stheharvester|grepVersion theHarvester-h# 最小被动收割,前提是目标已授权theHarvester-dnmap.org-bcrtsh,rapiddns,otx# 落盘,方便后面对照python3-utheHarvester-dnmap.org-bcrtsh,rapiddns-frep1# 限量与翻页theHarvester-dnmap.org-bcrtsh-l200-S0# 关掉 Missing 提示theHarvester-dnmap.org-bcrtsh,otx-q# 邮箱、人名方向theHarvester-dowasp.org-bbaidu,yahoo# 解析与 NS,属于 P1theHarvester-dnmap.org-bcrtsh-rtheHarvester-dnmap.org-bcrtsh-ntheHarvester-dnmap.org-bcrtsh-e1.1.1.1# 爆破,P1theHarvester-dnmap.org-bcrtsh-c-w/etc/theHarvester/wordlists/dns-names.txt# 接管检测、Shodan、截图,P2theHarvester-dnmap.org-bcrtsh-ttheHarvester-dnmap.org-bcrtsh-stheHarvester-dnmap.org-bcrtsh--screenshot./shots/# 全源,慢,日志留一份python3-utheHarvester-dnmap.org-ball-q|teefull.log我现在的固定做法是:一次跑两三个源,带-f存下来,文件名带上日期。过一周再跑一次,把两个 json 拿出来对照,能看出哪些子域是新冒出来的。它不给你做增量,这件事只能自己动手。
示例里的 nmap.org 和 owasp.org 都是公开演示域,换目标前先确认授权。