Image
CVE-2023-33443 - Eludir Captcha QR y tomar control administrativo de cámaras IP BESDER

CVE-2023-33443 - Eludir Captcha QR y tomar control administrativo de cámaras IP BESDER

CRITICAL 9.8

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

https://nvd.nist.gov/vuln/detail/CVE-2023-33443

https://cve.mitre.org/cgi-bin/cvename.cgi?name=2023-33443

Hola a todos, entusiastas, soy Fall y os quiero compartir una publicación acerca de una vulnerabilidad CVE que reporté hace unas semanas que afecta a las cámaras IP de BESDER (y muchas otras cámaras chinas) basadas en VideoPlayTool 2.0.1.0 y la aplicación XMEYE con Captcha QR habilitado.

Descripción de la Vulnerabilidad

Cuando se activa el Captcha QR, es posible evitar dicha verificación, lo cual permite recibir consultas autenticadas dirigidas a las funcionalidades administrativas de las cámaras IP de BESDER que emplean VideoPlayTool para establecer comunicación con el cliente al acceder al panel web de la cámara y la aplicación XMEYE.

Impacto de la Vulnerabilidad

Las funcionalidades administrativas expuestas incluyen:

  • Establecer arbitrariamente la contraseña de cualquier usuario.
  • Creación de usuarios administradores.
  • Desactivación de alarmas y alertas.
  • Eliminación de imágenes y vídeos de CCTV.
  • Ver el streaming de la cámara de seguridad.
  • Activación de la alarma.

¿Cómo encontré la vulnerabilidad?

Se compró esta cámara para montar un CTF en C1b3rwall: https://es.aliexpress.com/item/4001050531506.html

Se contempló la posibilidad de implementar elementos comunes, como una contraseña predeterminada, alguna vulnerabilidad deliberadamente introducida... Resultó sorprendente descubrir que prácticamente todas las funcionalidades de esta cámara eran susceptibles a vulnerabilidades de una forma u otra...

El fabricante ofrece una aplicación para controlar y visualizar la cámara desde un dispositivo móvil. Para el acceso remoto, simplemente se requiere el nombre de usuario de la cámara (por defecto 'admin') y el número de serie, que puede obtenerse con la prueba de concepto mencionada más abajo en la publicación. Esto permite imaginar el nivel de seguridad de las cámaras chinas...

Surge además otra cuestión, ¿se conectarán los servidores chinos a la cámara a través de algún backdoor? Probablemente sí, existen numerosos CVE asociados al uso de backdoors en servicios de cámaras utilizados por los fabricantes para acceder al hardware de los clientes. No se ha dedicado demasiado tiempo a esto, aunque si se encuentra un momento quizás se explore, pero se realizó una pequeña prueba perturbadora con una 'Throwing Star LAN Tap' (https://greatscottgadgets.com/throwingstar/).

Básicamente, se conecta la cámara por un puerto y por otro la salida al router, realizando un port mirroring a otros dos puertos. Inmediatamente después de conectarla, gracias al analizador de red Wireshark, se observó que la cámara enviaba y recibía una gran cantidad de tráfico hacia servidores chinos. Presumiblemente, podría afirmarse que era streaming de video, pero este tema podría dar pie a otra publicación y estas son simples suposiciones. Se prosigue con la prueba de concepto real, sobre cómo eludir el captcha de la funcionalidad de 'restablecimiento de contraseña'.

Existen muchas vulnerabilidades simples en la cámara, pero se optó por indagar y desarrollar una disfunción del captcha.

La función se ve así:

El QR de la izquierda debe ser escaneado con una aplicación XMEye que se supone está vinculada con la cámara. Se realizó ingeniería inversa en la aplicación que escanea el QR, con el objetivo de entender cómo descifra la información del QR para obtener el pin.

Para localizar la función en el código, se escaneó un QR falso y se recibió el siguiente error:

Se buscó la cadena de texto 'Invalid QR code' en el código fuente:

./sources/com/mobile/myeye/activity/RetrievePasswordByScanActivity.java

Se comienzan a encontrar dichas cadenas y otras trazas para observar cómo la aplicación maneja el QR. Se descubre que envía dicha cadena a través de una solicitud HTTP a un dominio de xmeye:

Se opta por pasar la aplicación a través del apreciado proxy BurpSuite y se captura la solicitud al escanear el QR. Se observa que simplemente se envía a una página web del fabricante junto con un UUID y una appkey:

Se recibe el valioso pin para cambiar la contraseña y el número de serie para otros actos malintencionados. Es importante mencionar que el uuid y la appkey pueden ser arbitrarios; de hecho, en mi script de prueba de concepto, se envía appkey=wtf

Explotación de la Vulnerabilidad

Para cambiar la contraseña de un usuario, es necesario obtener los datos del Captcha QR, enviarlos al servidor de XMEYE, descifrar el contenido del captcha, cifrar los datos recibidos del servidor chino con el software VideoPlayTool y enviarlos a la cámara IP. De este modo, se logrará cambiar la contraseña del usuario 'admin'.

Existe un script en python cómo prueba de concepto (PoC) en mi repositorio:

https://gitlab.com/FallFur/exploiting-unprotected-admin-funcionalities-on-besder-ip-cameras

PoC - Cambio de contraseña de usuario

El primer paso consiste en solicitar el código QR a la cámara. Para establecer comunicación con la cámara, primero se deben cifrar los parámetros de consulta con el software local VideoPlayTool. En la siguiente imagen, los parámetros son enviados al software local para ser cifrados:

Luego, ese payload cifrado recibido en la respuesta es enviado por POST a la cámara con la cookie “User=admin”:

Posteriormente, se deben enviar los datos QR codificados recibidos por la cámara a VideoPlayTool para descifrarlos:

Los datos proporcionados por el software VideoPlayTool siguen cifrados, necesitamos enviar esos datos a XMEYE para descifrarlos y obtener el código Captcha:

Ahora, debemos enviar otra vez al software loca, VideoPlayTool, el código PIN extraído del QR para cifrado:

Enviamos los parámetros cifrados a la cámara:

Una vez que el QR ha sido verificado y enviado, la cámara entrará en un modo 'administrador' que permitirá recibir solicitudes de cambio de contraseña. Se obtienen los parámetros a enviar con el software local, que contienen el usuario y la contraseña a configurar:

Ahora mandamos el payload cifrado en la respuesta anterior a la cámara para cambiar la password con la cookie “User=admin”:

Si el código de respuesta es: “zjDcYpCgilAyuvlhaZwziGMuN7/zqbAZPRpFn4SZSB3MsQM7Qy0AEtxWxBJnh0gg”, ha habido un error, pero si el código de respuesta es diferente, ¡ya puedes ir a comprobar si tu contraseña se ha configurado correctamente!

Se espera que esta publicación haya sido de interés, y además se busca generar consciencia acerca de los riesgos de utilizar hardware IoT chino de bajo coste y de mala calidad. Recuerden, solo el conocimiento nos hace libres y en el campo de la ciberseguridad, es esencial para protegernos de hardware que, en mi opinión, está troyanizado.

Un saludo, Fall


Pablo Martínez Lázaro, del departamento de Red Team de Entelgy Innotec Security