Khả năng hạ cấp từ xa các thiết bị dựa trên RouterOS (Mikrotik) khiến hàng trăm nghìn thiết bị mạng gặp rủi ro. Lỗ hổng này có liên quan đến việc đầu độc bộ đệm DNS của giao thức Winbox và cho phép bạn tải chương trình cơ sở đã lỗi thời (với cài đặt lại mật khẩu mặc định) hoặc chương trình cơ sở đã sửa đổi vào thiết bị.
Chi tiết về lỗ hổng
Thiết bị đầu cuối RouterOS hỗ trợ lệnh giải quyết để tra cứu DNS.
Yêu cầu này được xử lý bởi một hệ nhị phân được gọi là trình phân giải. Resolver là một trong nhiều chương trình nhị phân kết nối với giao thức Winbox của RouterOS. Ở mức cao, "tin nhắn" được gửi tới cổng Winbox có thể được định tuyến đến nhiều tệp nhị phân khác nhau trong RouterOS dựa trên sơ đồ đánh số dựa trên mảng.
Theo mặc định, RouterOS đã tắt tính năng máy chủ DNS.
Tuy nhiên, ngay cả khi chức năng máy chủ bị tắt, bộ định tuyến vẫn duy trì bộ đệm DNS của riêng nó.
Khi chúng tôi thực hiện yêu cầu bằng winbox_dns_request chẳng hạn như example.com, bộ định tuyến sẽ lưu kết quả vào bộ đệm.
Vì chúng tôi có thể chỉ định máy chủ DNS mà yêu cầu sẽ được gửi qua đó nên việc nhập địa chỉ không chính xác là điều bình thường. Ví dụ: bạn có thể định cấu hình triển khai máy chủ DNS từ
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()
Bây giờ nếu bạn tìm kiếm example.com bằng Winbox, bạn có thể thấy rằng bộ đệm DNS của bộ định tuyến đã bị nhiễm độc.
Tất nhiên, việc đầu độc example.com không hữu ích lắm vì bộ định tuyến sẽ không thực sự sử dụng nó. Tuy nhiên, bộ định tuyến cần truy cập vào nâng cấp.mikrotik.com, cloud.mikrotik.com, cloud2.mikrotik.com và download.mikrotik.com. Và nhờ một sai lầm khác, có thể đầu độc tất cả chúng cùng một lúc.
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()
Bộ định tuyến yêu cầu một quyền và chúng tôi cấp lại năm quyền. Bộ định tuyến không lưu trữ chính xác tất cả các phản hồi này.
Rõ ràng, cuộc tấn công này cũng hữu ích nếu bộ định tuyến hoạt động như một máy chủ DNS, vì nó cho phép các máy khách của bộ định tuyến bị tấn công.
Cuộc tấn công này cũng cho phép bạn khai thác một lỗ hổng nghiêm trọng hơn: hạ cấp hoặc backport phiên bản RouterOS. Kẻ tấn công tạo lại logic của máy chủ cập nhật, bao gồm cả nhật ký thay đổi và buộc RouterOS coi phiên bản lỗi thời (dễ bị tổn thương) là phiên bản hiện tại. Điều nguy hiểm ở đây nằm ở chỗ khi phiên bản được “cập nhật”, mật khẩu quản trị viên sẽ được đặt lại về giá trị mặc định - kẻ tấn công có thể đăng nhập vào hệ thống bằng mật khẩu trống!
Cuộc tấn công khá hiệu quả, mặc dù thực tế là
sự bảo vệ
Chỉ cần vô hiệu hóa Winbox sẽ cho phép bạn tự bảo vệ mình khỏi những cuộc tấn công này. Mặc dù việc quản trị thông qua Winbox thuận tiện nhưng tốt hơn nên sử dụng giao thức SSH.
Nguồn: www.habr.com