NOTÍCIAS

[ANONYMOUS][grids]

Rbndr - Simples Serviço DNS Rebinding


Rbndr é um servidor de nomes muito simples, não conforme, para testar software contra vulnerabilidades de recuperação de DNS. O servidor responde às consultas selecionando aleatoriamente um dos endereços especificados no nome do host e devolvendo-o como a resposta com um ttl muito baixo.
https://en.wikipedia.org/wiki/DNS_rebinding
O recarregamento de DNS é uma forma de vulnerabilidade TOCTOU (tempo de verificação, tempo de uso). Você usaria isso se você tiver um serviço que use verificações "preflight" incorretamente para modificar as propriedades de segurança. Por exemplo, considere um plugin de navegador (fictício) que tenha uma api como esta:
AllowUntrustedAccess("foobar.com");
SendArbitraryRequests("foobar.com");


AllowUntrustedAccess()simplesmente envia uma solicitação HTTP pré-vôo para o host:
GET /CanIDisableSecurity HTTP/1.1


Se o serviço retornar 200, então o plugin permite que o acesso completo do host àquele nome do host. Esta pode ser uma vulnerabilidade de segurança, porque você pode especificar um nome de host rbndr que alternará entre um host que você controla e um host que você não. O plugin pode permitir o acesso completo a um endereço IP arbitrário (por exemplo, um serviço interno ou localhost), mesmo que esse serviço normalmente não permita a verificação do teste. 
Isso pode parecer irreal, mas foi exatamente assim que o Adobe Flash, Oracle Java e muitos outros produtos funcionaram no passado e muitos outros produtos ainda funcionam. 


Para um software vulnerável a esta classe de ataque, rbndr é uma maneira fácil de testar sem ter que modificar /etc/hostsou configurar seu próprio servidor de nomes. Se o software associar o resultado com apenas o nome do host e não o nome do host e o endereço IP, você pode conceder-se acesso a qualquer endereço IP. 
O formato para nomes de host é simplesmente

<ipv4 in base-16>.<ipv4 in base-16>.rbndr.us


Mas você pode usar este site para converter de quads pontilhados se você preferir: 
https://lock.cmpxchg8b.com/rebinder.html
Por exemplo, para alternar 127.0.0.1192.168.0.1codificá-los como dwords e, em seguida, use:

7f000001.c0a80001.rbndr.us


Vamos testar:
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 192.168.0.1
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 192.168.0.1
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 192.168.0.1
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 127.0.0.1
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 127.0.0.1
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 192.168.0.1
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 127.0.0.1
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 127.0.0.1
$ host 7f000001.c0a80001.rbndr.us
7f000001.c0a80001.rbndr.us has address 192.168.0.1


Como você pode ver, o servidor retorna aleatoriamente um dos endereços. Você pode fazer algo assim (em pseudo-código):
// Keep calling api until it resolves to the address you control and you get granted access
while (AllowUntrustedAccesss("7f000001.c0a80001.rbndr.us") != true)
  ;

// Access granted, now wait for it to re-bind
while (ConnectToPort("7f000001.c0a80001.rbndr.us", 123) != true)
 ;
 
 // Now you have access to localhost:123 even though localhost did not opt-in to reduced security.
 SomethingEvil();