Detectar la explotación de CVE-2021-44228 (Log4j2) con Elastic Security

blog-security-detection-720x420.png

NOTA IMPORTANTE:

  • Para comprender cómo Elastic está evaluando actualmente el riesgo interno de esta vulnerabilidad en nuestros productos, consulta el aviso aquí.
  • Este blog se actualizó (14 de diciembre de 2021) con más mejoras de detección y búsqueda de amenazas desde su publicación inicial.

Visión general

En este blog se brinda un resumen de CVE-2021-44228 y se proporcionan a los usuarios de Elastic Security las detecciones para encontrar la explotación activa de la vulnerabilidad en su entorno.

Actualizaremos este blog a medida que sepamos más. Esta versión es precisa al martes, 14 de diciembre de 2021. Las actualizaciones de Apache pueden investigarse directamente a través de la página de seguridad de Log4j2.

Resumen de CVE-2021-44228 (Log4Shell)

Log4j2 es un marco de trabajo de logging open source incorporado en muchas aplicaciones basadas en Java tanto en servidores como sistemas de usuario final. A fines de noviembre de 2021, Chen Zhaojun de Alibaba identificó una vulnerabilidad de ejecución remota de código, que finalmente se reportó con el Id. de CVE: CVE-2021-44228, que se hizo público el 10 de diciembre de 2021. La explotación de la vulnerabilidad se realiza a través de la deserialización indebida de la entrada del usuario que se pasa al marco de trabajo. Permite la ejecución remota de código y puede permitir a un atacante filtrar datos confidenciales, como variables del entorno, o ejecutar software malicioso en el sistema objetivo.

La vulnerabilidad identificada afecta todas las versiones de Log4j2, desde la versión 2.0-beta9 hasta la versión 2.14.1. Los primeros métodos para aplicar un parche a este problema originaron varias candidatas a versiones, lo que culminó en la recomendación de actualizar el marco de trabajo a Log4j2 2.15.0-rc2 al momento de este blog.

Dada la complejidad trivial y la naturaleza de la explotación extendida observada, la mitigación debería considerarse crítica en cualquier entorno con software identificado que aproveche las versiones vulnerables de Log4j2.

Detectar la explotación de Log4Shell en Elastic Security

Los usuarios de Elastic Security pueden usar la regla de detección de correlación de eventos para identificar la explotación activa de la vulnerabilidad de Log4j2. Según el formato de los datos de eventos basados en el host, es posible que debas modificar esta detección para que coincida con tus campos de datos.

Regla de detección si usas datos de Endpoint

sequence by host.id with maxspan=1m
 [network where event.action == "connection_attempted" and 
  process.name : "java" and
  /* 
     outbound connection attempt to 
     LDAP, RMI or DNS standard ports 
     by JAVA process 
   */ 
  destination.port in (1389, 389, 1099, 53, 5353)] by process.pid
 [process where event.type == "start" and 

  /* Suspicious JAVA child process */
  process.parent.name : "java" and
   process.name : ("sh", 
                   "bash", 
                   "dash", 
                   "ksh", 
                   "tcsh", 
                   "zsh", 
                   "curl",
                   "perl*",
                   "python*",
                   "ruby*",
                   "php*", 
                   "wget")] by process.parent.pid

Regla de detección si usas datos de Auditbeat

sequence by agent.id with maxspan=1m
 [network where event.action == "connected-to" and 
  process.name : "java" and
  /* 
     outbound connection attempt to 
     LDAP, RMI or DNS standard ports 
     by JAVA process 
   */ 
  destination.port in (1389, 389, 1099, 53, 5353)] by process.pid
 [process where event.type == "start" and 

  /* Suspicious JAVA child process */
  process.parent.name : "java" and
   process.name : ("sh", 
                   "bash", 
                   "dash", 
                   "ksh", 
                   "tcsh", 
                   "zsh", 
                   "curl",
                   "perl*",
                   "python*",
                   "ruby*",
                   "php*", 
                   "wget")] by process.parent.pid

Regla de detección si usas eventos transmitidos de Endgame

sequence by agent.id with maxspan=1m
 [network where event.category == "network" and 
  process.name : "java" and
  /* 
     outbound connection attempt to 
     LDAP, RMI or DNS standard ports 
     by JAVA process 
   */ 
  destination.port in (1389, 389, 1099, 53, 5353)] by process.pid
 [process where event.type == "start" and 

  /* Suspicious JAVA child process */
  process.parent.name : "java" and
   process.name : ("sh", 
                   "bash", 
                   "dash", 
                   "ksh", 
                   "tcsh", 
                   "zsh", 
                   "curl",
                   "perl*",
                   "python*",
                   "ruby*",
                   "php*", 
                   "wget")] by process.parent.pid

Esta regla de detección busca una secuencia de un intento de conexión saliente a puertos estándares para LDAP, RMI y DNS (que suelen ser el objetivo de los ataques por inyección de JAVA/JNDI observados recientemente) seguido por un proceso secundario de la misma instancia de proceso de Java.

Ahora, veamos cómo esta regla detecta la explotación de la vulnerabilidad de log42j:

En la captura de pantalla anterior se muestra a un atacante que está explotando la vulnerabilidad con una carga codificada en Base 64.

En la captura de pantalla anterior se muestra a un atacante que está explotando la vulnerabilidad con una carga codificada en Base 64, cuyo objetivo es una aplicación vulnerable de ejemplo que creó Christophe Tafani-Dereeper.

En esta captura de pantalla se muestra la detección de la explotación activa de CVE-2021-44228 dentro de Elastic Security y se detallan tanto la vista de la alerta como de la línea de tiempo de la explotación.

En esta captura de pantalla se muestra la detección de la explotación activa de CVE-2021-44228 dentro de Elastic Security y se detallan tanto la vista de la alerta como de la línea de tiempo de la explotación.

En la captura de pantalla anterior se muestra que en la investigación de la alerta de detección Java ejecutó un script de shell para descargar y ejecutar un script de bash.

En la captura de pantalla anterior se muestra que en la investigación de la alerta de detección Java ejecutó un script de shell para descargar y ejecutar un script de bash.

Actualización: Mejoras de detección y búsqueda de amenazas


Ejecución de comandos shell sospechosos a través de Java

Sobre la base de las clases Java maliciosas conocidas de forma pública observadas que se proporcionan a través de la explotación de log4j, puedes buscar scripts de shell sospechosos y comandos de transferencia de la herramienta de ingreso:

process where event.type == "start" and
  process.parent.name : "java*" and

  /* Ingress tools transfer via common shell command interpreters */

  /* linux or macos */
  (
   (process.name : ("sh", "bash", "python*") and 
    process.command_line : ("*curl*|*sh*", "*wget*|*bash", "*curl*|*bash*", "*curl*|*bash*", "*http*|*sh*", "*python*http*")) or

  /* windows */
  (process.name : ("powershell.exe", "pwsh.exe", "cmd.exe") and
   process.command_line : ("*.downloadstring*", "*.downloadfile*", "*.downloaddata*", "*BitsTransfer*", "* -enc*", "* IEX*", "*wp-content*", "*wp-admin*", "*wp-includes*", "*$*$*$*$*$*", "*^*^*^*^*^*^*^*^*^*", "*.replace*", "*start-process*", "*http*", "*cmd*powershell*")))

Ejecución de archivo no confiable a través de JAVA

Identifica cuando un intérprete de JAVA crea un archivo ejecutable (PE/ELF) y el archivo se ejecuta posteriormente.

Regla de detección si usas datos de Endpoint

sequence by host.id with maxspan=5m
 [ file where event.type != "deletion" and 
  process.name : ("java", "java.exe", "javaw.exe") and 

  (file.extension : ("exe", "com", "pif", "scr") or
      /* Match Windows PE files by header data (MZ) */
  file.Ext.header_bytes : ("4d5a*", "7f454c46*")) and 

  not file.path :  ("?:\\Program Files\\*", 
                    "?:\\Program Files (x86)\\*") ] by file.path
 [ process where event.type == "start" and 
  not process.code_signature.trusted == true ] by process.executable
Regla de detección si usas eventos transmitidos de Endgame
sequence by agent.id with maxspan=5m
  [ file where event.type != "deletion"
    process.name : ("java", "java.exe", "javaw.exe")] by file_path
  [ process where event.type == "start" and 
  not process.code_signature.trusted == true] by process_path

Actividad potencial de CoinMiner

Proceso con línea de comando común a minero de criptomonedas (las campañas más observadas que aprovechan la explotación de log4j son mineros de monedas):

process where event.type == "start" and 
 process.command_line : 
       ("* pool.*", "*-u*--coin*", "*.xmr.*", "*.xmr1.*", 
        "*stratum*", "*elitter.net*", "*cryptonight*", 
        "*-a scrypt*", "*stratum1*", "*-userpass*", "*-max-cpu-usage*", 
	  "*qhor.net*", "*-wallet*pool*", "*--donate-level*", "*supportxmr.com*")

Detecciones de la comunidad

Varios miembros de la comunidad que debatieron sobre la explotación extendida de la vulnerabilidad proporcionaron información sobre diversos métodos de detección temprana que los analistas pueden aprovechar para identificar si los sistemas que usan fueron explotados o se encuentran en explotación activa:

  • El equipo de GreyNoise compartió una serie de cargas, incluidas aquellas con variantes codificadas y decodificadas para los analistas que buscan explorar los logs almacenados en sus sistemas. Esto se complementó con una lista de IP etiquetadas iniciales que intentaron la explotación de la vulnerabilidad.


  • Rob Fuller (Mubix) compartió una lista de hashes de archivos conocidos sobre versiones vulnerables del marco de trabajo, aquí.

Estrategias de mitigación adicionales

Fuera de la orientación que recomienda el equipo de Apache en cuanto al despliegue de las versiones con parches más recientes del marco de trabajo de Log4j2 para actualizar, se sugirieron varias mitigaciones para evitar la explotación:

  • Fastly sugirió comprobar si tu versión de Log4j soporta la ejecución de JVM con JAVA_OPTS=-Dlog4j2.formatMsgNoLookups=true para deshabilitar la funcionalidad de búsqueda en el servidor remoto. Esto debería aplicar a las versiones 2.10.0 a 2.15.0.

  • Para evitar el movimiento lateral desde un host vulnerable, o la explotación a través de la red, se recomienda limitar la conectividad de los sistemas potencialmente vulnerables a los recursos externos solamente a aplicaciones o servicios de confianza.

Gracias, de Elastic Security.

Queremos agradecerles a todos los equipos de seguridad del mundo por su labor incansable hoy y durante el fin de semana, en especial a aquellos nombrados en esta publicación. La apertura y la colaboración en la comunidad de seguridad para proteger a todos los usuarios es primordial al hacer frente a una vulnerabilidad tan seria y generalizada. Queremos que sepas que estamos aquí para acompañarte en cada paso del camino.

Elastic Security, en su versión existente, puede acceder a estas capacidades dentro del producto. Si eres nuevo en Elastic Security, echa un vistazo a nuestras guías de inicio rápido (videos de capacitación breves para que puedas dar los primeros pasos rápido) o nuestros cursos de capacitación gratuitos sobre conceptos básicos. Siempre puedes comenzar con una prueba gratuita de 14 días de Elastic Cloud. O descarga la versión autogestionada del Elastic Stack de forma gratuita.

Material de referencia

https://www.lunasec.io/docs/blog/log4j-zero-day/

https://www.tenable.com/blog/cve-2021-44228-proof-of-concept-for-critical-apache-log4j-remote-code-execution-vulnerability

https://www.crowdstrike.com/blog/log4j2-vulnerability-analysis-and-mitigation-recommendations/

https://mbechler.github.io/2021/12/10/PSA_Log4Shell_JNDI_Injection/

https://www.greynoise.io/viz/query/?gnql=CVE-2021-44228

https://logging.apache.org/log4j/2.x/security.html#

https://github.com/christophetd/log4shell-vulnerable-app