
Die Möglichkeit, Geräte basierend auf RouterOS (Mikrotik) remote herunterzustufen, gefährdet Hunderttausende von Netzwerkgeräten. Die Sicherheitsanfälligkeit ist mit der Vergiftung des DNS-Cache des Winbox-Protokolls verbunden und ermöglicht das Herunterladen veralteter (standardmäßig zurückgesetztes Kennwort) oder geänderter Firmware auf dem Gerät.

Sicherheitslücken Details
Das RouterOS-Terminal unterstützt einen Auflösungsbefehl für DNS-Suchvorgänge.

Diese Anforderung wird von einem binären Resolver verarbeitet. Resolver ist eine von vielen Binärdateien, die mit dem RouterOS Winbox-Protokoll verbunden sind. 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, verwaltet der Router seinen eigenen DNS-Cache.

Wenn wir eine Anfrage mit winbox_dns_request stellen, z. B. example.com, speichert der Router das Ergebnis zwischen.

Da wir den DNS-Server angeben können, über den die Anforderung gesendet werden soll, ist die Eingabe der falschen Adressen trivial. Beispielsweise können Sie die Implementierung des DNS-Servers von
Philip Klaus so konfigurieren, dass immer mit einem A-Eintrag mit der IP-Adresse 192.168.88.250 geantwortet wird.
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 auf example.com nachschlagen, können Sie feststellen, dass der DNS-Cache des Routers vergiftet wurde.

Natürlich ist die Vergiftung von example.com nicht sehr nützlich, da der Router sie nicht wirklich verwendet. Der Router benötigt jedoch Zugriff auf upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com und download.mikrotik.com. 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 Berechtigung an, und wir geben fünf zurück. Der Router speichert alle diese Antworten falsch zwischen.

Offensichtlich ist dieser Angriff auch nützlich, wenn der Router als DNS-Server fungiert, da er das Angreifen der Clients des Routers ermöglicht.
Dieser Angriff ermöglicht auch das Ausnutzen einer schwerwiegenderen Sicherheitsanfälligkeit: Downgrade oder Backport der RouterOS-Version. Der Angreifer erstellt die Logik des Update-Servers einschließlich des Änderungsprotokolls neu und veranlasst RouterOS, die veraltete (anfällige) Version als aktuell zu akzeptieren. Die Gefahr besteht hier darin, dass beim "Aktualisieren" der Version das Administratorkennwort auf den Standardwert zurückgesetzt wird - ein Angreifer kann sich mit einem leeren Kennwort beim System anmelden!
Der Angriff funktioniert ziemlich gut, obwohl der
Autor mehrere weitere Vektoren implementiert, einschließlich solcher, die sich auf das
Einbetten einer Hintertür in die Firmware beziehen. Dies ist jedoch bereits eine redundante Technik und es ist illegal, sie für illegitime Zwecke zu verwenden.
Schutz
Durch einfaches Deaktivieren von Winbox wird vor diesen Angriffen geschützt. Trotz der bequemen Verwaltung über Winbox ist es besser, das SSH-Protokoll zu verwenden.