介绍SignSaboteur:轻松伪造签名Web令牌
签名Web令牌广泛应用于Web中的无状态认证和授权。最流行的格式是JSON Web令牌(JWT),我们已经深入介绍过,但除此之外,还存在一个多样化的标准生态系统,每个都有其自己的数据存储和安全实现。为了帮助评估这些,我们发布了一个新的Burp Suite开源扩展,名为SignSaboteur。该工具旨在自动化本文讨论的攻击,确保您不再忽略任何不安全的配置。
简要概述
SignSaboteur是一个Burp Suite扩展,用于编辑、签名、验证和攻击签名令牌。它支持不同类型的令牌,包括Django、Flask和Express。该扩展提供自动检测和在线编辑HTTP请求/响应对和WebSocket消息中的令牌、令牌签名以及暴力攻击自动化。SignSaboteur包含自己的预构建词表,用于已知的默认密钥和盐。您可以用自己的字典扩展它们。还支持JSON编码的字符串,因此您可以包含甚至非ASCII密钥。您还可以保存已知密钥以供未来的暴力攻击使用。
您可以在代理和转发器消息编辑器中修改签名令牌。有许多内置的便捷编辑器,用于JSON、时间戳和HEX字符串。但该工具的真正威力在于未知签名字符串模式——稍后详细介绍。
方法论
要利用签名令牌,您通常需要发现密钥。这些可能披露在源代码、配置文件、文档页面和错误消息中。
这些论文提供了不同攻击的良好概述:
- Apache Airflow中的认证绕过CVE-2020-17526
- 用您的秘密烘焙Flask cookies
- 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连接ID令牌,不执行任何密钥派生。
开始使用
首先,您需要在Burp Suite中安装SignSaboteur。从扩展标签下的BApp商店进行安装。当然,您也可以从源代码构建扩展。
要使用扩展,打开任何包含签名Web令牌的HTTP请求/响应对,然后转到SignSaboteur标签。包含签名Web令牌的消息在代理 > HTTP历史标签中自动高亮显示。
基本用例
在SignSaboteur标签中,您可以查看扩展识别的所有签名Web令牌。这些出现在令牌下拉菜单中。每个Web签名令牌的类型支持快速暴力攻击模式。该模式仅使用已知消息和派生方法。如果扩展找到密钥和盐,您将看到一个新的密钥对话框。您可以使用已知密钥进行未来的攻击。为此,点击暴力破解 > 已知密钥或点击攻击并从签名密钥下拉菜单中选择密钥。要更改密钥,转到SignSaboteur > 词表标签。
设置
您可以在SignSaboteur > 设置标签中配置搜索策略以适应您的偏好。所有支持的令牌列表可供参考。请注意,一些令牌默认禁用以减少噪音。
未知签名Web令牌用例
当您在启用的签名者菜单中选择未知时,扩展会寻找匹配常见哈希函数大小的模式。一些消息负载可能被SignSaboteur错误识别。您可以手动更改消息和分隔符值来解决此问题。扩展支持不同的消息和密钥派生技术与暴力攻击,因此您不必手动更改它们。
要找到未知签名令牌的密钥,转到未知标签,点击暴力破解并选择平衡或深度模式。请注意,深度暴力破解模式支持慢速哈希函数,如基于密码的密钥派生函数2。仅使用小词表,否则任务将耗时过长。
小演示
这个简短的GIF演示了如何找到Flask测试应用程序的未知密钥,修改会话令牌,并重新签名。
最后说明
您可以在Github仓库的自托管实验室中尝试该扩展。祝您好运并玩得开心!