一、POC说明
包含 \*\*20 个 Python 服务适配器、16 个原生 Nuclei YAML 模板\*\*。清单中的账号/口令仅作为用户提供的候选值,已经核实为对应产品所有版本的出厂默认口令。

二、测试边界
Python 通过 85 项本地模拟/单元测试;16 个 YAML 通过静态结构检查,23 条正则通过 Go regexp 编译与正向样本匹配。安装并运行 Nuclei 引擎,执行原生 \`nuclei -validate\`,可连接真实厂商设备或真实产品实例。\*\*SSH、MySQL、PostgreSQL、MongoDB 的可选驱动可做真实集成测试。请先执行下文的原生验证,再在对应版本的授权测试环境验收。
三、测试边界
仅用于自有或明确授权的单个端点。每次调用只检查一组候选口令,不包含目标发现、网段枚举、字典循环、命令执行、业务数据导出、口令修改或持久配置修改。登录本身可能创建会话、生成审计记录或影响失败计数;不是“零影响”操作,不保证不会触发账号锁定。
1. 文件
| 文件/目录 | 用途 |
|---|---|
| `weakcred_poc.py` | Python 3.10+ 命令行入口,可按 `--service` 选择 20 个适配器 |
| `nuclei/http/` | 11 个 HTTP 原生模板 |
| `nuclei/network/` | 5 个 TCP 原生模板;随包版本仅使用明文 TCP |
| `requirements.txt` | HTTP 所需 requests;其余 5 个原生协议适配器使用标准库 |
| `requirements-optional.txt` | SSH/MySQL/PostgreSQL/MongoDB 的可选依赖 |
| `requirements-dev.txt` | 本地测试及 YAML 静态验证依赖 |
| `inventory.json` | 468 条原值、来源行号、解析标记和覆盖状态;含明文候选口令 |
| `coverage.csv` | 全量覆盖表,不含口令列;UTF-8 BOM 编码 |
| `source_inventory.txt` | 附件字节级副本 |
| `template_manifest.json` | 服务名与模板路径映射 |
| `tests/test_poc.py` | 仅绑定 127.0.0.1 的本地测试服务和单元测试 |
| `tools/validate_templates.py` | 静态检查;加 `--engine` 调用已安装的 Nuclei |
| `tools/check_go_regex.go` | 可选的 Go 正则编译/样本验证工具,不等价于 Nuclei 执行 |
| `docs/TEST_REPORT.md` | 实际已执行检查和未验证范围 |
| `docs/references.json` | 接口、协议及项目原始实现参考链接 |
2. 安装与运行 Python
在解压后的 `weakcred_poc_bundle` 目录执行。以下命令为单行写法,可用于 Windows PowerShell、终端或 shell。Windows 也可以将 `python` 替换为 `py -3`。
```sh
python --version
python -m pip install -r requirements.txt
python weakcred_poc.py --list
```
例如,检查本地/授权实验环境的 RabbitMQ Management HTTP API:
```sh
python weakcred_poc.py --service rabbitmq --target http://127.0.0.1:15672 --json --output results.jsonl
```
检查 Redis ACL 候选 `admin / 123456`:
```sh
python weakcred_poc.py --service redis-acl --target 127.0.0.1:6379 --json
需要上下文路径的应用应把上下文写进基础 URL,脚本不会猜目录或自动跳转:
```sh
python weakcred_poc.py --service geoserver --target http://127.0.0.1:8080/geoserver --json
python weakcred_poc.py --service druid --target http://127.0.0.1:8080/druid --json
python weakcred_poc.py --service nacos --target http://127.0.0.1:8848/nacos --json
python weakcred_poc.py --service guacamole --target http://127.0.0.1:8080/guacamole --json
```
可选数据库及 SSH 驱动:
```sh
python -m pip install -r requirements-optional.txt
python weakcred_poc.py --service mysql --target 127.0.0.1:3306 --json
python weakcred_poc.py --service postgresql --target 127.0.0.1:5432 --database postgres --json
python weakcred_poc.py --service mongodb --target 127.0.0.1:27017 --auth-source admin --json
```
SSH 默认要求核对主机公钥指纹;从可信资产记录取得指纹后传入 `--ssh-fingerprint SHA256:...`。只有隔离实验环境才使用下面的显式放宽选项。程序不会启动 shell 或运行命令。
```sh
python weakcred_poc.py --service ssh --target 127.0.0.1:22 --accept-unknown-hostkey --json
```
运行单个用户指定候选,而非清单原值:
```sh
python weakcred_poc.py --service rabbitmq --target https://127.0.0.1:15671 --username audit --ask-password --json
```
也支持 `--password-env ENV_NAME` 从指定环境变量读取口令、`--password ""` 显式空口令。优先使用交互输入,避免把真实口令放进终端历史和进程参数。覆盖账号或口令后,输出标注 `operator_override`,不再标记为附件原值。
TLS、超时与环境隔离
HTTP 使用 URL 中的 `https://\`,不要用 `--tls` 代替 HTTPS URL。其他协议可使用 `--tls`,FTP/IMAP 支持 `--starttls`。FTP 只实现显式 FTPS,不实现隐式 FTPS。
```sh
python weakcred_poc.py --service imap --target 127.0.0.1:993 --tls --ca-file lab-ca.pem --json
python weakcred_poc.py --service ftp --target 127.0.0.1:21 --starttls --ca-file lab-ca.pem --json
```
Python TLS 默认验证证书和主机名;`--insecure` 仅供隔离测试。默认单步超时 8 秒,HTTP/基线与候选检测间隔 0.3 秒。HTTP 响应体上限 1 MiB。响应过大、超时或证书失败不是弱口令结论。
HTTP 不采用环境代理及 `.netrc`,不自动跟随重定向。PostgreSQL 不读取 `.pgpass`,连接期间隔离 `PGPASSWORD`、`PGPASSFILE`、`PGSERVICE`、`PGSERVICEFILE`,避免环境凭据替代待测空口令。该适配器操作进程环境,因此作为库导入后不要并发调用;当前命令行是串行运行。
3. 覆盖及具体判据
下表的“实现”不表示真实产品联调已经通过。每个服务的候选值均严格取自来源行;完整候选值见 `inventory.json`。Nuclei 使用固定候选,不提供字典参数。
| `--service` | 来源行 | Python | Nuclei | 接口/范围与主要成功条件 |
|---|---:|---|---|---|
| rabbitmq | 3 | 实现 | HTTP | Management `/api/whoami`;基线拒绝,认证后 JSON 的 name 与候选一致并有 tags;不是 AMQP |
| grafana | 107 | 实现 | HTTP | `/api/user`;Basic Auth 必须启用;login、id、orgId;原用户名 `Admin` 保留 |
| harbor | 60 | 实现 | HTTP | Harbor 2.x 本地 Basic;`/api/v2.0/users/current`;username、user_id |
| geoserver | 28 | 实现 | HTTP | `/rest/about/version.json`;认证前拒绝,认证后 GeoServer 版本结构 |
| tomcat | 37 | 实现 | HTTP | `/manager/html`;认证前拒绝,认证后 Manager Applications 页面;要求 manager-gui 角色 |
| activemq | 91 | 实现 | HTTP | **ActiveMQ Classic** `/admin/`;认证前拒绝,认证后控制台;不适用于 Artemis |
| jboss-jmx | 58 | 实现 | HTTP | **旧 JBoss AS** `/jmx-console/`;不是 WildFly 管理接口 |
| druid | 53 | 实现 | HTTP | Alibaba Druid:`/index.html` 跳转登录页 → `/submitLogin` 返回 success → 同会话访问 Stat Index 页面 |
| nacos | 77 | 实现 | HTTP | `/index.html` 指纹 + `/v1/auth/users/login`;核对 username、accessToken、tokenTtl;只适用兼容该 v1 登录 API 的部署 |
| azkaban | 42 | 实现 | HTTP | `/` 的 action=login;status、session.id 和会话 Cookie;采用附件 azkaban/azkaban,不替换为外部清单值 |
| guacamole | 83 | 实现 | HTTP | `/api/tokens`;username、authToken 和 availableDataSources |
| redis-acl | 18 | 实现 | TCP | Redis 6+ ACL;未认证 PING 为 NOAUTH 后尝试 `AUTH admin 123456`,要求 +OK |
| ftp | 7 | 实现 | TCP | 220 欢迎,USER 返回 331,PASS 返回 230;不列目录、不读取文件 |
| imap | 9 | 实现 | TCP | LOGIN 标签响应 OK;Python 单独区分 PREAUTH;不读取邮件 |
| mqtt | 12 | 实现 | TCP | MQTT 3.1.1:无凭据 CONNECT 被拒绝后,候选 CONNECT 返回成功 CONNACK;不发布、不订阅 |
| cassandra | 4 | 实现 | TCP | Native protocol v4 + PasswordAuthenticator;AUTH_RESPONSE 后 AUTH_SUCCESS;不执行 CQL |
| ssh | 21 | 可选驱动实现 | 未提供 | 密码认证;校验主机公钥;不打开 shell |
| mysql | 13 | 可选驱动实现 | 未提供 | 建连后仅 `SELECT CURRENT_USER()` 核对实际账户 |
| postgresql | 17 | 可选驱动实现 | 未提供 | `SELECT current_user` + `used_password`;不将无需密码的连接误称为“空口令验证成功” |
| mongodb | 11 | 可选驱动实现 | 未提供 | 认证后仅 `connectionStatus` 核对 authenticatedUsers;不查询集合 |
认证成功只证明当前端点接受该候选或建立了相应身份,不能据此排除服务端特殊认证插件、代理信任或其它认证绕过机制。模板不是完整产品安全审计。
4. Nuclei 运行
这些模板使用原生 `http` / `tcp`,不调用本地 Python,不需要 `-code`。使用支持 `flow`、`internal`、`disable-cookie`、`skip-secret-file` 的 Nuclei 3.x;不同版本字段支持可能不同,必须首先做原生编译验证。模板参考了检查时的官方引擎字段,但本交付环境没有运行 Nuclei 二进制。
```sh
nuclei -version
nuclei -validate -t nuclei/ -duc
```
只对已确认的产品端点选择对应模板,不要把整个目录对不明设备盲跑。示例地址均为回环地址,应替换为明确授权的对应服务端点。
```sh
nuclei -u http://127.0.0.1:15672 -t nuclei/http/rabbitmq.yaml -c 1 -bs 1 -rl 1 -retries 0 -timeout 8 -ni -duc
nuclei -u http://127.0.0.1:8080/druid -t nuclei/http/druid.yaml -c 1 -bs 1 -rl 1 -retries 0 -timeout 8 -ni -duc
nuclei -u 127.0.0.1:6379 -t nuclei/network/redis-acl.yaml -c 1 -bs 1 -rl 1 -retries 0 -timeout 8 -ni -duc
```
`-rl 1` 控制引擎请求调度,**不保证每条 TCP 握手命令间都间隔 1 秒**。每个模板没有字典和凭据组合,命令关闭自动重试;Nuclei 引擎的其它全局配置仍需人工核对。
Nuclei 这里只输出正向匹配,**无输出不等于安全**,也不等于 Python 的 `NOT_CONFIRMED`。无指纹、验证码、SSO、MFA、接口不兼容、网络异常、账号锁定和免认证均可能不产生匹配。
不要添加外部 Authorization/Cookie 头、共享认证会话或会改变请求的全局配置,否则“未认证基线”可能被污染。不要把真实凭据放进 `-debug`、请求/响应存档或未经脱敏的 JSON 报告;本包未启用 token 提取器,但引擎的原始响应存储仍可能包含 token。Nuclei 日志应按敏感审计资料管理。
5 个随包 TCP 模板仅使用明文连接,不能把 993/8883 等 TLS 端口直接当作明文目标。需要 TLS/STARTTLS 时使用 Python 对应选项。复杂 TCP 分片、多行握手或定制认证器可能让原生模板漏报;Python 对相关报文做了更完整的读取和分类处理。
5. Python 结果含义
| status | 退出码 | 含义 |
|---|---:|---|
| `CONFIRMED` | 0 | 当前候选被接受,且满足该适配器的身份/协议证据 |
| `NOT_CONFIRMED` | 1 | 当前候选被明确拒绝;不代表不存在其它弱口令 |
| `ERROR` | 2 | 网络、TLS、缺少依赖或协议错误,没有漏洞判定 |
| `INCONCLUSIVE` | 3 | URL、产品指纹、认证机制、响应或版本不符合预期,无法下结论 |
| `AUTH_NOT_REQUIRED` | 4 | 当前客户端/所选端点无需该口令;不等于存储口令为空,也不证明拥有所有权限 |
JSON/JSONL 包含服务、目标、用户名、结果、来源行、耗时和有限证据;不输出候选密码、Cookie、token 或完整响应。MySQL/PostgreSQL 的只读身份查询不读取业务表。数据库认证成功也不说明账号拥有管理员权限。
6. 附件范围与保留规则
468 条中,20 条对应 Python 实现,16 条对应 Nuclei 实现;**448 条两种形式均未实现,另 4 条只有 Python 驱动实现**。未实现条目保留在覆盖表,而非生成永远不匹配的占位模板。
原附件没有为全部设备给出登录请求、协议、版本、验证码/CSRF/MFA 流程和认证成功证据。相同厂商或相同 admin/admin 不能推导为相同接口。不能仅凭设备名可靠构造数百个 POC。
特别保留的原值:
- 第 8 行 GBase 密码末尾 U+200C 隐藏字符保留并标注,没有静默删除。
- 第 17 行 `PostgreSQL/空` 的用户名大小写保留,仅把明确的“空”映射为空字符串。
- 第 133 行 SPUG 多个 `/` 的分隔含义不明确,没有自动生成多密码尝试。
- 第 214 行用户名末尾空格保留;`blank`、`Any`、`n/a` 等不擅自转成空值。
例如,附件列出的 Tomcat `tomcat/tomcat` 只是候选;官方 Manager 文档说明,默认安装并不配置拥有 Manager 权限的用户。Redis 带用户名的 AUTH 是 ACL 用法,本包没有擅自退化为只尝试密码的旧模式。PostgreSQL 的无密码连接也可能来自特定认证策略,不能作为“数据库存储了空口令”的证据。
原始口令清单和模板内候选值为明文,请在内部受控位置保存。
7. 重跑本地检查
```sh
python -m pip install -r requirements-dev.txt
python -m unittest discover -s tests -v
python tools/validate_templates.py
python tools/validate_templates.py --engine
```
最后一条要求本机已安装 `nuclei`;缺失时返回错误而不是假装通过。
Go 正则校验是可选的、不参与正常 POC 使用:
```sh
go run tools/check_go_regex.go < docs/regex_checks.json
```
上述重定向示例用于 bash/cmd;PowerShell 可用:
```powershell
Get-Content docs/regex_checks.json -Raw | go run tools/check_go_regex.go
```
详细验证边界见 `docs/TEST_REPORT.md`。来源行指原始附件行号;产品/协议的外部参考与附件原值分开记录在 `docs/references.json`。
三、测试边界
1、部分POC
2、全部POC(获取kscan)

