Cómo «dumpear» la memoria de un «cacharro»

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.


Publicado

en

,

por

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.