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