
Muligheden for at nedgradere enheder baseret på RouterOS (Mikrotik) fjerner sikkerheden for hundredtusindvis af netværksenheder. Sårbarheden er relateret til forurening af DNS-cache i Winbox-protokollen og muliggør nedladning af forældet (med nulstilling af koden "som standard") eller modificeret firmware til enheden.

Detaljer om sårbarheden
RouterOS-terminalen understøtter en kommando til opløsning af DNS.

Denne forespørgsel behandles af en binær fil ved navn resolver. Resolver er en af mange binære filer, der er tilsluttet Winbox-protokollen fra RouterOS. På et højt niveau kan "beskeder", der sendes til Winbox-porten, henvises til forskellige binære filer i RouterOS baseret på en array-baseret nummereringsschema.
Som standard er DNS-serverfunktionen deaktiveret i RouterOS.

Selvom serverfunktionen er deaktiveret, understøtter routeren sin egen DNS-cache.

Når vi foretager en forespørgsel ved hjælp af winbox_dns_request, for eksempel example.com, vil routeren cache resultatet.

Da vi kan angive en DNS-server, som forespørgslen skal gå gennem, er det trivielt at indtaste falske adresser. For eksempel kan man konfigurere en DNS-serverimplementering fra , så den altid svarer med en A-post, der indeholder IP-adressen 192.168.88.250.
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()Nu, hvis man søger example.com via Winbox, kan man se, at routerens DNS-cache er forurenet.

Selvfølgelig er forurening af example.com ikke særlig nyttigt, da routeren faktisk ikke vil bruge det. Ikke desto mindre skal routeren lave anmodninger til upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com og download.mikrotik.com. Og takket være en anden fejl er der mulighed for at forene dem alle på én gang.
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()Routeren anmoder om én tilladelse, og vi giver fem tilbage. Routeren cachen alle disse svar forkert.

Det er tydeligt, at denne angreb også er nyttig, hvis routeren fungerer som DNS-server, da det gør det muligt at angrebe routerens kunder.
Denne angreb udnyttes også til at udnytte en mere alvorlig sårbarhed: at gennemføre et downgrade eller backport af RouterOS-versionen. Angriberen genskaber logikken fra opdateringsserveren, inklusive changelog, og får RouterOS til at opfatte en forældet (sårbar) version som aktuel. Faren her ligger i, at ved "opdatering" af versionen nulstilles administratorpassordet til værdi "standard" - angriberen kan logge ind med et tomt password!

Angrebet fungerer fint, selvom implementerer flere andre vektorer, herunder , men det er allerede en overdreven teknik, og anvendelsen heraf til ulovlige formål er strafbart.
Lag
En simpel deaktivering af Winbox kan beskytte mod disse angreb. På trods af bekvemmeligheden ved administration via Winbox er det bedre at bruge SSH-protokollen.
Kilde: habr.com
