来源信息
- 仓库
- Kur1sulab/blackbox
- 最近来源活动
- 2026年8月12日 15:05
- 检测到的 SKILL.md 语言
- 中文
- 星标
- 3
- 分支
- 1
安装方式
默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。
检查来源文件
决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。
正在显示 SKILL.md
SKILL.md
来源说明 · 只读预览- name
- jwt-static-key-bruteforce
- description
- JWT HS256 静态密钥离线爆破。触发:真 token + 白盒已知派生规则,本地爆破静态 key。
- version
- 1.0.0
- author
- hermes-curator
- license
- internal
- metadata
- {"tags":["jwt","hs256","bruteforce","offline","shirojwt","dolyw"],"related_skills":["jwt-oauth-token-attacks","unified-pentest"]}
# JWT 静态密钥离线爆破(HS256 弱密钥扩大爆破)
> 适用:白盒/源码已拿到 JWT 密钥派生规则后,本地离线爆破静态 key(零触网,合规)。
> 典型场景:dolyw/ShiroJwt 系教程骨架二开(国内 SRC 高频目标),派生规则 `secret = account + 静态配置值`。
## When to Use(触发条件)
- 有真实 JWT(含签名)+ 源码/白盒确认了密钥派生规则(`secret = X + 静态值` 形态)
- 教程/默认密钥已被生产改掉(伪造 token 签名无效实测确认)
- 需要离线爆破静态 key → 任意账号伪造(顶配危害)
## 1. 先读源码确认派生规则(最重要的一步,决定爆破目标形态)
dolyw/ShiroJwt(com/wang/util/JwtUtil.java)实测确认:
- `secret = account + Base64ConvertUtil.decode(encryptJWTKey)`(sign 与 verify 同源同式)
- 配置(application.yml / config.properties)里 `encryptJWTKey` 存的是 **Base64 字符串**,代码先解码再拼接
- 教程默认:`encryptJWTKey=U0JBUElKV1RkV2FuZzkyNjQ1NA==` → 解码后 `SBAPIJWTdWang926454`
- **含义**:爆破目标是「解码后的明文 key」;命中后报告可顺带给出配置值 = base64(明文)。
教程默认值常被改掉,但「配置存 Base64」这个习惯常被二开保留——品牌词测明文形态即可,不用测其 base64(因为解码后才进 secret)。
## 2. 本地验证器(重算签名,零联网)
```python
import hmac, hashlib, base64, json
real = open('user-jwt.txt').read().strip()
H, P, S = real.split('.')
acc = json.loads(base64.urlsafe_b64decode(P + '=='))['account'] # 必须从 payload 提取——派生用的就是它
TGT = base64.urlsafe_b64decode(S + '==')
MSG = f'{H}.{P}'.encode()
# 候选 key k:对 (acc+k, k+acc, k) 三结构逐一 hmac.new(v, MSG, hashlib.sha256).digest() == TGT
```
- **自检**:教程默认 key 必须**不**匹配(证明生产改过 + 验证器无误报)。匹配了反而要怀疑验证逻辑。
- 结构三变体:`account+key`(教程原配,最可能)/ `key+account` / `纯key`。顺序按概率排,命中即停。
## 3. 候选生成配方(2026-08 shiluyun 实战验证)
1. **定制小字典先行**(单进程秒级跑完,命中就免开 Pool):
- 品牌全拼/简拼:shiluyun / sly / lingdayun / lingda / ldy / wsydt / hangzhou / hz / 0571 / 科技类后缀 keji/tech
- × 后缀:年份 2015-2026、123、123456、@123、!、!@#、888、666、520、1314、168、8888、6666、5201314、123123、9527、10086、10010…
- × 首字母大写 / 全大写;前缀变体(123+词、2024+词、0571+词)
- **中文原文**(如 诗路云/灵答/微商一点通):java-jwt 的 HMAC256(String) 用 UTF-8 bytes,Python `encode('utf-8')` 直接可测,别跳过
- 教程默认值系(SBAPIJWT / dWang926454 / 作者名 dolyw)、账号本身 + 后缀
- 创始人/作者名未知 → 跳过,别瞎编
2. **rockyou 截断策略**(预算受限时):
- 前 5M 词 × 全规则(原样 + 12 年份 + 9 符号数字 + 首字母大写 + 全大写 = 24 变体/词)
- 剩余词 × 高价值规则(原样 + 年份 + @123 + 123 = 15 变体/词)
- 每词用 set 去重(大写与原样碰撞),跳过空串
3. **命中输出**:`jwt-key-cracked.txt` 写 `static_key=<明文>` + `config_value_b64=<base64>` + `account=<账号>`,并本地重算签名确认一次。
## 4. Windows 多进程坑(实战实测,必踩)
- `multiprocessing.Pool` 在 Windows 是 **spawn** 模式:~40s 启动延迟,第一条进度线的 rate 会显示 0.01M/s 的假象 → **不要据此杀任务**,等第二条进度线再判断速率是否恢复。
- **计数单位陷阱**:worker 里 `n += len(variants)` 数的是「变体数」,每变体 ×3 结构 = 3 次 HMAC。台账要报 HMAC 数(×3),否则覆盖量虚报 3 倍、和历史轮口径对不上。
- 速率参考:i9-13980HX、24 进程、纯 Python hmac ≈ 2.4M HMAC/s;14.34M 词 × 24/15 规则 × 3 结构 ≈ 7.8 亿 HMAC ≈ 5.5 分钟。
- deadline 用 argv 传入,主循环 `elapsed > deadline` → `pool.terminate()` 后**如实报已跑量**(未跑完不算命中)。
- 进度打印:`imap_unordered` + 每 ~8s 一次,输出 词数/hmacs/rate/耗时 四要素。
## 5. 台账口径
本轮覆盖 = 定制字典条数 + Σ(词数 × 规则数 × 3 结构);速度 = ΣHMAC / 总秒数。
**累计口径必须与历史轮一致**(如历史「43M」= 14.34M 词 × 3 结构 = 43M 次 HMAC,不是 43M 词)。
## 6. 未命中后的下一步方向(别再无限扩规则)
1. GitHub 代码搜索该厂牌/品牌词 + `encryptJWTKey|jwt|secret` 反搜真实配置值(二开常把配置提交进公开仓库)
2. 前端 JS 产物 / 子域名 / 历史泄露源里捞配置片段
3. 对 encryptJWTKey 直接爆破其 **Base64 字符串形态**(防「配置里存了非 base64 的怪串」)
4. dolyw/ShiroJwt 衍生项目常见二开 key 清单
## 参考脚本
可复用骨架:`D:\tools\audit\shiluyun\jwt_crack_t5.py`(定制字典先行 + rockyou 前 5M 全规则/剩余高价值规则 + 3 结构 + deadline 参数 + 进度台账,Windows 24 进程实测 ~2.4M HMAC/s)。
在 GitHub 查看