環境搭建:
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://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的,還行