IoT Reversión 101: Descubrimiento

IoT Reversión 101: Descubrimiento

Antes de adentrarnos en el mundo de la ingeniería inversa, necesitamos discutir qué es realmente la ingeniería en su conjunto.

La ingeniería es la ciencia de hacer cosas.

Esto incluye definir los requisitos del producto, diseñar el producto y construir o fabricar el producto en su totalidad. La ingeniería inversa es el proceso de ingeniería realizado al revés con un alcance limitado. Un proyecto de alcance limitado es la comprensión de cómo modificar el firmware del router para agregar características y programas adicionales. Además, la ingeniería inversa, también llamada ingeniería hacia atrás, es el proceso mediante el cual un objeto hecho por el hombre es deconstruido para revelar su diseño, arquitectura o código con el fin de extraer ese conocimiento del propio objeto.

Esto es muy similar a la investigación científica, con la diferencia de que la investigación científica está más orientada hacia los fenómenos naturales. La ingeniería inversa se encuentra más comúnmente en el campo de la ingeniería informática, ingeniería mecánica, ingeniería electrónica, ingeniería de software y mucho más.

Ha habido muchas razones en el pasado para realizar ingeniería inversa, incluyendo: Interfaz, espionaje militar o comercial, obsolescencia, análisis de seguridad de productos, inteligencia técnica competitiva, propósitos de ahorro de dinero y reutilización de un producto.

Muchos ingenieros inversos intentan averiguar cómo funciona un componente de hardware, pero en algunos casos, también hay ingenieros inversos de software, que intentan averiguar cómo funciona un algoritmo para emular completamente los mismos resultados y mejorarlo en futuras encarnaciones.

Muchas empresas tienen su propio hardware OEM y código que no comparten con el mundo, y como tal, pueden demostrar tener un alto nivel de seguridad, en teoría, pero con los años, la gente eventualmente encontrará maneras de descifrar ese código y aprender lo que hay dentro de él, por lo que este campo adicional de competencia asegura que las empresas sigan actualizando su código, para que nunca se pueda revertir completamente.

El proceso de recopilación de información

Antes de comenzar el proceso de ingeniería inversa, necesitamos averiguar algunas cosas sobre el dispositivo, este proceso se conoce como recopilación de información.

¿Quién fabrica los dispositivos y hay un fabricante de diseño original para el dispositivo? Para hacer esto, simplemente comience abriendo la carcasa e identificando los componentes principales del dispositivo. Localice las interfaces UART y JTAG y obtenga el firmware y el sistema de archivos raíz.

Localización de la interfaz UART

Puedes comenzar buscando en internet e identificando posibles candidatos a encabezados seriales. Estos pueden estar marcados en la serigrafía del PCB y generalmente son 4 pines como VCC, GND, TX y RX. Puedes usar un multímetro para encontrar los candidatos potenciales y localizar pines en el SOC para seguir las trazas del PCB.

Para hacer esto de manera efectiva, utiliza una herramienta como un Jtagulator, Osciloscopio o Analizador Lógico para localizar el TX.

Localización de la interfaz JTAG

JTAG es un estándar de la industria para probar placas de circuitos impresos después de que se fabrican y, como tal, permite el acceso para leer y escribir contenidos de memoria flash y, a su vez, puede ser utilizado como un medio para un emulador en circuito. Múltiples dispositivos están conectados en cadena de esta manera.

Los pines que necesitas buscar son:

  1. TCK reloj de prueba
  2. TDI datos de prueba de entrada
  3. TDO datos de prueba de salida
  4. TMS selección de modo de prueba
  5. TRST reinicio de prueba.

Aunque no hay un pinout estándar, hay pinouts; para encontrarlos, busca en internet y busca encabezados etiquetados como TCK, TDI, TDO, TMS. Puedes buscar encabezados de pines de 1x5/6, 2x5, 2x7, 2x10. Asegúrate de buscar GND y VCC con un multímetro y compararlos con los pinouts populares, ya que a menudo hay resistencias pull-up entre 1 y 100k para TMS, TDI y RTST, TRST puede ser llevado a bajo.

TDO debe ser de alta impedancia.

Localiza los pines en el SOC y sigue las trazas del PCB usando una herramienta como Jtagulator.

Obtener el Archivo de Firmware

Intenta primero la manera más fácil, si el proveedor tiene un sitio web que proporciona actualizaciones de firmware, puedes descargar el archivo de firmware completo. Si la actualización de firmware solo se puede descargar directamente por el dispositivo, intercepta la comunicación con Wireshark y obtén el archivo de firmware de esa manera. Si ninguno de los pasos está disponible, descarga la imagen EEPROM a través del conector JTAG usando Bus Pirate y OpenOCD.

Para obtener la información del archivo de firmware, haga lo siguiente:


$ file DVA-5592_A1_WI_20180405.sig

DVA-5592_A1_WI_20180405.sig: data

$ binwalk DVA-5592_A1_WI_20180405.sig

DECIMAL HEXADECIMAL DESCRIPTION


512 0x200 JFFS2 filesystem, little endian

24379992 0x1740258 gzip compressed data, from

Unix, last modified:

2018-04-11 10:40:16

Extraiga el contenido del firmware instalando Jefferson para extraer archivos del sistema de archivos JFFS2.

Puede usar binwalk para extraer contenido del firmware haciendo lo siguiente:


$ binwalk -e DVA-5592_A1_WI_20180405.sig

$ ls -lh _DVA-5592_A1_WI_20180405.sig.extracted

-rw-rw-r-- 1 val val 30K oct 21 13:28 1740258

-rw-rw-r-- 1 val val 24M oct 21 13:27 200.jffs2

drwxrwxr-x 5 val val 4,0K oct 21 13:28 jffs2-root

$ file 1740258

1740258: POSIX tar archive (GNU)

$ tar -tvf 1740258

drwxr-xr-x l.fornalczyk/adb boards/

drwxr-xr-x l.fornalczyk/adb boards/963138_VD5….ipk

Para ver los archivos extraídos:


$ ls jffs2-root/

fs_1 fs_2 fs_3

Hay un total de tres sistemas de archivos aquí, “/boot” y ”/” en dos partes:

$ ls -lh fs_1

-rw-r--r-- 1 val val 0 oct 21 13:28 a

-rw-r--r-- 1 val val 260K oct 21 13:28 cferam.000

-rw-r--r-- 1 val val 1,2M oct 21 13:28 vmlinux.lz

cferam.000 es la imagen del cargador de arranque que se basa en el Entorno de Firmware Común de Broadcom, mientras que vmlinux.lz es el núcleo y está en un formato comprimido CFE.

En cuanto a los otros archivos, falta /sbin/init, pero busybox está presente.

$ ls -lh fs_2/bin/busybox -rwsr-sr-x 1 val val 382K fs_2/bin/busybox

$ strings fs_2/bin/busybox …

BusyBox v1.17.3 (2018-04-11 12:29:54 CEST) …

$ arm-linux-readelf -a fs_2/bin/busybox …

… intérprete de programa: /lib/ld-uClibc.so.0]

$ ls -lh fs_2/lib/ld-uClibc* -rwxr-xr-x ld-uClibc-0.9.33.2.so

lrwxrwxrwx ld-uClibc.so.0 -> ld-uClibc-0.9.33.2.so

$ ls -l fs_3/lib/libgcrypt.so.11*

lrwxrwxrwx libgcrypt.so.11 -> libgcrypt.so.11.5.3 -rwxr-xr-x libgcrypt.so.11.5.3

La salida de arranque en la consola serial fue algo así:

CFE versión 1.0.38-118.3-S para BCM963138 (32bit,SP,LE)

genérico

ID del Chip: BCM63136B0, ARM Cortex A9 Dual Core: 1000MHz

Memoria Total: 268435456 bytes (256MB)

NAND ECC BCH-4, tamaño de página 0x800 bytes, tamaño de repuesto 64 bytes

Dispositivo de flash NAND: , id 0xc2da bloque 128KB tamaño 262144KB

Versión de Linux 3.4.11-rt19 (l.fornalczyk@quelo) (versión gcc

4.5.4 20120306 (prerelease) (Linaro GCC 4.5-2012.03) )

CPU: Procesador ARMv7 [414fc091] revisión 1 (ARMv7)

jffs2: versión 2.2 (NAND) (SUMMARY) (ZLIB) (LZMA) (RTIME)

[2.502000] Encontrado Marcador de Partición YAPS en 0x080FFF00

[2.503000] Creando 8 particiones MTD en "brcmnand.0":

[2.504000] 0x000000000000-0x000000020000 : "CFE”

[2.506000] 0x000007f00000-0x000008100000 : "bootfs_1”

[2.508000] 0x000008100000-0x00000fbc0000 : "rootfs_1”

[2.510000] 0x000000020000-0x000007ce0000 : "upgrade”

[2.512000] 0x00000fbc0000-0x00000fdc0000 : "conf_fs"

[2.513000] 0x00000fdc0000-0x00000fe00000 : "conf_factory"

[2.515000] 0x00000fe00000-0x000010000000 : "bbt"

[2.517000] 0x000000000000-0x000010000000 : "flash” ...

Init iniciado: BusyBox v1.17.3 (2018-04-11 12:29:54 CEST)

iniciando pid 235, tty '': '/etc/init.d/rcS S boot’

Iniciando boot.sh ... Restaurar passwd .... Restaurar grupo ....

Iniciando /etc/rc.d/S11services.sh ...

Iniciando el Gestor de Configuración (B)

CM TR-181 listo CM TR-98 listo Versión del Software Epicentro: DVA-5592_A1_WI_20180405 Versión de la Plataforma Epicentro: 6.0.0.0028 ... Iniciando /etc/rc.d/S13acsd.sh ... Iniciando /etc/rc.d/S20voip.sh ... Iniciando /etc/rc.d/S60ipsec.sh ... Iniciando /etc/rc.d/S70vpn.sh ... Iniciando /etc/rc.d/S94printkd.sh ...

Buscar el Software Epicentro en internet da el Fabricante de Diseño Original ADB adbglobal.com.

  • A través de esto, descubrimos que el procesador es un ARMv7 Cortex-A9 Multicore
  • Que hay 256Mb NAND Flash
  • La versión de Linux es 3.4.11-rt19
  • La versión de uClibc es 0.9.33.2
  • La versión de BusyBox es 1.17.3
  • La versión de Libgcrypt es 1.4.5
  • El software Epicentro es de ADB o adbglobal.com

Referencias