Skip to content

Hacking en IoT, acceso al firmware de un dispositivo

Share on twitter
Share on linkedin
Share on email
Share on whatsapp
Hacking IoT

En esta publicación, primera en una serie de artículos en formato «hands on lab», vamos a ver cómo acceder al firmware de un dispositivo para comenzar a entender un poco el apasionante mundo del Hacking en IoT.

Se trata de un Gateway que utilizamos para enviar a «la nube» las telemetrías de nuestros sensores Zigbee, muy comunes en domótica e Internet of Things.

Puntos de entrada al dispositivo

En algunas ocasiones se puede acceder a un dispositivo a través de algún puerto abierto (http, ssh), o simplemente descargar el firmware de la web del fabricante. Otras veces, sin embargo, sólo se puede obtener «volcándolo» desde un chip de memoria flash, o a través de interfaces On-Chip Debugging (OCD), que algunos fabricantes dejan en las placas de sus dispositivos como puntos de diagnóstico.

Existen varios protocolos para OCD, como JTAG, I2C, SWD o UART, y cada uno de ellos suele presentarse en la placa como una configuración de 2, 4 o más «puntos» de conexión. La idea es tratar de identificarlos visualmente, y después, con un polímetro, un osciloscopio, o un analizador de lógica, determinar qué punto es cada uno («RX», «TX», «GND», etc.).

Recon: obtención de información sobre el dispositivo

Para identificación visual de estos conectores, hay una herramienta fantástica que permite obtener imágenes del interior del dispositivo sin tener que abrirlo. Se trata de la base de datos de la Federal Communications Commision (FCC), en la que los fabricantes de aparatos incluyen documentación, manuales de usuario y fotografías. El identificador FCCID se suele encontrar en las etiquetas laterales o en la base de los dispositivos.

Identificador FCCID

Buscamos el ID de nuestro gateway en https://fccid.io/, y aparecen entre otros los siguientes resultados:

ID de Gateway

El que ahora nos interesa es el documento Int_Photos. En él vamos a tener unas imágenes con bastante detalle sobre el interior del dispositivo:

Interior del dispositivo

Podemos distinguir varios grupos de pines, que bien podrían ser interfaces JTAG o UART.

Si nos fijamos en el grupo de tres pines dorados del centro de la imagen, podemos distinguir no muy claramente las palabras TXD0 y GND. El tercero no se ve nada.

Nuestro kit de herramientas

Para confirmarlo vamos a abrir el dispositivo y conectarnos a la presunta interfaz UART. La navajita suiza y las púas de guitarra son en Hardware Hacking de IoT como las radiografías del cerrajero.

Kit de herramientas, Hacking de IoT

Una vez abierto, con una buena lupa o un pequeño microscopio WiFi podemos observar la placa con más detalle, viendo claramente que hay un puerto TXD0, un RXD0 y un GND.

*NOTA: como vamos a trabajar con el gateway conectado a la corriente eléctrica, debemos medir con un polímetro los pins que vayamos a comprobar, para estar seguros del voltaje y evitar daños al equipo o a nosotros mismos.

Para identificar los distintos pines, se pueden usar muchas herramientas de distintos precios. El económico FT232H (unos 20€), el Bus Pirate, o en nuestro caso, el JTagulator, que si bien es bastante más caro, merece la pena si se va a usar mucho ya que es muy cómodo y versátil: sirve tanto para JTAG, como para UART, SWD, etc.

Buscando la entrada por UART

Conectamos la herramienta a nuestro ordenador a través de un puerto serie, y en seguida podremos ver que hay un dispositivo en /dev/ con el que nos podemos conectar con el comando «screen«:

  
ipmoreno$  ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port   /dev/tty.usbserial-AL05RPEH

ipmoreno$ sudo screen /dev/tty.usbserial-AL05RPEH 115200

                                  UU  LLL
 JJJ  TTTTTTT AAAAA  GGGGGGGGGGG   UUUU LLL   AAAAA TTTTTTTT OOOOOOO  RRRRRRRRR
 JJJJ TTTTTTT AAAAAA GGGGGGG       UUUU LLL  AAAAAA TTTTTTTT OOOOOOO  RRRRRRRR
 JJJJ  TTTT  AAAAAAA GGG      UUU  UUUU LLL  AAA AAA   TTT  OOOO OOO  RRR RRR
 JJJJ  TTTT  AAA AAA GGG  GGG UUUU UUUU LLL AAA  AAA   TTT  OOO  OOO  RRRRRRR
 JJJJ  TTTT  AAA  AA GGGGGGGGG UUUUUUUU LLLLLLLL AAAA  TTT OOOOOOOOO  RRR RRR
  JJJ  TTTT AAA   AA GGGGGGGGG UUUUUUUU LLLLLLLLL AAA  TTT OOOOOOOOO  RRR RRR
  JJJ  TT                  GGG             AAA                         RR RRR
 JJJ                        GG             AA                              RRR
JJJ                          G             A                                 RR


           Welcome to JTAGulator. Press 'H' for available commands.
         Warning: Use of this tool may affect target system behavior!

Sintiendo el poder que nos proporciona este banner tan cool, ya podemos empezar a trabajar con nuestro objetivo. Como vamos a identificar pines UART seleccionamos la opción «U» del menú, no sin antes seleccionar el voltaje (3.3 voltios).

> H
Target Interfaces:
J JTAG
U UART
G GPIO
S SWD

General Commands:
V Set target I/O voltage
I Display version information
H Display available commands

Dentro menú UART pulsamos de nuevo el comando «U», para identificar por fuerza bruta los pins de TX y de RX. En este caso sólo tenemos dos, por lo que la «fuerza bruta» se limita a buscar una velocidad de transmisión adecuada.

TXD: 0
RXD: 1
Baud: 38400
Data: .. [ F9 FC ]

TXD: 0
RXD: 1
Baud: 57600
Data: ..login: [ 0D 0A 6C 6F 67 69 6E 3A 20 ]

TXD: 0
RXD: 1
Baud: 115200
Data: . [ F8 ]

UART scan complete.

Como se suele decir en estos casos… ¡Bingo!: parece que los pines son los correctos y que están transmitiendo a 57600 baudios, y de hecho vemos la palabra «login: » lo que significa que hay una Shell esperándonos.

Ahora utilizamos el comando «P» («UART Passthrough«)

Enter TXD pin [0]: 0
Enter RXD pin [1]: 1
Enter baud rate [0]: 57600
Enable local echo? [y/N]:
Entering UART passthrough! Press Ctrl-X to exit...

Como no veo nada procedente de los pins, apago y enciendo el gateway, y ya empezamos a ver los mensajes del proceso de boot:

[ 0.840000] VFS: Mounted root (squashfs filesystem) readonly on device 31:5.
[ 0.860000] Freeing unused kernel memory: 172K (80325000 - 80350000)
[ 2.690000] init: Console is alive
[ 2.700000] init: - watchdog -
...
[ 22.660000] |--------------------------------------------------------|
[ 22.680000] |------------xxxxxx-version:x.x--------------------------|
[ 22.690000] |(c) 20xx xxx -------------------------------------------|
[ 22.730000] |--------------------------------------------------------|

pulsamos un par de veces «enter» y nos aparece el tan buscado prompt de login

login: root
passwd:

Probamos con varias combinaciones de login y passwords, pero sin éxito. Revisamos los mensajes de debug en busca de algo que nos permita entrar en la shell.

[ 6.850000] random: procd urandom read with 10 bits of entropy available
Press the [f] key and hit [enter] to enter failsafe mode
Press the [1], [2], [3] or [4] key and hit [enter] to select the debug level
...

El modo failsafe

No tardamos en encontrar unos mensajes que indican cómo entrar en el failsafe mode, que suele tener privilegios de «root«. Apagamos y encendemos de nuevo, pero ahora pulsamos «f» cuando aparece el mensaje, y… [cruzamos los dedos]:

Press the [f] key and hit [enter] to enter failsafe mode
Press the [1], [2], [3] or [4] key and hit [enter] to select the debug level
f
- failsafe -

================= FAILSAFE MODE active ================
special commands:
* firstboot reset settings to factory defaults
* mount_root mount root-partition with config files

=======================================================

root@(none):/#

Aparece de nuevo el prompt, pero esta vez ya autenticado como root! Otro dicho que te hará sentir como un auténtico hacker (de los que llevan capucha o gorrito) es: «Estamos dentro!».

Ahora, podemos explorar todos los directorios, ficheros de configuración, conexiones de red abiertas, etc. y buscar vulnerabilidades en la web de administración o en cualquiera de los ejecutables que corren dentro del gateway. Descubrir una vulnerabilidad nos permitiría no sólo controlar nuestro gateway, sino cualquiera que tenga la misma versión de firmware.

Obviamente, este tipo de análisis sólo lo hacemos con fines de investigación y para ayudar a los clientes que lo soliciten, de forma que puedan hacer más seguros sus productos. Espero que esta breve introducción os haya parecido interesante, y que incluso quizás os inspire a algunos para orientar vuestros pasos hacia el Hacking en IoT.

Comparte el artículo

Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on email
Email
Share on whatsapp
WhatsApp

Una nueva generación de servicios tecnológicos y productos para nuestros clientes