Después de identificar el hardware y extraer el firmware desde el chip flash, hoy buscamos un modo de acceso nuevo, lo que nos abrirá un gran abanico de posibilidades a la hora de hacer perrerías.
Herramientas necesarias
Para estas nuevas pruebas necesitaremos algunos componentes nuevos.
- Soldador de punta fina: cualquiera que sea decente vale, aunque se recomienda comprar un soldador de calidad si te lo puedes permitir.
- Multímetro digital: que al menos tenga la capacidad de medir continuidad y voltaje en corriente continua de hasta 6 voltios. No conozco un multímetro que no pueda realizar estas tareas.
Yo, cutre que soy, he comprado un kit barato que contiene los elementos que se necesitan (https://www.amazon.es/gp/product/B07STVXYRG/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1, 22.99€) y alguno extra. La verdad, para lo poco que lo he usado hasta ahora, no tengo mayor queja.
Además de esto utilizaremos distintos programas, todos software libre.
Identificación de puertos I/O
De nuevo, el primer paso es un reconocimiento de la placa en busca de las posibles interfaces de entrada y salida. Para ello, recuperemos una foto tomada en uno de los pasos anteriores:
En un primer momento, mi inexperiencia me llevó a pensar que los huecos que se pueden ver en la parte superior izquierda de la fotografía podían ser un puerto serial UART. Los que ya sabéis de electrónica y estáis leyendo esto podéis dejar de reíros ahora: está bastante claro que se trata de un puerto USB. No se nace sabiendo. Lo he identificado, finalmente, porque las siguientes razones:
- Posición: un puerto UART suele econtrarse cerca de la CPU y/o de la flash. En este caso, el puerto en cuestión no puede estar más lejos. Además, los puertos USB de los routers suelen estar próximos a un borde para poder exponerlos fuera de la carcasa, y es común encontrarlos en los laterales.
- Formato: se pueden ver claramente los 4 pines que me hicieron pensar que se trataba de un puerto UART. Sin embargo, también se pueden ver dos grandes huecos a los lados, donde es habitual soldar la conexión a tierra del recubrimiento de un puerto USB.
En la semana que lleva publicado el primer post de esta serie no he recibido ningún comentario al respecto de esto, y bien no soy tan idiota como imaginaba, o ni siquiera leéis y sólo venís por mi acertadísimo uso de imágenes de genios creadores de Internet. En cualquier caso, dishonor on you.
Una vez descartada esa posibilidad, nos centramos en el segundo candidato. Cumple varios de los requisitos prácticamente obligatorios de un puerto UART: tiene cuatro pines, y está situado muy cerca de la CPU. Por lo tanto, una vez descartadas otras posibilidades, pasamos a identificar los pines mediante una inspección a fondo. Pero antes, un poco de teoría.
UART
UART corresponde a las siglas de Universal Asynchronous Reciver-Transmitter, emisor-receptor universal asíncrono. Se utiliza para la transmisión serial con formato de datos y velocidad de comunicación configurable, tanto en modo simplex (unidireccional) como full (bidireccional al mismo tiempo) y half duplex (bidireccional turnándose para emitir cada extremo).
Por norma general, las señales se transmiten a través de 4 pines: tierra (GND), 3.3V (Vcc), Data Output (DO) y Data Input (DI).
Los elementos más simples del encapsulamiento de la información son los siguientes:
– Todos los paquetes de comunicaciones UART comienzan con un “start bit”, que consiste en un cambio de señal del estado en reposo (máximo voltaje) a mínimo voltaje, y vuelta al máximo.
– Se utilizan uno o dos bits de señal de parada (o “stop bits”), que consisten en una señal continua del máximo de voltaje.
– Dependiendo de la cantidad de stop bits y bits de paridad utilizados, se utiliza para cada paquete de 5 a 9 bits para codificar el mensaje.
Si durante un tiempo demasiado prolongado se detecta una señal de mínimo de voltaje, se considera que la comunicación se ha roto.
Para medir el tamaño de cada señal, se utiliza un ratio específico de comunicación, configurable en cada interfaz. Este parámetro es conocido como “baudio”, o cantidad de cambios de señal (o símbolos) transmitibles por segundo. No existen señales de reloj compartidas, por lo que están continuamente sincronizando los receptores en función de la señal que reciben (midiendo la coherencia de los start y stop bits).
Todos estos parámetros de configuración deben ser compartidos por los dos extremos de la comunicación para que esta pueda llevarse a cabo correctamente.
La configuración más habitual es la utilización de ocho bits de datos, no utilzar bit de paridad, y un bit de señal de parada, o, en su forma abreviada: 8N1. Esto permite el envío de una cantidad fija de carácteres ASCII: bitrate / 10.
Inspeccionando el puerto UART
Revisemos de cerca los puntos del puerto:
El fabricante, pese a no haber soldado los pines, ha decidido ponerlo fácil, dibujando sobre la placa la posición del adaptador de plástico que podemos encontrar en muchos puertos UART de otros dispositivos. Como no es el caso, y no tengo pines de sobra, he desoldado los que tenía otro router viejo que tenía por casa, y los he separado. Si no tenéis pines, podéis probar con cables finos, pero se puede complicar bastante la cosa. Los pines no son caros, prometo comprarlos para futuras pruebas.
Antes de quemar la placa, sería inteligente conocer qué pines necesitamos. Para ello utilizaremos un multímetro digital. El paso más sencillo a la hora de identificar los pines de UART es localizar el pin de tierra, ya que la tierra es compartida por la mayoría de componentes de la placa. Para esto, utilizaremos el medidor de continuidad del multímetro. Para los que no lo conzcan, este modo pita o muestra en pantalla si el circuito formado por las puntas de prueba y todo lo que haya entre ellas está cerrado.
Al seleccionar dicho modo, y mantener los cabezales de prueba en el aire, sin tocarse, vemos que el multímetro marca “1”. Este es el estado “abierto”. Si juntamos las puntas, el multímetro indicará (o se aproximará a) 0, y emitirá un pitido.
Como conexión a tierra, generalmente las placas metálicas que cubren procesador u otros componentes son la mejor elección. Sin embargo, ya que esta placa no los tiene, pero conocemos el pin de tierra del chip de la memoria flash, podemos utilizarlo de referencia. Este es el único paso de la medición que realizaremos con la placa desconectada de corriente. Nótese que en este punto había decidido soldar las puntas, ya que conocía la distribución de pines, pero no es necesario para tomar las medidas:
En la foto se puede ver (mal) que el primer hueco, el que venía identificado con una flecha, no se encuentra soldado con un pin por razones que veremos justo ahora.
De acuerdo, hemos localizado la tierra. Por descarte, el siguiente pin más sencillo de situar es el de Vcc, ya que se trata de una salida fija y constante. Para medirlo, cambiaremos el modo del multímetro a voltaje en corriente continua, y seleccionamos una medida superior al voltaje que vayamos a medir. Sabemos que los posibles voltajes presentes en la placa, por norma general, son 3.3 y 5 voltios, por lo que seleccionamos la opción 20V. Con la placa ya encendida, probamos con las puntas del multímetro:
Si hemos descartado Vcc y GND de los 4 pines, los que nos quedan son MISO (Serial Output), y MOSI (Serial Input). Estos pines son los más “difíciles” de localizar, ya que uno oscila entre 0 y 3.3V para enviar señal, y el otro generalmente se mantiene estático en un voltaje, ya que su función es medir diferencias en la señal que recibe. Para medir el pin MISO aprovecharemos el momento en el que más información transmite, que es durante el arranque (en este punto, asumiendo que este puerto se utiliza como salida de depuración, se muestra la información del bootloader, kernel y sistema de archivos durante su carga).
También es importante especificar en este punto que el tipo de multímetro que estemos utilizando es relevante para la prueba. La mayoría incluyen unas funciones de averaging en la medición que hace que se suavicen los cambios en cada muestra que toman, lo que generalmente hace más fácil leer el voltaje estable. Como este caso es justamente lo contrario, queremos observar la variación, esta función nos pone un poco palos en las ruedas, y nos obliga a estar muy atentos durante las pruebas. Cuanto más agresiva sea esta función de averaging, menos variación observaremos en la lectura.
Continuamos las mediciones por el tercer pin, utilizando como referencia el segundo (tierra). Es muy difícil mostrarlo en fotos, pero se observan ciertas variaciones:
El rango durante las pruebas ha sido de 3.1 a 3.7 voltios, lo que parece bastante fluctuación. A estas alturas podemos apostarnos unas cervezas sin demasiado riesgo a que el último pin es MOSI. Si queremos medirlo, podremos ver que el voltaje permanece estable.
Este pequeño capítulo nos ha mostrado una manera de localizar el puerto UART, e introducido los términos que debemos conocer para llevar a cabo la conexión con esta interfaz. En la próxima entrada veremos como configurar Bus Pirate para acceder al dispositivo, y realizaremos otro dump de parte del firmware con él. Que no se diga que no hay maneras de hacerlo…
Eriatarka.