Die Möglichkeit, auf RouterOS (Mikrotik) basierende Geräte aus der Ferne herunterzustufen, gefährdet Hunderttausende Netzwerkgeräte. Die Sicherheitslücke ist mit einer Vergiftung des DNS-Cache des Winbox-Protokolls verbunden und ermöglicht es Ihnen, veraltete (mit einem Standard-Passwort-Reset) oder geänderte Firmware auf das Gerät zu laden.
Details zur Sicherheitslücke
Das RouterOS-Terminal unterstützt den Auflösungsbefehl für die DNS-Suche.
Diese Anfrage wird von einer Binärdatei namens Resolver verarbeitet. Resolver ist eine von vielen Binärdateien, die eine Verbindung zum Winbox-Protokoll von RouterOS herstellen. Auf hoher Ebene können an den Winbox-Port gesendete „Nachrichten“ basierend auf einem Array-basierten Nummerierungsschema an verschiedene Binärdateien in RouterOS weitergeleitet werden.
Standardmäßig ist bei RouterOS die DNS-Serverfunktion deaktiviert.
Selbst wenn die Serverfunktion deaktiviert ist, behält der Router jedoch seinen eigenen DNS-Cache bei.
Wenn wir eine Anfrage mit winbox_dns_request stellen, zum Beispiel example.com, speichert der Router das Ergebnis zwischen.
Da wir den DNS-Server angeben können, über den die Anfrage gehen soll, ist die Eingabe falscher Adressen trivial. Sie können beispielsweise eine DNS-Serverimplementierung von konfigurieren
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 nun mit Winbox nach example.com suchen, können Sie feststellen, dass der DNS-Cache des Routers vergiftet ist.
Natürlich ist eine Vergiftung von example.com nicht sehr sinnvoll, da der Router sie nicht wirklich nutzt. Der Router muss jedoch auf upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com und download.mikrotik.com zugreifen. Und dank eines weiteren Fehlers ist es möglich, sie alle auf einmal 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 fordert eine Erlaubnis an und wir gewähren fünf zurück. Der Router speichert nicht alle diese Antworten korrekt zwischen.
Natürlich ist dieser Angriff auch dann nützlich, wenn der Router als DNS-Server fungiert, da er die Möglichkeit bietet, Clients des Routers anzugreifen.
Mit diesem Angriff können Sie auch eine schwerwiegendere Sicherheitslücke ausnutzen: ein Downgrade oder eine Backportierung der Version von RouterOS. Der Angreifer erstellt die Logik des Update-Servers einschließlich des Änderungsprotokolls neu und zwingt RouterOS, die veraltete (anfällige) Version als aktuell zu erkennen. Die Gefahr liegt hier darin, dass beim „Update“ der Version das Administrator-Passwort auf den Standardwert zurückgesetzt wird – ein Angreifer kann sich mit einem leeren Passwort am System anmelden!
Trotzdem funktioniert der Angriff recht gut
Schutz
Durch einfaches Deaktivieren von Winbox können Sie sich vor diesen Angriffen schützen. Trotz der Bequemlichkeit der Verwaltung über Winbox ist es besser, das SSH-Protokoll zu verwenden.
Source: habr.com