<>COVID-19 и новогодние поздравления: исследуем инструменты группировки Higaisa>
В марте 2022 года специалисты PT Expert Security Center анализировали активность APT-группировки Higaisa. Впервые ее деятельность была подробно изучена аналитиками Tencent в ноябре 2022. Исследователи считают, что Higaisa имеет южнокорейские корни. Активность группировки прослеживается вплоть до 2009 года и продолжается по сей день. По данным Tencent основными целями Higaisa являются государственные, общественные и торговые организации в Северной Корее, однако в число атакованных стран также входят Китай, Япония, Россия, Польша и другие.
На начальном этапе заражения Higaisa использует сообщения об актуальных событиях и новостях, а также поздравления с праздниками, такими как Новый год, китайский праздник фонарей, северокорейские национальные праздники. В большинстве случаев используется английский язык, поэтому многие «приманки» могут быть актуальны для англоговорящих стран.
В связи с пандемией коронавируса (COVID-19) многие APT-группы, в числе которых Gamaredon, SongXY, TA428, Lazarus, Konni, Winnti, используют эту тему в своих кампаниях. Не стала исключением и Higaisa.
В этой статье мы изучим созданный группировкой вредоносный файл, который был обнаружен нашими экспертами 11 марта в рамках исследования угроз информационной безопасности. Мы также сравним его с более ранними образцами и проанализируем произошедшие изменения.
Объект 1: 20220308-sitrep-48-covid-19.pdf.lnk
Стадия 1. Ярлык
Заражение начинается с файла 20220308-sitrep-48-covid-19.pdf.lnk, замаскированного под PDF.
Рисунок 2. Содержимое LNK-файла
Файл является ярлыком .lnk с иконкой PDF-документа. При попытке открытия выполняется команда cmd.exe /c со следующей командной строкой (для улучшения читаемости добавлены переносы и пробелы):
Рисунок 3. Командная строка, исполняемая ярлыком
В результате во временную папку копируется сам ярлык и файл C:\Windows\System32\CertUtil.exe под именем msoia.exe. При этом вместо прямого указания названия CertUtil.exe используется маска *ertu*.exe и поиск с помощью команды for, что позволяет обойти сигнатуры на имя файла.
Запуском findstr.exe извлекается Base64-нагрузка, содержащаяся в конце LNK-файла, которая затем декодируется с помощью CertUtil.exe (msioa.exe).
Стадия 2. Архив
Результат декодирования представляет собой CAB-архив, который распаковывается в ту же папку %tmp% и содержит следующие файлы:
- 3UDBUTNY7YstRc.tmp (DLL, используется при автозапуске),
- 9sOXN6Ltf0afe7.js (скрипт установки),
- 486AULMsOPmf6W.tmp (легитимный исполняемый файл, используется при автозапуске),
- 20220308-sitrep-48-covid-19.pdf (приманка, оригинальный файл отчета ВОЗ),
- cSi1r0uywDNvDu.tmp (XSL, содержит часть кода установки на VBScript),
- MiZl5xsDRylf0W.tmp (полезная нагрузка установщика).
После извлечения запускается следующая стадия закрепления в системе ― файл 9sOXN6Ltf0afe7.js.
Стадия 3. JS-скрипт. Начало
Скрипт записан в виде одной строки:
Рисунок 4. Фрагмент кода 9sOXN6Ltf0afe7.js
Фактически скрипт исполняет следующие консольные команды:
Рисунок 5. Консольные команды в 9sOXN6Ltf0afe7.js
Во временной папке %tmp% создается папка с именем cscript.exe, куда копируется оригинальный скриптовый интерпретатор cscript.exe под именем msproof.exe, а также XSL-файл под именем WsmPty.xsl. XSL-файл имеет следующий вид:
Рисунок 6. Фрагмент кода WsmPty.xsl
С помощью интерпретатора запускается легитимный скрипт %windir%\System32\winrm.vbs (консольный инструмент для работы с API Windows Remote Management). Ему передается команда get wmicimv2/Win32_Process?Handle=4 и формат вывода: -format:pretty.
При указании такого формата winrm.vbs подтянет из директории, в которой находится интерпретатор cscript.exe, файл WsmPty.xsl. Этот файл будет использоваться для форматирования вывода команды (вне зависимости от успешности ее исполнения). В свою очередь, это приведет к выполнению встроенного в него VBScript-кода.
Данная техника, описанная в 2022 году Мэттом Гребером, позволяет обойти ограничения белых списков приложений и запустить произвольный неподписанный код. При этом необходимое условие работы winrm.vbs ― наличие строки cscript.exe в пути к интерпретатору. Именно поэтому папка, в которую он копируется, создается с таким именем.
Стадия 4. XSL
Запускаемый VBScript-код содержит в себе hex-строку и код, выполняющий ее декодирование и исполнение с помощью execute. Преобразуем hex в байты и заменим обфусцированные названия переменных в соответствии с их значением:
Рисунок 7. Деобфусцированный VBScript-код
Суть кода сводится к созданию папки OFFICE12 в профиле пользователя и созданию ярлыка Accessories.lnk в папке автозагрузки. При этом ярлык запускает полезную нагрузку не напрямую, а с помощью функции FileProtocolHandler из библиотеки url.dll:
Кроме того, с помощью функции Write4D5A90 в %tmp% создается файл 2m7EBxdH3wHwBO.tmp, содержащий в себе три начальных байта EXE-файла — 0x4D, 0x5A, 0x90.
Стадия 3. JS-скрипт. Продолжение
После исполнения VBScript в XSL продолжается исполнение консольных команд, запущеных JS-кодом. В созданную в профиле пользователя папку OFFICE12 копируются три файла:
- MSOSTYLE.EXE
- OINFO12.OCX
- Wordcnvpxy.exe
При этом последний файл, являющийся полезной нагрузкой, склеивается из созданного VBScript трехбайтного начала и распакованного ранее MiZl5xsDRylf0W.tmp. В результате получается корректный EXE-файл.
MSOSTYLE.EXE является легитимным файлом из поставки Microsoft Office 2007. С его помощью выполняется side-loading DLL-библиотеки OINFO12.OCX.
OINFO12.OCX содержит в себе только код для исполнения финальной нагрузки:
Рисунок 8. Запуск Wordcnvpxy.exe в DllMain
А также не исполняющийся на практике код в экспортируемых функциях (мы предполагаем, что это попытка обойти детектирование в песочницах):
Рисунок 9. Код GetOfficeData() Рисунок 10. Код DeleteOfficeData()
Последний шаг работы скрипта — открытие PDF-файла с приманкой.
Загрузчик Wordcnvpxy.exe
Полезная нагрузка является приложением, создающим скрытое окно (имя класса и окна ― SK_Parasite).
Рисунок 11. Создание окна и цикл обработки событий в Wordcnvpxy.exe
Необходимые для работы функции загружаются динамически, при этом для декодирования имен библиотек используется Base64 с алфавитом z2bqw7k90rJYALIQUxZK%sO=hd5C4piVMFlaRucWy31GTNH-mED8fnXtPvSojeB6g, а вместо имен функций используются их хеши по алгоритму SuperFastHash.
Рисунок 12. Динамически загружаемые библиотеки
Основной код выполняется в отдельном потоке: каждые 10 минут приложение обращается на C&C-сервер motivation[.]neighboring[.]site, передавая идентификатор компьютера в строке User-Agent. В качестве идентификатора используется SuperFastHash от серийного номера системного тома и имени компьютера.
Рисунок 13. Основной цикл загрузчика
Ответ сервера сохраняется во временном файле. При наличии в ответе не менее 10 байт, он декодируется Base64 и делится на две части по символу $: зашифрованный RC4 исполняемый файл и его имя без расширения.
Рисунок 14. Обработка ответа сервера
Интересен метод построения ключа для дешифровки RC4: он генерируется с помощью рекуррентной последовательности, которая начинается с двух чисел (28 и 39), а каждый следующий элемент в ней является суммой двух предыдущих по модулю 255. Ключ состоит из 64 байт и начинается с первой суммы в последовательности. Далее ключ расширяется до 256 байт (зацикливанием) и используется в стандартном алгоритме RC4.
Рисунок 15. Генерация RC4-ключа в Wordcnvpxy.exe
Полученный с сервера исполняемый файл сохраняется в %TEMP% под указанным именем и запускается.
Объект 2: 邀请函.doc (Приглашение.doc)
Представляет собой RTF-файл с поздравлениями:
Рисунок 16. Документ с поздравительным текстом
Документ создан с помощью популярного билдера Royal Road RTF (или 8.t), эксплуатирующего уязвимость CVE-2022-0798 в Microsoft Equation Editor. Этот билдер недоступен публично, однако широко распространен среди китайских APT-группировок, в числе которых TA428, Goblin Panda, IceFog, SongXY. Название 8.t связано с тем, что вредоносный документ в процессе эксплуатации создает во временной папке файл с именем 8.t, содержащий зашифрованную полезную нагрузку.
В результате эксплуатации уязвимости создается файл %APPDATA%\microsoft\word\startup\intel.wll. Это DLL-дроппер, который будет загружен при следующем старте Microsoft Word. Его полезная нагрузка состоит из двух файлов: %ALLUSERSPROFILE%\TotalSecurity\360ShellPro.exe и %ALLUSERSPROFILE%\TotalSecurity\utils\FileSmasher.exe. Файлы зашифрованы с помощью xor 0x1A.
Рисунок 17. Главная функция дроппера intel.wll (фрагмент)
Для закрепления в системе дроппер создает ярлык в папке автозагрузки, запускающий %ALLUSERSPROFILE%\TotalSecurity\360ShellPro.exe с ключом /func=5. Данный файл является модифицированным компонентом антивируса 360 Total Security. Он используется для передачи управления загрузчику FileSmasher.exe с помощью техники, подобной DLL side-loading.
В легитимный 360ShellPro.exe вшит набор относительных путей к исполняемым файлам. В зависимости от значения аргумента /func= выбирается и запускается нужный файл.
Рисунок 18. Выбор файла в зависимости от параметра func
Загрузчик FileSmasher.exe
Файл во многом похож на Wordcnvpxy.exe. Это также оконное приложение (имя класса: NIS_K), но для запуска основного кода в данном случае используется таймер с периодом 10 минут, а не отдельный поток.
Рисунок 19. Создание окна, установка таймера, цикл обработки событий в FileSmasher.exe
Динамическая загрузка DLL не используется (все импорты статические), адрес C&C-сервера восстанавливается с помощью аналогичной функции для дешифровки RC4 (вместо декодирования Base64 с нестандартным алфавитом). При этом начальные элементы последовательности, с помощью которой генерируется ключ, имеют другие значения — 8 и 5, а сам алгоритм генерации полностью повторяется.
Рисунок 20. Генерация RC4-ключа в FileSmasher.exe
В качестве идентификатора зараженной машины используется CRC32 от серийного номера системного тома. Он передается в явном виде в качестве GET-параметра. Полный адрес, по которому загрузчик обращается к серверу, выглядит как http://walker[.]shopbopstar[.]top/blog/index.php?ei=<32 random chars>&ti=
Рисунок 21. Построение URL для обращения к контрольному серверу в FileSmasher.exe
Алгоритм загрузки также практически не отличается:
- Ответ сервера сохраняется во временном файле и обрабатывается только при наличии в нем не менее 10 байт.
- В отличие от Wordcnvpxy.exe, декодирование Base64 отсутствует.
- Разделение на две части происходит по символу & (вместо $).
- Первая часть также представляет собой зашифрованный RC4 исполняемый файл, вторая — его имя без расширения.
- Для дешифровки файла используется та же функция, что и для дешифровки адреса (параметры RC4 ключа — 8, 5).
Загруженный файл запускается с помощью CreateProcess.
Интересно, что среди ресурсов файлов Wordcnvpxy.exe и FileSmasher.exe присутствует диалоговое окно About с именем приложения и копирайтом.
Рисунок 22. Диалоговое окно About в ресурсах FileSmasher.exe
Такое окно, а также другие ресурсы (Menu, Accelerators), по всей видимости, генерируются Visual Studio при создании проекта. В случае Wordcnvpxy.exe имя приложения, указанное в диалоге, совпадает с именем класса окна (SK_Parasite). Однако в FileSmasher.exe это не так: приложение называется AttackBot, а в его версии мы видим сокращение NIS, которое ранее встречалось в имени оконного класса (NIS_K).
Эксперты Tencent связывают группу Higaisa с Республикой Корея, а в качестве основных интересов группы указывают северокорейские государственные и торговые организации. Это позволяет предположить, что NIS в данном случае может расшифровываться как National Intelligence Service — Национальное агентство разведки республики Корея. В то же время SK_Parasite можно считать отсылкой к южнокорейскому фильму «Паразиты» (2022 г.). Сами по себе эти данные недостаточны, чтобы делать какие-либо выводы, однако могут косвенно подтверждать связь файлов с Южной Кореей.
Связанные объекты
Содержание исходного документа (поздравления с новогодними праздниками) и даты компиляции файлов (22.12.2022) позволяют определенно говорить о периоде, в котором он использовался злоумышленниками. Однако это не единственный подобный объект: аналитиками Tencent была зафиксирована рассылка в тот же период вредоносных исполняемых файлов с именами Happy-new-year-2022.scr и 2022-New-Year-Wishes-For-You.scr. В данном случае исходные файлы являются исполняемыми, а приманка присутствует в виде поздравительной JPG-открытки, которая распаковывается и открывается в программе просмотра по умолчанию:
Рисунок 23. Открытка в Happy-new-year-2022.scr Рисунок 24. Открытка в 2022-New-Year-Wishes-For-You.scr
Структура этих угроз, за вычетом эксплуатации CVE-2022-0798, практически идентична RTF-документу. SCR-файлы являются дропперами, полезная нагрузка дешифруется с помощью xor 0x1A и распаковывается в подпапку в %ALLUSERSPROFILE%.
Рисунок 25. Главная функция дроппера 2022-New-Year-Wishes-For-You.scr (фрагмент)
Полезная нагрузка состоит из легитимного исполняемого файла (используется rekeywiz.exe из поставки Windows 7) и DLL-библиотеки загрузчика Duser.dll. Легитимный файл добавляется в автозагрузку с помощью ярлыка.
Загрузчик расшифровывает URL с помощью RC4 (начальные значения: 8, 5 и 9, 5), добавляет в GET-параметры случайную строку и CRC32 — идентификатор компьютера.
Рисунок 26. Построение URL для обращения к контрольному серверу в Duser.dll (дроппер 2022-New-Year-Wishes-For-You.scr)
Экземпляр загрузчика, распакованный из 2022-New-Year-Wishes-For-You.scr, для соединения с C&C-сервером использует статически слинкованную библиотеку libcurl, другой экземпляр — статически импортированные функции из библиотеки winhttp.dll, как и FileSmasher.exe.
Обращения происходят по адресам: http://adobeinfo[.]shopbopstar[.]top/notice/index.php и http://petuity[.]shopbopstar[.]top/research/index.php.
В обоих случаях от сервера ожидаются данные в том же формате, что и в FileSmasher.exe.
Несмотря на то, что оба описанных дроппера не создают никаких окон, в них также встречается стандартный набор оконных ресурсов, включая диалоговое окно About. В качестве имени приложения используются строки “K_NIS” и “KISA”.
Ответы C&C-сервера
В качестве полезной нагрузки, распространяемой C&C-сервером, использовались два вида компонентов:
- Сборщик информации о системе (InfoStealer), работа которого сводится к исполнению консольной команды systeminfo & ipconfig -all & tasklist & net view & dir c:\ & dir c:\users\ & dir d:\ & dir e:\ и отправке ее вывода на командный сервер.
- Gh0st RAT в различных модификациях, в частности с реализацией всей существенной функциональности в DLL-плагинах, загружаемых с C&C-сервера.
Полученные экземпляры Gh0st RAT в сравнении с публично доступным исходным кодом интересны наличием нестандартного шифрования отправляемых и принимаемых данных. Для пакетов, содержащих более 10 байт полезной нагрузки (не считая заголовка), первые 10 байт обрабатываются XOR с ключом 0x12, причём байты 0x0 и 0x12 не меняются. При этом для сжатия данных вместо zlib используется LZO.
Рисунок 27. Декомпилированный код функции CClientSocket::OnRead
Кроме того, поле m_bPacketFlag — сигнатура пакетов, отправляемых на командный сервер, инициализируется псевдорандомным значением, которое вычисляется на основе вызова GetTickCount(). В оригинальном коде поле равно Gh0st.
Рисунок 28. Инициализация поля CClientSocket::m_bPacketFlag
Заключение
По результатам исследования мы видим, как эволюционировали со временем вредоносные объекты, используемые для заражения группировкой Higaisa — от прямого распространения исполняемых файлов до применения эксплойтов и сложных многоступенчатых угроз. Однако структура используемых инструментов (дропперы, загрузчики) во многом остается неизменной. Для усложнения детектирования злоумышленники варьируют отдельные детали, такие как URL контрольного сервера, параметры RC4-ключа, используемые для DLL side-loading легитимные файлы, библиотеки для HTTP-взаимодействия.
Автор: Алексей Захаров, Positive Technologies