В марте 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. Ярлык
Заражение начинается с файла 20200308-sitrep-48-covid-19.pdf.lnk, замаскированного под PDF.

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

В результате во временную папку копируется сам ярлык и файл 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-скрипт. Начало
Скрипт записан в виде одной строки:

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

Во временной папке %tmp% создается папка с именем cscript.exe, куда копируется оригинальный скриптовый интерпретатор cscript.exe под именем msproof.exe, а также XSL-файл под именем WsmPty.xsl. 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 в байты и заменим обфусцированные названия переменных в соответствии с их значением:

Суть кода сводится к созданию папки 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 содержит в себе только код для исполнения финальной нагрузки:

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


Последний шаг работы скрипта — открытие PDF-файла с приманкой.
Загрузчик Wordcnvpxy.exe
Полезная нагрузка является приложением, создающим скрытое окно (имя класса и окна ― SK_Parasite).

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

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

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

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

Полученный с сервера исполняемый файл сохраняется в %TEMP% под указанным именем и запускается.
Объект 2: 邀请函.doc (Приглашение.doc)
Представляет собой RTF-файл с поздравлениями:

Документ создан с помощью популярного билдера 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.

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

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

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

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

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

Такое окно, а также другие ресурсы (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-открытки, которая распаковывается и открывается в программе просмотра по умолчанию:


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

Полезная нагрузка состоит из легитимного исполняемого файла (используется rekeywiz.exe из поставки Windows 7) и DLL-библиотеки загрузчика Duser.dll. Легитимный файл добавляется в автозагрузку с помощью ярлыка.
Загрузчик расшифровывает URL с помощью RC4 (начальные значения: 8, 5 и 9, 5), добавляет в GET-параметры случайную строку и CRC32 — идентификатор компьютера.

Экземпляр загрузчика, распакованный из 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.

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

Заключение
По результатам исследования мы видим, как эволюционировали со временем вредоносные объекты, используемые для заражения группировкой 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