
POC CVE-2020-2551 à utiliser sur Internet
python CVE-2020-2551.py [HOST] [IP]
python CVE-2020-TEST.py [HOST] [IP]
(Publié pour la première fois sur Anquanke, lien original)
Pour étudier cette vulnérabilité, des connaissances préalables sont nécessaires, par exemple CORBA et RMI.
Résumé simple :
CORBA est un ensemble de normes techniques établies par l'OMG pour les applications distribuées. Il utilise IDL pour la prise en charge multilingue, et la communication entre le client et le serveur se fait via le protocole IIOP.
RMI est une autre technologie d'application distribuée. En Java, JNDI peut être utilisé pour simplifier l'application. Le client et le serveur communiquent via le protocole JRMP, mais dans weblogic, RMI utilise le protocole T3, pour lequel de nombreuses vulnérabilités ont déjà été publiées.
RMI-IIOP combine les avantages respectifs de RMI et CORBA, en déployant des applications RMI via le protocole IIOP.
La documentation officielle mentionne également :
Les objets serveur RMI peuvent utiliser le protocole IIOP et communiquer avec des objets clients CORBA écrits dans n'importe quel langage.
Sans parler de weblogic pour le moment, concentrons-nous d'abord sur la façon d'écrire un exemple RMI-IIOP :
Le code client peut se référer au projet de test dans Java : RMI, JNDI, LDAP, JRMP, JMX, JMS (Partie 1). Vous pouvez compiler HelloClient et HelloServer vous-même, ou utiliser les versions déjà compilées du projet de test.
Démarrez le serveur de noms en ligne de commande (intégré à Java) :
start orbd -ORBInitialPort 1050
Démarrez le serveur HelloServer en ligne de commande et configurez le débogage distant. Pour savoir comment utiliser IDEA pour le débogage distant, référez-vous à la méthode mentionnée au début de cet article.
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 HelloServer
Bien sûr, vous pouvez aussi simplement exécuter sans débogage distant pour voir le résultat directement :
java HelloServer
Démarrez le client en ligne de commande :
Java HelloClient
À ce moment, la calculatrice s'ouvre. Si vous réussissez le débogage distant, vous verrez la pile d'appels suivante :

Exécution de la commande dans EvilMessage.readObejct() :

En aparté : articles sur l'installation et le débogage de weblogic
Qu'en est-il de RMI-IIOP dans weblogic ? L'article À propos de RMI-IIOP en Java mentionne l'exploitation de RMI-IIOP de weblogic. Sur cette base, nous avons fait quelques recherches. Using WebLogic’s RMI over IIOP décrit plusieurs façons pour weblogic d'utiliser le client RMI-IIOP, notamment :
La différence entre les deux premières méthodes semble être uniquement la configuration de JNDI_FACTORY :

Lors de nos études précédentes sur la désérialisation T3 de weblogic, nous avions déployé l'application Helloserver sur weblogic, avec une méthode sayhello() exploitable. Nous avons essayé de définir deux JNDI_FACTORY et d'appeler la méthode ; avec la deuxième JNDI_FACTORY, nous avons réussi à appeler la méthode sayHello().
Modifions ensuite le POC du protocole T3 de weblogic POC. En fait, il suffit de remplacer RMI par IIOP, et on constate que la chaîne d'exploitation jtaTransactionManager s'exécute avec succès et envoie une requête jrmp au jrmplisten local :

Regardons le trafic : lors de l'appel à la méthode remove(), une requête remove__java_lang_Object est envoyée, contenant des données malveillantes dans le trafic, mais on ne trouve pas le header magique aced :

On suppose qu'une analyse spéciale est effectuée côté serveur avant de désérialiser les données. Regardons la pile d'appels : la partie arrière de la chaîne d'exécution ressemble beaucoup à celle du RMI-IIOP natif précédent. La différence est que le déclenchement se fait ici à partir de IIOPInputStream.read_value() dans weblogic, alors que précédemment c'était à partir de CDRInputStream.read_value(). (Le point read_value a également été mentionné dans le sujet de 2019.)

Ici, la requête est d'abord traitée par clusterableServerRef.invoke(), qui appelle this.invoker.invoke() selon l'invocateur. Ensuite, Mejb_dj5nps_HomeImpl_WLSkel.invoke() est appelé. Comme il s'agit de "remove", on entre dans la branche case 6 et on appelle IIOPInputStream.readObject(). La méthode read_value() analyse les données IIOPInputStream et déclenche la désérialisation. Voici le POC utilisant la méthode remove().
L'[article d'analyse](https://lucifaer.com/2020/02/25/WebLogic WLS核心组件RCE分析(CVE-2020-2551)/?from=timeline&isappinstalled=0#2-2-Weblogic解析流程) du maître Lucifaer mentionne l'utilisation de la méthode bind() pour l'exploitation. C'est également la méthode d'exploitation courante sur Internet. Suivons la pile d'appels :
