WhatWeb 报错 error: cannot load such file -- whatweb 与 Web 指纹识别用法
仅供已获得书面授权的安全测试使用。
WhatWeb 是一个 Web 指纹识别工具,用 Ruby 编写。它向目标发送 HTTP 请求,再用内置插件匹配响应里的特征,识别目标使用的 CMS、框架、中间件、JavaScript 库、服务器软件以及版本号。
用 gem 装完之后直接敲 whatweb 报 cannot load such file,是这套工具最常见的安装坑,处置方法放在下面第一节。
报错 cannot load such file -- whatweb
gem 安装完成后执行命令,报错原文:
text
/usr/lib/ruby/vendor_ruby/rubygems/core_ext/kernel_require.rb:59:in `require':
cannot load such file -- whatweb (LoadError)
原因是 Ruby 的可执行文件包装器找到了,但 gem 的库路径没有进 $LOAD_PATH。三种处置:
bash
# 1) 确认 gem 装到哪儿了
gem which whatweb
gem environment | grep -A5 "GEM PATHS"
# 2) Debian/Kali 系优先用 apt,包名与路径都对得上
sudo apt install whatweb
# 3) 源码目录里直接跑,绕过包装器
cd /usr/share/whatweb
ruby whatweb http://192.168.1.10
gem install whatweb 在需要 root 的目录下安装但不带 sudo 时,还会先报 You don't have write permissions for the ... directory,这一类统一用 sudo gem install whatweb 或改用 apt。
安装与版本
Kali 自带 WhatWeb。本次实测环境为 Kali GNU/Linux Rolling 2025.4:
bash
whatweb --version
# WhatWeb version 0.6.3 ( https://morningstarsecurity.com/research/whatweb/ )
dpkg -l whatweb | tail -1
# ii whatweb 0.6.3-1kali1 all Next generation web scanner
其他发行版用 apt 或 gem 安装:
bash
sudo apt install whatweb
gem install whatweb
插件放在 /usr/share/whatweb/plugins,实测该目录下有 1833 个文件。自定义插件放 /usr/share/whatweb/my-plugins,里面自带 plugin-tutorial-1.rb 到 plugin-tutorial-3.rb 三个模板,照模板改就能加自己的识别规则。
基本用法
最简单的调用只给一个 URL 或主机名:
bash
whatweb http://192.168.1.10
实测一个只返回静态页的站点,输出是一行:
text
http://127.0.0.1:8099 [200 OK] Country[RESERVED][ZZ], HTTPServer[SimpleHTTP/0.6 Python/3.13.9], IP[127.0.0.1], Python[3.13.9], Title[t]
方括号里是插件名与匹配到的值,同一个插件可以出现多次,例如页面里同时引用了两个版本的 jQuery 就会列两条。
一次给多个目标:
bash
whatweb 192.168.1.10 192.168.1.11 example.com
也可以从文件读取,或用管道喂进去:
bash
whatweb -i targets.txt
cat targets.txt | whatweb -i /dev/stdin
目标支持 URL、主机名、IP、CIDR 网段(192.168.1.0/24)、IP 区间(192.168.1.1-20),以及文件路径。
插件与匹配
识别能力全部来自插件。查看与筛选插件:
bash
whatweb -l # 列出全部插件名
whatweb --search-plugins apache # 按关键词搜插件
whatweb -I "Apache,Cookie" # 列出指定插件的详细说明
只用某几个插件能大幅减少请求量,适合只关心服务器软件与标题的场景:
bash
whatweb -p "HTTPServer,Title,IP" http://192.168.1.10
-p 的列表用逗号分隔,元素可以是目录、文件或插件名,带 + / - 修饰表示追加或排除,例如 -p ./plugins-disabled,-md5。只想保留匹配到某个关键词的结果,用 -g:
bash
whatweb -g "WordPress" -i targets.txt
-g 支持普通字符串与正则,正则用斜杠包起来,写成 -g "/he[l]*o/" 这样。不想写插件文件、只想临时加一条匹配规则时,用 --custom-plugin 直接在命令行定义:
bash
whatweb --custom-plugin=:text=>"powered by acme" http://192.168.1.10
探测强度
-a 控制请求量,默认 1。
-a 1(Stealthy):每个目标一个请求并跟随跳转。最快、最不显眼,多数场景够用。-a 3(Aggressive):某个 1 级插件命中后,追加该插件的额外请求,能确认更精确的版本号。-a 4(Heavy):所有插件涉及的 URL 都被请求一遍,请求量最大,容易触发防护。
bash
whatweb -a 3 http://192.168.1.10
需要更详细的插件说明加 -v,只要结果不要过程加 -q,屏蔽报错加 --no-errors。
结果导出
日志参数决定输出格式,可单选也可同时开多个:
--log-brief=FILE一行一条,最省事--log-verbose=FILE带插件说明--log-json=FILEJSON,便于后续解析--log-json-verbose=FILE带插件详情的 JSON--log-xml=FILEXML--log-sql=FILESQL INSERT 语句,配合--log-sql-create建表--log-object=FILERuby 对象格式
bash
whatweb -q --log-json=scan.json --log-brief=ops.txt -i targets.txt
-q 只写文件不打印到终端,适合放进脚本。
批量与并发
-i 读目标列表,-t 控制并发线程,默认 25。超时参数 --open-timeout 默认 15 秒,--read-timeout 默认 30 秒:
bash
whatweb -i targets.txt -t 50 --open-timeout 5 --read-timeout 10 \
--no-errors --log-brief=ops.txt
对响应慢的目标,线程数开太高会把结果拖成大量超时。这时改成单线程并加请求间隔更稳:
bash
whatweb -i targets.txt --max-threads 1 --wait 1 --log-brief=ops.txt
需要认证的站点:-u user:pass 走 Basic 认证,-c 'name=value' 带 Cookie,-H 'X-Token: abc' 加自定义头,-U 'Mozilla/5.0' 换 User-Agent。要经代理用 --proxy 127.0.0.1:8080。
常见运行报错
连接超时:
text
ERROR Opening: http://192.168.1.10 - execution expired
这是 --open-timeout(默认 15 秒)内没建好连接。目标主机不在线、端口被防火墙丢弃、或批扫线程开太多把连接排队拖超时,都会出这条。先把线程降到 1 并拉长超时确认:
bash
whatweb -i targets.txt --max-threads 1 --open-timeout 30 --no-errors
忽略报错继续扫 :批量场景不希望个别目标失败打断整轮,加 --no-errors 把错误行压掉,结果文件里只留成功的条目。
bash
whatweb -i targets.txt --no-errors --log-brief=ops.txt
指定了不存在的插件名:
text
Warning: Plugin "apachee" not found
-p 列表里的名字拼错时会提示插件找不到,该插件被跳过,其余照常执行。核对插件真实名字用 whatweb --search-plugins apache。
注意事项
- 默认的
-a 1每个目标只发一个请求,很多插件的匹配条件不会触发,版本号经常识别不出。需要精确版本再上-a 3。 -a 4的请求量按插件数放大,对外网目标容易触发 WAF 或封 IP,批扫前先确认范围与频率。- 识别结果是基于响应特征的概率判断,不是漏洞结论。同一个中间件被匹配到,不代表存在漏洞。
- 不适用边界:WhatWeb 不检测漏洞,只做指纹识别;对纯前端渲染(页面内容由 JavaScript 运行时生成)的站点,缺少静态特征时识别率明显下降。