Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2022-21445-for-12.2.1.3.0-Weblogic — Exploit d'exécution de code à distance avant authentification pour Oracle WebLogic ADF Faces (CVE-2022-21445, CVSS 9.8). Inclut une configuration détaillée de l'environnement, la génération de charges utiles et des instructions de débogage à distance pour les tests d'intrusion. | Kitploit
Outils/GitHubGitHub/hienkiet/cve-2022-21445-for-12.2.1.3.0-weblogic
Analyse des VulnérabilitésAnalyse de CodeExploitationExploitation d'Applications WebTests d'IntrusionOutil d'Accès à DistanceDéveloppement de Charges Utiles
GitHubhienkiet/cve-2022-21445-for-12.2.1.3.0-weblogic

CVE-2022-21445-for-12.2.1.3.0-Weblogic

Exploit d'exécution de code à distance avant authentification pour Oracle WebLogic ADF Faces (CVE-2022-21445, CVSS 9.8). Inclut une configuration détaillée de l'environnement, la génération de charges utiles et des instructions de débogage à distance pour les tests d'intrusion.

Voir le dépôt
5347il y a 2 ansPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Aperçu

CVE-2022-21445 (score CVSS 9,8), la vulnérabilité est une désérialisation de données non fiables, identifiée dans le composant ADF Faces, pouvant être exploitée à distance sans authentification (pre-authentication) par des pirates pour exécuter du code à distance (RCE).

Cette vulnérabilité a été découverte par deux experts en cybersécurité : PeterJson de VNG Corporation et Nguyen Jang de VNPT. Oracle a reçu ce rapport en octobre 2021 et a mis six mois, soit jusqu'en avril 2022, pour publier un correctif.

Dans cet article, l'exploitation se concentre sur Oracle Business Intelligence version 12.2.1.4.0.

Analyse – Reproduction de la vulnérabilité

Installation de l'environnement

Côté machine victime/cible

Conditions : Installer Windows 10+ Pro ou Windows Home (x64) avec licence activée, ou utiliser Windows Server (privilégier les produits Oracle).

Étape 1 : Installer Java, version jdk 8u112 ou ultérieure (8Ux), lien de téléchargement : JDKv8U112

  • Ajouter JAVA_HOME en pointant vers le répertoire jdk (pas jre). Image 1.1 : Installation Java

Étape 2 : Installer Oracle Database 19c, lien de téléchargement :

Oracle 19c
  1. Préparer un dossier pour installer la base de données, créer un chemin comme ci-dessous et décompresser le fichier zip de la base de données téléchargée dans C:\app\oracle\product\19c\db_home1.

  2. Exécuter le fichier setup.application avec les droits d'administrateur. Image 2.1 : Exécution du setup DB

  3. Suivre chaque étape comme indiqué dans le Guide d'installation de la base de données.

  4. Attention importante : À l'étape 8/17, pensez à cocher Create as Container database pour créer une base de données pluggable nécessaire lors de l'installation de Fusion Middleware. Image 2.2 : Création de la base de données pluggable

    À l'étape 9/17, choisir le jeu de caractères Unicode (AL32UTF8). Image 2.3 : Choix Unicode

  5. Une fois l'installation terminée, vérifier dans les services Windows que les 4 services principaux (comme sur l'image ci-dessous) sont à l'état RUNNING. Image 2.4 : Installation réussie

    Image 2.5 : Vérification des services

  6. Créer un nouveau compte oracle database selon les étapes suivantes :

    • Terminal Administrator -> sqlplus / as sysdba
    • Créer l'utilisateur système : alter user system identified by system_password account unlock;
    • Vérifier l'existence de l'utilisateur : select username from dba_users;
    • Configurer l'environnement : alter session set "_oracle_script"=true;
    • Créer un utilisateur standard hr : create user hr identified by user_password;
    • Accorder les privilèges : grant all privileges to hr;
    • Déverrouiller le compte – modifier le mot de passe : alter user hr identified by hr_pass account unlock;
    • Créer un nouveau compte système : alter user sys identified by sys_pass account unlock;

Étape 3 : Installer SQL Developer, version no-jre, lien de téléchargement : SQLDev-NoJRE Image 3.1 : Téléchargement de SQL Developer

  • Exécuter le fichier sqldeveloper.application avec les droits d'administrateur. Image 3.2 : Lancement de SQL Developer

  • Configurer les paramètres d'une nouvelle connexion comme sur l'image ci-dessous, en modifiant le nom d'utilisateur et le mot de passe (par exemple hr), le nom d'hôte (par défaut localhost), le port (par défaut 1521), le SID (qui est le nom global de la base de données installée à l'étape 2). Image 3.3 : Configuration des paramètres SQL Developer

  • Si lors du clic sur Test un message indique Success, la connexion est réussie ; cliquer sur Connect.

Étape 4 : Installer Fusion Middleware Infrastructure (FMW) version 12.2.1.3.0, lien de téléchargement : FMW_ver_12.2.1.3.0 Image 4.1 : Téléchargement de FMW

  • Créer le chemin pour le dossier d'installation de FMW selon le modèle C:\Oracle\Middleware\Oracle_Home.
  • Suivre les étapes une à une selon le guide : Guide d'installation de FMW

Étape 5 : Installer Oracle Business Intelligence (OBIEE) version 12.2.1.4.0, lien de téléchargement : OBIEE_ver_12.2.1.4.0

  • Exécuter le fichier setup_bi_platform-12.2.1.4.0_win64.exe avec les droits d'administrateur. Image 5.1 : Exécution du fichier d'installation OBIEE

  • Installer étape par étape selon le Guide d'installation d'OBIEE

  • Remarque : Le chemin de BI doit être identique à celui utilisé pour FMW, ici Oracle/Middleware/Oracle_Home. Image 5.2 : Le chemin de BI doit correspondre à celui de FMW

Étape 6 : Configurer le schéma BI à l'aide de l'utilitaire Repository Creation Utility (RCU)

  • Dans le chemin C:\Oracle\Middleware\Oracle_Home\oracle_common\bin, exécuter le fichier rcu.bat avec les droits d'administrateur.

  • Suivre les étapes ci-dessous dans l'ordre :

Image 6.1 : Création du référentiel

Image 6.2 : Détails de la connexion à la base de données

Image 6.3 : Sélection des composants

Image 6.4 : Mot de passe du schéma

  • Enfin, cliquer sur Create pour que le système crée le schéma BI.

Étape 7 : Configurer les variables d'environnement pour OBIEE

  • Aller dans Panneau de configuration > Système > Paramètres système avancés > Avancé > Variables d'environnement > Nouvelle variable système. Image 7.1 : Variables d'environnement

Étape 8 : Créer le domaine BI

  1. Dans le chemin C:\Oracle\Middleware\Oracle_Home\bi\bin, exécuter le fichier config.cmd avec les droits d'administrateur.

Image 8.1 : Exécution du fichier config

  1. À l'étape 1 : Cocher les 3 composants, Essbase (serveur OLAP), Business Intelligence Enterprise Edition (BI Analytics) et Business Intelligence Publisher (BI Publisher).

Image 8.2 : Sélection des composants

  1. À l'étape 3 : Créer un nouveau domaine comme sur l'image ci-dessous, !! NOTEZ LE MOT DE PASSE DU DOMAINE CAR IL SERA DIFFICILE À RÉCUPÉRER. et laisser le domaine nommé bi car c'est la valeur par défaut.

Image 8.3 : Compte du domaine

  1. À l'étape 4 : Mettre à jour les informations du domaine pour la base de données.

Image 8.4 : Mise à jour des informations

  1. À l'étape 8 : Si le processus se déroule correctement, le résultat sera comme sur l'image ci-dessous.

Image 8.5 : Configuration réussie

  1. Si tout est terminé, enregistrer le fichier d'informations OBIEE pour l'étape suivante, puis se connecter aux URL suivantes :
  • http://localhost:9500/console
  • http://localhost:9500/em
  • http://localhost:9502/xmlpserver
  • http://localhost:9502/analytics
  1. Erreurs possibles :
  • À l'étape 4, si le système indique « Échec de la connexion », vérifier que le mot de passe du domaine est correct.

  • À l'étape 8, si une erreur comme sur l'image ci-dessous apparaît, vérifier que Windows est activé et que la version correspond aux conditions décrites.

Image 8.6 : Erreur de licence

  • Erreur due à l'absence de BI_HOME_PRODUCT, revoir l'Étape 7.
  • Mise à jour des erreurs…

Étape 9 : Après la configuration, accéder au domaine BI créé dans le chemin $Oracle_Home\user_projects\domains\bi\servers\AdminServer\tmp_WL_user\adf.oracle.domain.webapp\i83uao.

  • Copier tous les fichiers jar de cet emplacement dans un dossier séparé et les partager vers la machine attaquante (dans un environnement de laboratoire, faire ainsi ; en situation réelle d'attaque, la machine attaquante doit également avoir installé les mêmes composants que la machine cible pour obtenir le code source).

  • Ajouter également la bibliothèque coherence.jar située dans $Oracle_Home\coherence\lib à ce dossier.

  • Ce dossier est crucial pour la réussite de la charge utile (payload), car chaque version de FMW, BI ou environnement peut différer ; il est donc nécessaire d'utiliser les versions exactes pour éviter les risques ou les exceptions lors de la transmission de la charge utile.

Étape 10 (uniquement si un débogage à distance est nécessaire, à noter que dans un environnement réel, on ne peut pas configurer la machine victime librement, donc l'attaquant doit également configurer la machine cible sur sa propre machine pour pouvoir effectuer un débogage à distance et vérifier les erreurs) :

  • Installer Mozilla, ajouter le proxy Burp sur le port 8181.

  • Activer le débogage à distance sur le serveur BI.

    Accéder à localhost:9500/console.

    Dans Domain Structure -> sélectionner bi -> Environment -> Servers.

Image 10.1 : Structure du domaine

Deux serveurs s'affichent : AdminServer de Weblogic et bi_server1 de BI.

Image 10.2 : Liste des serveurs affichée

Cliquer sur Lock & Edit dans le coin gauche, cocher bi_server1 pour modifier sa configuration. Ensuite, aller dans Configuration -> Server start -> Descendre tout en bas, cliquer sur Advanced (si présent) -> Cliquer sur Arguments et saisir les paramètres de débogage :

-Xdebug -Xnoagent –Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n

(on peut essayer avec 0.0.0.0:5005 si une erreur empêche de redémarrer bi_server1 par la suite).

Saisir le mot de passe Weblogic (défini lors de la configuration du domaine BI) -> Apply change & Restart.

Ouvrir un terminal Administrateur -> Naviguer vers $Oracle_Home\user_projects\domains\bi\bitools\bin et exécuter ./stop.cmd puis ./start.cmd pour redémarrer bi_server1. Si aucun message d'erreur n'apparaît pendant le redémarrage, le débogage est activé et écoute sur le port 5005 comme spécifié. En cas d'erreur, vérifier les paramètres de débogage (espaces superflus, adresse incorrecte).

Côté machine attaquante

Étape 1 : Télécharger IntelliJ IDEA Ultimate, l'activer avec un code trouvé sur GitHub.

Étape 2 (uniquement si l'attaque génère des erreurs comme 500 Server Error, ... dues à des exceptions dans la charge utile) :

  1. Modifier la version jdk/sdk du projet pour qu'elle corresponde à celle de la machine cible (installation comme à l'Étape 1 côté machine cible).

  2. Créer un projet vide pour analyser le code source et effectuer le débogage à distance.

  3. Ajouter tous les fichiers jar du dossier reçu de la machine cible à ce projet.

    Project Structure -> Modules -> Cliquer sur + -> 1 JARS or Directories -> Ajouter tout le dossier jar.

Image 11.1 : Ajout des fichiers jar

Image 11.2 : Résultat

  1. Configurer le débogage à distance.

    Run -> Edit Configurations -> + -> Remote JVM Debug

Image 12.1 : Configuration du débogage à distance

Lancer le débogage à distance ; si la console affiche « Connected … », c'est réussi.

Image 12.2 : Lancement du débogage à distance

Étape 3 :

  • Cloner le code de ce dépôt sur la machine, supprimer l'ancien fichier coherence.jar dans le dossier lib et le remplacer par celui reçu de la machine cible à l'étape précédente.

  • Ensuite, ajouter le projet dans IntelliJ, ajouter les fichiers jar du dossier lib avec l'option Add as library.

  • Vérifier le nom de la classe LambdaIdentity$.... pour qu'il corresponde à la version de Weblogic ; si nécessaire, refactoriser le fichier et modifier son nom.

    Weblogic 12.2.1.3 : LambdaIdentity$E12ECA49F06D0401A9D406B2DCC7463A

    Weblogic 12.2.1.4 : LambdaIdentity$423B02C050017B24DB10DFF759AA56BF

  • Modifier le chemin vers le fichier LambdaIdentity$....class dans le fichier Main.java. Pour obtenir le chemin exact, deux méthodes : exécuter javac sur le fichier jar pour générer le fichier .class ; une autre méthode consiste à commenter le code de la fonction main, exécuter le projet normalement, le chemin du fichier class se trouve alors dans le dossier target.

  • Vérifier que le jdk et le sdk du projet sont identiques à ceux de la machine cible.

Analyse du code BI et du code générant la charge utile

Analyse du code BI

  1. Dans le chemin $Oracle\Middleware\Oracle_Home\user_projects\domains\bi\servers\AdminServer\tmp_WL_user\em\fw8wi5\war\WEB-INF

On trouve le fichier web.xml, qui décrit les correspondances de servlets (servlet-mapping). "resources" est un servlet lié aux ressources système, contenant des données et informations importantes ; c'est pourquoi il est souvent ciblé par les attaquants.

Image 13.1 : Correspondances servlet-mapping

  1. En approfondissant la classe ResourceServlet, plus précisément org.apache.myfaces.trinidad.webapp.ResourceServlet, on voit la méthode doGet qui traite les requêtes GET envoyées au serveur.

Image 13.2 : méthode doGet

  • Ici, via la méthode _getResourceLoader(), un nouveau loader est créé à partir de la requête entrante. En même temps, un resourcePath est initialisé et reçoit la valeur de servletPath et servletInfo via la méthode getResourcePath avec la requête en paramètre. Ce loader appelle ensuite la fonction getResource(resourcePath), qui tente de charger la ressource depuis la requête et de la trouver via la fonction org.apache.myfaces.trinidad.resource.ResourceLoader.getResource.findResource(). Enfin, la valeur trouvée est transmise à une instance url de la classe URL.class.

Image 13.3 : fonction getResource

  • _getResourceLoader maintient une ConcurrentMap pour stocker les correspondances entre servletPath et les loaders. Cette relation est définie explicitement dans oracle.adfinternal.view.resource.rich.RenderKitResourceLoader.

Image 13.3 : classe RenderKitResourceLoader

  • La méthode _register dans RenderKitResourceLoader() est appelée avec les regex et le loader correspondant, puis retourne super.register, sa fonction parente. Cette fonction ajoute dans concurrentmap_loaders le motif et le loader correspondant. Ainsi, lorsque le loader est initialisé dans la fonction doGet() et reçoit le paramètre de la requête, la valeur servletPath de l'URL de la requête est extraite et transmise à _loader.get() pour récupérer le servlet correspondant.

Image 13.4 : méthode _register

Image 13.5 : méthode register (méthode parente)

  • L'auteur de la vulnérabilité estime que parmi les classes contenant une méthode override findResource(), oracle.adfinternal.view.resource.rich.RemoteApplicationResourceLoader est celle qui présente un risque de désérialisation. Analysons-la pour en comprendre la raison.

Analyse de la fonction findResource() dans RemoteApplicationResourceLoader.class

Image 13.6 : fonction findResource()

Cette fonction retourne une méthode contenant un protocole personnalisé RAStreamHandler(). RAStreamHandler crée un objet URLConnection avec la valeur new RAURLConnection.

Image 13.7 : méthode RAStreamHandler()

La fonction RAURLConnection appelle _getPathBean.

Image 13.8 : méthode RAURLConnection ()

La fonction _getPathBean contient un objet bean créé via l'appel à la fonction getInstanceFromString(), qui traite la chaîne reçue pour en extraire les clés correspondantes (filtre).

Image 13.9 : fonction _getPathBean

La chaîne d'entrée bean est convertie via la classe SerializationUtils d'une forme encodée URL en un objet URLEncoderPathBean. Si tout se passe bien, l'entrée suivante est transmise à la fonction fromURLEncodeString().

Image 13.10 : fonction getInstanceFromString()

Image 13.11 : fonction fromURLEncodedString()

En cas d'erreur dans la chaîne d'entrée, une exception est levée. Les exceptions proviennent principalement de la bibliothèque utilisée dans la charge utile, en raison de différences de version ou d'un chemin incorrect vers le fichier Lambda.

Dans la fonction fromURLEncodedString(), une fonction fromString est retournée avec l'URL en paramètre, et son code est le suivant :

Image 13.12 : fonction fromString()

Dans la fonction fromString, les données sont lues par readObject() et renvoyées. On voit que l'entrée n'est pas filtrée ; elle passe par plusieurs fonctions et est finalement désérialisée dans fromString(). C'est le point de réception (sink) pour l'exploitation. Une fois le sink identifié, il faut trouver la source.

  1. Recherche de la source : comme analysé plus haut, pour trouver la source, il faut déterminer l'URL de la requête entrante. On voit que pour appeler la fonction findResource(), il faut pouvoir atteindre la classe RemoteApplicationResourceLoader. La classe RenderKitResourceLoader définit très clairement les chemins :```bash this._register("/./remote/(.)", new RemoteApplicationResourceLoader());
root@kitploit:~
Do đó, để gọi được đến class kể trên thì ta cần có regex dạng “/.*/remote/(.*)”. Bởi thế, khi router hay đường dẫn đầu vào có dạng /em/afr/foo/remote/payload thì nó sẽ thỏa mãn cấu trúc được quy định ở file này, khi đó RemoteApplicationResourceLoader sẽ được sử dụng như loader tại  doGet, và file class tương ứng oracle.adfinternal.view.resource.rich.RemoteApplicationResourceLoader sẽ gọi đến hàm findResource() được override trong đó.Thế cho nên nếu như truyền payload đến đúng địa chỉ thì dữ liệu sẽ được được truyền đi dễ dàng mà không vướng phải filter.

Đây là url sau cùng dùng cho khai thác:
__hostname:port/contextApp/afr/foo/remote/payload/__

Trong đó contextApp là một trong những path khi mới cài đặt xong OBIEE sẽ có như /em; /bicomposer; ….

Foo là chuỗi bất kỳ

Payload là chuỗi sinh ra khi chạy hàm Main của Project tấn công đã chuẩn bị.

### Phân tích code dùng để tạo payload

Project này tuân theo gadget chain của CVE-2020-14644

![file Lambda](https://raw.githubusercontent.com/hienkiet/CVE-2022-201145-12.2.1.3.0-Weblogic/main/image/payload2.png)

Class LambdaIdentity$E12ECA49F06D0401A9D406B2DCC7463A được kế thừa từ AbstractRemotable được sử dụng để tương tác với hệ thống từ xa.

Với việc sử dụng Java Reflection API, attacker có thể dễ dàng lấy ra WorkAdapter từ luồng thực thi hiện tại.

Kế đó sẽ lấy tiếp trường connectionHandler của WorkAdapter và 
thực hiện truy vấn để lấy ra ServletRequest và ServletResponse từ connectionHandler.

Tiếp theo, lấy ra giá trị của tiêu đề "cmd" từ yêu cầu (ServletRequest), sau đó kiểm tra nếu "cmd" không rỗng, thực hiện một lệnh shell tương ứng với hệ điều hành hiện đang chạy (Windows hoặc Linux/Unix).

Đọc kết quả từ lệnh shell và gửi kết quả đó về phản hồi (ServletResponse).

Nếu có bất kỳ lỗi nào xảy ra trong quá trình thực thi, chúng sẽ được in ra màn hình console thông qua phương thức printStackTrace().

Id phía sau tên lớp LamdaIdentity phụ thuộc vào phiên bản của weblogic server, là một chuỗi được mã hóa theo giá trị băm MD5 của class com.tangosol.internal.util.invoke.ClassIdentity, và vì ở mỗi phiên bản thì class này sẽ khác nhau nên như đã nói, để payload không bị lỗi thì phải kiểm tra kỹ cái này.

Tại đây, một biến cmd được lấy từ header trong request đầu vào, sau đó được thêm vào câu lệnh Runtime.getRumtime.exec() bên dưới, được mã hóa và giải mã theo dạng mã hexa md5, sau khi được truyền đến hệ thống OBIEE sẽ trả về giá trị được deserialization.

Cuối cùng, tại hàm Main, một đối tượng RemoteConstructor được tạo ra, thông qua thư viện SerializationUtils để được chuyển đổi thành một chuỗi URL encoded. Chuỗi này sẽ truyền trực tiếp vào url source, gây ra cơ hội cho các attacker chèn lệnh __cmd__ tùy ý.

![Hàm Main](https://raw.githubusercontent.com/hienkiet/CVE-2022-201145-12.2.1.3.0-Weblogic/main/image/payload1.png)

## Tái hiện khai thác

![Khai thác /em](https://raw.githubusercontent.com/hienkiet/CVE-2022-201145-12.2.1.3.0-Weblogic/main/image/exploit1.png)


![Khai thác /em](https://raw.githubusercontent.com/hienkiet/CVE-2022-201145-12.2.1.3.0-Weblogic/main/image/exploit2.png)


## Reference

1. https://peterjson.medium.com/miracle-one-vulnerability-to-rule-them-all-c3aed9edeea2

2. https://testbnull.medium.com/oracle-access-manager-pre-auth-rce-cve-2021-35587-analysis-1302a4542316

## Author of Vulnerability: Jang Nguyen & Duc PeterJson
Télécharger l’outil