Positive Technologies
PT Expert Security Center

COVID-19 и новогодние поздравления: исследуем инструменты группировки Higaisa

COVID-19 и новогодние поздравления: исследуем инструменты группировки Higaisa

В марте 2020 года специалисты PT Expert Security Center анализировали активность APT-группировки Higaisa. Впервые ее деятельность была подробно изучена аналитиками Tencent в ноябре 2019. Исследователи считают, что Higaisa имеет южнокорейские корни. Активность группировки прослеживается вплоть до 2009 года и продолжается по сей день. По данным Tencent основными целями Higaisa являются государственные, общественные и торговые организации в Северной Корее, однако в число атакованных стран также входят Китай, Япония, Россия, Польша и другие.

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

В связи с пандемией коронавируса (COVID-19) многие APT-группы, в числе которых Gamaredon, SongXY, TA428, Lazarus, Konni, Winnti, используют эту тему в своих кампаниях. Не стала исключением и Higaisa.

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

Объект 1: 20200308-sitrep-48-covid-19.pdf.lnk

Рисунок 1. PDF-документ с отчетом ВОЗ
Рисунок 1. PDF-документ с отчетом ВОЗ

Стадия 1. Ярлык

Заражение начинается с файла 20200308-sitrep-48-covid-19.pdf.lnk, замаскированного под PDF.

Рисунок 2. Содержимое LNK-файла
Рисунок 2. Содержимое LNK-файла

Файл является ярлыком .lnk с иконкой PDF-документа. При попытке открытия выполняется команда cmd.exe /c со следующей командной строкой (для улучшения читаемости добавлены переносы и пробелы):

Рисунок 3. Командная строка, исполняемая ярлыком
Рисунок 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 (легитимный исполняемый файл, используется при автозапуске),
  • 20200308-sitrep-48-covid-19.pdf (приманка, оригинальный файл отчета ВОЗ),
  • cSi1r0uywDNvDu.tmp (XSL, содержит часть кода установки на VBScript),
  • MiZl5xsDRylf0W.tmp (полезная нагрузка установщика).

После извлечения запускается следующая стадия закрепления в системе ― файл 9sOXN6Ltf0afe7.js.

Стадия 3. JS-скрипт. Начало

Скрипт записан в виде одной строки:

Рисунок 4. Фрагмент кода 9sOXN6Ltf0afe7.js
Рисунок 4. Фрагмент кода 9sOXN6Ltf0afe7.js

Фактически скрипт исполняет следующие консольные команды:

Рисунок 5. Консольные команды в 9sOXN6Ltf0afe7.js
Рисунок 5. Консольные команды в 9sOXN6Ltf0afe7.js

Во временной папке %tmp% создается папка с именем cscript.exe, куда копируется оригинальный скриптовый интерпретатор cscript.exe под именем msproof.exe, а также XSL-файл под именем WsmPty.xsl. XSL-файл имеет следующий вид:

Рисунок 6. Фрагмент кода WsmPty.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-кода.

Данная техника, описанная в 2018 году Мэттом Гребером, позволяет обойти ограничения белых списков приложений и запустить произвольный неподписанный код. При этом необходимое условие работы winrm.vbs ― наличие строки cscript.exe в пути к интерпретатору. Именно поэтому папка, в которую он копируется, создается с таким именем.

Стадия 4. XSL

Запускаемый VBScript-код содержит в себе hex-строку и код, выполняющий ее декодирование и исполнение с помощью execute. Преобразуем hex в байты и заменим обфусцированные названия переменных в соответствии с их значением:

Рисунок 7. Деобфусцированный VBScript-код
Рисунок 7. Деобфусцированный VBScript-код

Суть кода сводится к созданию папки OFFICE12 в профиле пользователя и созданию ярлыка Accessories.lnk в папке автозагрузки. При этом ярлык запускает полезную нагрузку не напрямую, а с помощью функции FileProtocolHandler из библиотеки url.dll:

C:\Windows\System32\rundll32.exe C:\Windows\system32\url.dll,FileProtocolHandler %UserProfile%\OFFICE12\MSOStyle.exe

Кроме того, с помощью функции 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
Рисунок 8. Запуск Wordcnvpxy.exe в DllMain

А также не исполняющийся на практике код в экспортируемых функциях (мы предполагаем, что это попытка обойти детектирование в песочницах):

Рисунок 9. Код GetOfficeData()
Рисунок 9. Код GetOfficeData()
Рисунок 10. Код DeleteOfficeData()
Рисунок 10. Код DeleteOfficeData()

Последний шаг работы скрипта — открытие PDF-файла с приманкой.

Загрузчик Wordcnvpxy.exe

Полезная нагрузка является приложением, создающим скрытое окно (имя класса и окна ― SK_Parasite).

Рисунок 11. Создание окна и цикл обработки событий в Wordcnvpxy.exe
Рисунок 11. Создание окна и цикл обработки событий в Wordcnvpxy.exe

Необходимые для работы функции загружаются динамически, при этом для декодирования имен библиотек используется Base64 с алфавитом z2bqw7k90rJYALIQUxZK%sO=hd5C4piVMFlaRucWy31GTNH-mED8fnXtPvSojeB6g, а вместо имен функций используются их хеши по алгоритму SuperFastHash.

Рисунок 12. Динамически загружаемые библиотеки
Рисунок 12. Динамически загружаемые библиотеки

Основной код выполняется в отдельном потоке: каждые 10 минут приложение обращается на C&C-сервер motivation[.]neighboring[.]site, передавая идентификатор компьютера в строке User-Agent. В качестве идентификатора используется SuperFastHash от серийного номера системного тома и имени компьютера.

Рисунок 13. Основной цикл загрузчика
Рисунок 13. Основной цикл загрузчика

Ответ сервера сохраняется во временном файле. При наличии в ответе не менее 10 байт, он декодируется Base64 и делится на две части по символу $: зашифрованный RC4 исполняемый файл и его имя без расширения.

Рисунок 14. Обработка ответа сервера
Рисунок 14. Обработка ответа сервера

Интересен метод построения ключа для дешифровки RC4: он генерируется с помощью рекуррентной последовательности, которая начинается с двух чисел (28 и 39), а каждый следующий элемент в ней является суммой двух предыдущих по модулю 255. Ключ состоит из 64 байт и начинается с первой суммы в последовательности. Далее ключ расширяется до 256 байт (зацикливанием) и используется в стандартном алгоритме RC4.

Рисунок 15. Генерация RC4-ключа в Wordcnvpxy.exe
Рисунок 15. Генерация RC4-ключа в Wordcnvpxy.exe

Полученный с сервера исполняемый файл сохраняется в %TEMP% под указанным именем и запускается.

Объект 2: 邀请函.doc (Приглашение.doc)

Представляет собой RTF-файл с поздравлениями:

Рисунок 16. Документ с поздравительным текстом
Рисунок 16. Документ с поздравительным текстом

Документ создан с помощью популярного билдера Royal Road RTF (или 8.t), эксплуатирующего уязвимость CVE-2018-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 (фрагмент)
Рисунок 17. Главная функция дроппера intel.wll (фрагмент)

Для закрепления в системе дроппер создает ярлык в папке автозагрузки, запускающий %ALLUSERSPROFILE%\TotalSecurity\360ShellPro.exe с ключом /func=5. Данный файл является модифицированным компонентом антивируса 360 Total Security. Он используется для передачи управления загрузчику FileSmasher.exe с помощью техники, подобной DLL side-loading.

В легитимный 360ShellPro.exe вшит набор относительных путей к исполняемым файлам. В зависимости от значения аргумента /func= выбирается и запускается нужный файл.

Рисунок 18. Выбор файла в зависимости от параметра func
Рисунок 18. Выбор файла в зависимости от параметра func

Загрузчик FileSmasher.exe

Файл во многом похож на Wordcnvpxy.exe. Это также оконное приложение (имя класса: NIS_K), но для запуска основного кода в данном случае используется таймер с периодом 10 минут, а не отдельный поток.

Рисунок 19. Создание окна, установка таймера, цикл обработки событий в FileSmasher.exe
Рисунок 19. Создание окна, установка таймера, цикл обработки событий в FileSmasher.exe

Динамическая загрузка DLL не используется (все импорты статические), адрес C&C-сервера восстанавливается с помощью аналогичной функции для дешифровки RC4 (вместо декодирования Base64 с нестандартным алфавитом). При этом начальные элементы последовательности, с помощью которой генерируется ключ, имеют другие значения — 8 и 5, а сам алгоритм генерации полностью повторяется.

Рисунок 20. Генерация RC4-ключа в FileSmasher.exe
Рисунок 20. Генерация RC4-ключа в FileSmasher.exe

В качестве идентификатора зараженной машины используется CRC32 от серийного номера системного тома. Он передается в явном виде в качестве GET-параметра. Полный адрес, по которому загрузчик обращается к серверу, выглядит как http://walker[.]shopbopstar[.]top/blog/index.php?ei={32 random chars}&ti={volume serial CRC32}

Рисунок 21. Построение URL для обращения к контрольному серверу в FileSmasher.exe
Рисунок 21. Построение URL для обращения к контрольному серверу в FileSmasher.exe

Алгоритм загрузки также практически не отличается:

  • Ответ сервера сохраняется во временном файле и обрабатывается только при наличии в нем не менее 10 байт.
  • В отличие от Wordcnvpxy.exe, декодирование Base64 отсутствует.
  • Разделение на две части происходит по символу & (вместо $).
  • Первая часть также представляет собой зашифрованный RC4 исполняемый файл, вторая — его имя без расширения.
  • Для дешифровки файла используется та же функция, что и для дешифровки адреса (параметры RC4 ключа — 8, 5).

Загруженный файл запускается с помощью CreateProcess.

Интересно, что среди ресурсов файлов Wordcnvpxy.exe и FileSmasher.exe присутствует диалоговое окно About с именем приложения и копирайтом.

Рисунок 22. Диалоговое окно About в ресурсах FileSmasher.exe
Рисунок 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 можно считать отсылкой к южнокорейскому фильму «Паразиты» (2019 г.). Сами по себе эти данные недостаточны, чтобы делать какие-либо выводы, однако могут косвенно подтверждать связь файлов с Южной Кореей.

Связанные объекты

Содержание исходного документа (поздравления с новогодними праздниками) и даты компиляции файлов (22.12.2019) позволяют определенно говорить о периоде, в котором он использовался злоумышленниками. Однако это не единственный подобный объект: аналитиками Tencent была зафиксирована рассылка в тот же период вредоносных исполняемых файлов с именами Happy-new-year-2020.scr и 2020-New-Year-Wishes-For-You.scr. В данном случае исходные файлы являются исполняемыми, а приманка присутствует в виде поздравительной JPG-открытки, которая распаковывается и открывается в программе просмотра по умолчанию:

Рисунок 23. Открытка в Happy-new-year-2020.scr
Рисунок 23. Открытка в Happy-new-year-2020.scr
Рисунок 24. Открытка в 2020-New-Year-Wishes-For-You.scr
Рисунок 24. Открытка в 2020-New-Year-Wishes-For-You.scr

Структура этих угроз, за вычетом эксплуатации CVE-2018-0798, практически идентична RTF-документу. SCR-файлы являются дропперами, полезная нагрузка дешифруется с помощью xor 0x1A и распаковывается в подпапку в %ALLUSERSPROFILE%.

Рисунок 25. Главная функция дроппера 2020-New-Year-Wishes-For-You.scr (фрагмент)
Рисунок 25. Главная функция дроппера 2020-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 (дроппер 2020-New-Year-Wishes-For-You.scr)
Рисунок 26. Построение URL для обращения к контрольному серверу в Duser.dll (дроппер 2020-New-Year-Wishes-For-You.scr)

Экземпляр загрузчика, распакованный из 2020-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
Рисунок 27. Декомпилированный код функции CClientSocket::OnRead

Кроме того, поле m_bPacketFlag — сигнатура пакетов, отправляемых на командный сервер, инициализируется псевдорандомным значением, которое вычисляется на основе вызова GetTickCount(). В оригинальном коде поле равно Gh0st.

Рисунок 28. Инициализация поля CClientSocket::m_bPacketFlag
Рисунок 28. Инициализация поля CClientSocket::m_bPacketFlag

Заключение

По результатам исследования мы видим, как эволюционировали со временем вредоносные объекты, используемые для заражения группировкой Higaisa — от прямого распространения исполняемых файлов до применения эксплойтов и сложных многоступенчатых угроз. Однако структура используемых инструментов (дропперы, загрузчики) во многом остается неизменной. Для усложнения детектирования злоумышленники варьируют отдельные детали, такие как URL контрольного сервера, параметры RC4-ключа, используемые для DLL side-loading легитимные файлы, библиотеки для HTTP-взаимодействия.

Автор: Алексей Захаров, Positive Technologies

IOCs

Имя файла MD5 SHA-1 SHA-256
20200308-sitrep-48-covid-19.pdf.lnk 21a51a834372ab11fba72fb865d6830e 9ceb6e0e4ad0a2c03751d0563a82a79ebb94ec95 95489af84596a21b6fcca078ed10746a32e974a84d0daed28cc56e77c38cc5a8
oGhPGUDC03tURV.tmp 37f78b1ad43959a788162f560bdc9c79 992d530d4bb35fb8dbdfb690740ead6e0fa974ec f74199f59533fbbe57f0b2aae45c837b3ed5e4f5184e74c02e06c12c6535f0f9
OINFO12.OCX 83d04f21515c7e6316f9cd0bb393a118 e00b982a14835dae781bbbe06055d7d18acc6eb0 a49133ed68bebb66412d3eb5d2b84ee71c393627906f574a29247d8699f1f38e
9sOXN6Ltf0afe7.js 4f8ff5e70647dbc5d91326346c393729 2fd4eb78e53af6a5b210943ca8f0e521bb567afb 70b8397f87e4a0d235d41b00a980a8be9743691318d30293f7aa6044284ffc9c
MSOSTYLE.EXE 371e896d818784934bd1456296b99cbe 88f23b0913ef5f94cd888605504e1e54c3a6e48f 604679789c46a01aa320eb1390da98b92721b7144e57ef63853c3c8f6d7ea85d
20200308-sitrep-48-covid-19.pdf faf5ef01f4a9bf2aba7ede67dcc5a2d4 4e0c1a05360c6bebf903a708acf6792b13f43870 2dd886cc041ea6e5e80880ccbbc54be42079598acf0c1e7e459616c3f9c0dd34
cSi1r0uywDNvDu.tmp eefeb76d26338e09958aae5d81479178 c400e10a8f2b5b62f919033e2db0a1f99b1a3c38 9d52d8f10673518cb9f19153ddbe362acc7ca885974a217a52d1ee8257f22cfc
MiZl5xsDRylf0W.tmp c1d8966fa1bd7aee41b2c4ad731407d3 6e7e3277801669f3053bf364ae6be89f00017c89 b578a237587054f351f71bd41bede49197f77a1409176f839ebde105f3aee44c
Wordcnvpxy.exe fd648c3b7495abbe86b850587e2e5431 d0e0d641f3a063fb02c7f862ea8586312af5fa2e 002c9e0578a8b76f626e59b755a8aac18b5d048f1cc76e2c12f68bc3dd18b124
Имя файла MD5 SHA-1 SHA-256
邀请函.doc 2123bf482c9c80cb1896ff9288ad7d60 ea02db9b92cbf1d243b502d130aa2dd6c98637d2 500b6037ddb5efff0dd91f75b22ccce5b04d996c459d83d1f07fae8780b24e09
intel.wll 59a55c7bbc0ee488ec9e2cf50b792a56 a29ce0331015f2a3e87fd7fe1ce9dae228808b59 1b978324df504451c2a3430e32dc577742e2ac93b2602d68d771d89be4199a58
360ShellPro.exe d5e42cc18906f09d5bab62df45b5fcf6 46833928f75db90220451e026997d039730906fa 1acd3cbc83dd4153f07b869b3142594aa9e77df33aa5319312439ecf7f606152
FileSmasher.exe ea628fef3b547a1476d915963415e64c 07dbfaa430a201ce81f5079dd1e48379fac27177 f2c60274e625bcb051909797b35095dc5f37fae155cfdd96287c4ac112664a65

motivation[.]neighboring[.]site

walker[.]shopbopstar[.]top