java反序列化漏洞复现学习

日常逛安全客,发现tomcat又爆了一个cveApache Tomcat多版本远程代码执行CVE-2016-8735(附POC),卧槽又是远程代码执行,结果去看,描述太简单了,没看懂。说法是java反序列化漏洞,好吧,又是这个,想到将近一年的common-collections反序列化漏洞。刚好最近在折腾java安全方面的东西,就找了一些资料,对着做了一遍,但是为了加强自己的理解和记忆,为了自己勤快地更博,决定还是把过程和自己的理解再纪录下来。 翻了很多资料,主要是乌云镜像里面的。其中,我猫爷common-collections中Java反序列化漏洞导致的RCE原理分析和RickGray大神从反序列化到命令执行 - Java 中的 POP 执行链 的,还有到freebuf也找了一些零零散散的资料。

通过描述可以知道问题是出现在common-collections jar包里面,首先下载jar包,为了保证漏洞复现成功,我去找了老版本的包,我已经上传到百度云,如果失效的话,可以自己去csdn下载。点击下载 问题出在InvokerTransformer这个类中,反编译common-collections可以找到它的代码<p> 在包org.apache.commons.collections.functors里面 (jeklly的垃圾代码高亮无力吐槽) 其中transform函数就是屌用java的反射机制,我们可以写一个demo来测试一下 。 三个要点,函数名字,传参类型,参数值 上面的代码等价于

append("hello,i am a hacker!")

当然我们可以yy下,利用getruntime来exec任意命令。这里我先找了一个java命令执行的代码

Runtime r = (Runtime)Class.forName("java.lang.Runtime").getMethod("getRuntime",newjava.lang.Class[]{}).invoke(null,newObject[]{});  
out.println(newjava.io.BufferedReader(newjava.io.InputStreamReader(r.exec("uname").getInputStream())).readLine());  

可以看出来,我们要构造人意执行的话要反射多次,先反射成Runtime,然后获得getRuntime,然后再屌用invoke,最后调用exec

一路跟踪,寻找到调用transform的地方,最终发现TransformedMap 进入代码里面发现在put函数,checkSetValue函数时调用了,这点我不知道为什么和大伙分析的不同,应该是最终这个地方调用了但是实际上不可以控制,所以大部分文章都只提checkSetValue。

那么下面来构造payload

发现put就触发了计算器 实际的利用可以参考这篇paper jboss exp

本次由于环境没搭建好,很可惜没能复现出来,等下次再补吧