
Exploit per modem via cavo Sagemcom F@ST 3890 che implementa la vulnerabilità Cable Haunt per ottenere l'esecuzione remota di codice tramite buffer overflow basato su WebSocket e catena ROP.
Questo exploit utilizza la vulnerabilità Cable Haunt per ottenere una shell sul modem via cavo Sagemcom F@ST 3890 (50.10.19*), tramite accesso dalla rete locale. La versione del firmware 50.10.21 o successiva dovrebbe essere sicura contro Cable Haunt. Questa prova di concetto è stata specificamente progettata per funzionare solo in locale per limitare il potenziale uso dannoso. Un'altra POC che crea una reverse shell verso una connessione esterna per il Technicolor TC7230 è disponibile qui.
Un elenco dei modem vulnerabili noti è disponibile su https://cablehaunt.com/#faq-am-i-affected.
exploit.py serve un sito web che, quando viene visitato, invia una richiesta WebSocket dannosa al modem via cavo.
Questa richiesta sovraccarica l'indirizzo di ritorno e i registri associati nello Spectrum Analyzer del modem via cavo e usa una ROP-chain per iniziare ad ascoltare una connessione TCP sulla porta 1337.
La ROP-chain è costruita e commentata in static/exploitSagemcom.js.
Il server exploit.py invia quindi il file exploit.raw su questa connessione TCP, che verrà poi eseguito dal modem.
Il file exploit.raw è reverseshell.c compilato per architettura MIPS (vedi sotto come).
Reverseshell.c è una shell scritta esplicitamente per questo modem. La shell ascolta i comandi da eseguire nella shell eCos sul modem via cavo e reindirizza STDOUT alla connessione TCP.
Puoi trovare un video che spiega l'exploit qui: https://www.youtube.com/watch?v=5FM9mS5ck3Y
Nota: Windows 10 non è attualmente supportato, devi usare un sistema operativo basato su Linux
Installa pwntools e flask per python3 ed esegui python exploit.py.
Ora vai su http://127.0.0.1:8080 nel tuo browser per sfruttare il modem.
Firefox non funzionerà per questo, poiché la versione di WebSocket utilizzata non è compatibile.
Ora dovrebbe apparire una shell interattiva nel terminale che esegue lo script python. Se esci dalla shell, il modem deve essere riavviato per avviare una nuova shell.
Se vuoi compilare il tuo payload, puoi prendere la toolchain da aeolus ed eseguire il seguente 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
Puoi costruire e sfruttare qualsiasi modem vulnerabile a Cable Haunt usando questa tecnica. Ti consigliamo di leggere il rapporto tecnico prima di provare a scrivere la tua ROP-chain. Vai su Cable Haunt per un elenco dei modem via cavo vulnerabili noti.
Per prima cosa, avrai bisogno del firmware del modem via cavo che intendi sfruttare. Poi, fai reverse engineering del firmware per trovare gli indirizzi delle funzioni rilevanti per costruire l'exploit, come socket(), bind(), accept(), listen(), recv() e connect() per una shell. Quindi Ropper può essere usato per trovare i gadget con il seguente comando:
python Ropper.py --type all --all --badbytes 00c0c1f5f6f7f8f9fafbfcfdfeff2c -r -a MIPSBE -I 0x80004000 --console -f <firmware path>
Non tutti i gadget sono raggiungibili, poiché i gadget sono semplicemente indirizzi inviati come byte grezzi e non tutti i byte possono essere inviati in una richiesta WebSocket con frame di testo.
Ad esempio, l'indirizzo 0x8080a864 non può essere inserito direttamente in un frame di testo WebSocket, perché non è un carattere UTF-8 valido. L'indirizzo 0xf28080a864 può invece essere inserito, perché 0xf2 indica l'inizio di un nuovo simbolo UTF-8 con 0x8080a864 come byte finali.
I seguenti byte non possono essere presenti in alcun indirizzo utilizzato a causa della specifica UTF-8: 0x00, 0xc0,0xc1,0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x2c. Esistono anche altre restrizioni che verranno presto spiegate più in dettaglio nel nostro rapporto.
Per ora, puoi leggere e usare utf8TestScript.py per testare se un indirizzo è raggiungibile.
Puoi usare il processo descritto sopra per compilare il tuo payload per un nuovo modem via cavo, ma ricorda che il payload non deve restituire il controllo! Se lo fa, il processo cercherà un indirizzo di ritorno sullo stack corrotto e andrà in crash.
Per la maggior parte dei modem, avrai bisogno di un modo per accedere alla shell eCos per estrarre il firmware o estrarlo direttamente dal chip flash. Questi firmware sono di solito impacchettati in un formato chiamato ProgramStore Se la console seriale non funziona, prova a eseguire: (potrebbe funzionare solo se il cavo coassiale è scollegato o non provisionato)
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
Quindi la shell dovrebbe essere accessibile, e bcm2-utils può rendere facile estrarlo usando questa shell. Quando si fa reverse engineering del firmware estratto, l'indirizzo di load/base è (per quanto abbiamo visto) sempre 0x80004000.