2023(星)CTF

咋只有一道web,全是ai题

jwt2struts

看题目猜测考点是jwt伪造+s2漏洞

进入网站,发现是需要admin身份,也确实是jwt伪造

image-20230731095441281

解析jwt

JSON Web Tokens - jwt.io进行解析,发现确实是jwt

image-20230731142627322

但是不知道密钥,

先尝试是不是空密钥,直接修改为admin

image-20230731155151954

得到新的jwt

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImV4cCI6MjAwNjM5MzI5N30.L0YCThgRESeqIu8mUgr_IjD6CYadVNFH4sQ29w40nnU

代入再次访问网站

结果提示token无效,

image-20230731155331700

查看网页源码发现

提示JWT_key.php

image-20230731155922977

这应该就是jwt生成和身份验证的php代码

访问得到代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
highlight_file(__FILE__);
include "./secret_key.php";
include "./salt.php";
//$salt = XXXXXXXXXXXXXX // the salt include 14 characters
//md5($salt."adminroot")=e6ccbf12de9d33ec27a5bcfb6a3293df
@$username = urldecode($_POST["username"]);
@$password = urldecode($_POST["password"]);
if (!empty($_COOKIE["digest"])) {
if ($username === "admin" && $password != "root") {
if ($_COOKIE["digest"] === md5($salt.$username.$password)) {
die ("The secret_key is ". $secret_key);
}
else {
die ("Your cookies don't match up! STOP HACKING THIS SITE.");
}
}
else {
die ("no no no");
}
}

no no no

分析代码

发现想要得到key,关键在于这段条件语句的绕过

1
2
3
if ($username === "admin" && $password != "root") {
if ($_COOKIE["digest"] === md5($salt.$username.$password)) {
die ("The secret_key is ". $secret_key);

$username$password好实现

username:adminpassword:除了root以为的字符

$_COOKIE["digest"]要求为md5($salt.$username.$password)

也就是$_COOKIE["digest"]要为盐+名字+密码的字符串的md5值

现在知道,

盐的长度是14

md5($salt."adminroot")=e6ccbf12de9d33ec27a5bcfb6a3293df

hash长度拓展攻击

对于这种未知salt,但又要进行绕过MD5或者sha1加密的,就可以考虑用hash长度拓展攻击

hash长度扩展攻击 | KANGEL (j-kangel.github.io)

【个人分析写在笔记上】

利用工具hashdump

1
2
3
4
Input Signature                    #现有哈希值(题目给的MD5)
Input Data #已知字符串
Input Key Length #为密文(salt)长度
Input Data to Add #为补位后自己加的字符串(自定义)

image-20230801211703847

Input Signature: e6ccbf12de9d33ec27a5bcfb6a3293df
Input Data: adminroot
Input Key Length: 14
Input Data to Add: Jay
8ae52974e81aace9837123a520cb8179
adminroot\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x00\x00Jay

然后把\x换成%

image-20230801211736595

此时,

$_COOKIE["digest"]

就为Cookie: digest=8ae52974e81aace9837123a520cb8179

$username$password

就为adminroot%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%b8%00%00%00%00%00%00%00Jay

然后修改请求包内容

image-20230801212115216

得到sercret_keysk-he00lctf3r

然后修改jwt,进行jwt伪造

image-20230801215103147

然后修改网站的token

刷新后,网站跳转http://140.210.223.216:55557/admiiiiiiiiiiin/

网站的名字就叫do you know struct2?

image-20230801215237349

确定这里是需要利用s2漏洞

抓包查看这个网页提交请求包

image-20230801215510347

发现是发向/admiiiiiiiiiiin/user.action

直接用工具也可以

flag在环境变量里,执行env可以看到

image-20230801215357776

burp发包也可以,只是需要将s2的payload进行url编码即可

image-20230801215658845


ps.jwt-cracker【非预期无法解】

本来是想用jwt-cracker进行爆破jwtsecret

1
2
3
docker pull epsilon95/jwtcrack

docker run -it --rm jwtcrack eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwiZXhwIjoyMDA2MzkzMjk3fQ.bQxqRhEOZkHV3NweYcdVKO_0WKrSDIb4ExcB-9UZRk0

结果CPU跑飞了也没爆破出来,看来是不是非预期能解出来,只能考虑hash长度拓展攻击

image-20230731171850197

脚本利用rockyou爆破salt【不知道是不是预期可行】

image-20230905090421230

rockyou.txt中有这个key,说明可以利用这个方法进行爆破,写个脚本即可进行

过滤rockyou中长度为14的字符,然后加到

adminroot前进行MD5计算使得计算后的值为

e6ccbf12de9d33ec27a5bcfb6a3293df

=>

最后我们就可以爆破出salt为sk-he00lctf3r

最后只要密码随便修改为root1即可,然后再MD5计算一次得到cookie