Adobe ColdFusion 在 2017 年 9 月 12 日发布的安全更新中提及到之前版本中存在严重的反序列化漏洞(CVE-2017-11283, CVE-2017-11284),可导致远程代码执行。当使用 Flex 集成服务开启 Remote Adobe LiveCycle Data Management access 的情况下可能受到该漏洞的影响,使用该功能会开启 RMI 服务,监听的端口为 1099。ColdFusion 自带的 Java 版本过低,不会在反序列化之前对 RMI 请求中的对象类型进行检验。
这个其实说起来简单也简单,不简单也不简单,其中有很多的细节小坑在里面。
漏洞作者发布的文件在这里,笔者对漏洞进行了一个简单的复现
https://nickbloor.co.uk/2017/10/13/adobe-coldfusion-deserialization-rce-cve-2017-11283-cve-2017-11238/
首先,搭建环境。
win的,linux的也同样支持,但是需要官网下载。链接:http://pan.baidu.com/s/1kVKeOoZ 密码:9srq
搭建过程不再累赘了,其中重要的是需要到web console上开启Remote Adobe LiveCycle Data Management access
查看端口
我在这里使用的是ysoserial,直接使用。
java -cp ysoserial-master-v0.0.5-gb617b7b-16.jar ysoserial.exploit.RMIRegistryExploit 192.168.197.150 1099 MozillaRhino1 calc.exe
这里需要注意下,使用的是MozillaRhino1,原因是Adoube 修复了common-collections的反序列化,但是js.jar仍然存在,js.jar的反序列化的ysoserial是MozillaRhino1
我也安装这样开始发payload,但是一直提示反序列化serialversionid不一致,和漏洞的作者所说的一样,于是wireshark抓包看之,呜呼哉,只在response里看到了反序列的ID,request的并没有看到。纠结了1天,后来向其他的朋友请教了一下,原因是序列化过后也看不到明文了,一直以为多多少少还可以看到。
就是长这个样子
方法是在resposne里会返回server和local的serialversionid,把local的serialversionid转成十进制,然后wirehex request hex view - find.
然后就成功找到了,但是wireshark并没有抓包的功能呀,而且RMI是走TCP的。
后来同事推荐了brup的一个插件 NoPE Proxy.
就是这个,RMI监听1099,那么我们再另起一个端口,然后payload发送brup代理端口,brup再去转发1099即可。这样我们就可以查看修改TCP的数据了。但是查看唯一的遗憾就是没有find功能,好在支持python脚本,可以直接动态处理,当然,工具也支持直接替换,但是这并不能满足我的需求,过程中需要替换好几次serialversionid。最终python大法好,动态替换,然后搞定。
起初并没有弹,这个也是最初就算是利用成功也没发现的原因,原因是ColdFusion默认是system权限运行的,不是当前的用户,所以查看的话在processlist中查看就可以了,或者是更改运行权限为当前用户即可。
至此就成功搞定了。
因为好久没更新了,这篇也没分析什么。不过算是给没复现成功的一些Tips吧,gyyyyy也在博客发表了,不过他的方法是修改ysoserial的serialversionid,和server一致。
修复方案:
1.不需要的话关闭RMI,一般的话应该会没人开,除非业务会有需求,或者iptables限制下
2.升级ColdFusion,新版本已经修复