Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2022-21445-for-12.2.1.3.0-Weblogic — 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. | Kitploit
Herramientas/GitHubGitHub/hienkiet/cve-2022-21445-for-12.2.1.3.0-weblogic
Análisis de VulnerabilidadesAnálisis de CódigoExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónHerramienta de Acceso RemotoDesarrollo de Payloads
GitHubhienkiet/cve-2022-21445-for-12.2.1.3.0-weblogic

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2022-21445-for-12.2.1.3.0-Weblogic

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.

Ver Repositorio
53hace 2 añosAún no revisado

Vista general

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

Análisis - Recreación de la vulnerabilidad

Configuración del entorno

En el lado de la máquina víctima/objetivo

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

  • Agregar JAVA_HOME con la ruta que apunte al directorio jdk (no jre) Imagen 1.1: Instalar Java

Paso 2: Instalar Oracle Database 19c, enlace de descarga: Oracle 19c

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

  2. Ejecutar el archivo setup.application con privilegios de administrador Imagen 2.1: Ejecutar setup DB

  3. Seguir paso a paso según las instrucciones en Guía de instalación de DB

  4. 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 Imagen 2.2: Inicializar Pluggable Database

En el paso 9/17, elegir el juego de caracteres Unicode (AL32UTF8) Imagen 2.3: Elegir Unicode

  1. Una vez finalizado el proceso de instalación, verificar cuidadosamente en los Servicios de Windows para asegurarse de que los 4 servicios principales como en la imagen de abajo estén en estado RUNNING Imagen 2.4: Instalación exitosa

Imagen 2.5: Verificar servicio

  1. Crear una nueva cuenta de base de datos Oracle siguiendo estos pasos:
  • Terminal Administrator -> sqlplus / as sysdba
  • Crear usuario system: alter user system identified by system_password account unlock;
  • Verificar la existencia del usuario system: select username from dba_users;
  • Configurar el entorno: alter session set “_oracle_script”=true;
  • Crear usuario común hr: create user hr identified by user_password;
  • Otorgar privilegios: grant all privileges to hr;
  • Desbloquear la cuenta – cambiar contraseña: alter user hr identified by hr_pass account unlock;
  • Crear nueva cuenta de sistema: alter user sys identified by sys_pass account unlock;

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

  • Ejecutar el archivo sqldeveloper.application con privilegios de administrador Imagen 3.2: Iniciar SQL Developer

  • 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) Imagen 3.3: Configurar parámetros de SQL Developer

  • 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 Imagen 4.1: Descargar FMW

  • Crear la ruta para el directorio de instalación de FMW en el formato C:\Oracle\Middleware\Oracle_Home
  • Seguir los pasos según las instrucciones: Guía de instalación de FMW

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 Imagen 5.1: Ejecutar archivo de instalación de OBIEE

  • 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 Imagen 5.2: La ruta de BI debe coincidir con la de FWM

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

Imagen 6.1: Crear Repository

Imagen 6.2: Detalle de conexión a la base de datos

Imagen 6.3: Seleccionar Componente

Imagen 6.4: Contraseña del Schema

  • Finalmente, hacer clic en Create para que el sistema cree el BI Schema

Paso 7: Configurar variables de entorno para OBIEE

  • Ir a Control Panel > System > Advanced system settings > Advanced > Environment Variables > New System Variable Imagen 7.1: Variables de entorno

Paso 8: Crear BI Domain

  1. En la ruta C:\Oracle\Middleware\Oracle_Home\bi\bin, ejecutar el archivo config.cmd con privilegios de administrador

Imagen 8.1: Ejecutar archivo config

  1. En el paso 1: Seleccionar los 3 componentes, donde Essbase es el servidor OLAP, Business Intelligence Enterprise Edition es BI Analytics y Business Intelligence Publisher es BI Publisher

Imagen 8.2: Seleccionar componente

  1. En el paso 3: Configurar un nuevo dominio como se muestra a continuación, ¡¡RECUERDE LA CONTRASEÑA DEL DOMINIO YA QUE SERÁ MUY DIFÍCIL RECUPERARLA. y deje el dominio como bi porque es el predeterminado.

Imagen 8.3: Cuenta del dominio

  1. En el paso 4: Actualizar la información del dominio para la base de datos

Imagen 8.4: Actualizar información

  1. En el paso 8: Si el proceso es exitoso, se obtendrá un resultado como el de la imagen

Imagen 8.5: Configuración exitosa

  1. Si todo está en Done, guardar el archivo de información de OBIEE para el siguiente paso, iniciar sesión en la url abierta:
  • http://localhost:9500/console*
  • http://localhost:9500/em*
  • http://localhost:9502/xmlpserver*
  • http://localhost:9502/analytics*
  1. Algunos errores que pueden ocurrir
  • 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.

Imagen 8.6: Error de licencia

  • Error por no agregar BI_HOME_PRODUCT, revisar Paso 7
  • Actualización de errores ...

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

Imagen 10.1: Domain Structure

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

Imagen 10.2: Lista de servidores mostrados

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.

En el lado de la máquina atacante

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)

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

  2. Crear un proyecto vacío para analizar el código fuente y realizar la depuración remota.

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

Imagen 11.1: Agregar archivos jar

Imagen 11.2: Resultado

  1. Configurar Remote Debug

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

Imagen 12.1: Configurar Remote Debug

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

Imagen 12.2: Ejecutar Remote Debug

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.

Análisis del código de BI y del código generador de payload

Análisis del código de BI

  1. En la ruta $Oracle\Middleware\Oracle_Home\user_projects\domains\bi\servers\AdminServer\tmp_WL_user\em\fw8wi5\war\WEB-INF

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.

Imagen 13.1: Relación servlet-mapping

  1. Al profundizar en la clase ResourceServlet, específicamente en org.apache.myfaces.trinidad.webapp.ResourceServlet, veremos la función doGet que maneja las solicitudes get enviadas al servidor.

Imagen 13.2: función doGet

  • Aquí, a través del método _getResourceLoader(), se crea un nuevo loader a partir de la solicitud entrante. Al mismo tiempo, también se inicializa un resourcePath y recibe el valor de servletPath y servletInfo a través del método getResourcePath con el parámetro request. Ese loader llama a la función getResource(resourcePath), intenta cargar el recurso desde la solicitud entrante y lo busca mediante org.apache.myfaces.trinidad.resource.ResourceLoader.getResource.findResource(), finalmente el valor encontrado se pasa a una instancia url de la clase URL.class.

Imagen 13.3: función getResource

  • _getResourceLoader mantiene un ConcurrentMap para almacenar la relación de mapeo entre servletPath y loaders. Esta relación se define claramente en oracle.adfinternal.view.resource.rich.RenderKitResourceLoader

Imagen 13.3: clase RenderKitResourceLoader

  • El método _register en la función RenderKitResourceLoader() se llama y se le pasan las regex + el loader correspondiente, luego devuelve super.register, que es la función padre. Esta función agrega al concurrentmap_loaders el valor del patrón y el loader correspondiente. Por lo tanto, cuando el loader se inicializa en la función doGet() y recibe el parámetro de solicitud entrante, el valor servletPath de la url de la solicitud enviada se toma para pasarlo a _loader.get() con el fin de obtener el servlet correspondiente.

Imagen 13.4: método _register

Imagen 13.5: método register (método padre)

  • El autor de la vulnerabilidad cree que, entre las clases que contienen un método que anula findResource(), oracle.adfinternal.view.resource.rich.RemoteApplicationResourceLoader es la clase que presenta el riesgo de deserialización. Vamos a analizarla para encontrar la razón.

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

Imagen 13.6: función findResource()

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

Imagen 13.7: método RAStreamHandler()

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

Imagen 13.8: método RAURLConnection ()

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

Imagen 13.9: función _getPathBean

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

Imagen 13.10: función getInstanceFromString()

Imagen 13.11: función fromURLEncodedString()

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:

Imagen 13.12: función fromString()

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.

  1. Buscar el source: como se analizó anteriormente, para encontrar el source es necesario determinar la url de la solicitud entrante. Vemos que para llamar a la función findResource(), se debe tener permiso para dirigirse a la clase RemoteApplicationResourceLoader. En la clase RenderKitResourceLoader se define muy claramente:```bash this._register("/./remote/(.)", new RemoteApplicationResourceLoader());
root@kitploit:~
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

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

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.

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

## Recreación de la explotación

![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)

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