
Serviço Simples de Reassociação de DNS
Serviço Simples de DNS Rebinding
rbndr é um servidor de nomes muito simples e não conforme para testar software contra vulnerabilidades de DNS rebinding. O servidor responde a consultas selecionando aleatoriamente um dos endereços especificados no hostname e retornando-o como resposta com um ttl muito baixo.
https://en.wikipedia.org/wiki/DNS_rebinding
DNS rebinding é uma forma de vulnerabilidade TOCTOU (time of check, time of use). Você o usaria se tivesse um serviço que utiliza verificações "preflight" incorretamente para modificar propriedades de segurança. Por exemplo, considere um (fictício) plugin de navegador que possui uma api como esta:
AllowUntrustedAccess("foobar.com");
SendArbitraryRequests("foobar.com");
E AllowUntrustedAccess() simplesmente envia uma requisição HTTP preflight para o host:
GET /CanIDisableSecurity HTTP/1.1
Se o serviço retornar 200, então o plugin permite que a página do host tenha acesso completo a esse hostname. Isso pode ser uma vulnerabilidade de segurança, porque você pode especificar um hostname rbndr que alternará entre um host que você controla e um host que você não controla. O plugin pode permitir 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 preflight.
Isso pode parecer irrealista, mas é exatamente como o Adobe Flash, Oracle Java e muitos outros produtos funcionavam no passado, e muitos outros produtos ainda funcionam.
Leia sobre como a Adobe tentou resolver esse problema no Flash aqui: https://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html
Para software vulnerável a essa classe de ataque, rbndr é uma maneira fácil de testar sem ter que modificar /etc/hosts ou configurar seu próprio servidor de nomes. Se o software associar o resultado apenas ao hostname e não ao hostname e endereço ip, você pode se conceder acesso a qualquer endereço ip.
O formato para hostnames é simplesmente
<ipv4 em base-16>.<ipv4 em base-16>.rbndr.us
Mas você pode usar este site para converter de dotted quads, se preferir:
https://lock.cmpxchg8b.com/rebinder.html
Por exemplo, para alternar entre 127.0.0.1 e 192.168.0.1, você os codificaria como dwords e usaria:
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ê poderia 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();