├── README.md └── readme.md /README.md: -------------------------------------------------------------------------------- 1 | # JWT_GUI 2 | 基于pyqt5和pyjwt实现的jwt加解密爆破一体化工具(ps:其实是水的python课设 ps2:发现最新用处,在全内网的线下赛中,收手机,出不去外网,出到jwt题目不会写脚本直接gg,该款工具就能派上用场hhh,也许有用~) 3 | 功能自己研究吧,图形化的应该一看就清楚。RS加密就是加密RS HS加密就是加密HS 注意算法选择和加密必须对应上,对应不上会报错。 4 | 爆破:纯数字爆破不用设置字典,点击就可以,纯字母爆破其实是同目录下存在弱口令字典 5 | readme.md文件中步骤比较详细,大家最好跟着ctfshow题目来一遍就熟悉了本软件的使用。1.0.6软件更新了界面和删除了一些功能,但是教程没变 6 | thanks Tolerance for a little white 7 | 不再更新维护,原因:市面上提供该类功能的图形化工具很多了(本工具出来也是因为当时市面上没有图形化的工具,且当时加解密和爆破等系列功能都需要前往不同的网站,使用不同的工具(假如不会编写py脚本),对此感到反感,且为练习pyqt5而写的小玩具,且当时并未经过严格的bug测试),目前该系列工具,本人很少用到,故不再继续维护,欢迎大家使用市面上更完善无bug的版本,这里不再推荐,容易搜得到。 8 | ## 个人感想 9 | 之前当我是小白的时候,我面对各种cli工具或者脚本时候,需要看它参数含义以及如何使用。我常对此感到反感,常感叹道为何tm没有图形化工具点点点,因此当时我看到类似sqlmapgui、xxxgui等图形化如获至宝。而前段时间,我在使用谷歌插件findsomething的时候,竟然产生了一种想法:“把findsomething本地移植成cli类型 !(实际上当我刚把项目git下来创建文件夹的当天晚上就在某公众号刷到了本地移植版,那么看来不止我一个人有这个需求想法)”。不对呀,这不是我以前想要的图形化吗?为何此时又不喜欢了? 10 | 原因是:cli可以方便按照你的心意改写,并和其他cli组成一套完整的工作流,这将省下你大量的时间,也许你可以用多余的时间陪陪心爱的女孩。 11 | 所以我的建议是假如你是一个小白,痴迷于寻找图形化工具,编程技能一塌糊涂,不想研究工具实现方法原理,那希望你可以耐着性子,干中学,增加一点自己的编程技能,(实际上本人也逐渐丧失了完整学习编程的兴趣,只有当ai无法实现我的改写想法,我才耐着性子去学习某一项技术)。 12 | 不过无论如何你处于什么时期,可能你今天花费一些时间学习/创造了一些东西,在以后的某天你发现用不到了,不要因此而感到沮丧。因为那正是那时的你所想要的,把握当下即可。 13 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | ### 前言 2 | 基于pyqt5和pyjwt实现的jwt加解密爆破一体化工具(ps:其实是水的python课设 ps2:发现最新用处,在全内网的线下赛中,收手机,出不去外网,出到jwt题目不会写脚本直接gg,该款工具就能派上用场hhh,也许有用~) 功能自己研究吧,图形化的应该一看就清楚。RS加密就是加密RS HS加密就是加密HS 注意算法选择和加密必须对应上,对应不上会报错。 爆破:纯数字爆破不用设置字典,点击就可以,纯字母爆破其实是同目录下存在弱口令字典 3 | ### 下载地址 4 | [https://github.com/Aiyflowers/JWT_GUI](https://github.com/Aiyflowers/JWT_GUI) 5 | 6 | ### 软件截图 7 | ![image.png](https://cdn.nlark.com/yuque/0/2023/png/29434471/1689933097657-397a5e93-a11e-44fd-9dec-7d0ced0ec5f9.png#averageHue=%23f6f6f5&clientId=u31fd5186-6b41-4&from=paste&height=860&id=u862e6a79&originHeight=1075&originWidth=1122&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=79682&status=done&style=none&taskId=u36c9fdd7-b827-4614-b9de-4f5999ad0f7&title=&width=897.6) 8 | 9 | ### 功能介绍 10 | #### 加解密/jwt伪造 11 | 由于针对ctf比赛,一般我们是进行jwt篡改。输入jwt解密后可直接进行篡改 12 | ![image.png](https://cdn.nlark.com/yuque/0/2023/png/29434471/1689933276085-c73c5f4e-98d0-44e6-bac6-f8ce84fcbce8.png#averageHue=%23f4f2f1&clientId=u31fd5186-6b41-4&from=paste&height=860&id=u9ac5d2d2&originHeight=1075&originWidth=1122&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=139728&status=done&style=none&taskId=u7d0ed7dc-1a02-4c80-9abc-83100ddaab9&title=&width=897.6) 13 | 可直接进行自由篡改 14 | 15 | 16 | ### ctfshow题目示例 17 | #### web345 18 | 获得jwt后点击解密再点击none攻击,不过这道题似乎是用php的jwt加密的,格式很奇怪哈。还有[]包裹,这里工具虽然不能一把梭,但是我放个可以过的payload 19 | ```python 20 | W3siYWxnIjoiTm9uZSIsInR5cCI6Imp3dCJ9.eyJzdWIiOiJhZG1pbiJ9XQ 21 | ``` 22 | ![image.png](https://cdn.nlark.com/yuque/0/2023/png/29434471/1690179213566-03ee6474-2c61-4aa1-b5c9-09f6d0e28048.png#averageHue=%23f6f6f6&clientId=u9c43d47f-1fdb-4&from=paste&height=74&id=u94d77ed0&originHeight=93&originWidth=609&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=5123&status=done&style=none&taskId=u9b79c1ff-96de-4270-b4a2-1c166e9ed15&title=&width=487.2) 23 | 只能说格式很奇怪。。不是标准的json格式 24 | #### web346 None攻击示例 25 | 先获取到jwt,注意它给的cookie形式 是否是x.x.x 或者x.x. 我们的运行提示里也会显示格式不对的话是无法运行的。如果格式没问题直接点击解密即可,格式如果不符合上述两种,请自己加上. 26 | 解密后你会看到显示HS256算法 27 | ![image.png](https://cdn.nlark.com/yuque/0/2023/png/29434471/1690161908984-8cf44b2a-52d0-4403-a385-929791b356aa.png#averageHue=%23f4f3f3&clientId=u0667b037-8a9b-4&from=paste&height=860&id=ue622c963&originHeight=1075&originWidth=1122&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=106206&status=done&style=none&taskId=u79f4686c-0153-484e-befd-9d81341bbad&title=&width=897.6) 28 | 一种错误的解题顺序方式:我们直接在payload一栏中篡改"sub":"user"为"sub":"admin" 接着点击None攻击 29 | 此时生成的结果解密后Headers一栏中为单引号包裹,是不符合json要求的。 30 | ![image.png](https://cdn.nlark.com/yuque/0/2023/png/29434471/1690162426257-0a328169-ea96-4505-ae71-783f40b859eb.png#averageHue=%23f3f0ef&clientId=u0667b037-8a9b-4&from=paste&height=179&id=ufc60e0d0&originHeight=224&originWidth=869&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=22160&status=done&style=none&taskId=u97a16e35-78eb-40eb-abf3-46c6b24bb3f&title=&width=695.2) 31 | (之所以产生这种工具特性~,是因为代码流程导致。懒得修改了直接用正常解题顺序就没得问题) 32 | 正确的解题顺序方式:先点击None攻击,将None攻击生成的数据拿到输入JWT中解密再进行篡改。 33 | ![image.png](https://cdn.nlark.com/yuque/0/2023/png/29434471/1690162524756-98facf2e-d62a-4cd3-9c1d-b81b2c60a29a.png#averageHue=%23f4f2f1&clientId=u0667b037-8a9b-4&from=paste&height=860&id=u89f86f27&originHeight=1075&originWidth=1122&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=126270&status=done&style=none&taskId=ubdc777fe-f9b6-4ca3-9e48-5dfb8bda7ba&title=&width=897.6) 34 | 我们点击了None攻击后,运行提示中会有提示格式可能不对,这时候可能需要我们自己补全.了 35 | 接着把None的输出放到输入jwt中补全格式后点击解密,自己再随意的篡改user为admin,然后点击HS加密即可得到篡改后的cookie,放到cookieedtor或者bp抓包放包即可得到flag 36 | ![image.png](https://cdn.nlark.com/yuque/0/2023/png/29434471/1690162649099-8905a7db-3fbb-4ded-afcb-cad99c23a846.png#averageHue=%23f6f4f4&clientId=u0667b037-8a9b-4&from=paste&height=830&id=u2a46762d&originHeight=1038&originWidth=1600&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=215613&status=done&style=none&taskId=ud31612f4-800d-495c-bb58-01e3fdafea4&title=&width=1280) 37 | #### 347 爆破key开始 38 | 本工具的爆破有三种 39 | 40 | 1. 基于for循环的纯数字前5位爆破 (从第6位开始,时间就不可控了) 41 | 2. 基于字典的纯字母爆破,前3位 (从第四位开始 时间就不可控了) 42 | 3. 基于自定义弱口令字典的密钥爆破 (只要你字典够强大,我就能爆) 43 | 44 | 而本题目我们需要弱口令字典去加载爆破,点击使用默认字典 45 | 点击爆破,即可爆破出来 46 | ![image.png](https://cdn.nlark.com/yuque/0/2023/png/29434471/1690174137311-2327109b-cd35-4ac4-979d-f158f736d335.png#averageHue=%23f4f3f3&clientId=uea3afa28-9e9a-4&from=paste&height=860&id=uc8fdf6b5&originHeight=1075&originWidth=1122&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=112112&status=done&style=none&taskId=u65e51b77-8c0c-437b-bc26-6f6a03dbcac&title=&width=897.6) 47 | 默认字典就是我提供的当前目录下的password.txt 48 | 爆破得到key后,即可篡改jwt,这里就不需要None攻击了而是利用HS加密即可 49 | ##### 爆破易错点(修改软件爆破失败特性) 50 | 因为key的生成与headers,payload的base64编码有关系,那么headers和payload中字段的顺序也影响着key的爆破!,这里不同jwt加密库的写法不同可能导致出现未预料的软件特性(bug) 51 | 比如pyjwt中默认的headers顺序是{typ,alg} 而且我们无法修改这个顺序。这就导致我们爆破key时候,比如说本题,我们的headers顺序是{alg,typ} 那么我们就不可以爆破到密钥。(实际测试是可以的,但是打包后的exe却不可以。解决办法如下) 52 | [解决Python修改pyjwt模块默认header无效的问题_python acmev2 no key id in jws header_ithomia的博客-CSDN博客](https://blog.csdn.net/m0_46261074/article/details/104165261) 53 | 进入到源代码中,以防止出问题,先留个备份 54 | ![image.png](https://cdn.nlark.com/yuque/0/2023/png/29434471/1690169480857-37d8288a-ed33-490e-990c-037a61a1b2ac.png#averageHue=%23272b30&clientId=uf7df05b3-a6b0-4&from=paste&height=860&id=ufac0ce03&originHeight=1075&originWidth=1915&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=2066197&status=done&style=none&taskId=u8eb1287d-8e5e-4118-9dbd-f62b42ee0c8&title=&width=1532) 55 | 这里需要注意的是,有可能你用pyinstaller打包所使用到的api_jwts.py不是当前目录下的,比如我的电脑就是这样,因此我建议用everything搜索电脑上所有的该文件,都进行更改再重新打包文件。 56 | 其实这里面还有个python小特性,json.loads处理出来的字典顺序是随机的!这里不多介绍 57 | #### 348 58 | ![image.png](https://cdn.nlark.com/yuque/0/2023/png/29434471/1690174360023-61dd4498-29fa-4390-81c8-9b3e6b8324ec.png#averageHue=%23f4f3f3&clientId=uea3afa28-9e9a-4&from=paste&height=860&id=ud2fc65b5&originHeight=1075&originWidth=1122&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=106257&status=done&style=none&taskId=uab224cda-44f8-4ee9-b296-bc50e73b612&title=&width=897.6) 59 | 和上题目一样。 60 | #### 349 获取到私钥一把梭 61 | app.js下载看一下 62 | 访问/private.key 加载上私钥 63 | 即可一把梭了,记得根据headers里面显示的加密算法选择上加密算法 64 | ![image.png](https://cdn.nlark.com/yuque/0/2023/png/29434471/1690178976339-3395e0f2-f44e-47c5-a10d-fe4a2a823685.png#averageHue=%23f3f1f0&clientId=u9c43d47f-1fdb-4&from=paste&height=860&id=ud4c66a5a&originHeight=1075&originWidth=1122&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=130267&status=done&style=none&taskId=uc97fef6b-9906-4708-a242-0e3fc1e2361&title=&width=897.6) 65 | ![image.png](https://cdn.nlark.com/yuque/0/2023/png/29434471/1690178955670-8708fd00-ad98-458b-b274-a9de229dd46f.png#averageHue=%23f5f3f3&clientId=u9c43d47f-1fdb-4&from=paste&height=834&id=u5500690f&originHeight=1042&originWidth=1600&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=215697&status=done&style=none&taskId=u1f0e4462-eda2-4855-97ac-3bc35b38fca&title=&width=1280) 66 | #### 350 67 | 必须用node.js去加解密,本工具暂时无法解决。 68 | --------------------------------------------------------------------------------