
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.
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.
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

Étape 2 : Installer Oracle Database 19c, lien de téléchargement :
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.
Exécuter le fichier setup.application avec les droits d'administrateur.

Suivre chaque étape comme indiqué dans le Guide d'installation de la base de données.
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.

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

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.


Créer un nouveau compte oracle database selon les étapes suivantes :
Étape 3 : Installer SQL Developer, version no-jre, lien de téléchargement : SQLDev-NoJRE

Exécuter le fichier sqldeveloper.application avec les droits d'administrateur.

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).

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

É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.

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.

É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 :




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

Étape 8 : Créer le domaine BI





À 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.
![]()
É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.

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

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).
É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) :
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).
Créer un projet vide pour analyser le code source et effectuer le débogage à distance.
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.


Configurer le débogage à distance.
Run -> Edit Configurations -> + -> Remote JVM Debug

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

É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.
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.






Analyse de la fonction findResource() dans RemoteApplicationResourceLoader.class

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

La fonction RAURLConnection appelle _getPathBean.

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).

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().


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 :

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.
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

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 ý.

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


## 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