Cuanto conseguimos acceso a un dispositivos con un sistema operativo embebido linux normalmente nos interesa dumpear ( volcar ) toda la información posible para analizarla posteriormente o intentar realizar ingeniería inversa para buscar algún posible bug, backdoors, entender mejor el funcionamiento o consultar scripts en offline.
Como definición de «cacharro» me refiero a cualquier dispositivo, pero este artículo está específicamente enfocado en dispositivos de red y similares.
En estos dispositivos podemos diferenciar dos tipos de «memoria» la memoria volátil RAM o sus variantes, y la ROM con sus variantes. Generalizando mucho podemos hablar de estos dos tipos para referirnos a lo siguiente:
- Volátil o RAM: La que usa el sistema operativo, binarios, etc… para su funcionamiento y que cuando apagamos el dispositivo normalmente se pierde. Esta memoria puede ser accedida desde
/dev/mem
- Persistente o ROM: Es la parte del dispositivo que guarda de manera segura todo el gestor de carga de firmware «bootloader» y herramientas de mantenimento CFE, arranque uboot y sistema operativo, además de valores de fábrica y datos que persisten aunque reiniciemos el dispositivo a valores de fábrica. Estarán disponibles en una capa de abstración MTD. En general estarán disponibles en
/dev/mtdX
donde la X es un numero. Ej:/dev/mtd0, /dev/mtd1
… y habitualmente están descritos en/proc/mtd
con la información de qué contiene cada bloque, posición de inicio en la memoria y longitud.
Al ser dispositivos especiales una de las formas de copiar el contenido de esta memoria sería usando cat
. Suponiendo que vamos a copiar mtd0
a un usb stick que normalmente se automontan solos podemos hacer algo como esto:
cat /dev/mtd0 > /mnt/sda1/KINGSTON/mtd0
cat /dev/mem > /mnt/sda1/KINGSON/mem
También podemos usar dd
para realizar esta tarea:
dd if=/dev/mtd0 of=/mnt/sda1/KINGSTON/mtd0
dd if=/dev/mem of=/mnt/sda1/KINGSON/mem
Otras herramientas
Finalmente como añadido saber que tenemos otras herramientas para manejar la memoria
MTD
Se usa para borrar y escribir bloques en mtd
admin@home:/tmp$ mtd
Usage: mtd [<options> ...] <command> [<arguments> ...] <device>[:<device>...]
The device is in the format of mtdX (eg: mtd4) or its label.
mtd recognizes these commands:
unlock unlock the device
refresh refresh mtd partition
erase erase all data on device
write <imagefile>|- write <imagefile> (use - for stdin) to device
jffs2write <file> append <file> to the jffs2 partition on the device
Following options are available:
-q quiet mode (once: no [w] on writing,
twice: no status messages)
-n write without first erasing the blocks
-r reboot after successful command
-f force write without trx checks
-e <device> erase <device> before executing the command
-d <name> directory for jffs2write, defaults to "tmp"
-j <name> integrate <file> into jffs2 data when writing an image
Example: To write linux.trx to mtd4 labeled as linux and reboot afterwards
mtd -r write linux.trx linux
NANDUMP y NANDWRITE
Herramientas para manipular memorias NAND
admin@home:/tmp$ nanddump
BusyBox v1.22.1 (2020-09-07 10:40:37 CEST) multi-call binary.
Usage: nanddump [-o] [-b] [-s ADDR] [-l LEN] [-f FILE] MTD_DEVICE
Dump MTD_DEVICE
-o Dump oob data
-b Omit bad block from the dump
-s ADDR Start address
-l LEN Length
-f FILE Dump to file ('-' for stdout)
admin@home:/tmp$ nandwrite
BusyBox v1.22.1 (2020-09-07 10:40:37 CEST) multi-call binary.
Usage: nandwrite [-p] [-s ADDR] MTD_DEVICE [FILE]
Write to MTD_DEVICE
-p Pad to page size
-s ADDR Start address
Otras formas de «dumpear»
Hay ocasiones en las que no conseguimos acceder a la shell del dispositivo con lo que no tenemos acceso a estos comandos, o el usuario que tenemos está mucho más limitado. En ese caso podemos intentar acceder usando un puerto serie del dispositivo e intentando interactuar con el hardware usando el CFE, que habitualmente dispone de comandos para dumpear zonas de memoria y con eso conseguir volcar la memoria. Para esto publicaré otro artículo con un ejemplo concreto de un dispositivo ZTE H108N
Finalmente si todo esto no es posible, siempre es posible usar herramientas hardware para leer la ROM/FLASH/NAND etc… conectándonos directamente y poder extraer así toda la información.
Aún teniendo estos volcados, a veces no es sencillo «montarlos» ya que los fabricantes suelen tener implementaciones no standard de ciertos algoritmos de compresion como lzma.
Deja una respuesta