Kemampuan untuk melakukan downgrade perangkat berbasis RouterOS (Mikrotik) dari jarak jauh dapat membahayakan ratusan ribu perangkat jaringan. Kerentanan ini terkait dengan keracunan cache DNS protokol Winbox dan memungkinkan Anda memuat firmware yang sudah ketinggalan zaman (dengan pengaturan ulang kata sandi default) atau yang dimodifikasi ke perangkat.
Detail kerentanan
Terminal RouterOS mendukung perintah penyelesaian untuk pencarian DNS.
Permintaan ini ditangani oleh biner yang disebut penyelesai. Resolver adalah salah satu dari banyak biner yang terhubung ke protokol Winbox RouterOS. Pada tingkat tinggi, "pesan" yang dikirim ke port Winbox dapat dirutekan ke berbagai biner di RouterOS berdasarkan skema penomoran berbasis array.
Secara default, RouterOS menonaktifkan fitur server DNS.
Namun, meskipun fungsi server dinonaktifkan, router tetap mempertahankan cache DNS-nya sendiri.
Saat kita membuat request menggunakan winbox_dns_request misalnya example.com, router akan menyimpan hasilnya dalam cache.
Karena kita dapat menentukan server DNS yang akan digunakan untuk mengirim permintaan, memasukkan alamat yang salah adalah hal yang sepele. Misalnya, Anda dapat mengonfigurasi implementasi server DNS dari
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 dapat melihat bahwa cache DNS router diracuni.
Tentu saja, meracuni example.com tidak terlalu berguna karena router tidak benar-benar menggunakannya. Namun, router perlu mengakses upgrade.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com dan download.mikrotik.com. Dan berkat kesalahan lainnya, mereka bisa diracuni 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()
Router meminta satu izin, dan kami memberikan lima izin kembali. Router tidak menyimpan semua tanggapan ini dengan benar.
Tentu saja, serangan ini juga berguna jika router bertindak sebagai server DNS, karena memungkinkan klien dari router tersebut diserang.
Serangan ini juga memungkinkan Anda mengeksploitasi kerentanan yang lebih serius: downgrade atau backport versi RouterOS. Penyerang membuat ulang logika server pembaruan, termasuk log perubahan, dan memaksa RouterOS untuk menganggap versi lama (rentan) sebagai versi terbaru. Bahayanya di sini terletak pada kenyataan bahwa ketika versi "diperbarui", kata sandi administrator diatur ulang ke nilai default - penyerang dapat masuk ke sistem dengan kata sandi kosong!
Meskipun demikian, serangan tersebut cukup berhasil
perlindungan
Cukup menonaktifkan Winbox memungkinkan Anda melindungi diri dari serangan ini. Meskipun kemudahan administrasi melalui Winbox, lebih baik menggunakan protokol SSH.
Sumber: www.habr.com