binwalk, descomprimir firmware(android...) desde Linux

 Binwalk es una herramienta destinada a la extracción de datos de imágenes binarias de firmware (proceso más conocido como “Firmware hacking”).

Dejo aquí el link hacia el apartado de Binwalk en la página oficial de Kali linux: http://tools.kali.org/forensics/binwalk
Y a la página oficial: http://binwalk.org/

El firmware, esencialmente, es un software que interactúa directamente con el hardware, por ello se trata de código de sólo-lectura. Ha evolucionado mucho desde aquellos tiempos en los que si se quería actualizar, había que cambiar directamente el chip (Chip ROM), hoy en día el firmware no sólo se trata de código de sólo-lectura, un claro ejemplo de ello es el que llevan los Routers, parte es modificable y parte no.

[Para los ejemplos que se mostrarán a continuación he usado el firmware CT-536B+-A101-302JAZ-C03_R21. Es un firmware anticuado pero lo he usado porque es muy liviano hacer análisis con él.]
Pasemos a las funcionalidades de Binwalk, éste es el análisis más básico:

binwalk -B firmware.bin

Esta opción extrae de forma recursiva los archivos que están detrás de la imagen binaria (ingeniería reversa):
binwalk -Me firmware.bin

Si quisiéramos hacer lo mismo pero sólo quedándonos con archivos con contenido:
binwalk -Mer firmware.bin

Volcado de datos en formato hexadecimal del archivo binario a un archivo llamado “data”:
binwalk -B -W firmware.bin -f data

Para volcar datos de forma limitada tenemos el comando “lenght”, el cual se mide en bytes:
binwalk -B -W -l 100 firmware.bin (mostrará los 100 primeros bytes en formato hex)

Extraer un tipo determinado de datos (según su extensión):
binwalk -D ‘png image:png’ firmware.bin
binwalk -D ‘zip archive:zip:unzip’ firmware.bin
binwalk –dd=’squashfs:squashfs’ firmware.bin

Para buscar un archivo en una determinada línea:
En este caso, visualizaremos qué código en formato hexadecimal hay al inicio de la línea x100 (que es donde comienza el filesystem squashfs).
binwalk -R “\x100” firmware.bin

foto5

Localizar códigos ejecutables o saber la arquitectura del archivo ejecutable:
binwalk -A firmware.bin
(En este caso no hay códigos ejecutables en el firmware.)

Si sabemos lo que queremos localizar, podemos crear un archivo con firmas digitales y usarlo para hacer el escaneo:
binwalk -m ./file.mgc firmware.bin
binwalk -m ./file.txt firmware.bin

Si estamos seguros de que el archivo no está corrupto y que toda la información que saquemos es válida usaremos:
binwalk -I firmware.bin
También es útil “binwalk -I -Mer firmware.bin -f data“. Personalmente este tipo de análisis me gusta mucho porque da mucha información sobre los tipos de compresión usados, algo vital para después poder recuperar el archivo (ingeniería reversa). Sin embargo, éste método puede dar falsos positivos (se muestran como “%s”), para ello se debe de tener en cuenta el análisis de la entropía “binwalk -E -vv firmware.bin“.

Para especificar el directorio output de toda la información sacada:
binwalk -e –directory=/tmp firmware.bin

Para escanear archivos con nombres predeterminados alojados en un archivo:
binwalk –finclude=’\.bin$’ firmware.bin
binwalk -M -e –finclude=’\.bin$’ firmware.bin
Y lo contrario:
binwalk -M -e –fexclude=’\.pdf$’ firmware.bin

Principalmente nos interesa el “Filesystem Squashfs” (no es el único, también puede haber UBIFS, ZIP, etc.) que está diseñado para ser sólo leído, ahí es donde estará toda la información del sistema operativo, ya que no está sujeta a cambios.
Por ejemplo, si nos dice que el squashfs filesystem empieza a partir del byte 4444, podemos hacer el análisis a partir de ese byte:
binwalk –dd=’squashfs:squashfs’ –offset=’256′ firmware.bin -f data.squashfs
(dd: comando para extraer información; offset: para iniciar el análisis a partir del byte 256 que es a partir de donde comienza el sistema de archivos sqfs; squashfs: extensión para el filesystem squashfs)
Tras haber realizado esto, nos quedará un archivo llamado “data.squashfs” y una carpeta, para poder trabajar con él primero tendremos que extraerlo.
Para ello se usa la herramienta “unsquashfs“:
sudo unsquashfs -f -d /tmp /home/rekod/Escritorio/CT-536B+-A101-302JAZ-C03_R21/_firmware.bin.extracted/100.squashfs
(En mi caso he querido que los datos extraidos se alojen en /tmp)
Los fabricantes de firmware muchas veces comprimen el contenido con firmas LZMA (u otras) no conocidas para que no les puedan hacer ingeniería reversa, por ello, aunque se extraiga con unsquashfs muchas veces los archivos extraidos quedan rotos o defectuosos. Para estos casos se usa el Firmware-mod-kit, es un conjunto de herramientas con diferentes versiones y formatos de descompresión para poder descomprimir exitosamente la mayor cantidad posible de archivos binarios. Recomiendo echarle un vistazo a la página: https://github.com/rampageX/firmware-mod-kit/wiki

Llegados a este punto es fácil darse cuenta del inmenso mundo en el que nos podemos sumergir sólo con los archivos binarios, de hecho, en las últimas conferencias de seguridad informática se ha puesto muy de moda el Firmware hacking ya que la mayoría de dispositivos llevan instalado un Firmware. Las opciones son evidentes: desde el hacking masivo de Routers hasta el de coches, pasando por gadgets vulnerables y dispositivos de domótica.
Generalmente el Firmware hacking se puede usar maliciosamente para 3 posibles escenarios: crear backdoorsexploits, o descubrir nuevas posibles funcionalidades del dispositivo para las que NO estaba previsto.

Para finalizar, pongamos un ejemplo muy fácil y útil para saber si nuestro router está hackeado. Esto significaría que tendríamos una backdoor en nuestro Router que proporciona acceso no autorizado a terceros, para comprobar si es así, debemos descargarnos nuestro actual firmware del router, realizar un análisis con Binwalk para extraer sus datos (recordemos “binwalk –dd=’squashfs:squashfs’ –offset=’256′ firmware.bin -f data.squashfs”). Tras esto buscamos en el directorio /etc un archivo llamado “shadow” o “passwd“. De forma predeterminada sólo debería de existir una cuenta root con una contraseña normalmente encriptada. En caso de ver varias cuentas, podríamos estar seguros de que alguien tiene acceso no autorizado a nuestro Router.
Para protegernos de esto es recomendable actualizar periódicamente el firmware de nuestro Router, en algunos Routers para ello primero se debe eliminar el firmware anterior y luego instalar la versión actualizada, en otros se trata de una simple actualización, a nivel práctico es más eficaz la primera técnica.
Éste artículo no pretende ser muy técnico (de hecho sólo se explican los conceptos más básicos) ya que sólo a este tema se le podría dedicar una página web, sin embargo me ha parecido conveniente explicar un poco más este mundillo y sobre todo, demostrar que cada herramienta abre una nueva ventana a una rama de la informática.

Comentarios

Entradas populares de este blog

Orange Pi IoT 2G Flashear memoria NAND

Usar datos gratis para proyectos IoT FreedomPop y Orange Pi 2G IoT (también Simyo).

Configurar modem GSM en la Orange Pi 2G IoT (Orange España)