Jboss 反序列化(CVE-2017-12149)的复现及修复方案
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的版本比较老,所以修改配置文件时可以参考:https://wenku.baidu.com/view/18bc1b18c5da50e2524d7ff5.html)
安装配置成功后启动服务通过另一个虚拟机访问:
\
接下来我们先看下这个漏洞能干什么,直接使用暴力工具jboss-_CVE-2017-12149-master,(下载地址:https://github.com/yunxu1/jboss-_CVE-2017-12149)
\
好,证明存在该漏洞。接下来就可以进行指令了:
\
这样就进入了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,如图所示:
\
步骤二: 在安全约束中添加
\
步骤三: 修改完成后,重启jboss服务,再次通过另一个虚拟机访问并且使用工具检测,结果如下:
\
发现没有执行漏洞,故修复成功。
方法二:不需要http-invoker.sar组件的直接删除\
结果同方法一。
\
方法三:升级jboss到jboss7x版本\
以上使用的是JBoss AS 5.1.0,用JBoss AS 6.1.0.Final复现并使用相同步骤修复后结果同上。