
Exploit de prueba de concepto para CVE-2020-12124 dirigido al router Wavlink AC1200, que demuestra inyección de comandos no autenticada y desbordamiento de búfer en la pila en interfaces CGI.
originalmente en https://www.klogixsecurity.com/scorpion-labs-blog/anatomy-of-an-iot-exploit-from-hands-on-to-rce
por David E. Baker, publicado el 1 de junio de 2023
Este estudio trata sobre el firmware del router Gigabit inalámbrico Wavlink AC1200 de junio de 2020. Las vulnerabilidades aquí discutidas pueden o no haber sido parcheadas por el fabricante, pero este es un caso de investigación de vulnerabilidades que mostrará el viaje como recompensa más que su conclusión. El autor realizó esta investigación antes de la divulgación pública de las vulnerabilidades, pero después de que otros investigadores las descubrieran de forma independiente y las reportaran al fabricante.
El fabricante pone a disposición el firmware de sus productos en la sección de soporte de su sitio web; esta es una forma común de obtener firmware de IoT y una alternativa útil a extraerlo de la memoria del dispositivo. El firmware no está cifrado, por lo que se puede extraer fácilmente con binwalk. El análisis dinámico se realizó con acceso a un ejemplar físico del dispositivo, y el análisis estático se realizó a través de Ghidra.
La interfaz web del router Gigabit inalámbrico Wavlink AC1200 tiene varios endpoints vulnerables que permiten la copia sin restricciones de datos proporcionados por el usuario en la pila de la aplicación o incluso directamente en la línea de comandos para lograr la ejecución arbitraria de comandos.
Los escaneos iniciales del dispositivo sugieren que el único recurso expuesto era la consola web administrativa, accesible para usuarios autenticados en la interfaz LAN a través de HTTP en el puerto TCP 80. El dispositivo puede ofrecer más servicios, pero estos no están habilitados de fábrica y por defecto. Por lo tanto, esta investigación se centra únicamente en la interfaz web.
Un escaneo nmap del dispositivo ejemplar, mostrando solo la interfaz web escuchando.
Las pruebas habituales — como las típicas inyecciones de comandos que se encuentran en los paneles de diagnóstico de dispositivos que permiten una inyección de comandos en los parámetros de un comando ping o traceroute — no arrojaron resultados inmediatamente interesantes, lo que fue decepcionante.
Opciones de gestión disponibles después de autenticarse en el panel web administrativo. "USB Storage" se puede ver como la segunda opción.
La primera interfaz (finalmente explotable) que se examinó aquí se encontró en el panel "USB storage", que se puede ver como la segunda opción en la captura de pantalla anterior. El dispositivo tiene un puerto USB junto a sus conectores Ethernet 802.2, lo que sugiere que podría ofrecer funcionalidad de almacenamiento conectado a la red (NAS).
Una fotografía de la parte trasera del ejemplar real, mostrando la disponibilidad de USB.
Un principio simple en la investigación de vulnerabilidades es que cuantos más componentes interactúe un fragmento de código y más partes móviles tenga, más probable será que haya código explotable cerca. La presencia de capacidades NAS es prometedora porque indica la presencia de código que interactúa simultáneamente con la capa de software del dispositivo, la capa de hardware y la periferia conectada (el propio almacenamiento USB).
La interfaz de gestión de la consola de Almacenamiento USB se muestra a continuación. La presencia del campo "Workgroup" por sí sola es prometedora, ya que esto sugeriría que este router WiFi podría incluso intentar interactuar a través del Server Message Block (SMB) — una gran carga para un router IoT. No puedo contar las veces que he visto entrada proporcionada por el usuario enviada directamente a la línea de comandos como argumento a la función Unix smbpasswd.
Opciones de almacenamiento USB disponibles para usuarios autenticados.
Los intentos iniciales de manipular estos ajustes fallaron debido a que el dispositivo no detectaba una unidad USB, como se ve a continuación.
Los cambios de configuración en las opciones de Almacenamiento USB no se guardarán a menos que se conecte manualmente una unidad formateada adecuadamente al puerto USB del dispositivo.
Sin embargo, una vez que se conecta una unidad formateada correctamente, el dispositivo permitió establecer un nombre de usuario y contraseña FTP. Como se sospechaba, colocó esta entrada proporcionada por el usuario en la línea de comandos:
Una inyección de comandos en el campo 'password' otorga el primer acceso al shell directamente al sistema operativo del dispositivo.
Aunque interesante, esta vulnerabilidad es difícil de generar un entusiasmo abrumador: requiere no solo acceso con credenciales a la interfaz administrativa del dispositivo, sino también acceso físico al dispositivo para manipular su unidad USB. El exploit anterior permite a un investigador interactuar con los componentes individuales del sistema operativo (y exfiltrarlos con fines de ingeniería inversa).
El dispositivo era un sistema Linux centrado en busybox con una interfaz web impulsada por Lighttpd. La funcionalidad de Interfaz de Entrada Común (CGI) era proporcionada por binarios individuales en /etc\_ro/lighttpd/www/cgi-bin/, con solicitudes web a los URI de CGI que lanzaban estos binarios directamente. Una mirada rápida a nas.cgi en Ghidra muestra la inyección de comandos en la línea 38 a continuación, que envía una contraseña proporcionada por el usuario directamente a la función do\_system (que es simplemente un envoltorio alrededor de la llamada al sistema estándar de libc).
La entrada del usuario se coloca en la línea de comandos como argumento para el script chpasswd.sh en la Línea 38, resultando en una inyección de comandos y acceso al shell directamente al sistema operativo del dispositivo.
Mirando a través del directorio /cgi-bin/ se reduce la tarea de encontrar un exploit más interesante a enumerar las interfaces CGI disponibles para el usuario, mostradas a continuación: