
Exploit de ejecución remota de código sin autenticación para Oracle WebLogic ADF Faces (CVE-2022-21445, CVSS 9.8). Incluye configuración detallada del entorno, generación de payloads e instrucciones de depuración remota para pruebas de penetración.
CVE-2022-21445 (puntuación CVSS 9.8), la vulnerabilidad es una deserialización de datos no confiables, identificada como existente en el componente ADF Faces, que puede ser explotada de forma remota sin autenticación (pre-authentication) para ejecutar RCE.
La vulnerabilidad fue descubierta por 2 expertos en seguridad cibernética, PeterJson de VNG Corporation y Nguyen Jang de VNPT. Oracle recibió este informe en octubre de 2021 y tardó hasta 6 meses, es decir, hasta abril de 2022, en lanzar el parche.
En este artículo, la explotación se centra en Oracle Business Intelligence versión 12.2.1.4.0
Condiciones: Instalar Windows 10+ Pro o Windows Home (x64) con licencia activada o usar Windows Server (priorizar usar productos de Oracle)
Paso 1: Instalar Java, versión jdk 8u112 o superior (8Ux), enlace de descarga: JDKv8U112

Paso 2: Instalar Oracle Database 19c, enlace de descarga: Oracle 19c
Preparar una carpeta para instalar la base de datos, crear una ruta como la siguiente y descomprimir el archivo zip de la base de datos recién descargado en C:\app\oracle\product\19c\db_home1
Ejecutar el archivo setup.application con privilegios de administrador

Seguir paso a paso según las instrucciones en Guía de instalación de DB
Tener mucho cuidado:
En el paso 8/17, recordar marcar Create as Container database para abrir una base de datos conectable que sirva para el proceso de instalación de Fusion Middleware que viene a continuación

En el paso 9/17, elegir el juego de caracteres Unicode (AL32UTF8)



Paso 3: Instalar SQL Developer, versión no-jre, enlace de descarga: SQLDev-NoJRE

Ejecutar el archivo sqldeveloper.application con privilegios de administrador

Configurar los parámetros para una nueva conexión como se muestra a continuación, recordar cambiar el Nombre de usuario y Contraseña (como en el ejemplo anterior es hr), Hostname (por defecto es localhost), Puerto (por defecto es 1521), SID (es el nombre global de la base de datos instalada en el paso 2)

Si al hacer clic en Test aparece un mensaje de Success, la conexión es exitosa; hacer clic en Connect
Paso 4: Instalar Fusion Middleware Infrastructure (FMW) versión 12.2.1.3.0, enlace de descarga FMW_ver_12.2.1.3.0

Paso 5: Instalar Oracle Business Intelligence (OBIEE) versión 12.2.1.4.0, enlace de descarga: OBIEE_ver_12.2.1.4.0
Ejecutar el archivo setup_bi_platform-12.2.1.4.0_win64.exe con privilegios de administrador

Instalar paso a paso según Guía de instalación de OBIEE
Nota: La ruta de BI debe coincidir con la ruta donde se instaló FWM, como aquí es Oracle/Middleware/Oracle_Home

Paso 6: Configurar BI Schema mediante la utilidad Repository Creation Utility (RCU)
En la ruta C:\Oracle\Middleware\Oracle_Home\oracle_common\bin, ejecutar el archivo rcu.bat con privilegios de administrador
Seguir los siguientes pasos




Paso 7: Configurar variables de entorno para OBIEE

Paso 8: Crear BI Domain





En el paso 4, si el sistema muestra fail to logon, verificar nuevamente la contraseña del dominio para asegurarse de que sea correcta
En el paso 8, si el sistema muestra un error como en la imagen de abajo, verificar si la licencia de Windows está activada y si su Windows cumple con las condiciones descritas.
![]()
Paso 9: Una vez configurado, acceder al dominio bi recién creado en la ruta $Oracle_Home\user_projects\domains\bi\servers\AdminServer\tmp_WL_user\adf.oracle.domain.webapp\i83uao
Copiar todos los archivos jar de aquí a una carpeta separada y compartirla con la máquina atacante (en un entorno de laboratorio se hace así; en un ataque real, en la máquina atacante también se debe instalar como en la máquina objetivo para obtener el código fuente)
Agregar también la librería coherence.jar desde la ruta $Oracle_Home\coherence\lib a esta carpeta.
Esta es una carpeta importante que determina si el payload tendrá éxito o no porque cada versión de FMW o BI o el entorno de cada máquina puede ser diferente, por lo que se necesita la versión exacta para minimizar riesgos o excepciones que surjan durante la transmisión del payload.
Paso 10 (solo si se necesita depuración remota; repetir, si se prueba en un entorno real, como no se puede configurar la máquina víctima a voluntad, el atacante debe realizar la configuración de la máquina objetivo en su propia máquina para poder depurar de forma remota y verificar errores)
Instalar Mozilla, agregar Burp Proxy con puerto 8181
Activar Remote Debug en el servidor BI
Acceder a localhost:9500/console
En Domain Structure -> seleccionar bi -> Environment -> Servers

Se mostrarán dos servidores: AdminServer de Weblogic y bi_server1 de BI

Seleccionar Lock & Edit en la esquina inferior izquierda, marcar bi_server1 para editar la configuración. Aquí, seleccionar Configuration -> Server start -> Desplazar hasta el final, seleccionar Advance (si existe) -> Seleccionar ingresar en Arguments -> Ingresar los parámetros de depuración:
-Xdebug -Xnoagent – Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n
(se puede probar con 0.0.0.0:5005 si luego hay un error al no poder reiniciar bi_server1)
Ingresar la contraseña de Weblogic (la establecida anteriormente en la parte Config BI Domain) -> Apply change & Restart
Abrir terminal Administrator -> Navegar a la ruta $Oracle_Home\user_projects\domains\bi\bitools\bin ejecutar ./stop.cmd y ./start.cmd para reiniciar bi_server1, durante el reinicio si no ocurre ningún error, la depuración se ha abierto y está escuchando en el puerto 5005 como se indicó. Si ocurre algún error, verificar nuevamente los parámetros de depuración anteriores para ver si hay espacios adicionales o un error en la parte de la dirección.
Paso 1: Descargar IntelliJ IDEA Ultimate, activar con código encontrado en GitHub.
Paso 2 (Solo hacer este paso si durante el ataque aparece un error como 500 Server Error, ... que se debe a una excepción en el payload)
Cambiar la versión de jdk – sdk del proyecto a la misma versión que en la máquina objetivo (cómo instalarlo en Parte Máquina Objetivo - Paso 1)
Crear un proyecto vacío para analizar el código fuente y realizar la depuración remota.
Agregar todos los archivos jar de la carpeta recibida de la máquina objetivo a este proyecto
Project Structure -> Modules -> Seleccionar el signo + -> 1 JARS or Directories -> Agregar toda la carpeta jar.


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

Ejecutar Remote Debug, si aparece en la consola: Connected … entonces ha sido exitoso.

Paso 3:
Clonar el código de este repositorio en la máquina, eliminar el archivo coherence.jar antiguo en la carpeta lib y reemplazarlo con el archivo recibido de la máquina objetivo en el paso anterior.
Luego, agregarlo a un proyecto ejecutado con IntelliJ, agregar los archivos jar en lib con la opción Add as library
Verificar que el nombre de la clase LambdaIdentity$.... sea correcto para la versión de Weblogic; si hay cambios, refactorizar el archivo y cambiar el nombre de ese archivo.
Weblogic 12.2.1.3: LambdaIdentity$E12ECA49F06D0401A9D406B2DCC7463A
Weblogic 12.2.1.4: LambdaIdentity$423B02C050017B24DB10DFF759AA56BF
Editar la ruta al archivo LambdaIdentity$....class en el archivo Main.java. Para obtener la ruta exacta, hay dos formas de hacerlo: se puede ejecutar javac en el archivo jar para que genere el archivo .class; otra forma es comentar el código de la función main, luego ejecutar este proyecto normalmente, la ruta del archivo class se puede encontrar en la carpeta target.
Verificar que el jdk y sdk del proyecto coincidan con los del lado de la máquina objetivo.
Vemos el archivo web.xml, que describe las relaciones de mapeo relacionadas con servlet-mapping. "resources" es el servlet relacionado con los recursos del sistema, que contiene datos e información importantes; por lo tanto, esta es la ubicación a la que suelen apuntar los atacantes.






Análisis de la función findResource() en RemoteApplicationResourceLoader.class

Esta función devuelve un método que contiene un protocolo personalizado RAStreamHandler(). RAStreamHandler creará un objeto URLConnection con el valor new RAURLConnection

La función RAURLConnection llama a la función _getPathBean

La función _getPathBean contiene un objeto bean creado mediante la llamada a la función getInstanceFromString(), que se encarga de procesar la cadena recibida para extraer las claves correspondientes (filtro).

La cadena bean de entrada se convertirá a través de la clase SerializationUtils de formato URL encoded a un objeto URLEncoderPathBean. Si todo sigue bien, la entrada posterior continuará pasando a la función fromURLEncodeString().


En caso de que la cadena de entrada encuentre un error, saltará una excepción. La excepción proviene principalmente de la lib utilizada en el payload, debido a discrepancias de versión o a una ruta incorrecta al archivo Lambda.
En la función fromURLEncodedString(), se devuelve una función fromString con el parámetro url, y su código es el siguiente:

En la función fromString, los datos se leen con readObject() y se devuelven. Se puede ver que la entrada no es filtrada en absoluto, pasa a través de varias funciones y finalmente se deserializa en fromString(). Este es el sink que sirve para la explotación. Una vez que tenemos el sink, ahora solo necesitamos encontrar el source.
Por lo tanto, para llamar a la clase mencionada, necesitamos una expresión regular como “/.*/remote/(.*)”. Por ello, cuando el enrutador o la ruta de entrada tiene la forma /em/afr/foo/remote/payload, cumplirá con la estructura definida en este archivo, entonces RemoteApplicationResourceLoader se utilizará como cargador en doGet, y la clase de archivo correspondiente oracle.adfinternal.view.resource.rich.RemoteApplicationResourceLoader llamará a la función findResource() que está sobrescrita allí. Por lo tanto, si el payload se envía a la dirección correcta, los datos se transmitirán fácilmente sin encontrar filtros.
Esta es la URL final para la explotación:
__hostname:port/contextApp/afr/foo/remote/payload/__
Donde contextApp es uno de los paths que, al instalar OBIEE, estarán presentes como /em; /bicomposer; ….
Foo es una cadena arbitraria
Payload es la cadena generada al ejecutar la función Main del proyecto de ataque preparado.
### Análisis del código utilizado para crear el payload
Este proyecto sigue la cadena de gadgets de CVE-2020-14644

La clase LambdaIdentity$E12ECA49F06D0401A9D406B2DCC7463A hereda de AbstractRemotable y se utiliza para interactuar con el sistema remoto.
Con el uso de la API de Reflexión de Java, un atacante puede obtener fácilmente WorkAdapter del hilo de ejecución actual.
Luego, tomará el campo connectionHandler de WorkAdapter y realizará una consulta para obtener ServletRequest y ServletResponse desde connectionHandler.
A continuación, obtendrá el valor del encabezado "cmd" de la solicitud (ServletRequest), luego verificará si "cmd" no está vacío, ejecutará un comando de shell correspondiente al sistema operativo en ejecución (Windows o Linux/Unix).
Leerá el resultado del comando de shell y enviará ese resultado en la respuesta (ServletResponse).
Si ocurre algún error durante la ejecución, se imprimirán en la consola a través del método printStackTrace().
El ID después del nombre de la clase LamdaIdentity depende de la versión del servidor WebLogic, es una cadena codificada según el valor hash MD5 de la clase com.tangosol.internal.util.invoke.ClassIdentity, y como en cada versión esta clase es diferente, como se dijo, para que el payload no falle, se debe verificar cuidadosamente esto.
Aquí, una variable cmd se obtiene del encabezado de la solicitud de entrada, luego se agrega a la instrucción Runtime.getRumtime.exec() más abajo, se codifica y decodifica en forma hexadecimal MD5, después de ser transmitida al sistema OBIEE devolverá el valor deserializado.
Finalmente, en la función Main, se crea un objeto RemoteConstructor, que a través de la librería SerializationUtils se convierte en una cadena codificada en URL. Esta cadena se pasará directamente a la URL de origen, brindando la oportunidad a los atacantes de insertar el comando __cmd__ a voluntad.

## Recreación de la explotación


## Referencias
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
## Autor de la vulnerabilidad: Jang Nguyen & Duc PeterJson