前言
基于pyqt5和pyjwt实现的jwt加解密爆破一体化工具(ps:其实是水的python课设 ps2:发现最新用处,在全内网的线下赛中,收手机,出不去外网,出到jwt题目不会写脚本直接gg,该款工具就能派上用场hhh,也许有用~) 功能自己研究吧,图形化的应该一看就清楚。RS加密就是加密RS HS加密就是加密HS 注意算法选择和加密必须对应上,对应不上会报错。 爆破:纯数字爆破不用设置字典,点击就可以,纯字母爆破其实是同目录下存在弱口令字典
下载地址
https://github.com/Aiyflowers/JWT_GUI
软件截图
功能介绍
加解密/jwt伪造
由于针对ctf比赛,一般我们是进行jwt篡改。输入jwt解密后可直接进行篡改
可直接进行自由篡改
ctfshow题目示例
web345
获得jwt后点击解密再点击none攻击,不过这道题似乎是用php的jwt加密的,格式很奇怪哈。还有[]包裹,这里工具虽然不能一把梭,但是我放个可以过的payload
W3siYWxnIjoiTm9uZSIsInR5cCI6Imp3dCJ9.eyJzdWIiOiJhZG1pbiJ9XQ
只能说格式很奇怪。。不是标准的json格式
web346 None攻击示例
先获取到jwt,注意它给的cookie形式 是否是x.x.x 或者x.x. 我们的运行提示里也会显示格式不对的话是无法运行的。如果格式没问题直接点击解密即可,格式如果不符合上述两种,请自己加上.
解密后你会看到显示HS256算法
一种错误的解题顺序方式:我们直接在payload一栏中篡改"sub":“user"为"sub”:“admin” 接着点击None攻击
此时生成的结果解密后Headers一栏中为单引号包裹,是不符合json要求的。
(之所以产生这种工具特性~,是因为代码流程导致。懒得修改了直接用正常解题顺序就没得问题)
正确的解题顺序方式:先点击None攻击,将None攻击生成的数据拿到输入JWT中解密再进行篡改。
我们点击了None攻击后,运行提示中会有提示格式可能不对,这时候可能需要我们自己补全.了
接着把None的输出放到输入jwt中补全格式后点击解密,自己再随意的篡改user为admin,然后点击HS加密即可得到篡改后的cookie,放到cookieedtor或者bp抓包放包即可得到flag
347 爆破key开始
本工具的爆破有三种
- 基于for循环的纯数字前5位爆破 (从第6位开始,时间就不可控了)
- 基于字典的纯字母爆破,前3位 (从第四位开始 时间就不可控了)
- 基于自定义弱口令字典的密钥爆破 (只要你字典够强大,我就能爆)
而本题目我们需要弱口令字典去加载爆破,点击使用默认字典
点击爆破,即可爆破出来
默认字典就是我提供的当前目录下的password.txt
爆破得到key后,即可篡改jwt,这里就不需要None攻击了而是利用HS加密即可
爆破易错点(修改软件爆破失败特性)
因为key的生成与headers,payload的base64编码有关系,那么headers和payload中字段的顺序也影响着key的爆破!,这里不同jwt加密库的写法不同可能导致出现未预料的软件特性(bug)
比如pyjwt中默认的headers顺序是{typ,alg} 而且我们无法修改这个顺序。这就导致我们爆破key时候,比如说本题,我们的headers顺序是{alg,typ} 那么我们就不可以爆破到密钥。(实际测试是可以的,但是打包后的exe却不可以。解决办法如下)
解决Python修改pyjwt模块默认header无效的问题_python acmev2 no key id in jws header_ithomia的博客-CSDN博客
进入到源代码中,以防止出问题,先留个备份
这里需要注意的是,有可能你用pyinstaller打包所使用到的api_jwts.py不是当前目录下的,比如我的电脑就是这样,因此我建议用everything搜索电脑上所有的该文件,都进行更改再重新打包文件。
其实这里面还有个python小特性,json.loads处理出来的字典顺序是随机的!这里不多介绍
348
和上题目一样。
349 获取到私钥一把梭
app.js下载看一下
访问/private.key 加载上私钥
即可一把梭了,记得根据headers里面显示的加密算法选择上加密算法
350
必须用node.js去加解密,本工具暂时无法解决。