Cabecera blog ciberseguridad

Emulación de firmware de dispositivo MIPS con Qemu

Durante un análisis de seguridad de un dispositivo embebido, que mostraba un comportamiento anómalo tras a una entrada de datos malformada en un servicio ftpd que escuchaba remotamente, se extrajo el firmware.

Las pruebas de fuzzing mostraban que este comportamiento anómalo podía estar relacionado con un desbordamiento de buffer pero tras un análisis inicial del binario MIPS no se encontraban pistas de ese vector de ataque.

Por todo ello, se decidió que la mejor estrategia era ejecutar el servicio vulnerable en un entorno emulado donde se pudiese disponer de herramientas adecuadas para su análisis (strace, gdb,..).

Haciendo uso del sistema de archivos recuperado, en formato squashfs, se procedió a ejecutar el firmware del dispositivo en un entorno virtual. El sistema operativo anfitrión es una distribución Kali 1.0 de GNU/Linux y el emulador utilizado es QEMU en su versión 1.1.2.

Para poder emular el firmware del dispositivo es necesario emular el procesador, la placa y los componentes. Por lo tanto, es necesario descargar una imagen compilada para MIPS:

wget https://people.debian.org/~aurel32/qemu/mips/debian_lenny_mips_standard.qcow2

También es necesario descargar una configuración hardware tipo, en este caso la placa Malta:

wget https://people.debian.org/~aurel32/qemu/mips/vmlinux-2.6.26-2-4kc-malta

Se utilizará el módulo NBD, Network Blocking Device, para montar la imagen del kernel descargada y modificarla, añadiéndole el firmware del dispositivo.

Se habilita el módulo ‘NBD’, utilizando el parámetro ‘max_part’ establecido a 16. A continuación se emula la imagen utilizando el módulo específico de ‘qemu’ para ‘nbd’. Una vez la emulación se encuentra en ejecución debemos indicar al sistema, con el comando ‘partprobe’, que las nuevas particiones deben ser releídas. Por último, se monta la partición del sistema ‘guest’ en el sistema anfitrión para poder modificarla.

mount device filesystem

Imagen – Proceso de montado del sistema de ficheros de base

Una vez se dispone el sistema emulado debemos copiar el firmware del dispositivo directamente sobre la imagen montada:

cp -R ~/Desktop/squashfs-root/* /mnt/routerFS/

Puede ser necesario restablecer el fichero /etc/passwd con el contenido por defecto:

0:unhDuTfeDCy7w:0:0:root:/home:/bin/sh
ftp:lnuHE/3WA3B2U:0:0:ftp user:/mnt:/bin/sh

Por último se emula la shell del dispositivo utilizando el siguiente comando:

qemu-system-mips -M malta -kernel vmlinux-2.6.26-2-4kc-malta -hda debian_lenny_mips_standard.qcow2 -append "root=/dev/hda1 console=ttyS0 rw init=/bin/busybox ash" -net nic -net tap -nographic

qemu busybox

Imagen – Firmware del dispositivo funcionando en entorno virtual

De este comando cabe destacar que se establece una máquina/arquitectura tipo Malta, con kernel ‘vmlinux-2.6.26-2-4kc-malta’ y sistema de ficheros, la imagen modificada con el firmware del dispositivo añadida ‘debian_lenny_mips_standard.qcow2’:

-M malta -kernel vmlinux-2.6.26-2-4kc-malta -hda debian_lenny_mips_standard.qcow2

También se debe configurar la emulación en modo lectura-escritura para permitir tanto la creación de logs y ficheros necesarios para la ejecución del sistema, como la escritura y edición de ficheros por parte del usuario:

-append "root=/dev/hda1 console=ttyS0 rw init=/bin/busybox ash"

Se establece un fichero de inicio que será el encargado de cargar el sistema. Después de una serie de pruebas se consiguió cargar la ‘shell’ contenida en el entorno ‘busybox’ que gestiona el dispositivo.

-append "root=/dev/hda1 console=ttyS0 rw init=/bin/busybox ash"

Por último, la conexión a la red de la emulación se establece de modo que crea una nueva interfaz en el anfitrión, que será a la que se conecta el sistema ‘guest’.

-net nic -net tap

Una vez en este punto se puede ejecutar el proceso ftpd en el entorno virtualizado e interactuar con el remotamente, de la misma forma que se haría con el dispositivo físico, pero antes debe establecerse la dirección IP de la interfaz de salida, en este caso eth0:

# ifconfig eth0 172.20.0.3
# /bin/bftpd -d

qemu ethernet address

Imagen – Ejecución del ‘daemon’ del servicio ftp en el entorno virtual.

Para comprobar que el servicio ftp está activo y funcional se realiza un escaneo de puertos remotamente:

nmap qemu ftpd service

Imagen – Escaneo de puertos muestra puerto ftp abierto

A partir de este momento, se pudieron concluir las pruebas de análisis con fuzzing y análisis de comportamiento. Lo que se descubrió es que el fallo estaba provocado por el espacio libre del dispositivo que, tras generar varias conexiones, se llenaba el log del sistema y provocaba una caída del dispositivo.

También se identificaron otros fallos de seguridad en otros servicios, explotables remotamente. Pero eso lo dejamos para otra ocasión.

Descubre nuestro trabajo y nuestros servicios de ciberseguridad en www.tarlogic.com/es/

En TarlogicTeo y en TarlogicMadrid.