0x01 漏洞基本信息
漏洞名稱:Tomcat AJP協(xié)議漏洞
CVE編號:CVE-2020-1938
漏洞簡介:2020年2月4日,Apache Tomcat官方發(fā)布了新的版本,該版本修復(fù)了一個影響所有版本(7.*、8.*、9.*)的文件包含漏洞,但官方暫未發(fā)布安全公告,2020年2月20日,CNVD發(fā)布了漏洞公告,對應(yīng)漏洞編號:CNVD-2020-10487。漏洞是Tomcat AJP協(xié)議存在缺陷而導(dǎo)致,攻擊者利用漏洞可以構(gòu)造特定參數(shù),讀取服務(wù)器webapp/ROOT下的任意文件。若目標(biāo)服務(wù)器同時存在文件上傳功能,攻擊者可進(jìn)一步通過文件包含實現(xiàn)遠(yuǎn)程代碼執(zhí)行。目前,廠商已發(fā)布新版本完成漏洞修復(fù)。
漏洞影響范圍:
Apache Tomcat 6
Apache Tomcat 7 < 7.0.100
Apache Tomcat 8 < 8.5.51
Apache Tomcat 9 < 9.0.31
0x02 漏洞起因
以下內(nèi)容來自:https://mp.weixin.qq.com/s/GzqLkwlIQi_i3AVIXn59FQ
tomcat默認(rèn)的conf/server.xml中配置了2個Connector,一個為8080的對外提供的HTTP協(xié)議端口,另外一個就是默認(rèn)的8009 AJP協(xié)議端口,兩個端口默認(rèn)均監(jiān)聽在外網(wǎng)ip,如下圖所示:
當(dāng)tomcat服務(wù)啟動后,查看端口可以發(fā)現(xiàn)8009端口已經(jīng)處于監(jiān)聽狀態(tài):
tomcat在接收ajp請求的時候會調(diào)用org.apache.coyote.ajp.AjpProcessor來處理ajp消息,prepareRequest將ajp里面的內(nèi)容取出來設(shè)置成request對象的Attribute屬性,如下圖:
因此可以通過這種特性,控制request對象的以下三個Attribute屬性:
javax.servlet.include.request_uri
javax.servlet.include.path_info
javax.servlet.include.servlet_path
然后封裝成對應(yīng)的request之后,繼續(xù)走servlet的映射流程,如下圖所示:
具體的映射方式這里就不介紹了。
0x03 漏洞利用方式
1、利用DefaultServlet實現(xiàn)任意文件下載
當(dāng)url請求未在映射的url列表里面,會通過tomcat默認(rèn)的DefaultServlet,根據(jù)上面的三個屬性來讀取文件,如下圖所示:
通過serveResource方法來獲取資源文件:
通過getRelativePath來獲取資源文件路徑:
然后通過控制ajp控制的上述三個屬性來讀取文件,操控上述三個屬性,從而可以讀取到/WEB-INF下面的所有敏感文件,不限于class、xml、jar等文件。
2、通過jspservlet實現(xiàn)任意后綴文件包含
當(dāng)url(比如http://xxx/xxx/xxx.jsp)請求映射在org.apache.jasper.servlet.JspServlet這個servlet的時候,也可以通過上述三個屬性來控制訪問的jsp文件,如下圖所示:
控制路徑之后就能以jsp解析該文件,所以只需要一個內(nèi)容可控的文件即可實現(xiàn)rce。
0x04 AJP協(xié)議規(guī)范
參考https://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html
0x05 漏洞利用環(huán)境
靶機(jī):centos7+tomcat8.5.30
攻擊機(jī):win7+python3
0x06 漏洞利用過程
1、Tomcat版本檢測
通常在Apache Tomcat官網(wǎng)下載的安裝包名稱中,會包含當(dāng)前Tomcat的版本號,用戶可通過查看解壓后的文件夾名稱,來確定當(dāng)前的版本。比如:
如果解壓后的Tomcat目錄名稱被修改過,或者通過Windows Service Installer方式安裝,使用軟件自帶的version模塊來獲取當(dāng)前的版本。進(jìn)入Tomcat安裝目錄的bin目錄,輸入命令./version.sh后,可查看當(dāng)前的軟件版本號:
2、通過python腳本文件讀取及文件包含進(jìn)行RCE
公眾號回復(fù)關(guān)鍵詞 文件讀取獲取腳本地址
用法:python3 2020-10487.py 172.26.1.182 -f WEB-INF/web.xml
可以看到成功讀取到了ROOT/WEB-INF下的web.xml文件(如果ROOT下存放了網(wǎng)站的源代碼,就會被不法分子通過讀取該源碼,然后進(jìn)行代碼審計,導(dǎo)致其他漏洞的發(fā)生),web.xml文件:
文件包含進(jìn)行RCE(實際環(huán)境中需要有上傳點):
因為是實驗環(huán)境,并沒有上傳點,所以我們已經(jīng)在webapp/ROOT下存放了一個名為exec.txt的文件,來模擬文件上傳后的文件,然后包含該文件即可進(jìn)行RCE。
exec.txt內(nèi)容為執(zhí)行“whoami”代碼:
<%out.println(new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec("whoami").getInputStream())).readLine());%>
用法:python3 CVE-2020-1938.py 172.26.1.182 -f exec.txt --rce 1
0x07 漏洞修復(fù)建議
1、臨時禁用AJP協(xié)議端口:在conf/server.xml配置文件中注釋掉117行的<Connector port="8009" protocol="AJP/1.3"redirectPort="8443" /> ,然后重啟服務(wù)器。
再次進(jìn)行文件讀取就會拋出異常,修復(fù)成功:
2、下載官方最新版:
https://tomcat.apache.org/download-70.cgi
https://tomcat.apache.org/download-80.cgi
https://tomcat.apache.org/download-90.cgi
聲明:筆者初衷用于分享與普及網(wǎng)絡(luò)知識,若讀者因此作出任何危害網(wǎng)絡(luò)安全的行為后果自負(fù),與安數(shù)網(wǎng)絡(luò)及原作者無關(guān)!
來源:合天智匯
及時掌握網(wǎng)絡(luò)安全態(tài)勢 盡在傻蛋網(wǎng)絡(luò)安全監(jiān)測系統(tǒng)
【網(wǎng)絡(luò)安全監(jiān)管部門】免費試用
本文來源:
如涉及侵權(quán),請及時與我們聯(lián)系,我們會在第一時間刪除或處理侵權(quán)內(nèi)容。
電話:400-869-9193 負(fù)責(zé)人:張明