2月20日,國家信息安全漏洞共享平台(CNVD)發布了Apache Tomcat文件包含漏洞(CNVD-2020-10487/CVE-2020-1938)。該漏洞是由於Tomcat AJP協議存在缺陷而導致,攻擊者利用該漏洞可通過構造特定參數,讀取服務器webapp目錄下的任意文件 (例如webapp配置文件,源代碼等),經檢驗只能讀取此目錄下文件,不可遍歷 。
若目標服務器同時存在文件上傳功能,攻擊者可進一步實現遠程代碼執行。
影響版本
Apache Tomcat 6
Tomcat 7系列 <7.0.100
Tomcat 8系列 < 8.5.51
Tomcat 9 系列 <9.0.31
漏洞原理
tomcat默認的conf/server.xml中配置了2個Connector,一個為8080的對外提供的HTTP協議端口,另外一個就是默認的8009 AJP協議端口,兩個端口默認均監聽在外網ip。
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
再通過控制ajp控制的上述三個屬性來讀取文件,通過操控上述三個屬性從而可以讀取到應用目錄下的任何文件。
為什么要用AJP
AJP是定向包協議,使用二進制格式傳輸文本,主要目的是節省性能,交互對象不是客戶端而是另一個web容器。
復現
搭環境
安裝docker
apt install apt-transport-https ca-certificates curl software-properties-common
apt install docker.io
這里遇到了個坑,docker原生鏡像地址太慢了,安裝了好幾次都timeout,於是換源
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://kfwkfulq.mirror.aliyuncs.com",
"https://2lqq34jg.mirror.aliyuncs.com",
"https://pee6w651.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
],
"dns": ["114.114.114.114","8.8.8.8"]
}
下面正式安裝鏡像
docker run -d -p 8080:8080 -p 8009:8009 --name ghostcat duonghuuphuc/tomcat-8.5.32
至此tomcat安裝好了,新建一個測試文件
確認安裝成功
驗證
使用poc
防護
-
更新版本
-
若不需要使用Tomcat AJP協議,可直接關閉AJP Connector,或將其監聽地址改為僅監聽本機localhost
-
若需使用Tomcat AJP協議,可根據使用版本配置協議屬性設置認證憑證