
Este exploit utiliza la vulnerabilidad Cable Haunt para obtener una shell en el módem de cable Sagemcom F@ST 3890 (50.10.19*) desde el acceso a la red local. La versión de firmware 50.10.21 o superior debería ser segura frente a Cable Haunt. Esta prueba de concepto ha sido diseñada específicamente para funcionar solo localmente, con el fin de limitar el potencial de uso malintencionado. Otro POC que crea una reverse shell hacia una conexión externa para el Technicolor TC7230 está disponible aquí.
Se puede encontrar una lista de módems vulnerables conocidos en https://cablehaunt.com/#faq-am-i-affected.
exploit.py sirve un sitio web que, al ser visitado, envía una solicitud WebSocket maliciosa al módem de cable.
Esta solicitud desborda la dirección de retorno y los registros asociados en el Spectrum Analyzer del módem de cable, y utiliza una cadena ROP para comenzar a escuchar una conexión TCP en el puerto 1337.
La cadena ROP se construye y se comenta en static/exploitSagemcom.js.
El servidor exploit.py envía entonces el archivo exploit.raw a través de esta conexión TCP, que posteriormente será ejecutado por el módem.
El archivo exploit.raw es reverseshell.c compilado para arquitectura MIPS (ver abajo cómo).
Reverseshell.c es una shell escrita explícitamente para este módem. La shell escucha comandos para ejecutarlos en la shell eCos del módem de cable y redirige STDOUT a la conexión TCP.
Puedes encontrar un vídeo que explica el exploit aquí: https://www.youtube.com/watch?v=5FM9mS5ck3Y
Nota: Windows 10 no es compatible actualmente; debes usar un sistema operativo basado en Linux
Instala pwntools y flask para python3 y ejecuta python exploit.py.
Ahora ve a http://127.0.0.1:8080 en tu navegador para explotar el módem.
Firefox no funcionará para esto, ya que la versión de WebSocket utilizada no es compatible.
Ahora debería aparecer una shell interactiva en tu terminal ejecutando el script de python. Si sales de la shell, el módem debe reiniciarse para iniciar una nueva shell.
Si quieres compilar tu propio payload, puedes obtener la toolchain de aeolus y ejecutar el siguiente comando:
/<toolchain Path>/gnutools/mipsisa32-elf/bin/mipsisa32-elf-gcc -O3 -c ./reverseshell.c -o ./reverseshell.o && /<toolchain Path>/toolchains/gnutools/mipsisa32-elf/bin/mipsisa32-elf-objcopy -O binary reverseshell.o exploit.raw
Puedes construir y explotar cualquier módem vulnerable a Cable Haunt con esta técnica. Recomendamos leer el informe técnico antes de intentar escribir tu propia cadena ROP. Ve a Cable Haunt para ver una lista de módems de cable vulnerables conocidos.
Primero, necesitarás el firmware del módem de cable que vas a explotar. Luego, haz ingeniería inversa al firmware para encontrar las direcciones de las funciones relevantes para construir el exploit, como socket(), bind(), accept(), listen(), recv() y connect() para una shell. Después, se puede usar Ropper para encontrar gadgets con el siguiente comando:
python Ropper.py --type all --all --badbytes 00c0c1f5f6f7f8f9fafbfcfdfeff2c -r -a MIPSBE -I 0x80004000 --console -f <firmware path>
No todos los gadgets son alcanzables, ya que son solo direcciones enviadas como bytes crudos y no todos los bytes pueden enviarse como una solicitud WebSocket con tramas de texto.
Por ejemplo, la dirección 0x8080a864 no puede insertarse directamente en una trama de texto WebSocket, porque no es un carácter UTF-8 válido. Sin embargo, la dirección 0xf28080a864 sí puede insertarse, ya que 0xf2 significa iniciar un nuevo símbolo UTF-8 con 0x8080a864 como bytes finales.
Los siguientes bytes no pueden estar presentes en ninguna dirección utilizada debido a la especificación UTF-8: 0x00, 0xc0,0xc1,0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x2c. También existen otras restricciones que pronto se explicarán más a fondo en nuestro informe.
Por ahora, puedes leer y usar utf8TestScript.py para comprobar si una dirección es alcanzable.
Puedes usar el proceso descrito anteriormente para compilar tu propio payload para un nuevo módem de cable, pero recuerda que ¡el payload no debe retornar! Si retorna, el proceso buscará una dirección de retorno en la pila destruida y fallará.
Para la mayoría de los módems, necesitarás una forma de acceder a la shell eCos para extraer el firmware, o extraerlo directamente del chip flash. Estos firmware suelen estar empaquetados en un formato llamado ProgramStore Si la consola serie no funciona, prueba a ejecutar: (podría funcionar solo si el cable coaxial está desconectado o no está aprovisionado)
snmpset -v2c -c private 192.168.0.1 1.3.6.1.4.1.4413.2.2.2.1.9.1.2.1.0 i 2
snmpset -v2c -c private 192.168.0.1 1.3.6.1.4.1.4413.2.2.2.1.9.1.2.1.0 i 0
snmpset -v2c -c private 192.168.0.1 1.3.6.1.4.1.4413.2.2.2.1.9.1.2.1.0 i 2
Entonces la shell debería ser accesible, y bcm2-utils puede facilitar su extracción usando esta shell. Al hacer ingeniería inversa del firmware extraído, la dirección de carga/base es (por lo que hemos visto) siempre 0x80004000.