Java反序列化漏洞-CC11链
背景该链是CC2和CC6的结合体,CC11使用了CC2动态加载字节码执行命令的方法,使用了CC6的前半部分,把它们不使用数组与字节码执行命令的优点给结合起来了。 CC11链分析 该链受影响的版本为CommonsCollections 3.1-3.2.1,关于环境的搭建,可以看我之前CC1中的教程。 分析该链之前,再重新介绍一下TelplatesIpl加载字节码执行命令。 链尾TelplatesIpl加载字节码 详情可以到CC3那篇看,这里只做简要介绍。 构造字节码的代码如下,把它编译为.Class后用后面提到到TemplatesImpl加载这个恶意的字节码就可以了。 12345678public class TemplatesImplTest extends AbstractTranslet { public void transform(DOM dom, SerializationHandler[] handlers) throws TransletException {} public void...
Java反序列化漏洞-CC7链
背景Java 8u76及以上版本修复了CC5中BadAttributeValueExpException入口点,导致利用链失效,CC7规避这些受到限制的类,找到了一个更底层的类。 CC7链分析链尾InvokerTransformer、LazyMap 链尾还是不变,直接把CC5的拿来 1234567891011Transformer[] transformers = new Transformer[]{ new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class},new Object[]{"getRuntime",null}), new InvokerTransformer("invoke",new...
Java反序列化漏洞-CC5链
背景 CC5链可以弥补JDK 8u71及以上版本LazyMapCC1AnnotationInvocationHandler类无法利用的情况,该链的链尾还是使用LazyMapCC1或者CC6的后半部分,而链首新引入了两个类。 CC5链分析链尾InvokerTransformer、LazyMap把CC1的流程图拿过来看一下 其中我们使用的链尾如下图: 把CC1或者CC6的链尾代码拿过来直接用。 1234567891011Transformer[] transformers = new Transformer[]{ new ConstantTransformer(Runtime.class), new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class},new Object[]{"getRuntime",null}), new...
Java反序列化漏洞-CC2链
背景在Shiro反序列化等漏洞利用中,有一些自定义的ClassLoader,如ClassResolvingObjectInputStream,它会限制数组类型(如Transformer[])的动态加载,CC1、CC4等利用链就使用了Transformer数组,导致利用链无法使用,本篇的CC2在CC4的基础上避免了使用数组来构造利用链。 CC2分析 环境不变 链尾TemplateImplCC2只是在CC4的基础上删除了使用数组的方式改用直接使用Invokertransformer的方式调用TemplateImpl#newTransformer(),因此它的整体还是一样的,我直接把动态加载字节码的链尾复制过来 123456789101112131415161718public class CC2Test { public static void main(String[] args) throws IOException, NoSuchFieldException, IllegalAccessException,...
Java反序列化漏洞-CC4链
背景 在commons collections4.0版本之后,InvokerTransformer不再实现Serializable,导致CC1和CC3没办法再利用,本篇CC4利用链是采用CC3执行命令的方法-动态加载字节码,而头部也会采用一个新的类利用。 导入依赖 12345<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.0</version> </dependency> CC4链分析 CC4链子执行命令的方式和CC3相同,都是通过加载字节码的方式,因此该链的后半部分拿着CC3的poc用就行了。 这里代码就不做解读了,详情可以看我之前的动态加载解码、CC3部分...
Tomcat内存马-全
内存马-全
Tomcat内存马-01篇
内存马大致可以分为两种,第一种是利用Java Web的组件,如Tomcat下的动态添加Servlet、Filter、Listener的恶意组件,在Spring框架下就是Controller、Intercepter。第二种是修改字节码,如利用Java的Instrument机制,动态注入Agent。 本文分析Tomcat型内存马的其中两个,剩下的Tomcat型内存马下一篇文章写;学习内存马之前,还需要了解Java Web三大组件、tomcat、jsp的基础知识。 前置基础基础知识只写了一些简单介绍 三大组件 Java...
Java反序列化漏洞-CC3链
前文分析了动态加载字节码,本篇就来分析一下使用TemplatesImpl加载字节码执行命令的CC3并将原本CC1和CC6中执行命令的尾部Runtime也改为用TemplatesImpl加载字节码执行命令。 环境部分版本不变为jdk8u65和CC3.2.1 CC3链分析尾部TemplateImpl由于Runtime和invokertransform被限制使用,本链会利用其他方法把这些限制绕开。 TemplatesImpl加载字节码执行命令详情前文已经分析过,整条利用链为 : TemplatesImpl#newTransformer() -> TemplatesImpl#getTransletInstance() -> TemplatesImpl#defineTransletClasses() ->...
动态加载字节码
在利用链的构建过程中,由于受到环境限制,Runtime 类无法被正常使用,因此无法再通过传统的 Runtime 方式来执行命令。为了解决这一问题,可以采用动态加载字节码的方式来实现命令的执行。这种方式通过将需要执行的代码以字节码的形式动态加载到内存中,并利用 Java 的类加载机制在运行时执行,从而绕过对 Runtime 的直接依赖。 基础部分字节码Java字节码是由Java编译器(如javac)将Java源代码(.java)编译而成。每个.class文件中包含的就是对应类的字节码指令。JVM负责解释执行这些字节码指令,从而实现Java程序的运行。 示例Java类 12345public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); }} 经过编译生成HelloWorld.class 123456public static void...
Java反序列化漏洞-CC6链
前文分析到CC1会受到JDK和Commons Collections版本限制,CC6优势在于绕过JDK 8u71-8u202版本限制,8u_202以上的版本还可以配合fastjson利用,Commons Collections 利用范围也较广,因此它是最好用的CC链。 版本切换jdk版本用jdk8u71,反编译用openJDK,它的搭建在CC1已经介绍了,这里不再介绍,之前搭建过的可以直接切换版本 CC6反序列化利用链分析 JDK_8u71把AnnotationInvocationHandler类给限制住了,LazyMap和InvokerTransformer还可以继续用,只需要找到能够调用LazyMa的get()方法的类即可。 先把LazyMap和InvokerTransformer的POC写下来,和CC1是一样的。 12345678910Transformer[] transformers = new Transformer[]{ new ConstantTransformer(Runtime.class), new...