蓝队应急响应实战:从JWT令牌解析到密钥破解的全过程
您是一名高级网络安全工程师,作为Blueteam中的一员在您值班期间,我们拦截/注意到了来自未知来源的可能被识别为恶意的高权限行为。这些操作可能被识别为恶意的。我们已为您获取了执行这些操作的票据。
您是创建这些票据秘密的人。请修复此问题并提交低权限票据,以便我们确保您有资格担任此职位。
票据如下:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmbGFnIjoiQlRMe180X0V5ZXN9IiwiaWF0Ijo5MDAwMDAwMCwibmFtZSI6IkdyZWF0RXhwIiwiYWRtaW4iOnRydWV9.jbkZHll_W17BOALT95JQ17glHBj9nY-oWhT1uiahtv8
需要解决的问题
-
识别出该token的名称?
-
token的结构是什么?
-
从标记中找到了什么提示?
-
秘密是什么?
-
你是否能已地权限生成新的经过签名的签名票?
票据识别
首先将获取的票据进行BASE64解码,我们可以得到这是一个JWT的令牌。解码后的内容如下:
通过解码我们知道了这是一个JWT的令牌,现在我们可以使用在线工具(如 jwt.io)来解码并验证 JWT 的内容。
什么是 JWT?
JWT(JSON Web Token) 是一种用于在各方之间安全传输信息的开放标准(RFC 7519)。它以 JSON
对象的形式承载信息,并通过数字签名来保证数据的真实性和完整性。
JWT的组成
JWT 分为三个部分:Header(头部)、Payload(负载)和Signature(签名),它们使用 .
分隔。
JWT 的用途
- 身份验证:JWT 常用于身份验证机制中,服务器在用户登录时生成一个 JWT,并将其返回给客户端,客户端在后续的请求中携带这个 JWT。服务器不需要在每次请求时查数据库,只需验证 JWT 的签名是否正确即可。
- 信息传递:由于 JWT 被数字签名了,可以确保它没有被篡改,因此可以安全地传递信息。
- 单点登录(SSO):JWT 还被广泛用于单点登录系统中,用户只需一次登录即可访问多个系统。
JWT 的优势
- 轻量级:JWT 以 JSON 形式承载数据,简洁且适合在 URL 中传递。
- 无状态:JWT 不需要在服务器上保存状态,服务器只需通过签名来验证令牌的合法性。
- 安全性:通过签名确保数据的完整性,不容易被篡改。
安全注意事项
- 签名的私钥:私钥或密钥必须安全保存,不能泄露,否则 JWT 的真实性无法保证。
- 过期时间:应设置合理的过期时间,防止长期有效的 JWT 被盗用。
- 使用 HTTPS:JWT 虽然保证了数据的完整性,但不保证保密性,因此在传输 JWT 时,应该通过 HTTPS 来防止中间人攻击。
具体分析
简单了解了JWT的组成及其作用,现在继续解决剩下的问题,对拿到的票据进行分析:
-
Header(头部):
-
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
-
这是 Base64 编码的头部,解码后为:
{ "typ": "JWT", "alg": "HS256" }
"typ": "JWT"
表示这是一个 JWT。"alg": "HS256"
表示使用 HMAC-SHA256 算法进行签名。
-
-
Payload(负载):
-
eyJmbGFnIjoiQlRMe180X0V5ZXN9IiwiaWF0Ijo5MDAwMDAwMCwibmFtZSI6IkdyZWF0RXhwIiwiYWRtaW4iOnRydWV9
-
这是 Base64 编码的负载,解码后为:
{ "flag": "BTL_4_Eyes", "iat": 90000000, "name": "GreatExp", "admin": true }
"flag": "BTL_4_Eyes"
表示可能是某种标志或密钥,这可能是给我们的一些提示。"iat": 90000000
表示令牌的发行时间(一般是 UNIX 时间戳,单位为秒)。"name": "GreatExp"
表示用户名或某个用户的标识。"admin": true
表示该用户具有管理员权限。
-
-
Signature(签名):
jbkZHll_W17BOALT95JQ17glHBj9nY-oWhT1uiahtv8
- 这是使用
HMAC-SHA256
对前面的Header
和Payload
进行签名后的结果。签名用于验证数据的完整性,以确保它没有被篡改。
此JWT 的作用:
- 这个 JWT 票据可能用于身份验证,其中包含了一些用户的信息,比如用户名
GreatExp
和管理员权限标记admin: true
。由于使用了HMAC-SHA256
加密算法,只有服务器拥有签名密钥才能验证 JWT 的有效性。 - 此外,
flag
字段可能是一个提示,表明在某种挑战或测试中用作完成某些任务的目标。
解密
现在我们知道了token
的名称、结构以及提示。现在我们需要找到秘密以及进行新票据的生成。
获取到秘密,首先需要对JWT令牌进行破解,我们可以将令牌保存到文件通过HashCat
来进行破解,这里我将令牌保持到名为jwt.txt
的文件中。
由于JWT 使用 HMAC-SHA256
作为默认的签名算法,所以 hashcat
需要使用 JWT 的模式,即 16500。
我们可以使用字典攻击或暴力破解来查找 JWT 的密钥。假设你已经有了字典文件或想通过掩码方式进行破解。
1.字典攻击
我们可以通过一个常见密钥的字典文件来对JWT密钥进行破解,可以用以下命令:
# 该项目的目标是找到尽可能多的公开可用的 JWT 密钥,以帮助开发人员和 DevOps 通过 Wallarm NGWAF 级别的流量分析来识别它
https://github.com/wallarm/jwt-secrets
# SecLists 是安全测试人员的好帮手。它是安全评估期间使用的多种列表类型的集合,收集在一个地方。列表类型包括用户名、密码、URL、敏感数据模式、模糊测试负载、Web Shell 等等。目标是使安全测试人员能够将此存储库拉到新的测试箱上,并可以访问可能需要的每种类型的列表
https://github.com/danielmiessler/SecLists
# 具体命令为 -- wordlist.txt替换为自己具体的字典文件
hashcat -m 16500 jwt.txt wordlist.txt
2.掩码攻击(暴力破解)
如果你想使用暴力破解,比如使用长度为 8 个字符的密码,可以用以下命令:
hashcat -m 16500 jwt.txt -a 3 ?a?a?a?a?a?a?a?a
其中 ?a?a?a?a?a?a?a?a
表示尝试所有 8 位字符组合。
3.查看破解结果
一旦破解完成,使用以下命令显示破解后的 JWT 密钥:
hashcat --show jwt.txt
4. 优化
-
如果你已经知道密钥的某些特征,可以调整掩码,比如只破解 6 位的小写字母:
hashcat -m 16500 jwt.txt -a 3 ?l?l?l?l?l?l
-
可以使用
--force
来忽略硬件限制警告。
通过HashCat
我们成功获取到了密钥,密钥为:bT!0
票据生成
现在我们通过密钥很容易就可以以低权限生成新的经过验证的签名令牌,我们可以通过https://jwt.io/ 来生成。首先将管理员值更改为 false
并添加密钥,最后成功得到新的令牌。