
Einfacher DNS-Rebinding-Dienst
Einfacher DNS-Rebinding-Dienst
rbndr ist ein sehr einfacher, nicht konformer Nameserver zum Testen von Software auf DNS-Rebinding-Schwachstellen. Der Server antwortet auf Anfragen, indem er zufällig eine der im Hostnamen angegebenen Adressen auswählt und sie als Antwort mit einer sehr niedrigen TTL zurückgibt.
https://en.wikipedia.org/wiki/DNS_rebinding
DNS-Rebinding ist eine Form der TOCTOU-Schwachstelle (Time of Check, Time of Use). Sie würden es verwenden, wenn Sie einen Dienst haben, der „Preflight“-Prüfungen falsch verwendet, um Sicherheitseigenschaften zu ändern. Stellen Sie sich zum Beispiel ein (fiktives) Browser-Plugin vor, das eine API wie diese hat:
AllowUntrustedAccess("foobar.com");
SendArbitraryRequests("foobar.com");
Und AllowUntrustedAccess() sendet einfach eine Preflight-HTTP-Anfrage an den Host:
GET /CanIDisableSecurity HTTP/1.1
Wenn der Dienst 200 zurückgibt, erlaubt das Plugin der Hostseite vollständigen Zugriff auf diesen Hostnamen. Dies könnte eine Sicherheitslücke darstellen, da Sie einen rbndr-Hostnamen angeben können, der zwischen einem von Ihnen kontrollierten Host und einem nicht von Ihnen kontrollierten Host umschaltet. Das Plugin könnte möglicherweise vollständigen Zugriff auf eine beliebige IP-Adresse gewähren (z. B. einen internen Dienst oder localhost), selbst wenn dieser Dienst normalerweise die Preflight-Prüfung nicht zulassen würde.
Das mag unrealistisch klingen, aber genau so haben Adobe Flash, Oracle Java und viele andere Produkte in der Vergangenheit funktioniert, und viele andere Produkte funktionieren immer noch so.
Lesen Sie hier, wie Adobe versucht hat, dieses Problem in Flash zu beheben: https://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html
Für Software, die gegenüber dieser Angriffsklasse anfällig ist, ist rbndr eine einfache Möglichkeit, sie zu testen, ohne /etc/hosts ändern oder einen eigenen Nameserver einrichten zu müssen. Wenn die Software das Ergebnis nur mit dem Hostnamen und nicht mit dem Hostnamen und der IP-Adresse verknüpft, dann können Sie sich selbst Zugriff auf jede beliebige IP-Adresse gewähren.
Das Format für Hostnamen ist einfach
<ipv4 in base-16>.<ipv4 in base-16>.rbndr.us
Sie können aber auch diese Website verwenden, um von punktierten Quadrupeln zu konvertieren, wenn Sie möchten:
https://lock.cmpxchg8b.com/rebinder.html
Um beispielsweise zwischen 127.0.0.1 und 192.168.0.1 umzuschalten, kodieren Sie diese als DWORDs und verwenden dann:
7f000001.c0a80001.rbndr.us
Testen wir es:
$ 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
Wie Sie sehen können, gibt der Server zufällig eine der Adressen zurück. Sie könnten etwa so vorgehen (in Pseudocode):
// 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();