Ir al contenido
Únase al foro de la comunidad Censys : Conectar, compartir y prosperar | Empieza aquí
Blogs

CVE-2022-30525: Vulnerabilidad de inyección de comandos en el sistema operativo Zyxel

El 12 de mayo de 2022, se publicaron detalles sobre una vulnerabilidad que afecta a varios dispositivos VPN y cortafuegos de Zyxel Networks. Registrada como CVE-2022-30525 con una puntuación CVSS de 9,8 (crítica), esta vulnerabilidad permite a un atacante ejecutar comandos arbitrarios en el dispositivo sin autenticación. Descubierta por investigadores de Rapid7, esta vulnerabilidad es fácil de explotar y ya se ha utilizado con éxito en la naturaleza.

Censys fue capaz de identificar las versiones específicas de estos dispositivos, y en el momento de escribir este artículo, Censys observó 19.506 dispositivos cortafuegos/VPN de Zyxelde los cuales más de 7.500 pueden ser vulnerables a este ataque específico.

La buena noticia es que muchos de estos dispositivos parecen tener activadas las actualizaciones automáticas, pues ya hemos observado miles de hosts con la última versión parcheada del firmware 5.30 instalada en los últimos días.

Serie ATP

Resumen

Versiones vulnerables v5.10 - v5.21 (parcheado en v5.30)
Censys Consulta de búsqueda services.http.response.html_title: {“ATP100″,”ATP200″,”ATP500″,”ATP700”}
Número de resultados 5,899

USG FLEX 50(W)

Versiones vulnerables v5.10 - v5.21 (parcheado en v5.30)
Censys Consulta de búsqueda services.http.response.html_title: {“USG FLEX 50″,”USG FLEX 50w”}
Resultados totales 5,321

USG FLEX 100(W), 200, 500, 700

Versiones vulnerables v5.00 - v5.21 (parcheado en v5.30)
Censys Consulta de búsqueda services.http.response.html_title: {“USG FLEX 100″,”USG FLEX 100w”,”USG FLEX 200″,”USG FLEX 500″,”USG FLEX 700″}
Resultados totales 8,287

Identificación y huella digital de dispositivos Zyxel

Para determinar el alcance real de esta vulnerabilidad, tuvimos que encontrar un método para identificar versiones específicas del software en ejecución. A veces es más fácil decirlo que hacerlo, y este proveedor no es una excepción. No hay información específica en nuestros datos de escaneado que indique la versión real del software en ejecución. Pero no permitimos que esto nos disuadiera, ya que hemos versionado con éxito lo no versionable con anterioridad.

El primer paso fue mirar los artefactos y datos que tenemos ahora para ver si podíamos potencialmente utilizar algo para asignar un dispositivo a una versión específica. Parecía que cada dispositivo Zyxel que podíamos encontrar en nuestros datos tenía un conjunto común de archivos javascript que el dispositivo importaba:

Uno de los archivos javascript include que nos llamó la atención fue uno llamado "/ext-js/app/common/zld_product_spec.js", que también contenía un argumento de consulta llamado "v" seguido de una cadena de números. Por ejemplo:

Dado que nuestros datos sólo incluyen información que se encuentra en la raíz del servicio HTTP, tuvimos que recuperar manualmente este archivo específico de cara al público. El contenido de este archivo contiene más de mil líneas de variables javascript, incluyendo una variable llamada "ZLDCONFIG_CLOUD_HELP_VERSION".

~$ curl -sk https://$HOST/ext-js/app/common/zld_product_spec.js?v=220420024630 | grep ZLDCONFIG_CLOUD_HELP_VERSION

var ZLDCONFIG_CLOUD_HELP_VERSION=5.30;

~$

Parece que esta variable se utiliza en todo el software para generar enlaces a documentación específica de la versión en la página de soporte al cliente de Zyxel. Pero si nuestras suposiciones son correctas, podemos usar esto para asociar potencialmente el enlace "?v=220420024630" con una versión real del dispositivo.

Necesitábamos generar una lista de hosts y los caracteres numéricos que seguían al archivo "zld_product_spec.js" utilizando únicamente los datos de nuestro conjunto de datos. La mejor forma de hacerlo es utilizando la interfaz BigQuery de Censys(disponible para clientes empresariales):

 

El resultado es el siguiente, que puede guardarse como CSV:

A continuación, tomamos la lista completa y escribimos un pequeño script personalizado para obtener automáticamente el archivo "/ext-js/app/common/zld_product_spec.js" del host, analizar los resultados y crear un archivo de registro que contenga los números que siguen al argumento "v" y el valor de la variable "ZLDCONFIG_CLOUD_HELP_VERSION" que se encuentra en el archivo javascript "zld_product_spec". Por ejemplo,

$ tail -n 5 hosts.log
220315001833, 5.20
220420064457, 5.30
220315032123, 5.20
220420002802, 5.30
220420001613, 5.30

Tras analizar detenidamente estos resultados, determinamos que sólo necesitábamos fijarnos en los cuatro primeros dígitos de este número "v" para asociarlo a una versión de firmware concreta. Y puesto que sólo tenemos que identificar las versiones comprendidas entre la 5.00 y la 5.30, podemos decir lo siguiente con nuestros datos:

  • v5.00 tiene un valor de argumento "v" comprendido entre '2106' y '2108'.
  • v5.10 tiene un valor de argumento "v" comprendido entre '2109' y '2111'.
  • v5.20 tiene un valor de argumento "v" comprendido entre '2201' y '2203'.
  • v5.30 (la última y primera versión no vulnerable) tiene un argumento "v" que siempre empieza por '2204'.

Con esta información en la mano, podemos construir una imagen completa de Internet y de cómo le afecta esta vulnerabilidad. Una vez más, la mejor manera de hacerlo es utilizando la interfaz Censys BigQuery:

Lo que nos dio un total de 71 resultados, todos los cuales han sido asignados a una versión de firmware específica. A continuación, utilizamos estos datos para generar los informes resumidos que aparecen al principio de este artículo.

 

¿Qué se puede hacer?

Sobre el autor

Mark Ellzey
Senior Security Researcher Todos los puestos de Mark Ellzey
Mark Ellzey es investigador principal de seguridad en Censys. Antes de ocupar su puesto actual, Mark ha trabajado como ingeniero de seguridad de redes y desarrollador de software para varios proveedores de servicios de Internet e instituciones financieras durante más de 22 años.
Soluciones de gestión de la superficie de ataque
Más información