Η δυνατότητα απομακρυσμένης υποβάθμισης συσκευών που βασίζονται στο RouterOS (Mikrotik) θέτει σε κίνδυνο εκατοντάδες χιλιάδες συσκευές δικτύου. Η ευπάθεια σχετίζεται με δηλητηρίαση της κρυφής μνήμης DNS του πρωτοκόλλου Winbox και σας επιτρέπει να φορτώσετε ξεπερασμένο (με επαναφορά προεπιλεγμένου κωδικού πρόσβασης) ή τροποποιημένο υλικολογισμικό στη συσκευή.
Λεπτομέρειες ευπάθειας
Το τερματικό RouterOS υποστηρίζει την εντολή επίλυσης για αναζήτηση DNS.
Αυτό το αίτημα αντιμετωπίζεται από ένα δυαδικό που ονομάζεται αναλυτής. Το Resolver είναι ένα από τα πολλά δυαδικά αρχεία που συνδέονται με το πρωτόκολλο Winbox του RouterOS. Σε υψηλό επίπεδο, τα "μηνύματα" που αποστέλλονται στη θύρα Winbox μπορούν να δρομολογηθούν σε διάφορα δυαδικά αρχεία στο RouterOS με βάση ένα σχήμα αρίθμησης που βασίζεται σε πίνακα.
Από προεπιλογή, το RouterOS έχει απενεργοποιημένη τη δυνατότητα διακομιστή DNS.
Ωστόσο, ακόμη και όταν η λειτουργία διακομιστή είναι απενεργοποιημένη, ο δρομολογητής διατηρεί τη δική του προσωρινή μνήμη DNS.
Όταν κάνουμε ένα αίτημα χρησιμοποιώντας το winbox_dns_request για παράδειγμα.com, ο δρομολογητής θα αποθηκεύσει το αποτέλεσμα στην προσωρινή μνήμη.
Εφόσον μπορούμε να καθορίσουμε τον διακομιστή DNS μέσω του οποίου πρέπει να περάσει το αίτημα, η εισαγωγή εσφαλμένων διευθύνσεων είναι ασήμαντη. Για παράδειγμα, μπορείτε να διαμορφώσετε μια υλοποίηση διακομιστή DNS από
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()
Τώρα, αν κάνετε αναζήτηση για παράδειγμα.com χρησιμοποιώντας το Winbox, μπορείτε να δείτε ότι η προσωρινή μνήμη DNS του δρομολογητή είναι δηλητηριασμένη.
Φυσικά, το poisoning example.com δεν είναι πολύ χρήσιμο αφού ο δρομολογητής δεν θα το χρησιμοποιήσει πραγματικά. Ωστόσο, ο δρομολογητής πρέπει να έχει πρόσβαση στα upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com και download.mikrotik.com. Και χάρη σε ένα άλλο λάθος, είναι δυνατό να τα δηλητηριάσουν όλα με τη μία.
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()
Ο δρομολογητής ζητά μία άδεια και εμείς επιστρέφουμε πέντε. Ο δρομολογητής δεν αποθηκεύει σωστά όλες αυτές τις αποκρίσεις.
Προφανώς, αυτή η επίθεση είναι επίσης χρήσιμη εάν ο δρομολογητής λειτουργεί ως διακομιστής DNS, καθώς επιτρέπει στους πελάτες του δρομολογητή να δεχτούν επίθεση.
Αυτή η επίθεση σάς επιτρέπει επίσης να εκμεταλλευτείτε μια πιο σοβαρή ευπάθεια: υποβάθμιση ή backport της έκδοσης του RouterOS. Ο εισβολέας αναδημιουργεί τη λογική του διακομιστή ενημέρωσης, συμπεριλαμβανομένου του αρχείου καταγραφής αλλαγών, και αναγκάζει το RouterOS να αντιληφθεί την παρωχημένη (ευάλωτη) έκδοση ως τρέχουσα. Ο κίνδυνος εδώ έγκειται στο γεγονός ότι όταν η έκδοση "ενημερώνεται", ο κωδικός πρόσβασης διαχειριστή επαναφέρεται στην προεπιλεγμένη τιμή - ένας εισβολέας μπορεί να συνδεθεί στο σύστημα με κενό κωδικό πρόσβασης!
Η επίθεση είναι αρκετά λειτουργική, παρά το γεγονός ότι
Προστασία
Η απλή απενεργοποίηση του Winbox σάς επιτρέπει να προστατεύεστε από αυτές τις επιθέσεις. Παρά την ευκολία διαχείρισης μέσω Winbox, είναι καλύτερο να χρησιμοποιήσετε το πρωτόκολλο SSH.
Πηγή: www.habr.com