Keupayaan untuk menurunkan taraf peranti dari jauh berdasarkan RouterOS (Mikrotik) meletakkan ratusan ribu peranti rangkaian berisiko. Kerentanan dikaitkan dengan keracunan cache DNS protokol Winbox dan membolehkan anda memuatkan yang sudah lapuk (dengan tetapan semula kata laluan lalai) atau perisian tegar yang diubah suai ke peranti.
Butiran kerentanan
Terminal RouterOS menyokong perintah menyelesaikan untuk carian DNS.
Permintaan ini dikendalikan oleh binari yang dipanggil penyelesai. Penyelesai adalah salah satu daripada banyak binari yang bersambung ke protokol Winbox RouterOS. Pada tahap yang tinggi, "mesej" yang dihantar ke port Winbox boleh dialihkan ke pelbagai binari dalam RouterOS berdasarkan skema penomboran berasaskan tatasusunan.
Secara lalai, RouterOS mempunyai ciri pelayan DNS dilumpuhkan.
Walau bagaimanapun, walaupun apabila fungsi pelayan dilumpuhkan, penghala mengekalkan cache DNSnya sendiri.
Apabila kami membuat permintaan menggunakan winbox_dns_request sebagai contoh.com, penghala akan cache hasilnya.
Memandangkan kita boleh menentukan pelayan DNS di mana permintaan itu harus pergi, memasukkan alamat yang salah adalah remeh. Sebagai contoh, anda boleh mengkonfigurasi pelaksanaan pelayan DNS daripada
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()
Sekarang jika anda mencari example.com menggunakan Winbox, anda boleh melihat bahawa cache DNS penghala telah diracuni.
Sudah tentu, meracuni example.com tidak begitu berguna kerana penghala sebenarnya tidak akan menggunakannya. Walau bagaimanapun, penghala perlu mengakses upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com dan muat turun.mikrotik.com. Dan terima kasih kepada kesilapan lain, adalah mungkin untuk meracuni mereka semua sekaligus.
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()
Penghala meminta satu kebenaran, dan kami memberikan lima kembali. Penghala tidak cache semua respons ini dengan betul.
Jelas sekali, serangan ini juga berguna jika penghala bertindak sebagai pelayan DNS, kerana ia membolehkan pelanggan penghala diserang.
Serangan ini juga membolehkan anda mengeksploitasi kelemahan yang lebih serius: turun taraf atau backport versi RouterOS. Penyerang mencipta semula logik pelayan kemas kini, termasuk log perubahan, dan memaksa RouterOS untuk melihat versi lapuk (terdedah) sebagai semasa. Bahaya di sini terletak pada fakta bahawa apabila versi "dikemas kini", kata laluan pentadbir ditetapkan semula kepada nilai lalai - penyerang boleh log masuk ke sistem dengan kata laluan kosong!
Serangan itu cukup berkesan, walaupun pada hakikatnya
perlindungan
Hanya melumpuhkan Winbox membolehkan anda melindungi diri anda daripada serangan ini. Walaupun kemudahan pentadbiran melalui Winbox, lebih baik menggunakan protokol SSH.
Sumber: www.habr.com