
Анализ и PoC для CVE-2018-14847, уязвимости раскрытия информации в MikroTik RouterOS Winbox, позволяющей неавторизованный доступ на чтение к базе учётных данных.
Неаутентифицированный обход пути в протоколе Winbox от MikroTik, приводящий к утечке учетных данных администратора из /flash/rw/store/user.dat
CVE-2018-14847 — это уязвимость обхода пути в MikroTik RouterOS, затрагивающая протокол управления Winbox (TCP-порт 8291). Неаутентифицированный удалённый злоумышленник может читать произвольные файлы из файловой системы роутера, включая базу учётных данных пользователя /flash/rw/store/user.dat, в которой пароли хранятся в зашифрованном виде с помощью слабого статического XOR-ключа.
Уязвимость была впервые раскрыта Джейкобом Бейнсом (Tenable) в июле 2018 года через эксплойт By the Way. Данный репозиторий содержит самостоятельную реализацию на Python3 с полной документацией протокола.
| Канал | Версии |
|---|
| Longterm | 6.30.1 - 6.40.7 |
| Stable | 6.29 - 6.42 |
| Beta | 6.29rc1 - 6.43rc3 |
MikroTik исправил эту уязвимость в апреле 2018 года. Устройства, работающие на более старых версиях RouterOS, чем исправленные, остаются уязвимыми.
Winbox — это проприетарный бинарный протокол управления MikroTik, работающий через TCP-порт 8291. Фреймы структурированы следующим образом:
[total_len - 2][0x01][0x00][total_len - 4]["M2"][fields...]
4-байтовый заголовок кодирует общий размер фрейма. Это не стандартный little-endian u16 — каждый байт независимо кодирует total_length - 2 и total_length - 4.
Кодирование полей внутри каждого фрейма:
| Тип байта | Значение | Значение |
|---|---|---|
| 0xff | Маркер расширенного поля | за ним следуют field_id и значение |
| 0x09 | u8 целое | 1 байт |
| 0x21 | Строка | префикс длины (1 байт) + данные |
| 0x88 | Маркер ожидания ответа | без значения |
| 0xfe | Идентификатор расширенного поля | 3-байтовый id + тип + значение |
Обработчик файловой системы находится на конечной точке (sys=5, handler=0) и предоставляет три релевантные команды:
Обработчик файловой системы Winbox не санирует путь, передаваемый в команду открытия файла. Встраивая последовательности '/////./../', злоумышленник выходит за границы песочницы и достигает корневой файловой системы:
/////./..//////./..//////./../flash/rw/store/user.dat
Каждый сегмент '/////./../' (10 байт) поднимается на один уровень каталога вверх. Три сегмента достигают корня, после чего flash/rw/store/user.dat представляет собой базу учётных данных пользователя RouterOS. Запрос не требует аутентификации.
Эксплойт отправляет два фрейма:
user.dat представляет собой последовательность записей nv::message. Каждая запись предваряется 2-байтовым полем длины в LE и начинается с магических байтов M2. Поля внутри каждой записи используют 3-байтовый идентификатор поля в LE:
| Идентификатор поля | Тип | Значение |
|---|
| 0x01 | строка | имя пользователя |
| 0x02 | u8 | группа — 3 = полный доступ администратора |
| 0x11 | строка | зашифрованный пароль (пусто, если не задан) |
Пароли шифруются с помощью статического XOR-ключа, полученного из жёстко заданной соли, скомпилированной в RouterOS:
key = MD5(username + "283i4jfkai3389")
password = XOR(encrypted_pass[i], key[i % len(key)]) до нулевого байта
Это означает, что любой user.dat, извлечённый с любого затронутого устройства, может быть дешифрован офлайн без перебора.
После получения пароля администратора злоумышленник может аутентифицироваться через Winbox и использовать команду create-file для записи двух файлов, активирующих скрытый вход разработчика:
/pckg/option активирует пакет option
/flash/nova/etc/devel-login включает пользователя devel
После создания этих файлов роутер предоставляет root-оболочку BusyBox через Telnet и SSH под пользователем devel, используя пароль администратора.
На некоторых версиях RouterOS сначала необходимо подключиться через Telnet, чтобы заработал SSH.
Exploit_CVE_2018_14847.py — это самодостаточный эксплойт на Python3 без внешних зависимостей. Он реализует бинарный протокол Winbox с нуля и выполняет:
# Порт по умолчанию 8291
python3 Exploit_CVE_2018_14847.py 192.168.1.10
# Пользовательский порт
python3 Exploit_CVE_2018_14847.py 192.168.1.10 8291
Пост-эксплуатация — разработческий бэкдор:
# Telnet (сначала необходимо подключиться)
telnet -l devel 192.168.1.10
# SSH (после сессии Telnet)
ssh -oHostKeyAlgorithms=+ssh-dss [email protected]
Уведомление о безопасности MikroTik