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
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/hosts
ou 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
https://lock.cmpxchg8b.com/rebinder.html
Por exemplo, para alternar
127.0.0.1
e 192.168.0.1
codificá-los como dwords e, em seguida, use:7f000001.c0a80001.rbndr.us
$ 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
// 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();