RouterOS (Mikrotik) tabanlı cihazların sürümünün uzaktan düşürülmesi, yüz binlerce ağ cihazını riske atıyor. Güvenlik açığı, Winbox protokolünün DNS önbelleğinin zehirlenmesiyle ilişkilidir ve cihaza güncel olmayan (varsayılan şifre sıfırlamayla) veya değiştirilmiş ürün yazılımını yüklemenize olanak tanır.
Güvenlik açığı ayrıntıları
RouterOS terminali, DNS araması için çözümleme komutunu destekler.
Bu istek çözümleyici adı verilen bir ikili dosya tarafından işlenir. Resolver, RouterOS'un Winbox protokolüne bağlanan birçok ikili dosyadan biridir. Yüksek düzeyde, Winbox bağlantı noktasına gönderilen "mesajlar", dizi tabanlı bir numaralandırma şemasına dayalı olarak RouterOS'taki çeşitli ikili dosyalara yönlendirilebilir.
RouterOS'ta varsayılan olarak DNS sunucusu özelliği devre dışıdır.
Однако даже при отключенной функции сервера маршрутизатор поддерживает собственный кэш DNS.
Örnek.com gibi winbox_dns_request kullanarak bir istek yaptığımızda, yönlendirici sonucu önbelleğe alacaktır.
İsteğin geçmesi gereken DNS sunucusunu belirleyebildiğimiz için yanlış adreslerin girilmesi önemsizdir. Örneğin, bir DNS sunucusu uygulamasını şuradan yapılandırabilirsiniz:
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()
Artık Winbox'ı kullanarak example.com'u ararsanız, yönlendiricinin DNS önbelleğinin zehirlendiğini görebilirsiniz.
Elbette example.com'u zehirlemek, yönlendiricinin aslında onu kullanmayacağı için pek kullanışlı değildir. Ancak yönlendiricinin, update.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com ve download.mikrotik.com adreslerine erişmesi gerekir. Ve başka bir hata sayesinde hepsini birden zehirlemek mümkündür.
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()
Yönlendirici bir izin ister ve biz beşini geri veririz. Yönlendirici bu yanıtların tümünü doğru şekilde önbelleğe almıyor.
Açıkçası, bu saldırı, yönlendiricinin istemcilerinin saldırıya uğramasına izin verdiğinden, yönlendirici bir DNS sunucusu gibi davranıyorsa da faydalıdır.
Bu saldırı aynı zamanda daha ciddi bir güvenlik açığından yararlanmanıza da olanak tanır: RouterOS sürümünün düşürülmesi veya desteklenmesi. Saldırgan, değişiklik günlüğü de dahil olmak üzere güncelleme sunucusunun mantığını yeniden oluşturur ve RouterOS'u eski (savunmasız) sürümü güncel olarak algılamaya zorlar. Buradaki tehlike, sürüm "güncellendiğinde" yönetici şifresinin varsayılan değere sıfırlanmasıdır - bir saldırgan sisteme boş bir şifreyle giriş yapabilir!
Saldırı oldukça işe yarıyor
koruma
Winbox'ı basitçe devre dışı bırakmak, kendinizi bu saldırılara karşı korumanıza olanak tanır. Winbox üzerinden yönetimin kolaylığına rağmen SSH protokolünü kullanmak daha iyidir.
Kaynak: habr.com