SignSaboteur
SignSaboteur 是一个用于编辑、签名、验证和攻击已签名令牌的 Burp Suite 扩展。 它支持不同类型的令牌:Django TimestampSigner, ItsDangerous Signer, Express cookie-session 中间件, OAuth2 Proxy, Tornado 的签名 Cookie, Ruby Rails 签名 Cookie, Ruby Rails 加密 Cookie, Nimbus JOSE + JWT 以及未知签名字符串。
你可以在 Portswigger Research 博客文章页面上找到关于该扩展的更多信息 - Introducing SignSaboteur: forge signed web tokens with ease。
它提供对 HTTP 请求/响应和 WebSocket 消息中令牌的自动检测和行内编辑, 令牌签名以及针对已签名令牌实现的暴力破解攻击自动化。
它受 Fraser Winterborn 和 Dolph Flynn 的 JWT Token 扩展启发。原始源代码可以在 这里 和 这里 找到。
构建说明
- 确保已安装 Java JDK 17 或更高版本
- 从项目根目录运行命令
./gradlew jar - 这应该会将 JAR 文件
sign-saboteur-1.0.6.jar放置在build/libs目录中 - 可以通过导航到
Extensions选项卡、Installed子选项卡,点击Add并加载 JAR 文件将其加载到 Burp 中 - 此 BApp 使用了较新的 Montoya API,因此最好使用最新版本的 Burp(如果最新稳定版存在问题,请尝试早期采用者 渠道)
词表视图
The Wordlist View 允许导入 secrets 和 salts 列表文件。该扩展拥有自己的预构建字典列表。大多数
secrets 取自 jwt-secrets。作为
可选项,可以使用 Flask-Unsign-Wordlist。该扩展支持 JSON
字符串格式以处理特殊字符,使用时请用 " 对 secret 字符串进行引号包裹。
Editor View
The Editor View 支持多种签名令牌:Django、Dangerous、Flask、Express、OAuth2 和 Tornado。它允许在 Burp Suite 的 Proxy、History 和 Repeater 工具中,于 HTTP 请求/响应视图中修改签名令牌。
Dangerous 选项卡可用于 Flask 和 Django 令牌,具体选择取决于检测到的是 Dangerous 令牌还是 Django 令牌。
Unknown 选项卡可用于暴力破解未知的签名字符串。猜测模式仅适用于 Balanced 和 Deep 暴力破解攻击。它支持不同的消息派生技术,包括:
- None 消息将按原样使用
- CONCAT 分隔符字节将从消息中移除,并使用该新值来计算签名
- Tornado 分隔符字节将被添加到消息字符串的末尾
可编辑字段
提供了一个 JSON 文本编辑器,用于编辑包含 JSON 内容的每个组件:
- Dangerous Payload
- Django Payload(除 pickle 序列化载荷外)
- Express Payload
- JWT Payload
提供了一个时间戳编辑器,用于编辑包含时间戳的每个组件:
- Dangerous timestamp
- Django timestamp
- OAuth2 Proxy timestamp
- Tornado timestamp
为所有签名令牌提供了十六进制编辑器,但 Express 签名除外。注意 Express 选项卡尚不支持签名自动更新。请手动将其复制到对应的签名 cookie 中。
签名
Sign 提供了一个签名对话框,可用于通过使用具有签名功能的 Keys View 中的密钥对令牌进行签名来更新 Signature
暴力破解
Brute force 将尝试查找用于生成签名的密钥。如果找到密钥,将显示一个对话框。
Brute force 选项针对签名令牌签名实现了三种类型的攻击:
- 已知密钥 仅使用先前发现的密钥
- 快速 使用默认哈希算法和密钥派生
- 均衡 使用所有已知的密钥派生技术,但 PBKDF2WithHmacSHA1、PBKDF2WithHmacSHA256 除外
- 深度 使用所有密钥派生技术,包括 Ruby Rails 框架支持的不同类型
攻击
Attack 选项实现了对签名令牌的八种知名授权攻击:
- 用户声明
- 包装的用户声明
- 用户名和密码声明
- Flask 声明
- Express 声明
- 账户用户声明
- 已认证声明
- 用户 access_token
这些攻击将在下文详细描述。
攻击
所有这些攻击可以组合使用。请注意,扩展在 Attack 模块中不支持修改令牌载荷,因此您的载荷将被新的载荷替换。
用户声明
OpenID connect ID 令牌格式通常由签名库用于存储关于已认证用户的信息。
扩展将为 admin 用户 ID 令牌生成占位符。
包装的用户声明
与 User claims 攻击相同,但会将其放入 user JSON 属性中。
用户名和密码声明
存储用户详情的另一种常见方式是 username 和 password JSON 属性。扩展将为 admin 用户生成
占位符。
Flask 声明
如果 Flask 已认证用户会话信息存储在客户端,应包含 id 和 _id 以及 user_id
或 _user_id JSON 属性。扩展将为第一个用户(通常是管理员)生成会话。
Express 声明
Express 框架使用 passport JSON 属性来存储用户详情。扩展将为 admin
用户生成占位符。
账户用户声明
某些框架可能使用 account 包装器来存储关于已认证用户的信息。为了利用,可能还需要
使用 Authenticated claims。
已认证声明
Authenticated claims 实现了 12 个众所周知的授权标志。
User access_token
User access_token 选项生成的 JWT OpenID connect ID token 使用相同的密钥和相同的哈希算法进行签名,
且未执行任何密钥派生。