theHarvester 入门教程:从装好到看懂输出

第一次跑 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 拿出来对照,能看出哪些子域是新冒出来的。它不给你做增量,这件事只能自己动手。

示例里的 nmap.org 和 owasp.org 都是公开演示域,换目标前先确认授权。

相关推荐
政安晨1 小时前
【政安晨】嵌入式AI开发实践 —— ESP-Claw 深度拆解:把 AI Agent 塞进 $5 芯片,它是怎么“看见“并“握住“硬件的
人工智能·开源·esp·ai agents·esp-claw·esp-mosaico
严肃小白兔1 小时前
Cloudflare 更新 API Token 管理:从最小权限到自动化凭据安全
网络·安全·自动化
miofly2 小时前
GitHub 周榜趋势速报 | 2026-11-08
开源·github
分布式存储与RustFS2 小时前
RustFS 自建对象存储实战目录:110 篇按场景分类(持续更新)
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
miofly2 小时前
GitHub 日榜趋势速报 | 2026-11-08
开源·github
十方空烬16 小时前
命中不等于支持:一个离线证据检索器只保证引文位置
开源
山东科恩光电17 小时前
安全触边在游乐园设施与公共交通车门防夹伤系统中的选型安装及维护要点
安全
miofly17 小时前
百度开源ERNIE 5.5 Flash Base,总参数280B仅激活14B
开源·github