Blog

Binwalk, la navaja suiza para el análisis de firmwares

Para los que lo conozcais, binwalk es una herramienta de análisis de firmwares escrita por Craig Heffner (@devttys0) que permite el análisis, extracción y reversing.

Las características principales de Binwalk son:

  • Identificación y extracción de archivos
  • Identificación de código
  • Análisis de entropía
  • Análisis heurístico de datos
  • Análisis de strings

La característica base es la identificación de archivos dentro de una imagen, mostrando el offset en el que se encuentra, tamaño y tipo de archivo. Para entender su funcionamiento tenemos que entender como identificar las cabeceras (o magic numbers) de los archivos, similar al comando file de sistemas Unix.

Para verlo analizaremos el volcado hexadecimal de un archivo ZIP:

# hexdump -C example.zip | head -3
00000000  50 4b 03 04 14 00 00 00  08 00 a2 95 58 43 48 ae  |PK..........XCH.|
00000010  92 c2 32 61 00 00 8c 6d  00 00 05 00 1c 00 6d 75  |..2a...m......mu|
00000020  74 68 72 55 54 09 00 03  8f 4e 69 52 c6 d6 70 52  |thrUT....NiR..pR|

La cabecera de los archivos ZIP es PK, como podeis ver al inicio del archivo nos encontramos con esta cabecera que identifica el archivo. Binwalk tiene una base de datos de estas cabeceras para multitud de archivos que nos permite la identificación dentro de imágenes de firmware. Entendiendo esta que es la función básica de binwalk ya podemos empezar a usarlo sobre un firmware real, podéis descargarlo y seguir los pasos de instalación aquí.

El firmware que utilizaremos de ejemplo será de un router DLink así que nos los descargamos y preparamos la imagen para analizar.


# ls -l
total 1792
-rw-r--r-- 1 root root 13313872 jun  6 21:41 DSL-321B_1.02_04222013
# file DSL-321B_1.02_04222013
DSL-321B_1.02_04222013: data

Con la imagen ya descomprimida y lista para analizar pasamos el comando file que nos muestra que es un tipo de dato desconocido. En este punto es cuando binwalk nos ayudará así que utilizando esta imagen veremos las principales funcionalidades de este software.

Identificación y extracción de archivos

Identificación:

Es la ejecución mas simple de binwalk, simplemente muestra los archivos que contiene la imagen del firmware, su posición, tamaño y algunos datos adicionales. Es habitual encontrarnos con falsos positivos, pero utilizando un poco de sentido común podemos hacernos una idea de la estructura del archivo.


# binwalk DSL-321B_1.02_04222013

DECIMAL       HEX           DESCRIPTION
-------------------------------------------------------------------------------------------------------------------
0             0x0           Broadcom 96345 firmware header, header size: 256, firmware version: "8", board id: "6332CG", ~CRC32 header checksum: 0xB25AC2B9, ~CRC32 data checksum: 0x3F7B3036
256           0x100         Squashfs filesystem, big endian, version 2.0, size: 1349044 bytes, 719 inodes, blocksize: 65536 bytes, created: Mon Apr 22 10:29:54 2013

Como veis binwalk ha identificado un sistema de archivos squashfs buscando su cabecera (sqsh). Para verificarlo solo tenemos que inspeccionar el volcado hexadecimal del firmware y buscar la cabecera en el offset 0x100:


00000100  73 71 73 68 00 00 02 cf  00 14 95 b4 00 14 95 b0  |sqsh............|

Extracción:

Una vez que conocemos los archivos que contiene el firmware binwalk nos da la posibilidad de extraerlos mediante el comando dd que trae implementado. Su uso es el siguiente:

$ binwalk --dd='zip archive:zip:unzip %e' firmware.bin

En nuestro caso sabemos por la primera ejecución que tenemos un sistema de archivos squashfs, por lo que le diremos a binwalk que nos lo extraiga con la extensión .squashfs y que no corra ningún comando sobre él.


//Decimos a binwalk que nos extraiga el archivo
# binwalk --dd='squashfs:squashfs' DSL-321B_1.02_04222013

DECIMAL       HEX           DESCRIPTION
-------------------------------------------------------------------------------------------------------------------
0             0x0           Broadcom 96345 firmware header, header size: 256, firmware version: "8", board id: "6332CG", ~CRC32 header checksum: 0xB25AC2B9, ~CRC32 data checksum: 0x3F7B3036
256           0x100         Squashfs filesystem, big endian, version 2.0, size: 1349044 bytes, 719 inodes, blocksize: 65536 bytes, created: Mon Apr 22 10:29:54 2013

# ls -l
total 1796
-rw-r--r-- 1 root root 1832657 abr 22  2013 DSL-321B_1.02_04222013
drwxr-xr-x 2 root root    4096 nov  8 11:13 _DSL-321B_1.02_04222013.extracted
root@kali:~/Desktop/Firmwares/DLink/DSL_321B_1.02# cd _DSL-321B_1.02_04222013.extracted/
root@kali:~/Desktop/Firmwares/DLink/DSL_321B_1.02/_DSL-321B_1.02_04222013.extracted# ls -l
total 1792
-rw-r--r-- 1 root root 1832401 nov  8 11:13 100.squashfs

//Validamos que el archivo tiene el formato correcto
# file 100.squashfs
100.squashfs: Squashfs filesystem, big endian, version 2.0, 1349044 bytes, 719 inodes, blocksize: 65536 bytes, created: Mon Apr 22 10:29:54 2013

Identificación de código

La identificación de código nos permite conocer la arquitectura sobre la que corre el firmware, binwalk detecta los opcodes de la imagen del mismo modo que hace con la cabecera de los archivos.

# binwalk -A DSL-321B_1.02_04222013

DECIMAL       HEX           DESCRIPTION
-------------------------------------------------------------------------------------------------------------------
174611        0x2AA13       ARMEB instructions, function epilogue
474762        0x73E8A       ARM instructions, function prologue
1230277       0x12C5C5      ARMEB instructions, function epilogue
1655863       0x194437      ARM instructions, function epilogue
1665110       0x196856      ARM instructions, function epilogue

De este modo sabemos que estamos ante un sistema ARM Big Endian lo que a la hora de buscar vulnerabilidades o emular el firmware nos sería de utilidad.

Análisis de entropía

Muchas veces desconocemos el estado del firmware que estamos analizando. Muchos vendors cifran el firmware para dificultar la tarea de reversearlo, otras veces simplemente estan comprimidas. El analisis de entropía nos ayuda a identificar este estado en base a la aletoriedad de los datos. Los datos comprimidos o cifrados tendrán mas entropia que ejecutables o texto.

# binwalk -E DSL-321B_1.02_04222013

DECIMAL       HEX           ENTROPY ANALYSIS
-------------------------------------------------------------------------------------------------------------------
0             0x0           0.871669
1024          0x400         0.974383
2048          0x800         0.978306
3072          0xC00         0.973445
4096          0x1000        0.976130
[...]
1828864       0x1BE800      0.976332
1829888       0x1BEC00      0.979545
1830912       0x1BF000      0.977608
1831936       0x1BF400      0.964018

Una vez termine el análisis nos mostrará una gráfica con los resultados:

plot

Análisis de entropía

El comando de entropía puede ser combinado de diferentes formas para mostrar código, strings o cabeceras. Podéis ver las diferentes opciones ejecutando la ayuda.

# binwalk -h

Análisis heurístico de datos

Al hilo de la opción anterior binwalk nos facilita aún mas las cosas mediante un análisis automatico de la entropía mostrando posibles secciones cifradas o comprimidas.


# binwalk -H DSL-321B_1.02_04222013

DECIMAL       HEX           HEURISTIC ANALYSIS
-------------------------------------------------------------------------------------------------------------------
1024          0x400         Moderate entropy data, best guess: compressed, size: 1317888, 23 low entropy blocks
1352704       0x14A400      High entropy data, best guess: encrypted, size: 478929, 0 low entropy blocks

Análisis de strings

Por último tenemos la opción de identificación inteligente de strings. A diferencia del comando strings de Unix binwalk descarta la basura y nos muestra las cadenas que puedan tener un significado.


binwalk -S DSL-321B_1.02_04222013

DECIMAL       HEX           Strings
-------------------------------------------------------------------------------------------------------------------
4             0x4           Broadcom Corporatio
24            0x18          ver. 2.0
649           0x289         cWf4oj8
750           0x2EE         eLk
1513          0x5E9         ARG
1589          0x635         Ia;2j
1738          0x6CA         heC
1318960       0x142030      Ir/)b
1319199       0x14211F      zWU
1319279       0x14216F      UjV
1319349       0x1421B5      di3
1320061       0x14247D      /var/ipsec/ipsec.conf!
1320116       0x1424B4      /var/udhcpd/udhcpd.conf1
1320201       0x142509      /var/ipsec/racoon.conf!
1320399       0x1425CF      /var/udhcpd/udhcpd.leases1
1320430       0x1425EE      /var/ppp/ip-up.local!
1320484       0x142624      /var/ppp/peers/vpnuser
1320527       0x14264F      /var/ppp/chap-secrets!
1320582       0x142686      /var/ppp/pap-secrets
1320651       0x1426CB      /var/fyi/sys/gateway!
[...]

1348859       0x1494FB      atmctl
1348868       0x149504      cat
1348874       0x14950A      false
1348882       0x149512      iptables
1348893       0x14951D      ping
1348900       0x149524      busybox
1348910       0x14952E      atm
1348929       0x149541      sendarp
1348939       0x14954B      chmod
1348992       0x149580      udhcpd
1349001       0x149589      adslctl
1349023       0x14959F      mount
1349031       0x1495A7      ebtables
1349047       0x1495B7      netctl
1349056       0x1495C0      dumpmem
1349078       0x1495D6      mkdir
1349086       0x1495DE      dmesg!
1349099       0x1495EB      ethctl
[...]

Y aqui terminamos por hoy. Ademas de estas funcionalidades binwalk nos permite la extensión a través de plugins y dispone de filtros para mostrar el output mas comodamente. Os recomiendo pasaros por la página del proyecto para conocerlo a fondo: http://code.google.com/p/binwalk

Adrián – adrian@highsec.es – @shellshocklabs

Leave a Reply

*

    No Twitter Messages