
De UART a Root: Irrumpiendo en el Xiaomi C200 mediante U-Boot
En este repositorio mostraré cómo obtuve acceso a la interfaz UART incluso sin el conjunto común de pines expuestos / pads de prueba, utilizando U-Boot y trucos para obtener root en una etapa temprana y eventualmente extraer el firmware.
Hay algunas cosas clave que quedan claras en la PCB:
Primero fui a los candidatos obvios para un acceso UART directo, hay 4 pads de prueba en fila que parecen ser Tx, Rx, GND y alimentación, pero al probarlos con un multímetro obtuve lecturas incorrectas como se ve en la imagen. Probé la mayoría de los otros pads de prueba y aún así no pude encontrar la lectura correcta, así que tuve que cambiar de estrategia.
Como no quedaban conectores en la placa ni pads de prueba útiles, decidí ir a la fuente, conectándome a los pines del procesador y obteniendo una shell UART de esa manera. Descargué la hoja de datos de ese procesador e identifiqué los pines del protocolo UART.

Ahora solo necesitamos encontrar tierra en la placa y conectar:
Usé algunas sondas PCBite y un adaptador USB a TTL para esta configuración.

Ahora podemos usar picocom para obtener la shell UART que buscamos.
sudo picocom -b 115200 /dev/ttyUSB0
Si no se hace nada, solo obtengo los registros de arranque y ninguna shell al final del proceso de arranque, así que tuve que interrumpir U-Boot presionando Enter inmediatamente.
Al obtener una shell de U-Boot, primero imprimí los argumentos del entorno.
Las cosas importantes para nosotros son:
Para obtener un acceso root rápido, puedo usar el truco de cambiar el comando init con setenv para obtener una shell en lugar de ejecutar el binario linuxrc. Luego puedo cargar la memoria manualmente y arrancar el dispositivo (esencialmente copiando el comando bootcmd).
Ahora, cuando termine el arranque, seré enviado a una shell temprana sin prácticamente nada ejecutándose en el sistema, así que ejecutaré el binario original linuxrc en segundo plano y comprobaré si hay puertos abiertos en este sistema.
¡Sin suerte! La cámara solo habla con su nube en "47.237.75.249", sin interfaz web expuesta para experimentar.
Dado que la ingeniería inversa del binario de comunicación en la nube está fuera del alcance de mi investigación, aquí es donde decidí finalizar mi investigación :)
Un extra para quienes estén interesados en jugar con el firmware: aquí se explica cómo obtenerlo.
Misma configuración que antes con la UART, pero esta vez solo sondeando y cargando la memoria desde la flash a la RAM sin arrancar en ella.
Luego puedes imprimir los datos desde la memoria RAM y grabar la salida de tu terminal (esta vez con minicom) para guardarla en un archivo, limpiarla un poco con Python y obtener el firmware. Emparejar binwalk y bootargs ayuda a nombrar cada sección.
