¿Qué tal mis queridos lectores ? Hace muchísimo tiempo que no escribo nada (tampoco es que sirva para mucho … ¿o sí? en fin) y visto lo que sucedió la última vez –que por si no lo recuerdan– liberé de forma didactica el proceso de creación de claves por defecto de los routers comtrend para movistar y jazztel (WLAN_XXXX) dando así como resultado una proliferación masiva de aplicaciones para “robar wifi al vecino” conectarse a internet everywhere (gracias por mencionarme en todas ellas), he decidido volver con algo igual de didáctico pero menos apetitoso, o no…
Como consecuencia de lo anteriormente comentado, los nuevos routers que se han ido instalando han cambiado sutancialmente la forma de generar la clave por defecto de la red wifi, y en concreto vamos a hablar de lo que ha caido en mis manos, un AW4062 fántastico oye. Por si alguien anda perdido “esos que tiene la mac 001915”.

He de decir que esta vez se han lucido un poco más, he tenido primero que lidiar con el firmware, ya que a primera vista no encontraba ningún bug para acceder a una shell mediante su “cli” (command line interface) pero vayamos por partes.
Este cacharro está basado en linux, como viene siendo de costumbre, en concreto :
Booting
Press ‘ESC’ to enter BOOT console…
Using Int. PHY
Decompress file… ok!
Linux version 2.6.19 (root@hp.tecom.intra) (gcc version 3.2.3-1.2.8) #475 Mon Apr 19 15:35:31 CST 2010
CPU revision is: 0000ff00
Blabla…
Llava un puerto serie interno, que es clave para investigar un poco con él. Lo descubrí al “brickearlo” mientras buscaba la intefaz JTAG ya que jugando con el firmware me lo cargé momentaneamente. Con un MAX232 y unos condensadores puedes conectarlo al puerto serie. Velocidad 115200 bps 🙂
El firmware se compone de 3 partes, cabezera, sistema de ficheros y kernel. Utiliza squashfs y lzma para el rootfs y el kernel respectivamente. La cabezera es de 64bytes y guarda información y hasta aquí voy a leer…
Una vez extraido el sistema de ficheros, podemos jugar con los ejecutables, incluso emularlos con qemu-mips pero lo más indicado es prepararse un toolchain para mips y tirar de gdb.
Pero para poder meterle “cosas” al router necesitamos poder generar nuestro propio firmware. Es aquí donde empieza mi investigación, veamos la cabezera.
Los primeros 64 bytes son la cabezera en la que se codifican varios datos importantes y a continuación comienza la signatura para el sistema de archivos squashfs.
El sistema de archivos contiene esta estructura:
bin/ dev/ etc/ home/ lib/ mnt@ proc/ sbin@ sys/ tmp@ usr/ var/
dev,mnt,proc,sys,tmp y var son creados en caliente y es donde los datos que nos pueden interesar están, luego no es muy útil el firmware por si solo, tampoco nos valen las emulaciones, por lo que hay que buscar la forma de acceder al router mendiante shell.
Además por si fuera poco, el contenido de bin es escaso, sobre todo si quieres realizar un dumpeo de la memoría ram, o del propio rtl8671hb o memoría ram.
CreatexmlConfig configd ifconfig mpoad startup LoadxmlConfig cp igmpproxy msh tc ShowStatus cpu inetd netlogger telnetd UDPserver cwmpClient init ps tftpd [ dnsmasq iptables qc traceroute adslctrl ebtables iptables-batch reboot udhcpc arp echo iwcontrol rm udhcpd auth ethctl iwpriv route udpechoserver bash@ expr kill routed updatedd boa flash login sarctl updateddctrl brctl flatfsd ls sh vsntp busybox ftp mini_upnpd slogd wdg cat ftpd mkdir snmpd wpa_default catch help mount spppctl wscd cli httpd mpoactl spppd
También tiré de strings y en efecto, dio buenos resultado, pero no tan fáciles como con los comtrend. Así pues, si quería investigar en consecuencia primero tendría que modificar el firmware de router, para ello he creado un pequeño set de utilidades que me permiten extraer de un firmware todo, modificarlo y volverlo a empaquetar, mirad:

He tenido que modificar las utiliades de squashfs (con soporte lzma) y además con ayuda de ingeniería inversa, la consola serie, e IDA ver cómo está implementando el checksum en el firmware para crear un “joiner” que une los binarios del sistema de archivos squash y el kernel y le añade la cabezera y el checksum calculado.

et voilá, firmware creado y listo para meter al router. Veamos más del router. Este utiliza un fastidioso “cli” que he intentado reventar buscarle fallos y como a los treinta minutos no salía nada, desistí. Por otro lado implementa un sistema de identificación que guarda los datos en /var/passwd pero como comenté antes, todo esto lo hace en caliente. Tampoco sirve de mucho buscarle fallos al cli ya que de todas maneras tienes que modificar el sistema de archivos para poder debuggear correctamente. Pero bueno esto es bastante subjetivo, hay caminos para todo.
¿Pero dónde está el dichoso algoritmo?
En este punto que ya nos encontramos es cuando empieza realmente la búsqueda del algoritmo que genera la clave. Por el momento no voy a contar nada más, ha sido suficiente y como conclusión y pistas, os diré que no es fácil, usa dos algoritmos encadenados y por lo que apuntan mis indicios, la entrada a dicha primera función no es la mac ni nada fácil de obtener, es un número de serie único que por el momento no voy a decir cómo obtenerlo, no es fácil. Ahora me falta probarlo todo, por que mi segundo indicio es que las funciones que generan dicha contraseña son funciones con particularidades, es decir, que no devuelven la misma salida que puede devolver en una versión estandad del algoritmo.
Tengo que seguir debuggeando entre gdb e IDA, y gracias que esta vez no sea tan fácil para todos, quien quiera algo que se lo curre.
Os dejo regalos
http://pastebin.com/7fVsXNyg el dmesg
Firmware mayberoot -> Este es mi firmware modificado, con acceso a root, la contraseña la tenéis que adivinar vosotros 😛 por cierto, de nada vale descomprimirlo, hay que cargarlo en el router. http://192.168.1.1/elve.html para saber si se ha cargado bien.

Saludos y hasta la próxima!
P.D: Me alegro mucho de contar un blog que alguien pueda leer sin recurrir a foros que serían como telecinco es a la televisión.