
Semplice servizio di DNS Rebinding
Semplice servizio di DNS rebinding
rbndr è un name server molto semplice e non conforme, per testare software contro le vulnerabilità di DNS rebinding. Il server risponde alle query selezionando casualmente uno degli indirizzi specificati nel nome host e restituendolo come risposta con un ttl molto basso.
https://en.wikipedia.org/wiki/DNS_rebinding
Il DNS rebinding è una forma di vulnerabilità TOCTOU (time of check, time of use). Lo si userebbe se si ha un servizio che utilizza controlli "preflight" in modo errato per modificare le proprietà di sicurezza. Ad esempio, considera un plugin del browser (fittizio) che ha un'API come questa:
AllowUntrustedAccess("foobar.com");
SendArbitraryRequests("foobar.com");
E AllowUntrustedAccess() invia semplicemente una richiesta HTTP preflight all'host:
GET /CanIDisableSecurity HTTP/1.1
Se il servizio restituisce 200, allora il plugin concede alla pagina host l'accesso completo a quel nome host. Questa potrebbe essere una vulnerabilità di sicurezza, perché puoi specificare un nome host rbndr che passerà da un host che controlli a uno che non controlli. Il plugin potrebbe concedere l'accesso completo a un indirizzo IP arbitrario (ad esempio un servizio interno o localhost) anche se quel servizio normalmente non consentirebbe il controllo preflight.
Potrebbe sembrare irrealistico, ma è esattamente come funzionavano in passato Adobe Flash, Oracle Java e molti altri prodotti, e molti altri prodotti funzionano ancora.
Leggi come Adobe ha cercato di risolvere questo problema in Flash qui, https://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html
Per il software vulnerabile a questa classe di attacchi, rbndr è un modo semplice per testare senza dover modificare /etc/hosts o configurare il proprio name server. Se il software associa il risultato solo al nome host e non al nome host e all'indirizzo IP, allora puoi concederti l'accesso a qualsiasi indirizzo IP.
Il formato per i nomi host è semplicemente
<ipv4 in base-16>.<ipv4 in base-16>.rbndr.us
Ma puoi usare questo sito web per convertire da dotted quads se preferisci:
https://lock.cmpxchg8b.com/rebinder.html
Ad esempio, per passare da 127.0.0.1 a 192.168.0.1 li codificheresti come dword, e poi useresti:
7f000001.c0a80001.rbndr.us
Proviamolo:
$ 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
Come puoi vedere, il server restituisce casualmente uno degli indirizzi. Potresti fare qualcosa del genere (in pseudo-codice):
// 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();