介绍SignSaboteur:轻松伪造签名Web令牌
签名Web令牌广泛应用于Web无状态认证和授权。最流行的格式是JSON Web令牌(JWT),我们已经深入介绍过,但除此之外,还存在多种标准生态系统,每种都有其自己的数据存储和安全实现方式。
为了帮助评估这些令牌,我们发布了一个新的Burp Suite开源扩展,名为SignSaboteur。该工具旨在自动化本文讨论的攻击,确保您不再忽略任何不安全的配置。
简要概述
SignSaboteur是一个Burp Suite扩展,用于编辑、签名、验证和攻击签名令牌。它支持不同类型的令牌,包括Django、Flask和Express。该扩展提供HTTP请求/响应对和WebSocket消息中令牌的自动检测和内联编辑、令牌签名以及暴力破解攻击的自动化。
SignSaboteur包含自己预构建的已知默认密钥和盐的单词列表。您可以用自己的字典扩展它们。还支持JSON编码字符串,因此您可以包含甚至非ASCII密钥。您还可以保存已知密钥以供将来的暴力破解攻击使用。
您可以在Proxy和Repeater消息编辑器中修改签名令牌。有许多内置的便捷编辑器用于JSON、时间戳和HEX字符串。
但该工具的真正威力在于未知签名字符串模式 - 稍后会详细介绍。
方法论
要利用签名令牌,通常需要发现密钥。这些密钥可能在源代码、配置文件、文档页面和错误消息中披露。
以下论文提供了不同攻击的良好概述:
- Apache Airflow中的认证绕过CVE-2020-17526
- 用您的秘密烘焙Flask cookie
- Redash不安全默认配置
- Facebook服务器上的远程代码执行
为了检测和利用签名Web令牌,我们推荐以下方法:
- 观察请求/响应cookie、URL、body参数中潜在的签名令牌:base64编码或已知长度的hex字符串,常见于HMAC
- 如果签名Web令牌包含时间戳,观察令牌过期时签名是否变化
- 尝试识别目标使用的任何框架
- 如果识别出框架,搜索常见密钥和盐,例如硬编码值或配置文件,包括docker环境变量
- 用找到的信息更新您的单词列表
- 尝试使用不同的派生技术暴力破解令牌
如果您发现了密钥,尝试以下攻击:
- 如果令牌结构已知,将id更改为高权限账户,通常是1
- 如果令牌结构未知,使用常用列表暴力破解参数名称:id、user_id、username等
注意,SignSaboteur扩展支持一些提到的技术
- 如果您找不到密钥,尝试用默认密钥重新签名消息并发送到应用程序。如果服务器接受您的伪造消息,意味着存在漏洞。按照已知密钥的步骤操作
如果服务器接受您的伪造消息,使用新令牌访问所有页面,并尝试获取管理功能访问权限。
配置暴力破解攻击
暴力破解攻击为每种类型的签名令牌配置。SignSaboteur使您能够使用不同的策略来查找密钥和盐:
- 已知密钥 - SignSaboteur仅使用先前找到的密钥
- 快速 - SignSaboteur使用默认哈希算法和密钥派生
- 平衡 - SignSaboteur使用所有已知密钥派生技术,除了具有大量迭代的慢速PBKDF2 Hmac
- 深度 - SignSaboteur使用所有密钥派生技术,包括Ruby on Rails框架支持的不同类型
配置授权绕过攻击
一旦您识别出密钥,就可以使用扩展运行多个授权绕过攻击。所有这些攻击可以一起使用:
- 用户声明 - 一组OpenID Connect标准声明。SignSaboteur尝试为不同的潜在SSRF漏洞声明注入合作者负载,如用户图片。更多信息请参见Portswigger Web Security Academy OpenID Connect实验室
- 包装用户声明 - 这与用户声明攻击类似,但SignSaboteur将合作者负载注入用户JSON属性
- 用户名和密码声明 - 另一种存储用户详情的常见方式是使用用户名和密码JSON属性。SignSaboteur为管理员用户生成占位符
- Flask声明 - Flask认证用户会话信息如果在客户端存储,应包含id和_id以及user_id或_user_id JSON属性。SignSaboteur为第一个用户(通常是管理员)生成会话
- Express声明 - Express框架使用passport JSON属性存储用户详情。SignSaboteur为管理员用户生成占位符
- 账户用户声明 - 一些框架使用账户包装器存储认证用户信息。为了利用,可能需要使用认证声明
- 认证声明 - 最知名的认证标志
- 用户access_token - SignSaboteur生成使用相同密钥和相同哈希算法签名的JWT OpenID connect ID令牌,不执行任何密钥派生
开始使用
首先您需要在Burp Suite中安装SignSaboteur。从Extensions选项卡下的BApp Store进行安装。当然,您也可以从源代码构建扩展。
要使用扩展,打开任何包含签名Web令牌的HTTP请求/响应对,然后转到SignSaboteur选项卡。包含签名Web令牌的消息会在Proxy > HTTP history选项卡中自动高亮显示。
基本用例
在SignSaboteur选项卡中,您可以查看扩展识别的所有签名Web令牌。这些令牌出现在Token下拉菜单中。每个Web签名令牌类型支持快速暴力破解攻击模式。该模式仅使用已知消息和派生方法。
如果扩展找到密钥和盐,您会看到一个新的密钥对话框。您可以使用已知密钥进行未来攻击。为此,点击Brute Force > Known keys或点击Attack并从Signing keys下拉菜单中选择密钥。要更改密钥,转到SignSaboteur > Wordlist选项卡。
设置
您可以在SignSaboteur > Settings选项卡中配置搜索策略以满足您的偏好。所有支持的令牌列表可供参考。请注意,默认情况下禁用某些令牌以减少噪音。
未知签名Web令牌用例
当您在Enabled signers菜单中选择Unknown时,扩展会查找匹配常见哈希函数大小的模式。某些消息负载可能被SignSaboteur错误识别。您可以手动更改消息和分隔符值来解决此问题。扩展支持不同的消息和密钥派生技术与暴力破解攻击,因此您不必手动更改它们。
要查找未知签名令牌的密钥,转到Unknown选项卡,点击Brute force并选择Balanced或Deep模式。请注意,深度暴力破解模式支持慢速哈希函数,如基于密码的密钥派生函数2。仅使用小型单词列表,否则任务将花费太长时间。
小演示
这个简短的GIF演示了如何找到Flask测试应用程序的未知密钥,修改会话令牌并重新签名。
最后说明
您可以在Github存储库中的自托管实验室中尝试该扩展的实际操作。祝您好运并玩得开心!