MahdiHedhli/openclaw_scanner
GitHub: MahdiHedhli/openclaw_scanner
一款基于证据优先模式的开源 OpenClaw 网关指纹识别与漏洞分诊扫描器。
Stars: 3 | Forks: 1
OpenClaw Scanner
重证据。非假设。
用于指纹识别暴露的 OpenClaw 网关的 OpenClaw 扫描器,包括
OpenClaw 18789 端口扫描器工作流,以及以证据优先的 OpenClaw
漏洞分诊。
授权的 Web 检查器:
OpenClaw 暴露检查器
## 为什么开发此工具
`openclaw_scanner` 是一个开源的 OpenClaw 扫描器,旨在帮助防御者
在不夸大的情况下对暴露的 OpenClaw 网关进行指纹识别。它支持
OpenClaw 18789 端口扫描器工作流,从 Shodan/Censys/
FOFA/CT 导出中进行被动发现,低影响力的主动验证,以及当网络中可见
具备关联级别的精确版本证据时,进行保守的 OpenClaw
漏洞分诊。
该扫描器刻意保持低影响力。它不会利用主机、尝试
绕过身份验证、暴力破解凭据或运行侵入性 payload。
仅将其用于您拥有或获得明确授权评估的系统。本项目
不支持对未经授权测试的面向互联网的 IP 进行主动
扫描。
## 概览
| 功能 | 您将获得 |
| --- | --- |
| 🔎 被动发现 | Shodan 查询 ID、Shodan/Censys/FOFA/CT 导入、mDNS 解析、hash 枢纽、置信度权重 |
| 🌐 主动网关探测 | 低影响力的默认 GET/WebSocket 探测;在获得强家族证据后进行条件性深度验证 |
| 🧬 指纹证据 | 状态分布、标题、JS 资产、favicon hash、JSON 键形状、body 标记、版本提示 |
| 🧪 精确版本规则 | 通过实验室验证并推广的 17 个 OpenClaw 版本(截至 `2026.5.28`) |
| 📦 最新 OpenClaw 包 | 已发布 `2026.6.1`;精确规则覆盖范围在推广前仍需进行实验室捕获 |
| 🛡️ 防御上下文 | 反向代理检测、蜜罐启发式分析、漏洞关联 |
| 🐍 可移植运行时 | 标准 `python3`;无第三方 Python 依赖 |
## OpenClaw Scanner 搜索短语
本项目特意涵盖了常见的防御性搜索意图:
- OpenClaw scanner
- 指纹识别暴露的 OpenClaw 网关
- OpenClaw 18789 端口扫描器
- OpenClaw 漏洞分诊
- OpenClaw 网关指纹识别
- Clawdbot 和 Moltbot 网关暴露检查
## 快速导航
- [快速开始](#quick-start)
- [实地校准快照](#field-calibration-snapshot)
- [公开暴露检查器](#public-exposure-checker)
- [已知版本语料库](#known-version-corpus)
- [输入格式](#input-formats)
- [黑盒校准工作流](#black-box-calibration-workflow)
- [自定义指纹规则](#custom-fingerprint-rules)
- [测试](#tests)
## 工作原理
对于每个目标,扫描器会:
1. 仅使用默认 GET 请求以及 WebSocket upgrade-header 握手来探测常见的 OpenClaw 网关 endpoint、兼容 OpenAI 的模型路径、
WebSocket 升级、静态资产以及安全的错误行为路径
2. 记录 header、header 顺序、状态码、剔除的错误文本、堆栈
跟踪提示、标题、favicon hash、JS 资产路径、JSON 键形状、
产品标记、响应时间、版本提示,以及
`status_distribution_signature`
3. 导入被动的 Shodan、Censys、FOFA 和 CT 元数据,例如标题、TLS
名称、JARM 值、favicon hash、Shodan 报告的 CVE,以及在可用时导入结构化的
mDNS 网关元数据
4. 从实时响应和被动的 Shodan WAF 提示中检测潜在的反向代理或 WAF 边缘
5. 应用保守的家族指纹规则和精确版本规则
6. 将推断出的版本与内置的 OpenClaw 漏洞数据进行关联
## 证据模型
OpenClaw Scanner 将发现、识别、版本归因和
漏洞关联区分开来:
| 阶段 | 含义 | 可驱动的操作 |
| --- | --- | --- |
| 候选 | 被动来源、查询、CT 名称、标题、favicon hash、TLS 名称、JARM 值或 mDNS 记录表明某台主机可能值得检查。 | 仅用于分诊和目标选择。 |
| 主动服务信号 | 实时的低影响力探测返回状态、header、标题、JSON 键、body 标记、静态资产或 WebSocket 握手行为。 | 更强力的分诊和响应聚类。 |
| 家族指纹 | 多个远程可见信号与内置的 OpenClaw 家族行为规则匹配。 | 家族级别的识别和可选的条件性深度验证。 |
| 精确版本证据 | 实验室推广的精确规则或显式的关联级元数据(如 mDNS `cliPath` 包版本)匹配。 | 精确版本归因。 |
| 漏洞关联 | 关联级别的版本匹配与内置的漏洞范围相交。 | 防御性漏洞分诊,而非可利用性证明。 |
被动发现元数据并不等于版本证据。被动数据集
对于寻找候选目标很有用,但目前的现场数据表明,它们自身无法提供
可靠的精确版本指纹识别。CDP/Chromium 信号是
浏览器代理证据;仅凭 CDP 并不能独立证明 OpenClaw 的存在,且永远不会
驱动漏洞关联。
## 快速开始
扫描单个目标:
```
python3 -m openclaw_scanner --target https://127.0.0.1:18789 --format pretty
```
扫描目标列表并输出 JSON:
```
python3 -m openclaw_scanner \
--targets-file targets.txt \
--format json \
--output results.json
```
被动分析 Shodan 导出数据:
```
python3 -m openclaw_scanner \
--shodan-file shodan-results.json \
--format csv \
--output triage.csv
```
主动重新探测源自 Shodan 的候选目标:
```
python3 -m openclaw_scanner \
--shodan-file shodan-results.json \
--rescan-shodan \
--format json \
--output active-results.json
```
运行实时 Shodan 查询:
```
SHODAN_API_KEY=... python3 -m openclaw_scanner \
--shodan-query 'product:"mDNS" "clawdbot-gw"' \
--shodan-pages 2 \
--format pretty
```
列出内置发现查询并按 ID 运行其中一个:
```
python3 -m openclaw_scanner --list-discovery-queries
SHODAN_API_KEY=... python3 -m openclaw_scanner \
--discovery-query shodan-title-openclaw-control \
--shodan-pages 1 \
--format csv
```
导入其他被动数据集:
```
python3 -m openclaw_scanner \
--censys-file censys-export.json \
--fofa-file fofa-export.csv \
--ct-file ct-export.jsonl \
--format json
```
探测备用端口上的潜在网关并使用条件性深度验证:
```
python3 -m openclaw_scanner \
--shodan-file shodan-results.json \
--rescan-shodan \
--probe-ports \
--deep-validation \
--format json
```
从匿名的主动 CSV 中导出下一个公开安全的校准目标:
```
python3 -m openclaw_scanner \
--calibration-candidates-from artifacts/shodan/2026-06-03/public/openclaw-active-default-100-anonymized.csv \
--format csv \
--output next-calibration-candidates.csv
```
使用内置的演示数据:
```
python3 -m openclaw_scanner \
--shodan-file openclaw_scanner/data/demo_18789-03-17-2026.json \
--rescan-shodan \
--format pretty
```
## 实地校准快照
OpenClaw Scanner 目前进行了两次公开安全的校准运行,展示了
将发现与识别分开的价值。
### 2026-06-02 mDNS 导向运行
首次面向公众的校准运行使用了来自 500 行被动
Shodan 数据和 100 个主动目标入围名单的匿名数据:
| 指标 | 结果 |
| --- | ---: |
| 被动 Shodan 候选 | 500 |
| 主动入围名单 | 100 |
| 响应的主动主机 | 14 |
| 主动 OpenClaw 家族匹配 | 13 |
| 精确版本匹配 | 0 |
| 候选到响应率 | 14% |
| 候选到家族匹配率 | 13% |
| 被动到家族匹配率 | 2.6% |
主动样本还产生了聚类后的 `status_distribution_signature`
值,例如 `200:13;401:1;404:23` 和 `200:13;401:3;404:21`。
### 2026-06-03 标题查询跟进
跟进运行使用了扩展的发现查询支持来针对
`http.title:"OpenClaw Control"`,规范化了 500 个被动候选目标,并主动
验证了一个 100 台主机的入围名单两次:一次是默认的低影响力模式,
另一次启用了 `--deep-validation` 但仍禁用了 POST 探测。
| 指标 | 被动候选 | 主动默认 | 主动深度(无 POST) |
| --- | ---: | ---: | ---: |
| 处理结果 | 500 | 100 | 100 |
| 响应的主动主机 | N/A | 100 | 100 |
| OpenClaw 家族匹配 | 0 | 70 | 70 |
| 精确版本匹配 | 0 | 25 | 25 |
| 漏洞关联 | 0 | 10 | 10 |
标题查询运行的关键比率:
- 主动候选到家族匹配率:70 / 100,即 70%。
- 主动候选到精确版本率:25 / 100,即 25%。
- 被动到家族匹配率:70 / 500,即 14%。
更深入的 CSV 审查得出了以下额外发现:
- 被动门控在现场数据中依然有效:65 个被动候选目标带有
`product_confidence=1.0` 且无关联的类版本证据,但仍然
产生了 0 个精确版本和 0 个漏洞关联。在旧的
被动 banner 逻辑下,这些行的数据类型原本可能成为
纯被动版本或漏洞的误报。
- 25 台具有精确版本的主动主机分布在 `2023.11.3` (8)、
`2026.5.28` (7)、`2026.5.7` (4),以及 `2026.1.29-beta.1`、
`2026.2.2-1`、`2026.5.3-1`、`2026.5.18`、
`2026.5.22` 和 `2026.5.27` 各一台主机。
- 漏洞关联保持在证据门控内:8 台 `2023.11.3` 主机
各自关联了 32 条记录,一台 `2026.1.29-beta.1` 主机关联了 30 条,
一台 `2026.2.2-1` 主机关联了 29 条。没有纯被动行产生
漏洞关联。
- 版本后缀保留已在实地得到确认,包括 `2026.2.2-1`、
`2026.1.29-beta.1` 和 `2026.5.3-1`。
- 30 行无家族匹配的主动数据分为误报、
错误频繁和有响应/无家族类别。有响应/无家族行
聚集在 `200:35;400:2;404:1` 或 `401` 身份验证质询变体周围,它们
是下一个规则挖掘目标。
- 被动候选集包括明显的非 OpenClaw 产品,例如
Ivanti EPMM、Sophos SSL VPN、D-Link 网络摄像头、Ncat proxy、IIS 和 Apache。
扫描器现在会注释或降级这些被动候选目标,而不是
将发现置信度视为识别结果。
在此样本中,深度验证并未改变家族、精确版本或漏洞数量,
但它增加了更丰富的响应形状证据。最常见的
默认状态特征码是 `200:19;404:19`、`200:17;404:19` 和
`101:2;200:17;404:19`;最常见的深度验证特征码是
`200:34;404:23;405:1`、`200:32;404:23;405:1` 和
`101:2;200:32;404:23;405:1`。
这些特征码被作为关联信号进行跟踪,用于未来的版本、
部署模式和反向代理分析,但它们自身不被视为
精确版本证明。
公开安全的匿名产物位于:
- `artifacts/shodan/2026-06-02/public/`
- `artifacts/shodan/2026-06-03/public/`
## 公开暴露检查器
实时授权自我评估页面:
代码仓库包含一个可部署的、位于 `site/` 下的 GitHub Pages 检查器前端,
以及位于 `cloudflare/worker/` 下的 Cloudflare Worker API。该页面是刻意
静态的,本身不执行扫描;它调用单独的、受速率限制的 Worker
后端,进行一次授权的、低影响力的检查。
检查器流程受到刻意限制:
- 用户必须确认:“我确认我拥有此系统或已获得明确
授权对其进行评估。”
- 用户必须在请求被接受之前完成 CAPTCHA
- 后端会验证目标并阻止 localhost、私有、链路本地、
多播、元数据、保留和内部主机名目标
- 检查器路径仅使用低影响力的 GET 检查
- 不允许进行 POST 探测、身份验证尝试、debugger socket 连接、VNC
交互或 payload 执行
- 除非存在关联级别的精确版本
证据,否则漏洞输出将被抑制
- 部署详情位于 `docs/exposure-checker.md`
## 文档
- 官方 GitHub 仓库:
- [路线图](docs/roadmap.md)
- [已知版本语料库工作流](docs/corpus-workflow.md)
- [公告草案](docs/openclaw-scanner-announcement.md)
- [2026 年 6 月校准博客更新](docs/openclaw-scanner-blog-update-2026-06-03.md)
- [静态暴露检查器](docs/checker/index.html)
- [暴露检查器 API 契约](docs/checker/api-contract.json)
- [暴露检查器部署指南](docs/exposure-checker.md)
## 已知版本语料库
内置的精确版本规则目前包括 17 个实验室推广的 OpenClaw
版本:
显示已覆盖的版本
- `2026.1.29-beta.1`
- `2026.2.2-1`
- `2026.2.6`
- `2026.2.13`
- `2026.2.21`
- `2026.5.3-1`
- `2026.5.7`
- `2026.5.18`
- `2026.5.19-beta.1`
- `2026.5.20`
- `2026.5.22`
- `2026.5.24-beta.1`
- `2026.5.24-beta.2`
- `2026.5.25-beta.1`
- `2026.5.26`
- `2026.5.27`
- `2026.5.28`
这些规则基于短暂的 VLAN 30 捕获,应被视为
高价值的分诊证据。它们不是利用证明,并且异常的部署
模式、代理、自定义构建或隐藏的静态资产仍然可能将扫描结果
降级为家族级别的置信度。截至 2026-06-02 的版本监视运行,稳定
包的差距已通过 `2026.5.28` 弥补。截至 2026-06-04 的 npm 注册表
检查,最新发布的 OpenClaw 包是 `2026.6.1`;该版本尚未
在此扫描器中进行实验室推广,在添加精确版本规则之前,应经过
受限的版本监视捕获工作流。
## 输入格式
### 直接目标
传入一个或多个 `--target` 值或使用 `--targets-file`。
示例:
- `https://host.example:18789`
- `http://10.0.0.5:8080`
- `gateway.example.com:18789`
- `192.0.2.10`
当目标不包含 scheme 时,扫描器默认
先尝试 `https://`,如果失败则回退到 `http://`。
### Shodan 导出
扫描器接受以下常见形式:
- 包含 `matches` 数组的 JSON 对象
- 由结果对象组成的顶层 JSON 数组
- 每行都是一个 Shodan 匹配对象的换行符分隔的 JSON
有用的字段包括 `ip_str`、`port`、`hostnames` 和 `ssl`。
如果 Shodan 记录包含 favicon hash,扫描器会将该被动
信号导入到离线观察模型中。
扫描器还会在存在这些字段时导入 Shodan 产品/版本、OS、CPE、hash 枢纽、
`ssl.jarm`、Shodan 报告的 CVE ID 以及结构化的 mDNS 网关元数据。
默认情况下,Shodan 导出会根据 JSON 本身进行离线分析。如果
您想主动探测每个导出的主机,请使用
`--rescan-shodan`。
### Censys、FOFA 和 CT 导出
扫描器将额外的被动数据集规范化为 Shodan 导入使用的相同内部目标
记录:
- `--censys-file` 接受包含主机/服务行的 JSON、JSONL 或 CSV 导出。
- `--fofa-file` 接受 JSON、JSONL、CSV 以及 FOFA `fields` + `results` JSON。
- `--ct-file` 接受被动证书透明度导出,且仅导入
包含 `openclaw`、`clawbot`、`clawdbot` 或 `moltbot` 的
名称。
规范化导入保留了安全的被动信号,例如 HTTP 标题、HTTP
状态、server header、favicon hash、TLS/JARM 元数据、证书 CN/SAN
名称以及发现置信度/来源标签。包含凭据的 header,如
`Authorization`、`Cookie`、`Set-Cookie` 和 API 密钥 header,在进入扫描器产物之前
会从规范化的外部记录中被剔除。
被动 TLS、提供商和 CT 元数据可以提高发现置信度,但它们
不能独立产生精确版本的断言。
### 实时 Shodan 搜索
使用一个或多个 `--shodan-query` 值直接从
Shodan REST API 获取 banner。扫描器按以下顺序查找 API 密钥:
- `--shodan-key`
- 当前环境中的 `SHODAN_API_KEY`
- `.env` 中的 `SHODAN_API_KEY=...`
- 仓库根目录或 `openclaw_scanner/.shodanapi` 中的 `.shodanapi`
原始 token 以及 `key=...` / `SHODAN_API_KEY=...` 格式均受支持。
有用的标志:
- `--list-discovery-queries` 列出可重用的 Shodan 发现查询 ID
- `--discovery-query shodan-title-openclaw-control` 运行内置的查询 ID
- `--shodan-pages 3` 翻页浏览多个结果页面
- `--shodan-fields ip_str,port,http.title,data` 请求更窄的字段集
- `--shodan-minify` 使用 Shodan 更小的响应模式
- `--rescan-shodan` 在摄取后主动探测返回的主机
实时查询路径会消耗 Shodan 查询额度,尤其是当您使用
搜索过滤器或获取第一页之后的结果时。
### 主动验证控制
`--probe-ports` 是可选启用的。如果在提供时不带值,发现衍生出的
主机除了导入的端口外,还会尝试
`18789,8080,8443,9000,3000,5000`。您可以提供一个自定义的逗号分隔列表,例如
`--probe-ports 18789,8443`。
`--deep-validation` 仅在基础探测已经
产生强有力的 OpenClaw 家族指纹之后,才会增加第二阶段。该阶段收集额外的
存在性、状态、header 和响应形状证据,用于 Socket.IO 轮询、
noVNC、websockify、兼容 OpenAI 的 GET 路由、
浏览器工具路由、画布相关路由、CORS 预检行为以及 WebSocket 升级行为。
它不会进行身份验证、连接到 debugger socket、附加到 VNC、发送工具
执行 payload 或建立浏览器 debugger 会话。
POST 探测默认被禁用。如果您明确希望对受身份验证限制的 API 路由进行
空 body 或 `{}` 感知方法的 POST 检查,请添加 `--enable-post-probes` 和
`--deep-validation`。
## 黑盒校准工作流
扫描器始终专注于外部发现。黑盒工作流仅用于
从受控测试节点生成更好的远程指纹规则。
预期的循环流程是:
1. 搭建一个或多个已知版本的测试网关。
2. 使用 `openclaw_scanner` 扫描它们,并使用
`--capture-output` 加上 `--capture-version` 写入捕获包。
3. 对其他版本重复此操作。
4. 对保存的包运行 `--suggest-rules-from`。
5. 在将它们推广到
[`openclaw_scanner/data/openclaw_rules.json`](openclaw_scanner/data/openclaw_rules.json) 之前,检查生成的候选 `version_rules`。
重要的范围护栏:
- 捕获包仅存储远程可见的信号,例如路径/状态对、
方法/状态对、标题、内容类型、header 顺序、剔除的错误
文本、favicon hash、JSON 键、JS 资产名称和 body hash。
- 版本标签仅是用于校准的带外元数据。
- 扫描器不依赖于主机端文件、进程或本地配置来
对远程目标进行指纹识别。
- 已知版本校准节点的 Oracle Cloud 免费套餐部署脚本位于
[`deploy/oracle_free_tier/README.md`](deploy/oracle_free_tier/README.md)。
## 自定义指纹规则
内置的漏洞情报位于:
- [`openclaw_scanner/data/openclaw_rules.json`](openclaw_scanner/data/openclaw_rules.json)
规则文件支持两层:
- 用于家族或行为分类的 `fingerprint_rules`
- 用于精确或近似版本推断的 `version_rules`
家族规则示例:
```
{
"id": "openclaw-ui-only-404-api",
"family": "openclaw_ui_only_404_api",
"label": "OpenClaw UI-only gateway with JSON /health and 404 API paths",
"confidence": 0.93,
"notes": "Observed on live port 18789 responders.",
"all": [
{
"type": "title_contains",
"path": "/",
"value": "OpenClaw Control"
},
{
"type": "path_status",
"path": "/api/version",
"statuses": [404]
},
{
"type": "json_key",
"path": "/health",
"value": "ok"
}
]
}
```
版本规则示例:
```
{
"id": "lab-ui-family-2026-2",
"version": "2026.2.x",
"confidence": 0.78,
"notes": "Example placeholder rule based on a known dashboard bundle.",
"all": [
{
"type": "script_contains",
"value": "dashboard.7f2f57d4.js"
},
{
"type": "path_status",
"path": "/api/version",
"statuses": [404]
}
]
}
```
支持的条件类型:
- `path_status`
- `path_status_not`
- `method_status`
- `status_distribution_signature`
- `title_contains`
- `marker_present`
- `script_contains`
- `header_contains`
- `json_key`
- `body_hash`
- `body_contains`
- `error_pattern`
- `header_order`
- `has_stack_trace`
- `favicon_hash`
- `ws_upgrade_supported`
- `ws_upgrade_status`
- `ws_subprotocol_contains`
- `ws_extension_contains`
- `version_hint_prefix`
- `cdp_present`
- `cdp_debugger_url_present`
- `cdp_browser_family`
- `cdp_engine`
结果中呈现的有用的被动元数据字段包括:
- `mdns_version`
- `mdns_service_types`
- `mdns_instance_names`
- `mdns_txt_records`
- `mdns_advertised_ports`
- `mdns_product_markers`
- `proxy_detection`
- `honeypot_assessment`
- `status_distribution_signature`
内置的家族规则目前可识别:
- `claw_gateway_tools_invoke_auth_json`
- `chromium_devtools_exposed`
- `openclaw_cdp_devtools_exposed`
- `socketio_polling_handshake`
- `novnc_presence`
- `websockify_presence`
- `openclaw_openai_chat_surface_enabled`
- `openclaw_mdns_gateway_advertisement`
- `clawdbot_mdns_gateway_advertisement`
- `openclaw_ui_only_404_api`
- `openclaw_spa_fallback_all_200`
- `clawdbot_spa_fallback_all_200`
- `moltbot_spa_fallback_all_200`
| 家族 | UI 标题 | `/api` | `/api/version` | `/health` | 解释 |
| --- | --- | --- | --- | --- | --- |
| `openclaw_ui_only_404_api` | `OpenClaw Control` | `404 text/plain` | `404 text/plain` | `200 application/json`,包含 `ok,status` | UI 存在,但 API 路径返回稳定的 `Not Found` body,且 `/health` 是真正的 JSON 存活探测 endpoint。 |
| `openclaw_spa_fallback_all_200` | `OpenClaw Control` | `200 text/html` | `200 text/html` | `200 text/html` | 看起来像 API 的路由回退到了相同的 SPA shell,因此这里的 `200` 并不意味着是真正的版本 endpoint。 |
| `clawdbot_spa_fallback_all_200` | `Clawdbot Control` | `200 text/html` | `200 text/html` | `200 text/html` | 与 OpenClaw 的 SPA 回退模式相同,但品牌为 Clawdbot。 |
| `moltbot_spa_fallback_all_200` | `Moltbot Control` | `200 text/html` | `200 text/html` | `200 text/html` | 与 OpenClaw 的 SPA 回退模式相同,但品牌为 Moltbot。 |
被动的 Shodan mDNS 导出也可以匹配网关播发家族:
| 家族 | 服务 | 必需的 TXT 标记 | 解释 |
| --- | --- | --- | --- |
| `openclaw_mdns_gateway_advertisement` | `_openclaw-gw._tcp.local` | `role=gateway`, `gatewayPort=18789` | 被动确认 OpenClaw 家族网关播发了默认网关端口。 |
| `clawdbot_mdns_gateway_advertisement` | `_clawdbot-gw._tcp.local` | `role=gateway`, `gatewayPort=18789` | 被动确认 Clawdbot 家族网关播发了默认网关端口。 |
这些家族和存在性匹配改善了聚类和分诊,但除非也
推断出关联级别的版本,否则它们不会
产生漏洞命中。与产品无关的 CDP、Socket.IO、noVNC 和 websockify 信号并
不能独立证明 OpenClaw 的存在。
## 变更日志衍生的网关信号
当前官方的 OpenClaw 文档和发行说明使得网关 HTTP 接口对于
外部指纹识别来说,比 2026 年 3 月初时更有用。
| 信号 | 探测 | 解释 |
| --- | --- | --- |
| 受身份验证限制的 tools API | `POST /tools/invoke` 返回 `400/401/403/429` 以及 JSON `error` |烈的 Claw 家族网关信号。此 endpoint 是当前受信任操作员 HTTP API 接口的一部分,因此结构化的身份验证失败比单纯的仪表板获取更具信息量。 |
| 启用了兼容 OpenAI 的聊天接口 | `POST /v1/chat/completions` 返回 `400/401/403/429` 以及 JSON `error` | 将其视为功能生成信号,而非精确版本。它与较新的兼容 OpenAI 的网关行为一致,表明聊天路由处于活动状态,而不是不存在或被方法阻止。 |
| 模型路径是真实的 JSON | `GET /v1/models` 或 `GET /v1/models/openclaw/default` 返回 JSON | 当发生这种情况时具有潜在的高价值,特别是如果响应包含 `data`、`object` 或 `id`。 |
| 模型路径仅为 SPA 回退 | `GET /v1/models` 返回 `200 text/html` 以及控制台标题 | 不要将此视为真实的模型 API。在当前的实时目标上,这通常会镜像与 `/` 相同的仪表板 shell。 |
扫描器现在将这些视为网关接口信号,而不是精确
的版本指纹。它们对于产品确认、行为
聚类和下限功能定年很有用,但在没有额外版本提示的情况下,还不能用于
精确的漏洞映射。
## 建议的工作流
1. 针对目标或导出的 Shodan 数据运行扫描器。
2. 查看 JSON 或 CSV 输出中的原始特征以及任何家族匹配。
3. 根据您自己的实验室捕获构建产物或行为规则。
4. 使用丰富的规则文件重新运行扫描器。
5. 使用精确版本或家族匹配来确定漏洞分诊的优先级。
## 注意事项
- 漏洞映射是基于版本的。它不能证明可利用性。
- 在最终研究扫描期间发现的仅包含 GHSA 的安全公告记录在
研究笔记中,但在
将其规范化为稳定的扫描器数据之前,不会
捆绑到默认的漏洞匹配中。
- 内置的漏洞数据现在包括 2026 年 3 月的其他建议,修复
延长至 `2026.3.2`,以及后来
截至 `2026.2.26` 的研究批次中经过筛选的低风险添加项。
- 更大规模的 2026 年 3 月研究批次仍记录在
[`research/proposed_changes/`](research/proposed_changes) 中,
但明确标记为需要验证的条目尚未
捆绑到默认漏洞匹配中。
- 当 banner OS 数据明显不匹配时,特定平台的 CVE 会被过滤掉,
当目标平台未知时,则会标记得更加谨慎。
- 一些内置的 CVE 需要身份验证、特定的工具权限或本地访问权限。
- 反向代理和自定义仪表板可以隐藏有用的信号。
- 蜜罐评估刻意保持保守,应被视为
分诊提示,而不是证明目标为伪造的确实证据。
- 默认的实时探测保持低影响力:扫描器仅使用 GET 请求和
WebSocket upgrade-header 检查。第二验证阶段可通过
`--deep-validation` 获得,且仅在强有力的 OpenClaw 家族
指纹识别后运行。CORS OPTIONS 检查和额外的 GET/WebSocket 存在探测位于
该条件性阶段中。空 body 或 `{}` JSON POST 探测需要
显式的 `--enable-post-probes`。
WebSocket 检查仅发送 HTTP upgrade header 并记录可见的
握手响应;扫描器不会建立完整的经过身份验证的
会话。
- `--format csv` 为每个目标输出一行汇总数据,用于分诊。
- 除了版本和
漏洞之外,CSV 输出还包括顶级指纹家族列,以及在可用时包括状态分布、被动 Shodan 产品/平台/
枢纽列、mDNS 版本、反向代理列和蜜罐评估
列。
- `--format ndjson` 每行输出一个完整的 JSON 记录,适用于流水线。
- JSON 和 NDJSON 输出在 `matched_versions` 旁边包含 `fingerprint_matches`、
`proxy_detection`、`honeypot_assessment`,且
源自 Shodan 的元数据在适用时包括被动枢纽查询、mDNS 字段和
Shodan 与扫描器 CVE 交叉引用数据。
- 演示数据集位于
[`openclaw_scanner/data/`](openclaw_scanner/data)。
- 大规模的互联网使用应尊重速率限制和授权。
## 未来范围
- 主机端扫描可能会在稍后添加,但对于当前的外部发现工具而言,这是故意不在考虑范围内的。
## 测试
运行本地单元测试:
```
python3 -m unittest discover -s tests -v
```
标签:C2日志可视化, Python, 主机安全, 指纹识别, 插件系统, 无后门, 漏洞审计, 程序员工具, 资产测绘, 逆向工具