توانایی کاهش از راه دور دستگاه های مبتنی بر RouterOS (Mikrotik) صدها هزار دستگاه شبکه را در معرض خطر قرار می دهد. این آسیبپذیری با مسموم شدن حافظه پنهان DNS پروتکل Winbox مرتبط است و به شما امکان میدهد سیستمافزار قدیمی (با تنظیم مجدد رمز عبور پیشفرض) یا اصلاحشده را روی دستگاه بارگیری کنید.
جزئیات آسیب پذیری
ترمینال RouterOS از دستور حل برای جستجوی DNS پشتیبانی می کند.
این درخواست توسط یک باینری به نام حل کننده بررسی می شود. 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 روتر مسموم شده است.
البته، 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 عمل کند، زیرا به مشتریان روتر اجازه حمله میدهد.
این حمله همچنین به شما این امکان را می دهد که از آسیب پذیری جدی تری سوء استفاده کنید: نسخه RouterOS را کاهش دهید یا backport کنید. مهاجم منطق سرور بهروزرسانی، از جمله تغییرات را ایجاد میکند و RouterOS را مجبور میکند تا نسخه قدیمی (آسیبپذیر) را بهعنوان فعلی درک کند. خطر در اینجا در این واقعیت نهفته است که هنگام "به روز رسانی" نسخه، رمز عبور مدیر به مقدار پیش فرض بازنشانی می شود - مهاجم می تواند با یک رمز عبور خالی وارد سیستم شود!
با وجود این واقعیت، حمله کاملاً کار می کند
حفاظت
به سادگی غیرفعال کردن Winbox به شما امکان می دهد از خود در برابر این حملات محافظت کنید. با وجود راحتی مدیریت از طریق Winbox، بهتر است از پروتکل SSH استفاده کنید.
منبع: www.habr.com