WhatWeb 报错 error: cannot load such file -- whatweb 与 Web 指纹识别用法

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=FILE JSON,便于后续解析
  • --log-json-verbose=FILE 带插件详情的 JSON
  • --log-xml=FILE XML
  • --log-sql=FILE SQL INSERT 语句,配合 --log-sql-create 建表
  • --log-object=FILE Ruby 对象格式
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 运行时生成)的站点,缺少静态特征时识别率明显下降。
相关推荐
白帽攻防录2 小时前
SRC 挖洞:Cisco ISE 认证绕过深度复盘,CVE-2026-76460 CVSS 满分怎么让企业网络大门敞开
网络·安全·web安全·网络安全·src漏洞挖掘
yunni82 小时前
政企AI落地避坑:敏感数据不出域,安全需求优先本地化部署
人工智能·安全
李纲明2 小时前
WordPress 安全加固基线:更新策略、文件权限、登录面收缩和备份验证(含回滚注意)
运维·安全·php·wordpress
恣睢s2 小时前
BugKu——Simple SQL injection
网络安全
Rosanci2 小时前
AI 编程工具该知道什么、能做什么?从仓库上下文到测试执行的权限分层
人工智能·自动化·ai 编程
志栋智能2 小时前
预算敏感型企业的自动化之路:IT运维低成本转型
运维·人工智能·自动化
盛世宏博智慧档案2 小时前
档案库房实现自动化的恒温恒湿消毒净化关键:恒湿消毒净化一体机
运维·自动化·一体机·恒湿机
Novproxy_Z3 小时前
IPv4 与 IPv6 代理在跨境自动化场景下的选型与风险
运维·自动化·php
竣达技术3 小时前
市电断电电池快耗尽时,防止数据损坏?安全关闭后端WINDOWS系统服务器的方案
运维·服务器·安全