La possibilité de rétrograder à distance des appareils basés sur RouterOS (Mikrotik) met en danger des centaines de milliers de périphériques réseau. La vulnérabilité est associée à l'empoisonnement du cache DNS du protocole Winbox et permet de charger un firmware obsolète (avec une réinitialisation du mot de passe par défaut) ou modifié sur l'appareil.
Détails de la vulnérabilité
Le terminal RouterOS prend en charge la commande solve pour la recherche DNS.
Cette requête est gérée par un binaire appelé résolveur. Resolver est l'un des nombreux binaires qui se connectent au protocole Winbox de RouterOS. À un niveau élevé, les « messages » envoyés au port Winbox peuvent être acheminés vers divers binaires dans RouterOS sur la base d'un schéma de numérotation basé sur un tableau.
Par défaut, RouterOS a la fonctionnalité de serveur DNS désactivée.
Cependant, même lorsque la fonction serveur est désactivée, le routeur conserve son propre cache DNS.
Lorsque nous faisons une requête en utilisant winbox_dns_request par exemple example.com, le routeur mettra en cache le résultat.
Puisque nous pouvons spécifier le serveur DNS par lequel la requête doit passer, saisir des adresses incorrectes est trivial. Par exemple, vous pouvez configurer une implémentation de serveur DNS à partir de
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()
Maintenant, si vous recherchez example.com à l'aide de Winbox, vous pouvez voir que le cache DNS du routeur est empoisonné.
Bien sûr, empoisonner example.com n'est pas très utile puisque le routeur ne l'utilisera pas réellement. Cependant, le routeur doit accéder à upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com et download.mikrotik.com. Et grâce à une autre erreur, il est possible de les empoisonner tous d’un coup.
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()
Le routeur demande une autorisation et nous en accordons cinq en retour. Le routeur ne met pas correctement en cache toutes ces réponses.
Évidemment, cette attaque est également utile si le routeur fait office de serveur DNS, car elle permet d'attaquer les clients du routeur.
Cette attaque permet également d'exploiter une vulnérabilité plus grave : rétrograder ou rétroporter la version de RouterOS. L'attaquant recrée la logique du serveur de mise à jour, y compris le journal des modifications, et force RouterOS à percevoir la version obsolète (vulnérable) comme actuelle. Le danger ici réside dans le fait que lorsque la version est « mise à jour », le mot de passe administrateur est réinitialisé à la valeur par défaut - un attaquant peut se connecter au système avec un mot de passe vide !
L'attaque fonctionne plutôt bien, malgré le fait que
Protection
Désactiver simplement Winbox vous permet de vous protéger de ces attaques. Malgré la commodité de l'administration via Winbox, il est préférable d'utiliser le protocole SSH.
Source: habr.com