Apache Tomcat Ajp CVE-2020-1938漏洞復現


環境搭建:

sudo docker pull duonghuuphuc/tomcat-8.5.32

sudo docker run -d -it -p 8080:8080 -p 8009:8009   --name ghostcat duonghuuphuc/tomcat-8.5.32

tomcat調試:

export JAVA_OPTS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005'

漏洞復現:

任意文件讀取

任意文件包含

請求存在的jsp使其包含指定的文件中的jsp代碼

實際上根據不同的匹配將由不同的serverlet進行處理

漏洞分析:

這里根據網上的exp來分析一下:

首先去去github看看是啥時候commit修復的該漏洞

 可以確定2月5號已經修復該問題了,點進去看看修復點

 

可以看到這里把原先的監聽外網,改為監聽本地地址了,根據網上的資料可以看到實際上攻擊過程主要控制以下三個屬性,發送的消息如果包含着三個值,那么serverlet將根據三個值屬性進行request請求的改造,而這三個值都可以直接加到ajp數據包中

從修改的文件中大致可以推斷到處理ajp消息的文件,進去看看

其中AjpProcessor.java中定義了處理jsp數據包中attributes中的邏輯,可以看到在處理attr屬性時else了一條set,那么如果n,v可控就可以注入屬性了

實際上上面的設置屬性是在prepareRequest函數中,處理完后將調用getAdapter繼續之后的請求過程,即匹配serverlet了

文件包含

org/apache/jasper/servlet/JspServlet.java

實際上這里文件包含只需要用到這兩個屬性即可,當然前提是匹配到存在的jsp文件,例如請求index.jsp

文件讀取:

直接雙shift找到defaultserverlet,在doget方法中通過getRelaticePath拿到請求的路徑

 

 這里將通過設置的屬性來獲取最重要讀取的文件屬性,這里需要同時設置這三個屬性才可以,因為此時請求路徑不存在,所以就從屬性中取路徑了,只要求該屬性不為null即可,並重新定義要讀取的文件

 

 

之后經過處理將這兩個屬性拼接並返回,即serverlet_path/path_info,之后就讀取文件資源

看一下git上的ajp的一個demo

 

 這里調用完end以后就構造完數據包,接下來就發包了,所以要改一下end函數

 這里結束字節是0XFF,所以要在該字節前面插入

 

 抓包可以看到ajp協議的通信過程

 可以清楚看到所加入的屬性值,都是明文,加入位置也可以清楚看到

總結:

任意文件讀取和任意文件包含范圍:

webapps目錄下的文件,默認的exp只能讀取webapps/ROOT下的文件,需對exp加以修改才能讀取webapps下的其他文件,修改如下:

因為webapps下可以存在多個應用,那么不同的應用實際上可以認為是不同的context,則對於tomcat容器來說,對於客戶端發送的請求將首先對context進行匹配,匹配以后則進行相應的serverlet的匹配,那么exp默認是ROOT,那么假如想要讀取webapps下的manager下的文件,則可以修改req_uri來使tomcat匹配到該context即可

 

所以修改exp:

 

只需修改上圖一處,那么對應exp中ajp_request的封裝中將該值賦給req_uri

 

效果如下圖所示:

任意包含只需要:

1.請求存在的

2.pathinfo和serverlet_path兩個屬性執行包含的文件

任意文件讀取:

1.請求不存在的文件

2.request_uri屬性必須存在,值可為任意

3.pathinfo和serverlet_path組合對應文件路徑

修復:

1.若不需要使用Tomcat AJP協議,可直接關閉AJP Connector,或將其監聽地址改為僅監聽本機localhost。

 監聽本地:

    <Connector protocol="AJP/1.3"
               address="::1"
               port="8009" 
               redirectPort="8443" />

此時重啟tomcat即測試不成功

 2.增加ajp connector密鑰認證方式

tomcat version7 version9

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" address="YOUR_TOMCAT_IP_ADDRESS" secret="YOUR_TOMCAT_AJP_SECRET"/>

tomcat version8

tips:

影響范圍:   

Apache Software Foundation Tomcat 6.*

Apache Software Foundation Tomcat 7.0.0 - 7.0.99

Apache Software Foundation Tomcat 8.0.0 - 8.5.50

Apache Software Foundation Tomcat 9.0.0 - 9.0.30

poc地址:

https://github.com/0nise/CVE-2020-1938

參考:

https://blog.csdn.net/yiqiushi4748/article/details/104428847

https://mp.weixin.qq.com/s?__biz=MzI4NjE2NjgxMQ==&mid=2650241245&idx=1&sn=2ca66d99fafb82b17b9023e65a143d63&chksm=f3e2c2a9c4954bbfa58ed15d4647eab743d79375eb51853ab2aecacf5f5c85b862f91cc0d685&mpshare=1&scene=23&srcid=&sharer_sharetime=1582366241817&sharer_shareid=ae6683d6c0e7df9a0b7c15e7cacf6b3c#rd

 https://blog.csdn.net/wangchengsi/article/details/2973012 coyote框架

 https://youmeek.gitbooks.io/intellij-idea-tutorial/content/remote-debugging.html idea之旅

https://xz.aliyun.com/t/7325 先知講tomcat的,還行

 


免責聲明!

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



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