
Exploit para o modem a cabo Sagemcom F@ST 3890 que implementa a vulnerabilidade Cable Haunt para obter execução remota de código por meio de estouro de buffer baseado em WebSocket e cadeia ROP.
Este exploit usa a vulnerabilidade Cable Haunt para obter um shell no modem a cabo Sagemcom F@ST 3890 (50.10.19*), a partir do acesso à rede local. A versão de firmware 50.10.21 ou superior deve ser segura contra o Cable Haunt. Esta prova de conceito foi especificamente projetada para funcionar apenas localmente, a fim de limitar o potencial de uso malicioso. Outro POC que cria um reverse shell para uma conexão externa no Technicolor TC7230 está disponível aqui.
Uma lista de modems vulneráveis conhecidos pode ser encontrada em https://cablehaunt.com/#faq-am-i-affected.
O exploit.py serve um site que, quando visitado, envia uma solicitação WebSocket maliciosa para o modem a cabo.
Essa solicitação causa overflow no endereço de retorno e nos registradores correspondentes do Spectrum Analyzer do modem a cabo e usa uma ROP-chain para começar a escutar por uma conexão TCP na porta 1337.
A ROP-chain é construída e comentada em static/exploitSagemcom.js.
O servidor do exploit.py então envia o arquivo exploit.raw por essa conexão TCP, que será então executado pelo modem.
O arquivo exploit.raw é o reverseshell.c compilado para a arquitetura MIPS (veja abaixo como).
O Reverseshell.c é um shell escrito explicitamente para este modem. O shell escuta comandos para serem executados no shell eCos do modem a cabo e redireciona o STDOUT para a conexão TCP.
Você pode encontrar um vídeo explicando o exploit aqui: https://www.youtube.com/watch?v=5FM9mS5ck3Y
Nota: o Windows 10 não é suportado atualmente; você deve usar um sistema operacional baseado em Linux
Instale pwntools e flask para python3 e execute python exploit.py.
Agora acesse http://127.0.0.1:8080 no seu navegador para explorar o modem.
O Firefox não funcionará para isso, pois a versão do WebSocket usada não é compatível.
Agora, um shell interativo deve aparecer no seu terminal executando o script python. Se você sair do shell, o modem precisará ser reiniciado para iniciar um novo shell.
Se quiser compilar seu próprio payload, você pode obter a toolchain do aeolus e executar o seguinte 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
Você pode construir e explorar qualquer modem vulnerável ao Cable Haunt usando esta técnica. Recomendamos ler o relatório técnico antes de tentar escrever sua própria ROP-chain. Acesse Cable Haunt para obter uma lista de modems a cabo vulneráveis conhecidos.
Primeiro, você precisará do firmware do modem a cabo que vai explorar. Em seguida, faça engenharia reversa do firmware para encontrar os endereços das funções relevantes para a construção do exploit, como socket(), bind(), accept(), listen(), recv() e connect() para um shell. Então, o Ropper pode ser usado para encontrar gadgets com o seguinte comando:
python Ropper.py --type all --all --badbytes 00c0c1f5f6f7f8f9fafbfcfdfeff2c -r -a MIPSBE -I 0x80004000 --console -f <firmware path>
Nem todos os gadgets podem ser alcançados, pois os gadgets são apenas endereços enviados como bytes brutos, e nem todos os bytes podem ser enviados em uma solicitação WebSocket com text frames.
Por exemplo, o endereço 0x8080a864 não pode ser inserido diretamente em um WebSocket text frame, pois não é um caractere UTF-8 válido. O endereço 0xf28080a864, no entanto, pode ser inserido, pois 0xf2 significa iniciar um novo símbolo UTF-8 com 0x8080a864 como bytes finais.
Os seguintes bytes não podem estar presentes em nenhum endereço usado, devido à especificação utf-8: 0x00, 0xc0,0xc1,0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 0x2c. Outras restrições também existem, que serão explicadas em mais detalhes em nosso relatório.
Por enquanto, você pode ler e usar utf8TestScript.py para testar se um endereço é alcançável.
Você pode usar o processo descrito acima para compilar seu próprio payload para um novo modem a cabo, mas lembre-se de que o payload não deve retornar! Se ele retornar, o processo procurará um endereço de retorno na stack corrompida e irá travar.
Para a maioria dos modems, você precisará de uma forma de acessar o shell eCos para extrair o firmware, ou extraí-lo diretamente do chip de flash. Esses firmwares geralmente são empacotados em um formato chamado ProgramStore Se o console serial não estiver funcionando, tente executar: (pode funcionar apenas se o cabo coaxial estiver desconectado ou não provisionado)
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
Então o shell deve estar acessível, e o bcm2-utils pode facilitar a extração usando esse shell. Ao fazer engenharia reversa do firmware extraído, o endereço de carga/base é (até onde vimos) sempre 0x80004000.