
Die Möglichkeit, Geräte mit RouterOS (Mikrotik) aus der Ferne herabzustufen, gefährdet Hunderttausende von Netzwerkgeräten. Die Schwachstelle hängt mit der DNS-Cache-Vergiftung des Winbox-Protokolls zusammen und ermöglicht es, veraltete (mit Passwortreset auf 'Standard') oder modifizierte Firmware auf das Gerät hochzuladen.

Details zur Schwachstelle
Das RouterOS-Terminal unterstützt den Resolution-Befehl zur DNS-Abfrage.

Diese Anfrage wird von einer Binärdatei mit dem Namen resolver verarbeitet. Der Resolver ist eine von vielen Binärdateien, die mit dem Winbox-Protokoll von RouterOS verbunden sind. Auf hoher Ebene können die 'Nachrichten', die an den Winbox-Port gesendet werden, basierend auf einer Array-basierten Nummerierung an verschiedene Binärdateien in RouterOS weitergeleitet werden.
Die DNS-Serverfunktion ist standardmäßig in RouterOS deaktiviert.

Selbst bei deaktivierter Serverfunktion unterstützt der Router jedoch einen eigenen DNS-Cache.

Wenn wir eine Anfrage stellen, z.B. durch winbox_dns_request für example.com, wird der Router das Ergebnis im Cache speichern.

Da wir den DNS-Server angeben können, über den die Anfrage gehen soll, ist das Eingeben falscher Adressen trivial. Zum Beispiel kann eine Implementierung eines DNS-Servers eingerichtet werden von , um immer mit der A-Antwort zu reagieren, die die IP-Adresse 192.168.88.250 enthält.
def dns_response(data):
request = DNSRecord.parse(data)
reply = DNSRecord(DNSHeader(
id=request.header.id, qr=1, aa=1, ra=1), q=request.q)
qname = request.q.qname
qn = str(qname)
reply.add_answer(RR(qn,ttl=30,rdata=A("192.168.88.250")))
print("---- Reply:n", reply)
return reply.pack()Wenn Sie jetzt mit Winbox nach example.com suchen, können Sie feststellen, dass der DNS-Cache des Routers vergiftet ist.

Natürlich ist die Vergiftung von example.com nicht besonders nützlich, da der Router tatsächlich nicht darauf zugreifen wird. Dennoch benötigt der Router Zugriff auf upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com und download.mikrotik.com. Und dank eines weiteren Fehlers besteht die Möglichkeit, sie alle gleichzeitig zu vergiften.
def dns_response(data):
request = DNSRecord.parse(data)
reply = DNSRecord(DNSHeader(
id=request.header.id, qr=1, aa=1, ra=1), q=request.q)
qname = request.q.qname
qn = str(qname)
reply.add_answer(RR(qn,ttl=30,rdata=A("192.168.88.250")))
reply.add_answer(RR("upgrade.mikrotik.com",ttl=604800,
rdata=A("192.168.88.250")))
reply.add_answer(RR("cloud.mikrotik.com",ttl=604800,
rdata=A("192.168.88.250")))
reply.add_answer(RR("cloud2.mikrotik.com",ttl=604800,
rdata=A("192.168.88.250")))
reply.add_answer(RR("download.mikrotik.com",ttl=604800,
rdata=A("192.168.88.250")))
print("---- Reply:n", reply)
return reply.pack()Der Router fragt eine Genehmigung an, während wir fünf zurückgeben. Der Router cached alle diese Antworten falsch.

Offensichtlich ist dieser Angriff auch nützlich, wenn der Router als DNS-Server fungiert, da er Angriffe auf die Router-Kunden ermöglicht.
Zusätzlich ermöglicht dieser Angriff, eine schwerwiegendere Sicherheitsanfälligkeit auszunutzen: ein Downgrade oder ein Backport von RouterOS-Versionen durchzuführen. Der Angreifer rekonstruiert die Logik des Update-Servers, einschließlich des Änderungsprotokolls, und zwingt RouterOS dazu, eine veraltete (anfällige) Version als aktuell zu betrachten. Die Gefahr dabei liegt darin, dass beim „Update“ der Version das Administratorkennwort auf den Standardwert zurückgesetzt wird — der Angreifer kann sich mit einem leeren Kennwort einloggen!

Der Angriff funktioniert einwandfrei, obwohl weitere Vektoren implementiert, die unter anderem mit zusammenhängen, aber dies ist bereits eine überflüssige Technik und deren Verwendung zu illegalen Zwecken ist strafbar.
Schutz
Ein einfaches Deaktivieren von Winbox schützt vor diesen Angriffen. Trotz der Bequemlichkeit der Verwaltung über Winbox ist es besser, das SSH-Protokoll zu verwenden.
Quelle: habr.com
