我们是第三,各位师傅都尽力了太厉害了!
Chain17
0day就不公开了
Web签到
命令拼贴导致任意文件读取。
挺简单一题
右上角解码可以看到flag
easyCAS
虽然说是考cas5.x,但不是反序列化的洞,是log4j2!想都没想到这傻逼居然是log4j2!
源码:
https://github.com/apereo/cas/tree/v5.3.16
条件:
- 默认密码 casuser/Mellon
- debug开启
- 如何RCE
https://curz0n.github.io/2020/01/17/apereo_cas_deserialize/
Whynot war包
https://mvnrepository.com/artifact/org.apereo.cas/cas-server-webapp-tomcat/5.3.16
一开始没理解他说的debug模式是什么,以为是tomcat的debug,会输出日志文件,最终读取日志拿到key,打老反序列化的洞。结果不是,其实当时应该注意到log4j2.xml的
项目文件配置了log4j2,默认就带这个,并且你可以看到在反序列化漏洞的入口点有这么一段
它调用了logger.debug方法。
获取的是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 | import threading |
About this Post
This post is written by Boogipop, licensed under CC BY-NC 4.0.