Jboss 反序列化(CVE-2017-12149)的复现
**漏洞名称:**Jboss 反序列化(CVE-2017-12149)
**漏洞描述:**JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3的规范。在/invoker/readonly路径下,攻击者可以构造序列化代码传入服务器进行反序列化,由于没有对反序列化操作进行任何检测,导致攻击者可以执行任意代码。
**漏洞影响:**Redhat JBoss Enterprise Application Platform 5.0
**影响版本:**JBoss 5.x / 6.x
靶机相关环境
Ubuntu:20.04(要注意Ubuntu:20.04一般默认安装了UFW(Uncomplicated Firewall))
jdk:1.8
jboss:jboss-5.1.0.GA
(因为jboss的版本比较老,所以修改配置文件时可以参考:wenku.baidu.com/view/18bc1b…)
安装配置成功后启动服务通过另一个虚拟机访问:
接下来我们先看下这个漏洞能干什么,直接使用暴力工具jboss-_CVE-2017-12149-master,(下载地址:github.com/yunxu1/jbos…)
好,证明存在该漏洞。接下来就可以进行指令了:
这样就进入了Ubuntu的终端命令,可以在此进行各种行为。例如新建文件等:
所以,这个漏洞的危险性可显而知,那是这个漏洞是如何产生的呢?
Jboss 反序列化(CVE-2017-12149)的原理
Java序列化就是指把Java对象转换为字节序列的过程,在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。
Java反序列化就是指把字节序列恢复为Java对象的过程,根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
序列化:
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(st);
反序列化
ileInputStream 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函数代码如下:
可以看出它从http中获取数据,通过调用readobject()方法对数据流进行反序列操作,但是没有进行检查或者过滤。
知道了大概原理后我们就可以对其进行相应的修复。
Jboss 反序列化(CVE-2017-12149)的修复方案
**修复原理:**通过向http-invoker.sar的web.xml文件中的安全约束添加url-pattern>来保护对整个 http-invoker上下文的访问,不想使用http-invoker.sar可以将其删除。
方法一:修改web.xml文件
具体步骤如下:
**步骤一:**进入/jboss/server/default/deploy/http-invoker.sar/invoker.war/WEB-INF/web.xml,如图所示:
**步骤二:**在安全约束中添加,就是在security-constraint里添加或修改为以下代码(第158行):
/*如图:
**步骤三:**修改完成后,重启jboss服务,再次通过另一个虚拟机访问并且使用工具检测,结果如下:
发现没有执行漏洞,故修复成功。
方法二:不需要http-invoker.sar组件的直接删除
结果同方法一。
方法三:升级jboss到jboss7x版本
以上使用的是JBoss AS 5.1.0,用JBoss AS 6.1.0.Final复现并使用相同步骤修复后结果同上。