
Vamos a divertirnos examinando un firmware de router Zyxel y la arquitectura MIPS
Los tutoriales son solo para fines informativos y educativos. Creo que el hacking ético, la seguridad de la información y la ciberseguridad deberían ser temas familiares para cualquier persona que utilice información digital y ordenadores. Creo que es imposible defenderse de los hackers sin saber cómo se realiza el hacking.
$ IDA Pro +7.0 (puedes usar Radar2 ya que IDA es bastante caro)
$ Router con Rompager 4.07: hay una cantidad inmensa de ellos, como TP-Link TD-W8951*, ZyXEL P-660R, Billion BiPAC 51**/52**
$ UART a USB
La vulnerabilidad de la mala suerte (misfortune cookie) ha existido durante un tiempo, pero aún carece de un análisis que ilustre los detalles técnicos de la vulnerabilidad en público. Según Check Point, el software afectado es el servidor web embebido RomPager de AllegroSoft. Escaneos a nivel de Internet sugieren que RomPager es probablemente el software de servidor web más popular del mundo en cuanto al número de endpoints disponibles. RomPager suele estar integrado en el firmware que se distribuye con el dispositivo. Esta vulnerabilidad específica se introdujo en la base de código en 2002. Además, los dispositivos expuestos son aquellos que utilizan servicios RomPager con versiones anteriores a la 4.34 (y específicamente la 4.07).
Para este tutorial usaré un ZXHN H108L que utiliza Rompager 4.07
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="ZXHN H108L"
Content-Type: text/html
Transfer-Encoding: chunked
Server: RomPager/4.07 UPnP/1.0
EXT:
Ahora usemos el puerto serie; primero debemos determinar la velocidad de baudios
$ sudo stty -F /dev/ttyUSB0
SALIDA :
speed 115200 baud; line = 0;
-brkint -imaxbel
dispositivo
Yo uso minicom, puedes usar cualquier cosa desde screen hasta HyperTerminal, pero prefiero este por su estabilidad ;)
$ sudo minicom -s
+-----------------------------------------------------------------------+
| A - Dispositivo Serie : /dev/modem |
| B - Ubicación del archivo de bloqueo : /var/lock |
| C - Programa de llamada : |
| D - Programa de salida : |
| E - Bps/Par/Bits : 115200 8N1 |
| F - Control de flujo por hardware : No |
| G - Control de flujo por software : No |
| |
| ¿Cambiar qué ajuste? |
+-----------------------------------------------------------------------+
| Pantalla y teclado |
| Guardar configuración como dfl |
| Guardar configuración como.. |
| Salir |
| Salir de Minicom |
+--------------------------+
Ahora estamos listos:
$ sudo minicom -D /dev/ttyUSB0 -b 115200
Bootbase Version: VTC_SPI1.26 | 2012/12/26 16:00:00
RAM: Size = 8192 Kbytes
Encontrado SPI Flash 2MiB GD25Q16 en 0xbfc00000
SPI Flash Quad Enable
Desactivar modo Quad
RAS Version: ZXHN H108LV4.0.0a_ZRQ_MA
System ID: $2.12.162.0(G94.BY.2)3.20.19.0| 2014/03/21 20140321_v006 | 2014
Presiona cualquier tecla para entrar en modo debug en 3 segundos.
..........
Para mostrar los comandos posibles:
$ ATHE
======= Listado de Comandos Debug =======
AT solo responde OK
ATHE muestra ayuda
ATBAx cambia la velocidad de baudios. 1:38.4k, 2:19.2k, 3:9.6k 4:57.6k 5:115.2k
ATENx,(y) establece el Flag de Debug de BootExtension (y=contraseña)
ATSE muestra la semilla del generador de contraseñas
ATTI(h,m,s) cambia la hora del sistema a hora:min:seg o muestra la hora actual
ATDA(y,m,d) cambia la fecha del sistema a año/mes/día o muestra la fecha actual
ATDS vuelca la pila RAS
ATDT vuelca el Área Común del Módulo de Arranque
ATDUx,y vuelca el contenido de memoria desde la dirección x con longitud y
ATRBx muestra el valor de 8 bits de la dirección x
ATRWx muestra el valor de 16 bits de la dirección x
ATRLx muestra el valor de 32 bits de la dirección x
ATGO(x) ejecuta el programa en la dirección x o inicia el router
ATGR inicia el router
ATGT ejecuta el Programa de Prueba de Hardware
ATRTw,x,y(,z) prueba de RAM nivel w, desde la dirección x hasta y (z iteraciones)
ATSH vuelca datos relacionados con el fabricante en ROM
ATDOx,y descarga desde la dirección x con longitud y al PC vía XMODEM
ATTD descarga la configuración del router al PC vía XMODEM
ATUR sube el firmware del router a la ROM flash
< presiona cualquier tecla para continuar >
Este firmware tiene un conjunto de comandos ocultos que son muy útiles para nuestro análisis dinámico. El problema es que no podemos ver los registros ni establecer puntos de interrupción, pero con suerte con estos comandos ocultos tendríamos esas características. Para verlos y usarlos necesitamos usar ATEN. Sin embargo, este comando requiere una contraseña, así que ¿qué podemos hacer ahora? Vamos a aplicar ingeniería inversa al firmware para encontrar el algoritmo del generador de contraseñas.
(Análisis estático) Veamos primero el archivo del firmware:
$ binwalk ras
binwalk1
$ dd if=ras of=rom1.lzma bs=1 skip=85043 count=66696
$ dd if=ras of=rom2.lzma bs=1 skip=350259 count=3350556
$ lzma -d <rom1.lzma> rom1
$ lzma -d <rom2.lzma> rom2
Veamos ahora la firma en los archivos extraídos:
$ binwalk -Y rom1
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 código ejecutable MIPS, 32/64 bits, big endian, al menos 1250 instrucciones válidas
string es una gran herramienta para hacerse una idea de qué es un archivo binario o qué contiene. Veamos si podemos encontrar el algoritmo de la contraseña:
$ strings rom1 | grep -i aten
$ strings rom2 | grep -i aten
Aparentemente, no podemos verlo porque el firmware aún está comprimido, lo que significa que debemos volcarlo desde el router usando el modo de depuración:
$ ATDO bfc00000, 1f0000
xmodem
Lo primero que viene a la mente es comenzar a buscar una tabla de despacho. ¿Por qué? Solo intuición, la única alternativa es if-elif, pero sería un conjunto largo de ellos para verificar la validez de la contraseña proporcionada por el usuario, y esto es lo que obtuve:
ROM:800158A0 CmdTable: .word unk_80015C20 # DATA XREF: sub_8000E3D8+4Co
ROM:800158A0 # sub_8000E3D8+90o ...
ROM:800158A4 .word sub_8000E6D0
ROM:800158A8 .byte 0
ROM:800158A9 .byte 0
ROM:800158AA .byte 0
ROM:800158AB .byte 0
ROM:800158AC .word aJustAnswerOk # " just answer OK"
ROM:800158B0 .word aAthe # "ATHE"
ROM:800158B4 .word CMD_SHOW_HELP_ATHE
ROM:800158B8 .byte 0
ROM:800158B9 .byte 0
ROM:800158BA .byte 0
ROM:800158BB .byte 0
ROM:800158BC .word aPrintHelp # " print help"
ROM:800158C0 .word aAtba # "ATBA"
ROM:800158C4 .word CMD_ATBA
...
ROM:800158D0 .word aAten # "ATEN"
ROM:800158D4 .word CMD_ATEN
Ten en cuenta que la palabra MIPS es de 4 bytes, ahora veamos CMD_ATEN: