jueves, 4 de junio de 2015

Analizando livebox



De un tiempo cada vez es más normal ver cómo los routers que nos regalan (alquilan) nuestros ISPs vienen con menos opciones de configuración. Para algunas personas que no se limitan a enchufar el router y navegar por internet, sino que tienen configuraciones de red algo más curradas esto es bastante molesto. Y es incluso irritante cuando podemos comprobar que esos routers que nos limitan tienen multitud de opciones que podrían ser aprovechadas. Y el problema ya es sangrante cuando comprobamos que además de caparnos opciones de configuración, nos impiden ver datos como nuestro propio usuario/password SIP, haciéndonos depender de su hardware para mantener nuestra línea de voz.


Algunos diréis que lo más simple es poner nuestro propio router a continuación del que nos ofrece nuestro ISP. Así tenemos control sobre nuestra red, podemos dejar que los teléfonos sean gestionados por el router del ISP, y lo demás corre de nuestra cuenta. Y seguramente eso sea lo más inteligente. Pero a los que nos gusta complicarnos la vida todas esas limitaciones nos despiertan el "y esto cómo funciona?" que llevamos dentro. Y a algunos nos da hasta por escribir un artículo en un blog. Al lío:


Obtención del volcado de la memoria:El primer paso cuando se "juega" con routers suele ser obtener el firmware. Para ello se nos pueden ocurrir varios métodos:
Obtener una actualización.
Descargarlo vía página de administración.
...
Hacer un volcado de la memoria del propio router usando métodos "hardware".
En nuestro caso, a priori, no se ve ninguna forma de volcar el firmware usando el software del propio router. Y por descontado, no vamos a poder obtenerlo de ninguna actualización colgada en la web de Orange porque ya hemos visto lo "celosos" que son de sus interioridades. Así que cogemos el adaptador TTL-USB y nos damos un paseo por el wiki de OpenWRT a ver si encontramos el puerto serie del cacharro. Afortunadamente vemos que sólo hacen falta tres puntos de soldadura y ya estamos delante de la consola:




Una vez aquí, voy a explicar el proceso del volcado de la memoria.

Gracias de nuevo a espeltron tenemos pass del boot original: Oh!123Go

Versión unificada de u-boot para versiones R01 y R02.

Soporte en trunk de Openwrt.

Soporte VDSL gracias a espeltron:

copiamos el fichero vdsl.bin en /lib/firmware , conectamos la línea y hacemos:


Código:
/etc/init.d/dsl_control stop
/etc/init.d/dsl_control start
/etc/init.d/dsl_control status
Estado actual

Soporte de OpenWrt total, salvo el Wifi y puertos de teléfono.

Es importante entender que el boot esta dividido en dos: uno tuneado que se empeña en arrancar el firmware original siempre y esta protegido por contraseña. Lesgar consiguió saltar esta protección y acceder a la consola de comandos con el procedimiento descrito más abajo.

Una vez ahí accederemos al segundo uboot, desde donde vamos a arrancar imágenes en RAM y desde probar o flashear OpenWrt definitivamente.

También podemos directamente habilitar el modo UART, subir un uboot que corre en RAM y desde ahí flashear un uboot definitivo. En este punto podremos utilizar toda la flash del router, respetando la última partición de configuración.

Finalmente parece que el método más cómodo consiste en hacer corto en la flash, y desde el mismo boot original flashear en su lugar el u-boot nuevo, enviado mediante Xmodem.

Hardware

Todo está contenido en la wiki de OpenWrt:

http://wiki.openwrt.org/toh/arcadyan/arv7519

Atención: no conectar el punto VCC al adaptador TTL-USB dado que no es necesario y se ha comprobado que el router deja de funcionar.

Si alguien quiere poner todo en castellano, bienvenido sea.


Lo importante

Existen dos versiones R01 y R02 que podemos verificar en el arranque o bien mirando la etiqueta bajo el router. Debemos escoger el firmware adecuado. Si no usamos el u-boot o fw adecudado, los puertos ethernet no funcionan.

Es imprescindible soldar el puerto serial. Podemos hacerlo con cables y un soldador de 25W o bien poner pines.

En la wiki tenemos los pines y su correspondencia.


Nuevo manual hecho por Lesgar:

1-Backup
Copiamos el passsword del boot original: Oh!123Go
Arrancamos el router pulsamos tres veces la barra espaciadora
Pegamos la pasword
Accedemos al modo administrador pulsando "!"

Código:
[VR9 Boot]:!
Enter Administrator Mode ! En el [VR9 Boot] pones lo siguiente:
"H"
Y modificas el boot options de FE-FF-FF-FF-FF-FF o FF-FF-FF-FF-FF-FF a:
"FF-00-00-00-00-00"

Pones "linux image" con:
"2"

Reinicias con:
"Y"
Solamente hay que pulsar la tecla J.
De esta forma tendremos un backup 100% original que arrancará por si solo con el firmware de Orange.

Código:
VR9 Boot]:j

Ready to run firmware


U-Boot 2010.06-LANTIQ-v-2.0.26-dirty (Jul 25 2011 - 09:16:19)

CLOCK CPU 500M RAM 250M
DRAM: 128 MiB
Flash: 32 MiB
In: serial
Out: serial
Err: serial
Net: fw_addr=0xa0200000
Internal phy(FE) firmware version: 0x8200
vr9 Switch

Type "run flash_nfs" to mount root filesystem over NFS

Hit any key to stop autoboot: 1
....
...
... Dentro de root@arcadyan haz esto:

Coloca una memoria USB formateada como FAT16 o FAT32. Yo he usado el puerto USB trasero, pero valdria igualmente el otro.
Realiza el backup de todo en menos de 1 minuto:

Código:
cat /dev/mtd0 > /tmp/usb/a1/mtd0.bin
sync
cat /dev/mtd1 > /tmp/usb/a1/mtd1.bin
sync
cat /dev/mtd2 > /tmp/usb/a1/mtd2.bin
sync
cat /dev/mtd3 > /tmp/usb/a1/mtd3.bin
sync
cat /dev/mtd4 > /tmp/usb/a1/mtd4.bin
sync
cat /dev/mtd5 > /tmp/usb/a1/mtd5.bin
sync
cat /dev/mtd6 > /tmp/usb/a1/mtd6.bin
sync
cat /dev/mtd7 > /tmp/usb/a1/mtd7.bin
sync
cat /dev/mtd8 > /tmp/usb/a1/mtd8.bin
sync
cat /dev/mtd9 > /tmp/usb/a1/mtd9.bin
sync
cat /dev/mtd0 > /tmp/usb/a1/mtd0a.bin
sync
cat /dev/mtd1 > /tmp/usb/a1/mtd1a.bin
sync
cat /dev/mtd2 > /tmp/usb/a1/mtd2a.bin
sync
cat /dev/mtd3 > /tmp/usb/a1/mtd3a.bin
sync
cat /dev/mtd4 > /tmp/usb/a1/mtd4a.bin
sync
cat /dev/mtd5 > /tmp/usb/a1/mtd5a.bin
sync
cat /dev/mtd6 > /tmp/usb/a1/mtd6a.bin
sync
cat /dev/mtd7 > /tmp/usb/a1/mtd7a.bin
sync
cat /dev/mtd8 > /tmp/usb/a1/mtd8a.bin
sync
cat /dev/mtd9 > /tmp/usb/a1/mtd9a.bin
sync
Desmontas la unidad USB:


Código:
umount /tmp/usb/a1
Conjectamos el usb al pc y verificamos que se haya copiado bien con un md5sum


Código:
md5sum mtd*
85d71f2f2853cd946b3b11f74286e6c7 mtd0.bin
85d71f2f2853cd946b3b11f74286e6c7 mtd0a.bin
dbc706a9561a93bb1f199f4af9608be3 mtd1a.bin
dbc706a9561a93bb1f199f4af9608be3 mtd1.bin
35e99851d54769f14554603551c4a97c mtd2a.bin
35e99851d54769f14554603551c4a97c mtd2.bin
16a2b702e0f607f2c667592d5f653885 mtd3a.bin
16a2b702e0f607f2c667592d5f653885 mtd3.bin
2261435b7db30104108bf17e14c85b6b mtd4a.bin
2261435b7db30104108bf17e14c85b6b mtd4.bin
4531703a2c0c1f217906e94e293c9f2b mtd5a.bin
4531703a2c0c1f217906e94e293c9f2b mtd5.bin
3e159f50c18d679155c44a62fa6142d8 mtd6a.bin
3e159f50c18d679155c44a62fa6142d8 mtd6.bin
fe95326845fc89fce42a2303a8372712 mtd7a.bin
fe95326845fc89fce42a2303a8372712 mtd7.bin
42be09fa44e3ba8cd9be771817ea89c5 mtd8a.bin
42be09fa44e3ba8cd9be771817ea89c5 mtd8.bin
79309eb3491945f91092fc9612aa139a mtd9a.bin
79309eb3491945f91092fc9612aa139a mtd9.bin
Montar Imagen


Código:
cat mtd0.bin mtd1.bin mtd2.bin mtd3.bin mtd4.bin mtd5.bin mtd6.bin mtd7.bin mtd8.bin mtd9.bin > dump.bin
El comando para hacer eso en Windows sería


Código:
copy /b mtd0.bin+mtd1.bin+mtd2.bin+mtd3.bin+mtd4.bin+mtd5.bin+mtd6.bin+mtd7.bin+mtd8.bin+mtd9.bin dump.bin
copy /b hace las concatenaciones en modo binario sin traducir caracteres pero hay un error en el retorno del carro que genera imagenes mas grandes.

2-Instalacion

Copiamos el passsword del boot original: Oh!123Go
Arrancamos el router pulsamos tres veces la barra espaciadora
Pegamos la pasword
Accedemos al modo administrador pulsando "!"

Código:
[VR9 Boot]:!
Enter Administrator Mode ! Pulsamos "U" para cargar el uboot

Código:
[VR9 Boot]:U
UPLOAD Flash
---------------------------------------
Area Address Length
---------------------------------------
[0] Boot 0xB0000000 512K
[1] Image 0 0xB1280000 6144K
[2] Image 1 0xB1880000 6144K
[3] Configuration 0xB1E80000 1024K
[4] Boot Parameters 0xB1F80000 256K
[5] Flash Image 0xB0000000 32768K
[6] Linux Image 0xB0080000 24576K
[7] Emergency Value 0xB1FC0000 2883584K
---------------------------------------
Enter area to UPLOAD: 0
Upload area 0. Are you sure? (Y/n) Pulsamos "Y" y mandamos por X-modem la imagen de uboot

2.-Instalación de OpenWrt desde u-boot modificado

Muy sencillo; definimos dos nuevas macros y las hacemos permanentes en u-boot con:

Código:
setenv write-openwrt 'tftpboot openwrt-lantiq-xrx200-ARV7519RWV1[color=red]X-[/color]squashfs.image && protect off 0xB0080000 +$filesize && erase 0xB0080000 +$filesize && cp.b $fileaddr 0xB0080000 $filesize'
setenv kernel_addr 0xB0080000
saveenv
(cambiamos la X por la versión de nuestro router).

Al final del post se añade como configura el tftp

Ejecutamos la macro: run write-openwrt,


Código:
arv7519rw # run write-openwrt
ltq_phy: addr 0, link 0, speed 10, duplex 0
ltq_phy: addr 17, link 0, speed 10, duplex 0
ltq_phy: addr 19, link 1, speed 100, duplex 1
Using ltq-eth device
TFTP from server 192.168.1.100; our IP address is 192.168.1.1
Filename 'openwrt-lantiq-xrx200-ARV7519RWV11-squashfs.image'.
Load address: 0x81000000
Loading: #################################################################
#################################################################
#################################################################
########################################################
5 MiB/s
done
Bytes transferred = 3670020 (380004 hex)
............................. done
Un-Protected 29 sectors

............................. done
Erased 29 sectors
Copy to Flash... 10....9....8....7....6....5....4....3....2....1....done
arv7519rw # reset

Crear un servidor TFTP

Si usas windows, el tftpd32 es un servidor que instalas en windows.
http://tftpd32.jounin.net/
http://tftpd32.jounin.net/tftpd32_download.html
Selecciona el programa de instalacion que mejor te convenga y permite el acceso a traves del firewall cuando te lo indique.

Este servidor es muy facil de configurar, solo tienes que indicarle la tarjeta de red que va a usar mediante la IP que tenga asignada.
Le indicas la carpeta que vas a utilizar para compartir (descargar o subir archivos), que normalmente puede estar dentro de la ruta donde se instala el programa.

Cuando activas el servidor tftpd cualquier equipo conectado a tu red puede subir o descargar archivos que tengas compartidos en esa carpeta, mediante el protocolo tftpd y la IP de esa tarjeta de red.
Para que esto funcione la IP de la tarjeta de red tiene que ser la adecuada, segun cada aplicacion en concreto.
Por ejemplo podria ser requisito que la IP fuera: 192.168.1.100, o la que tuviera el uboot fijada como IP del servidor tftpd.

Aunque se pueda usar el protocolo Xmodem muchos uboot con loady suelen utilizar el Ymodem. Prueba a usar el protocolo Ymodem con el hiperterminal de windows. Pero estos procedimientos son muchiiiiiiiiisimo mas lentos. Creo que solo deberían usarse en caso de emergencia.

Volver al estado de fábrica

Encendemos el router:

Código:
ROM VER: ��!D

U-Boot 2014.01-openwrt2-dirty (Apr 27 2014 - 15:57:36) arv7519rw

Board: Arcadyan ARV7519RW
SoC: Lantiq VRX288 v1.1
CPU: 500 MHz
IO: 250 MHz
BUS: 250 MHz
BOOT: NOR
DRAM: 64 MiB
Flash: 32 MiB
In: serial
Out: serial
Err: serial
Net: ltq-eth
Hit any key to stop autoboot:
Pulsamos una tecla y una vez hemos accedido al prompt tecleamos tftpboot dump.bin. Estamos cargando por tftp el backup de la flash (que previamente has sacado de TU flash) en la ram del router

Código:
arv7519rw # tftpboot dump.bin

ltq_phy: addr 0, link 0, speed 10, duplex 0
ltq_phy: addr 17, link 0, speed 10, duplex 0
ltq_phy: addr 18, link 0, speed 10, duplex 0
ltq_phy: addr 19, link 1, speed 100, duplex 1
ltq_phy: addr 20, link 0, speed 10, duplex 0
Using ltq-eth device
TFTP from server 192.168.1.2; our IP address is 192.168.1.1
Filename 'dump.bin'.
Load address: 0x81000000
Loading: * #######################################################
#################################################################
[...]
#################################################################
#################################################################
###########
2.5 MiB/s
done
Bytes transferred = 33554432 (2000000 hex)

Ahora solo falta grabar,en la flash del router, lo que hemos subido a la ram. Tecleamos run write-uboot-nor

Código:
arv7519rw # run write-uboot-nor
Un-Protected 256 sectors

................................. done
Erased 256 sectors
Copy to Flash... 10....9....8....7....6....5....4....3....2....1....doneCuando haya terminado solo faltaría resetear el router. Tecleamos reset

Código:
arv7519rw # reset

ROM VER: 1®
ROM VER: 1.0.5
CFG 01
Tuning DDR begin
DDR Access auto data-eye tuning Rev 0.3a
DDR size from 0xa0000000 - 0xa7ffffff
DDR check ok... start booting...




=======================================================================
Wireless ADSL IAD VR9 Loader v0.70.01 build Mar 26 2012 13:36:53
Arcadyan Technology Corporation
=======================================================================
A1x VR9
0xbe22ff1c : 70240000
0xBf203014 : 70240000
MXIC MX29GL256EL top boot 16-bit mode found

Copying boot params.....DONE

Enter command mode ...
Get Primary to 0.....
Image Check from FLASH_AREA_IMAGE_0 : Passed.
Recordar que si para hacer el backup habeis cambiado algo en el brnboot, hay que dejarlo como estaba al principio.
Nota: para que arranque por defecto sea el fimware de orange hay que teclear 3 en el prompt del vrboot.

Código:
[VR9 Boot]:3

Set to Supertask image done
Métodos de emergencia
Activar UART

"Precauciones iniciales del ARV7519RW22 y casos catastroficos"
erase Flash
conectar vcc
NUNCA conecteis el pin VCC con adaptadores serial USB, ya que no lo necesita y es peligroso.
Modo UART
Usar resistencias
Creditos:
Pteridium, Gmtii, Espeltron, www-www, jmcabgam y alguno más que seguro se me olvida


Configurar los parámetros de uboot después de haberlo flasheado
Podéis configurar las IPs del servidor y del router en el uboot como os dé la gana, pero la MAC es conveniente que la cojáis de la etiqueta que lleva el router.

Código:
setenv ipaddr 192.168.1.3
setenv serverip 192.168.1.2
setenv ethaddr 88:03:55:XX:XX:XX
saveenv
Reflashear el uboot

Código:
tftpboot u-boot.bin
write-uboot-nor
Iniciar una imagen initramfs desde uboot
Para arrancar la imagen initramfs es necesario que modifiquéis las direcciones IP y la MAC tal y como aparece descrito en este mismo post.

Código:
tftpboot openwrt-lantiq-xway-ARV7519RWV1x-uImage-initramfs
bootm
Flashear una imagen squashfs desde uboot
Para arrancar la imagen initramfs es necesario que modifiquéis las direcciones IP y la MAC tal y como aparece descrito en este mismo post.

Código:
tftp openwrt-lantiq-xway-ARV7519RWV1x-squashfs.image
erase B0080000 +$filesize
cp.b 81000000 B0080000 $filesize

Descargas

uboot-lantiq-2013_10-arv7519rw22
Firmwares OpenWrt para R01 y R02


 este router. Básicamente se hace una copia de todas las áreas de memoria, confiando en que más adelante sepamos qué es cada una de ellas.



Extracción del firmware:


Lo habitual al obtener un volcado de memoria del firmware es pasarle el binwalk para extraer los contenidos. En imágenes sin ofuscación o sin cifrado suele dar buenos resultados, pero desgraciadamente cada vez más los fabricantes usan métodos de ocultación para evitar que "curiosos" metan mano. Éste es el caso del Livebox, así que empecé a buscar cadenas que aparecían en el log de arranque, por si otros routers implementasen el mismo mecanismo, y entre toda la información que encontré estaba esta fantástica página de Stefan Viehböck.


En nuestro caso el firmware se encuentra en mtd5, aunque para encontrarlo hay que rebuscar un poco (me tocó buscar en el volcado de memoria por todas las secuencias de bytes "sospechosas" que Stefan comenta en su post: 0x32547698, 0xFFFFFFFF0xFFFFFFFF, 0x78563412...). Los "magic bytes" no son exactamente iguales (en este caso la primera sección del firmware comienza por "04 05 11 20", por ejemplo) pero la estructura de las secciones es mas o menos la misma que la mostrada en el post. Y gracias al programa del post somos capaces de tener por fin un fichero LZMA que, descomprimido, nos da lo que andábamos buscando.


Una vez desempaquetado el firmware, toca sesión de ensamblador en MIPS (toda una experiencia no siempre agradable). Con dirección de carga 0x80002000, $gp=0x80A64120 y gracias al script de Stephen que podéis encontrar aquí tenemos una imagen lista para empezar a analizar. En mi caso estuve varios días "adecentando" el resultado, sobre todo buscando secuencias de bytes que hiciesen referencia a offsets, lo que fue relativamente sencillo (en cuanto veía un 0x80?????? en el desensamblado probaba a visualizarlo como un offset) pero muy muy muy tedioso ("Pues haber hecho un script!" diréis, con toda la razón), pero que me sirvió para hacer una toma de contacto con lo que tenía entre manos.


OJO: Todas las direcciones de memoria a las que hago referencia a partir de este punto se refieren al firmware versión 00.96.315 (el último hasta el momento)


Bueno, pues ya tenemos material para buscar cosas interesantes. Lo primero que intenté comprender era el proceso de desempaquetado del firmware porque, como bien decía Stephen en su post, está compuesto por varias secciones y nosotros de momento sólo tenemos una. El proceso de desempaquetado se encuentra en la dirección 0x800C68E4 y realiza varias funciones. Las más importantes son:
Comprueba que el tamaño del fichero esté entre 0x1B7740 y 0x600000 bytes.
Comprueba si la imágen viene con CRC32 asociado.
Recorre las secciones del fichero y por cada una va comprobando el "signature" y las va desempaquetando.
Estudiar esta función también nos sirve para darnos cuenta de algunas cosas importantes a la hora de extraer el firmware completo:

Cuál es el la marca de fin de fichero de firmware (recordad que hasta ahora lo único que teníamos era el principio del firmware ofuscado dentro de mtd5, ahora sabemos que el firmware termina con "BRNOSPPH1"+0x00).
Cómo calcular el CRC32 de la imágen completa (con el último campo CRC32 a 0xFFFFFFFF se calcula el CRC y se sustituye 0xFFFFFFFF por el CRC32 calculado).
Si el CRC32 de la imágen es 0xFFFFFFFF no se comprueba: 











Las distintas secciones están alineadas a 1024 bytes (para posicionarse al final del fichero, se hace file_size & 0x3FF, que es equivalente a file_size % 1024. Los bytes resultantes, que son "BRNOSPPH1"+0x00, los descarta).
Qué tipos de ficheros podemos encontrarnos en cada subsección:




Con esta información podemos hacernos una idea detallada de la estructura del fichero de firmware, y tenemos un punto de partida para crear un programa (lo encontraréis en la sección de herramientas de este artículo) para desempaquetar el firmware completo. La estructura y el contenido de las secciones del fichero son:






Tenemos el primer bloque, que es el que ya teníamos desempaquetado, donde se encuentra el firmware que estamos analizando. En los tres bloques posteriores tenemos el sistema de ficheros, empaquetado en formato PFS. Y los dos últimos bloques contienen lo que creo que es (en base a los logs de consola) el firmware de VSDL2 y el firmware DSP.


El fichero de configuración:


Teniendo el firmware completamente desempaquetado lo siguiente que me picaba la curiosidad era el fichero de configuración del router. Mediante la página de administración del Livebox es posible descargar una copia de seguridad de la configuración actual. Pero cuando nos descargamos esa copia de seguridad, tan sólo podemos ver bytes sin sentido aparente: ni una sola cadena, ni una sola secuencia de bytes "sospechosa", sin padding por ningún lado... Todo apunta a que está cifrado. Y si se toman la molestia de cifrarlo, puede que tenga algo interesante.


Soy perezoso. Y lo sé. Y antes de meterme a buscar las rutinas de cifrado/descifrado del fichero de configuración en el firmware, y teniendo en cuenta que el algoritmo de ofuscación del firmware era un refrito de otro modelo de router, supuse que podrían haber hecho lo mismo con el algoritmo de cifrado del fichero de configuración. Y tras un rato buscando, el wiki de OpenWRT vino al rescate de nuevo.


Los magic numbers, de nuevo, varían de un modelo a otro. Pero lo importante es que ya tenemos el algoritmo de cifrado (AES) y las claves. Después de ajustar el programa de descifrado a los valores del LiveBox, tenemos el fichero de configuración descifrado y un montón de datos entre los que podemos encontrar usuarios, passwords, datos de configuración del SIP, de proveedores DNS dinámicos, configuración interna de Orange... y al final del fichero tenemos otro misterioso chorro de bytes sin sentido.


Más adelante entraremos en qué es cada cosa dentro del fichero de configuración, pero por el momento quise centrarme en qué había detrás de esos bytes. Esta vez Google no dio resultado, el programa al que hacia referencia el wiki de OpenWRT se quedaba en el descifrado de la primera "capa" del fichero y no supe encontrar ninguna mención a esa segunda sección sin descifrar. Así que me tocó darme un paseo por el código del firmware.


La rutina que se encarga de la creación del fichero de configuración está en la posición 0x80337458. En general se encarga de darle a los datos de configuración la forma correcta y cifrarlos con AES, una clave y un IV. Al tener el programa de descifrado me puse a buscar dónde estaban usándose las claves que aparecían en él para, a partir de ahí, identificar la función encargada de cifrar y ver si se usaba en otros sitios, pero no tuve suerte. Las claves puestas "a fuego" en el programa al que hacía referencia la wiki de OpenWRT no aparecían por ningún lado. Y prestando más atención a nuestra función podemos ver por qué.


Una de las funciones llamadas desde la función principal tiene esta pinta (offset 0x80336D40):






Así que lo que parece que hacen es crear las claves en ejecución para evitar meterlas "a fuego" en el firmware, usando una función de ofuscación que tiene esta pinta (offset 0x80336B4C):


Ahora ya sabemos de dónde han salido las misteriosas claves AES del programa de descifrado. Y también sabemos cuál es la rutina de cifrado en AES (se llama inmediatamente después de la preparación de las claves) y qué significan sus parámetros:
Offset 0x80344004
$a0 -> texto cifrado
$a1 -> tamaño del texto cifrado
$a2 -> buffer de salida
$a3 -> tamaño del buffer de salida
$t0 -> modo de funcionamiento (1 cifrar / 0 descifrar)
$t1 -> clave


Si buscamos otros puntos desde donde se llame a esta rutina, pasando $t0 = 0 (en modo descifrar), nos encontramos con otra función interesante en 0x8010E578.

Así que tenemos una función que llama a la rutina de cifrado en AES, en modo "descifrar", y que no llama a la función de preparación de claves AES sino que mete la clave directamente. Modificamos el programa de descifrado del fichero de configuración para descifrar la última sección con esta clave y el IV de su cabecera y ahí lo tenemos: última sección descifrada. En esta última sección tenemos la "piedra de Rosetta" para interpretar todo el fichero de configuración: ya podemos saber lo que significa cada uno de los bytes de nuestro fichero.


La estructura final del fichero de configuración la podéis ver en este esquema:






En el fichero de configuración tenemos varios datos interesantes:
Usuarios y contraseñas almacenados en el router.
Parámetros de configuración del funcionamiento del router, tanto a alto nivel como a bajo nivel.
Parámetros de configuración de la función TR-069 (esto lo veremos más adelante), incluyendo el servidor ACS de Orange y el usuario, la password y la URL del interfaz TR-069 de nuestro router (escuchando en el puerto 50805).
Parámetros de configuración del ftp para la descarga del firmware (desafortunadamente esto viene "heredado" del fabricante, seguramente para otro modelo, y no es el firmware de Orange)
Parámetros de configuración de un FTP de Orange al que el router envía datos de diagnóstico (también lo veremos más adelante).
Hay multitud de parámetros con los que jugar y "tunear" nuestro router sin tocar un pelo su firmware. Como comentaba al inicio del artículo (si todavía os acordáis) es muy molesto comprobar que estos routers, con multitud de opciones disponibles, vienen capados a la mínima expresión.


Por otra parte, esto también le será útil a los usuarios que, por el motivo que sea, quieren usar otro router manteniendo la línea de voz. Actualmente Orange se niega a dar los datos de configuración del servicio SIP de sus clientes (para este router en concreto, creo que pasa lo mismo con el resto), por lo que si quieres usar otro router te ves obligado a mantener el que te da Orange para gestionar la telefonía. Estoy seguro que algún motivo habrá pero no creo que sea por el interés de sus clientes. Con la posibilidad de descifrar el fichero de configuración, podemos recuperar todos los datos necesarios para usar el router que nos venga en gana y tener, por lo menos, la capacidad de elección que Orange nos niega.


Otras funciones interesantes en el firmware:


Analizando los strings del firmware vemos muchos mensajes interesantes que tienen relación con funcionalidades que en algunos casos están capadas, y en otros casos ocultas. Dando un paseo por el sistema de ficheros, que podemos analizar echando un vistazo a los ficheros PFS desempaquetados del fichero de firmware, nos encontramos con páginas ocultas como:
http:///usb_wftp_server.stm -> nos permite montar un servidor de ficheros vía web a través del puerto 8000.
http:///system_firmwarel.stm -> Una especialmente útil, ahora que sabemos cómo va el empaquetado del firmware, que nos permite actualizar el firmware del router vía web (necesita una password, que es la misma que la del acceso al bootloader: Oh!123Go . Conocida gracias espeltron de seguridadwireless por éste post).
http:///cgi-bin/config.bin -> Una interesante que nos da el fichero de configuración ya descifrado (excepto la última sección).
http:///get_getnetworkconf.cgi -> Otra muy graciosa que nos da la password WIFI sin necesidad de autenticación.
Seguramente haya más "joyitas" escondidas. Con el PFS extraído es cuestión de echarle tiempo.


En los strings también vemos mensajes como "Running Console Debug... !!!", que hacen que inmediatamente dejes todo lo que estés haciendo y te pongas a investigar. El mensaje en cuestión aparece en la función que empieza en la dirección 0x8011A53C,

Así que si "algo" es 0x29, se muestra ese mensaje. Y sabiendo que 0x29 corresponde al carácter ")", vale la pena probar a pulsar ")" en la consola.... para ver que no pasa nada. Aquí me tiré bastante tiempo analizando el firmware y preguntándome qué se necesitaba para que el mensaje apareciese, y siempre llegaba a la misma conclusión: pulsando ")". Hasta que me dio por buscar en el fichero de configuración y vi la variable "uart_rx_enabled", que estaba a 0. Al poner la variable a 1, cifrar el fichero de configuración y volverlo a cargar, pulsando ")" en el PuTTY...


Al activar la depuración por consola se nos abren otro buen montón de opciones. Pulsado ENTER nos aparece un menú con todo lo que podemos hacer:

Por ejemplo, el menú de sistema:





Y mención especial para el menú "FTP":


anteriormente comentaba que en el fichero de configuración estaba definido un FTP al que el router envía datos de configuración. Los parámetros de conexión los tenemos bajo la sección "infoReport", y son "defServerDom", "defPath", "defUsername" y "defPassword". Me había estado montando muchas películas sobre los datos que se enviaban, la verdad, pero modificando el fichero de configuración para poner vuestro propio servidor FTP y usando la opción "put system log" del menú FTP de la consola de depuración veréis que son datos asociados al router que supongo usará el servicio técnico en sus diagnósticos. Es cierto que hay datos sensibles como la password de WIFI, que por otra parte pueden sacar perfectamente vía TR-069, pero respiré aliviado al ver que mis visitas a youporn no aparecían.


Otro punto a investigar dentro del firmware son los CGIs "capados". Los CGIs en realidad están ahí (bueno, no exactamente CGIs, el LiveBox corre un RTOS llamado "SuperTask", con lo que en realidad todo forma parte del kernel), pero el punto de entrada a través del interfaz web ha sido retirado. Esto lo podemos solucionar modificando el PFS o haciendo algo más "imaginativo". El mapeo entre cada CGI y su correspondiente función lo encontramos a partir del offset 0x806DB1A4 del firmware:






Una manera de "descapar" esos CGIs sería modificando el firmware para hacer que un CGI accesible llame a la función que un CGI capado invocaría.


Y para terminar con las funciones interesantes del firmware, entre esos CGIs podemos encontrar referencias a uno llamado "get" y otro llamado "set". Si nos centramos en "get", que es implementado por la función definida en 0x80107D0C, vemos que acepta dos parámetros (son excluyentes): "param" y "object". Después de desenmarañar las distintas llamadas entre funciones y con ayuda de los mensajes de error del propio firmware, vemos que lo que espera el CGI son parámetros del protocolo TR-069. Y qué es esto del protocolo TR-069?, preguntaréis algunos. Es un protocolo orientado a controlar de forma remota a los routers que los ISPs tienen en las casas de sus clientes. De esta manera pueden leer y escribir parámetros de configuración desde su central. Gracias a este protocolo los ISPs son capaces de actualizar de forma silenciosa el firmware de nuestros routers y así no hacer que todos los usuarios (algunos sin demasiados conocimientos en informática) tengan que actualizarlo de forma manual, con sus consiguientes riesgos. Tener un "parque" de routers tan grande como tienen los ISPs, y encima cada uno con su versión de firmware, se puede convertir en una pesadilla a la hora de dar un servicio técnico. Tenéis información sobre el protocolo y los parámetros que acepta aquí. Ésto es lo que nos devuelve el router si invocamos a "get" con los parámetros adecuados. Por ejemplo:


http:///cgi-bin/get?param=InternetGatewayDevice.DeviceInfo


Nos da:



InternetGatewayDevice.DeviceInfo.Manufacturer = ARCADYAN
InternetGatewayDevice.DeviceInfo.ManufacturerOUI = XXXXXX
InternetGatewayDevice.DeviceInfo.ModelName = DSL Router
InternetGatewayDevice.DeviceInfo.Description = DSL Router
InternetGatewayDevice.DeviceInfo.ProductClass = Yabox
InternetGatewayDevice.DeviceInfo.SerialNumber = XXXXXXXXXX
InternetGatewayDevice.DeviceInfo.HardwareVersion = AR.7519.02
InternetGatewayDevice.DeviceInfo.SoftwareVersion = AR.00.96.315
InternetGatewayDevice.DeviceInfo.ModemFirmwareVersion = 5.4.1.10.1.1
InternetGatewayDevice.DeviceInfo.SpecVersion = 1.0
InternetGatewayDevice.DeviceInfo.ProvisioningCode = XXXXXXXXXXX
InternetGatewayDevice.DeviceInfo.UpTime = 4018
InternetGatewayDevice.DeviceInfo.FirstUseDate = 201X-XX-XXXXXXXXX
InternetGatewayDevice.DeviceInfo.DeviceLog =
InternetGatewayDevice.DeviceInfo.X_ORANGE-COM_ExternalIPAddress = 127.0.0.1
InternetGatewayDevice.DeviceInfo.X_ORANGE-COM_MACAddress = XXXXXXXXXXXXXX
InternetGatewayDevice.DeviceInfo.X_ORANGE-COM_RescueActive = 0

A partir de ahí, todo es ir probando con los distintos parámetros. Algunos interesantes son:

Datos SIP: http:///cgi-bin/get?param=InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.Line.1.SIP
Más datos SIP: http:///cgi-bin/get?param=InternetGatewayDevice.Services.VoiceService.1.VoiceProfile.1.SIP
Configuración de la WLAN: http:///cgi-bin/get?param=InternetGatewayDevice.LANDevice.1.WLANConfiguration.1.
Configuración del servidor ACS de Orange: http:///cgi-bin/get?param=InternetGatewayDevice.ManagementServer
Configuración ADSL: http:///cgi-bin/get?param=InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANPPPConnection.1
Como he comentado antes, el CGI admite los parámetros "param" y "object". Sustituyendo "param" por "object" en las urls anteriores el router os devolverá la información en formato XML. Puede ser útil si álguien se anima a codificar un interfaz para ver todo ésto de forma cómoda... y modificarlo de forma cómoda. Porque estamos hablando del CGI "get" pero si recordáis también existe el comando "set" que hace... bueno, creo que todos os imaginaréis lo que hace. Acepta como parámetro el nombre del parámetro TR69 a modificar y su valor. Por ejemplo:
http:///cgi-bin/set?InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.DNSServers=208.67.222.222


Como habréis visto, el interfaz TR-069 nos da la opción de hacer modificaciones en los parámetros de configuración del router sin tener que estar bajando el fichero de backup, descifrándolo, modificándolo, volviéndolo a cifrar y subiéndolo al router. El fichero de configuración tiene muchísimas mas opciones, pero para ciertas modificaciones éste último método es más cómodo.


Tengo pendiente el análisis de la generación de la clave WIFI por defecto, pero apostaría unas cañas a que puede ser parecido a esto que ya se comentó en SbD hace tiempo.


Ataques:


Hasta aquí hemos hecho un repaso del firmware y las funcionalidades del router, pero éste es un blog de seguridad

Sabemos que tenemos el router prácticamente bajo nuestro control: podemos modificar el fichero de configuración, podemos modificar el firmware, podemos modificar parámetros TR-069... pero necesitamos tener las credenciales. O esa es la teoría... Ante la reciente moda de poner nombres y bonitos logos a los bugs, no he querido ser menos y os vengo a presentar...


Volcado de Objetos de Memoria Interna Tras Overflow 



VÓMITO consiste en un fallo en el servidor web implementado por el router que provoca que, ante un desbordamiento de memoria, recibamos un volcado de la misma como respuesta a la petición. El PoC del ataque es sencillo:
echo `perl -e 'print "HEAD " . print "A"x135660'` | netcat -w 5 80 > vomito


En realidad en lugar de "HEAD" podéis poner "KTULU" mientras enviéis un número de bytes suficientemente grande (a mi el tamaño que me ha permitido sacar volcados mas grandes ha sido ese). Al terminar el volcado el router cascará, y en el fichero "vomito" tendremos unos 200MB del contenido de la memoria del router en el momento del ataque. No hace falta decir que en ese volcado podemos encontrarnos de todo. Y cuando digo de todo también me refiero a credenciales. Y entre todas esas credenciales tenemos las que nos dan acceso al interfaz web del router (y las de SIP, y las de correo si estuviesen definidas, y las de proveedores DNS dinámicos si estuviesen definidas...). Así que esta es la pieza que nos faltaba para poder entrar en el interfaz y, a partir de ahí, comenzar a jugar.


Ésto es interesante si nos encontramos en la red del router. Pero, qué pasa si estamos en Internet y queremos usar VÓMITO contra un LiveBox cualquiera? Desgraciadamente (o afortunadamente, que dirán algunos), he intentado provocar el VÓMITO remotamente de varias formas y la única en la que he tenido éxito ha sido con la opción de "Configuración Remota" activada. Al hacer esto exponemos el servidor web a Internet a través del puerto 8080 del router, y con él el fallo. Esto reduce drásticamente las opciones de explotación remota, pero alguno que otro se encuentra si se busca. En shodan podemos encontrar algunos de estos routers con el filtro:
port:8080 Apache "Content-length: 6187" org:"Orange Espana" para el firmware versión 00.96.217
port:8080 Apache "Content-length: 6210" org:"Orange Espana" para el firmware versión 00.96.315 (la más actual).
Aunque un simple escaneo escogiendo bien el rango de IPs basta para encontrarnos alguno que otro. En conjunto tenemos dos escenarios posibles:
Escenario "local", desde la red interna: Usar VÓMITO para extraer las credenciales de acceso, cambiar los datos de configuración mediante el interfaz oculto TR-069 o mediante fichero de configuración modificado (metiendo nuestro servidor DNS, por ejemplo), desactivar actualizaciones remotas (eliminando los parámetros del ACS de Orange, por ejemplo) y, si estamos con ganas, crear un firmware troyanizado y sustituir el legítimo con el nuestro.
Escenario "remoto": Únicamente si la configuración remota está activada (muy reducido).
Otros posibles escenarios de ataque remoto son el puerto 5060 (sip) y el puerto 50805 (puerto a través del cual se comunica el subsistema TR-069 del router con el ACS de Orange), pero de momento la investigación no ha dado frutos...


Tenemos la opción de no quedarnos simplemente en intentar explotar routers remotos. Al ser capaces de modificar el firmware, se hace posible (teóricamente al menos) la explotación del ACS mismo. En condiciones normales el router se comunica con el ACS mediante TR-069, se envían datos correctos y todo va como la seda. Si modificamos las respuestas del router podemos poner en un apuro al ACS si tiene algún fallo en el procesado. Podéis leer sobre el tema en esta charla de Shahar Tal en la Defcon y en este white paper de Check Point.



Herramientas:


A continuación  dejo un par de herramientas sobre las que hablaba al inicio del artículo junto a su correspondiente código fuente. Las herramientas están programadas en Java (lo siento, lo sé, en algún momento debí darme un golpe en la cabeza, de verdad que lo siento). Las podéis descargar aquí.


LiveBoxDecoder.jar
Esta herramienta descifra y cifra el fichero de configuración del LiveBox. En caso de descifrar, se le puede pasar un parámetro para generar un fichero con la última sección de la configuración (la que nos sirve para interpretar el resto) descifrada. En caso de que no se proporcione no la genera, no es necesaria para el re-cifrado del fichero de configuración, solo es útil para tener el listado de las variables que podemos modificar y saber sus offsets. El fichero con la última sección descifrada contiene una lista de parámetros con sus nombres, valores y posiciones dentro del fichero de configuración descifrado. Si, por ejemplo, queremos modificar el FTP al que el router manda el informe técnico:



java -jar LiveBoxDecoder.jar d config_dsl.bin offsets.txt
[*] Astoria Networks ARV7519RW22 (Orange LiveBox 2.1) configuration
[*] file decrypter. Decrypts/Encrypts LiveBox 2.1 configuration
[*] files, obtained via Web GUI backup option
[*] Re-encrypted config files can be uploaded to the router via Web GUI
[*] Start decrypting file....
[*] Decrypting header with:
[*] IV = 0x3a 0x2e 0x4f 0xe3 0x15 0xf1 0x43 0x1e 0x12 0x6f 0x43 0x51 0x12 0x7d 0x41 0xbf
[*] Key = 0x1d 0xe5 0xfa 0xb8 0x81 0x91 0x00 0x84 0x11 0xaf 0x53 0xdd 0xe4 0x89 0xea 0xfd
[*] Decrypting body with:
[*] IV = 0x00 0x25 0xe7 0x20 0x3f 0x7a 0xfa 0x25 0x44 0xb4 0x89 0x0a 0x25 0xa3 0xd3 0xd4
[*] Key = 0xa9 0xdc 0x0e 0xf0 0x28 0x67 0x91 0xac 0xc9 0x13 0x86 0x5d 0x2d 0xf8 0x20 0x99
[*] Done with file decryption
[*] Decrypting tail with:
[*] IV = 0x5e 0x1d 0xe0 0x76 0x19 0x0f 0x8c 0x71 0xe1 0x95 0xdc 0xa0 0x75 0x60 0xb9 0x9b
[*] Key = 0x12 0x34 0x56 0x78 0x90 0x12 0x34 0x56 0x78 0x90 0x12 0x34 0x56 0x78 0x90 0x12
[*] Done with tail decryption
Error processing element call_waiting
Error processing element clir
Error processing element call_hold
Error processing element three_pty
Error processing element cfu
Error processing element cfb
Error processing element cfnr
Error processing element enabled
Error processing element keypad
[*] Done



- Este comando creará dos ficheros: config_dsl_decoded.bin con la configuración descifrada, y offsets.txt con los datos para interpretar qué es cada valor y en qué offset está dentro del fichero de configuración descifrado. Buscamos la sección "infoReport" dentro del fichero de offsets. En este caso tenemos que "defServerDom" empieza en la posición 23468 del fichero de configuración. Modificamos el valor en config_dsl_decoded.bin, guardamos y creamos nuestro nuevo fichero de configuración modificado:


java -jar LiveBoxDecoder.jar e config_dsl_decoded.bin nueva_config.bin
[*] Astoria Networks ARV7519RW22 (Orange LiveBox 2.1) configuration
[*] file decrypter. Decrypts/Encrypts LiveBox 2.1 configuration
[*] files, obtained via Web GUI backup option
[*] Re-encrypted config files can be uploaded to the router via Web GUI
[*] Start encrypting file....
[*] Encrypting body with:
[*] IV = 0x00 0x25 0xe7 0x20 0x3f 0x7a 0xfa 0x25 0x44 0xb4 0x89 0x0a 0x25 0xa3 0xd3 0xd4
[*] Key = 0x1a 0xa8 0x80 0xb5 0x44 0x11 0xf1 0x19 0x0c 0xca 0x3d 0xe8 0x77 0x41 0x37 0x89
[*] Computed MD5: 0x17 0x3b 0xe9 0x04 0xe3 0x5f 0x0b 0x36 0x8a 0x3b 0x1e 0x98 0x16 0xf2 0xf3 0x05
[*] Encrypting header with:
[*] IV = 0x3a 0x2e 0x4f 0xe3 0x15 0xf1 0x43 0x1e 0x12 0x6f 0x43 0x51 0x12 0x7d 0x41 0xbf
[*] Key = 0x1d 0xe5 0xfa 0xb8 0x81 0x91 0x00 0x84 0x11 0xaf 0x53 0xdd 0xe4 0x89 0xea 0xfd
[*] Done


- El fichero resultante podemos subirlo al router mediante la opción Administración -> Configuración -> Restaurar la configuración del router.


FirmwareDecoder.jar
Esta herramienta desempaqueta y empaqueta el firmware del LiveBox. Para preparar el firmware:
- dumpear mtd5 del router
- Buscar por la cabecera de la primera sección (04 05 11 20)
- Copiar desde ahí hasta la última aparición de los bytes 78 56 34 12 (debe haber 6 apariciones) + otros 4 bytes para incluir también el CRC32, el resto se descarta.
- Añadir "BRNOSPPH1"+0x00 (42 52 4E 4F 53 50 50 48 31 00) al final del fichero (debería quedar algo como 78 56 34 12 XX XX XX XX 42 52 4E 4F 53 50 50 48 31 00).
- Con esto tenemos el firmware aislado y preparado. Para desempaquetar el firmware:


java -jar FirmwareDecoder.jar d mtd5

[*] Astoria Networks ARV7519RW22 (Orange LiveBox 2.1) firmware file decoder.
[*] Decodes LiveBox 2.1 firmware files, obtained via console dump.
[*] Thanks to Stefan Viehb÷ck for the initial deobfuscation method:
[*] https://sviehb.wordpress.com/2011/09/06/reverse-engineering-an-obfuscated-firmware-image-e01-unpacking/
[*] BRNOSPPH1 signature found
[*] Image size: 5089290 bytes
[*] Image CRC32: 0xff 0xff 0xff 0xff
[*] Obfuscated LZMA part found at offset 0
[*] Obfuscated LZMA part final position: 2416632
[*] Obfuscated LZMA part size: 2416306
[*] Block type: 0x00
[*] Obfuscated LZMA part DONE!
[*] Obfuscated LZMA part found at offset 2416640
[*] Obfuscated LZMA part final position: 3795960
[*] Obfuscated LZMA part size: 1378967
[*] Block type: 0x0a
[*] Obfuscated LZMA part DONE!
[*] Obfuscated LZMA part found at offset 3795968
[*] Obfuscated LZMA part final position: 4103160
[*] Obfuscated LZMA part size: 306515
[*] Block type: 0x0b
[*] Obfuscated LZMA part DONE!
[*] Obfuscated LZMA part found at offset 4103168
[*] Obfuscated LZMA part final position: 4375544
[*] Obfuscated LZMA part size: 271678
[*] Block type: 0x0c
[*] Obfuscated LZMA part DONE!
[*] LZMA part found at offset 4375552
[*] LZMA part final position: 4724728
[*] LZMA part size: 348593
[*] Block type: 0x32
[*] LZMA part DONE!
[*] LZMA part found at offset 4724736
[*] LZMA part final position: 5089272
[*] LZMA part size: 363500
[*] Block type: 0x5a
[*] LZMA part DONE!
[*] Firmware extraction finished.
[*] DO NOT CHANGE PRODUCED FILE NAMES IF YOU WANT TO USE THEM TO CREATE A NEW FIRMWARE!!


- En el nuevo directorio "extracted" tenéis el firmware desempaquetado. Ahora podéis modificarlo y volver a empaquetar los ficheros del directorio "extracted" usando:



java -jar FirmwareDecoder.jar e new_mtd5
[*] Astoria Networks ARV7519RW22 (Orange LiveBox 2.1) firmware file decoder.
[*] Decodes LiveBox 2.1 firmware files, obtained via console dump.
[*] Thanks to Stefan Viehb÷ck for the initial deobfuscation method:
[*] https://sviehb.wordpress.com/2011/09/06/reverse-engineering-an-obfuscated-firmware-image-e01-unpacking/
[*] Processing: 0-2416632.0x00.obfuscated.part...
[*] File Offset: 0
[*] File footer offset: 2416632
[*] Calculated CRC32: 05a592e2
[*] Processing: 2416640-3795960.0x0a.obfuscated.part...
[*] File Offset: 2416640
[*] File footer offset: 3795960
[*] Calculated CRC32: 1cb46a53
[*] Processing: 3795968-4103160.0x0b.obfuscated.part...
[*] File Offset: 3795968
[*] File footer offset: 4103160
[*] Calculated CRC32: 0ff7c372
[*] Processing: 4103168-4375544.0x0c.obfuscated.part...
[*] File Offset: 4103168
[*] File footer offset: 4375544
[*] Calculated CRC32: 8583d2dd
[*] Processing: 4375552-4724728.0x32.lzma.part...
[*] File Offset: 4375552 [*] File footer offset: 4724728
[*] Calculated CRC32: 0d0335e5
[*] Processing: 4724736-5089272.0x5a.lzma.part...
[*] File Offset: 4724736
[*] File footer offset: 5089272
[*] Calculated CRC32: 7dfd186a
[*] Firmware packing done. Now you can upload the new firmware image
[*] using the hidden page http:///system_firmwarel.stm
[*] Password: Oh!123Go



- Y ya se puede cargar en el router usando la página oculta http:///system_firmwarel.stm y la password "Oh!123Go" en el cuadro de texto de la página.


OJOCUIDADO: Puedes cargarte el router. Si vas a trastear con el firmware te recomiendo hacer antes una copia de seguridad de los contenidos de la memoria para poder restaurarlo luego en caso de catástrofe. La herramienta que proporciono puede fallar. en caso de no tener copia de seguridad, adiós router.


Como pueden comprobar, me he apoyado bastante en trabajos hechos por otras personas para otros routers, y he intentado ampliar un poco ese trabajo.

No hay comentarios:

Publicar un comentario