Adobe ColdFusion反序列化RCE漏洞分析

0x00 漏洞介绍

Adobe ColdFusion在2017年9月12日发布的安全更新中提及到之前版本中存在严重的反序列化漏洞(CVE-2017-11283,CVE-2017-11284),可导致远程代码执行。

根据漏洞作者的描述,他发现CodeFusion的RMI服务(默认端口1099)未对请求的对象类型进行校验,可能存在反序列化漏洞,而且CodeFusion中依赖了lib/js.jar(Mozilla Rhino JavaScript library),可以构造出稳定的反序列化POP链。

0x01 影响版本

1.ColdFusion 2016 release Update 4及之前的所有版本

2.ColdFusion 11 Update 12及之前的所有版本

0x02 搭建环境

官方下载试用版(不是最新版,未修复漏洞),正常安装。

更新提示中的版本才为修复后版本。

开启RMI服务,并且确认1099端口正常启动。

0x03 利用验证

直接通过ysoserial工具(使用方式参考官方手册即可)利用,很可惜不成功。

注意观察报错信息(当然漏洞作者也在文章里有说明,可以仔细看看),很明显是因为服务端和客户端的serialVersionUID不一致(一般为版本或其他编译环境问题)。

进入ysoserial的rhino:js:1.7R2/js-1.7R2.jar(maven管理的,即Mozilla Rhino)中找到ScriptableObject类看看,发现它并没有显式的定义自己的serialVersionUID。

这时候的做法有3种:

1.拿到生成的Payload,找到对应的serialVersionUID,将它改成和服务端一致,再编写脚本或其他方式自行发包

2.拦截TCP请求,修改对应的serialVersionUID值,再放行

3.修改js-1.7R2.jar,为ScriptableObject类显式定义serialVersionUID并赋值

前两种做法问题应该不大,我们重点测试第三种。

由于js-1.7R2.jar版本有点老(2009年),依赖的编译环境不是特别好匹配(JDK1.5和老版本的Ant),因此我们直接使用javaassist对ScriptableObject.class进行字节码操作。

将重新生成的ScriptableObject.class替换掉js-1.7R2.jar中修改之前的版本(当然你也可以选择直接write)。

使用新的jar包生成Payload重新攻击,会发现IdScriptableObject也存在一样的问题,重复上面的工作就行了。

再次攻击,出现的RhinoException不一致可以忽略,那已经是回包了。

可是仍然没看到弹出来的计算器,别急,看看进程里有什么。

在安装ColdFusion时做成了服务被SYSTEM启动(见上图coldfusion相关进程),和我们当前用户不交互。那我们手动启动一次,再试试。

0x04 修复方案

1.停止使用RMI服务

2.升级到ColdFusion最新版本

0x05 参考资料

1.https://helpx.adobe.com/security/products/coldfusion/apsb17-30.html

2.https://nickbloor.co.uk/2017/10/13/adobe-coldfusion-deserialization-rce-cve-2017-11283-cve-2017-11238/

1 thought on “Adobe ColdFusion反序列化RCE漏洞分析”

路人进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注