Скачивание и запуск загрузчика Silence
Документ с макросом
Злоумышленники распространяют ВПО с помощью писем от некой Вики, которая предлагает посмотреть запись секретных переговоров (тема письма: «Tramp novosti posmatri»). К письму приложен вредоносный документ в формате DOC.
В теле вредоносного документа спрятана DLL-библиотека: ее содержимое скрыто в виде таблиц (рис. 1).
Рис. 1. Часть содержимого DLL-библиотеки, спрятанного в теле документа
Макрос, содержащийся в документе, преобразует каждое поле таблицы в 4 байта будущей библиотеки: текст ячейки обрабатывается как значение с типом integer. Например:
- 9460301 преобразуется в 4d 5a 90 00;
- 3 преобразуется в 03 00 00 00;
- 4 преобразуется в 04 00 00 00.
Заметим, что вредоносный документ содержит как 64-битную, так и 32-битную версии библиотеки. Содержимое 64-битной библиотеки находится между ключевыми словами SeasonValue и AppendCell, а содержимое 32-битной — между Visions и FindWords. Разрядность загруженной библиотеки выбирается в соответствии с разрядностью процесса winword.exe.
Часть макроса, осуществляющая загрузку и исполнение DLL-библиотек, представлена на рис. 2.
Рис. 2. Часть вредоносного макроса
После сборки библиотеки макрос копирует ее в директорию %TEMP% с именем icutils.dll и загружает. Далее макрос вызывает из библиотеки функцию clone, в результате чего происходит скачивание и запуск новой версии загрузчика Silence.
В рамках недавней рассылки содержимое загрузчика скачивалось с адреса hxxps://pastebin[.]com/raw/Jyujxy7z. В скором времени после рассылки этот ресурс оказался недоступен.
Описание библиотек icutils.dll
32-битная версия библиотеки icutils.dll записывает свой код в адресное пространство процесса notepad.exe, а 64-битная — в адресное пространство процесса cmd.exe.
После этого обе библиотеки совершают одинаковую последовательность действий:
- скачивают содержимое по адресу hxxps://pastebin[.]com/raw/Jyujxy7z при помощи функции InternetReadFile;
- записывают это содержимое в файл, расположенный по пути %TEMP%\<random-hex-string>.dat;
- декодируют и расшифровывают содержимое файла %TEMP%\<random-hex-string>.dat.
Если первые 2 байта полученного буфера совпадают с заголовком PE-файла (MZ), то буфер записывается в файл, расположенный по пути %TEMP%\<random-hex-string>.exe, и данный файл исполняется. При нескольких неудачных попытках процесс, в памяти которого исполняется библиотека, завершается.
Детальный анализ библиотек icutils.dll проведем на примере 64-битной версии. Напомним, она функционирует в адресном пространстве процесса cmd.exe.
Для начала рассмотрим функцию clone, которая отвечает за скачивание и запуск загрузчика Silence.
На первом этапе происходит расшифровка кода (рис. 3), который будет исполняться в адресном пространстве процесса cmd.exe, а также данных (рис. 4), необходимых для корректной работы кода.
Рис. 3. Расшифровка кода с помощью XOR
Рис. 4. Расшифровка данных с помощью XOR
После этого происходит следующее:
- создание дочернего процесса cmd.exe;
- запись расшифрованных кода и данных в адресное пространство процесса cmd.exe;
- передача управления записанному коду с помощью функции CreateRemoteThread.
Наглядно это представлено в псевдокоде из декомпилятора Hex-Rays (рис. 5).
Рис. 5. Инжект в cmd.exe
Как видно из скриншота, в параметр lpStartAddress записывается код из inj_func_start, а структура lpParameter содержит расшифрованные данные из inj_data_start (в том числе и адрес hxxps://pastebin[.]com/raw/Jyujxy7z).
Рассмотрим теперь код функции inj_func_start.
Адреса импортируемых функций получаются по значениям CRC32 от их имен (рис. 6).
Рис. 6. Получение адресов импортируемых функций (константы со значениями CRC32 заменены на имена соответствующих им API-функций)
Далее происходит скачивание содержимого с ресурса hxxps://pastebin[.]com/raw/Jyujxy7z и запись этого содержимого в файл с расширением .dat (рис. 7).
Рис. 7. Скачивание и запись в DAT-файл содержимого с ресурса hxxps://pastebin[.]com/raw/Jyujxy7z
После получения DAT-файла происходит его раскодирование из base64, расшифровка с помощью XOR и, в случае корректности, запись в файл — за все это отвечает функция DecryptAndSave. Наконец, с помощью функции CreateProcessW запускается исполняемый файл (рис. 8).
Рис. 8. Получение и запуск исполняемого файла
Следует отметить, что функция DecryptAndSave выполняется успешно только в том случае, если первые 2 байта полученного содержимого — «MZ». Это помогает избежать скачивания некорректного содержимого, например если бы содержимое ресурса hxxps://pastebin[.]com/raw/Jyujxy7z было удалено (а это в итоге и произошло). После нескольких неудачных попыток процесс завершается.
Новая версия загрузчика Silence
Предыдущий загрузчик Silence, также известный как TrueBot, выполнял следующие действия:
- сбор информации о зараженной системе при помощи системных утилит Windows и запись полученной информации в файл;
- загрузку полученного файла на управляющий сервер и ожидание команды с сервера;
- самоудаление или загрузку и запуск дополнительного ПО в зависимости от полученной команды.
Новый загрузчик Silence сочетает в себе особенности TrueBot и главного модуля Silence. В частности, с главным модулем у него совпадают:
- практика присваивания идентификатора зараженным пользователям;
- способ получения импортируемых функций и расшифрованных строк.
Общий процесс исполнения загрузчика представлен на рис. 9.
Рис. 9. Граф процессов во время исполнения загрузчика
Получение распакованного загрузчика
Как и 64-битная библиотека icutils.dll, загрузчик записывает свой код в адресное пространство процесса cmd.exe (#2 на рис. 9). В отличие от библиотеки загрузчик делает это дважды.
Вредоносный код и данные для осуществления первого инжекта расшифровываются с помощью XOR (рис. 10).
Рис. 10. Функция расшифровки кода и данных для первого инжекта
ВПО создает дочерний процесс cmd.exe (#2) в приостановленном состоянии. Далее ВПО перезаписывает точку входа созданного процесса (рис. 11), а также записывает расшифрованный код и данные в выделенную область памяти.
Рис. 11. Код, которым перезаписывается точка входа процесса cmd.exe (#2)
Перед возобновлением процесса cmd.exe (#2) константа 0xCBCBCBCB (см. рис. 11) заменяется адресом выделенной области памяти, куда ранее были записаны вредоносный код и данные.
Вредоносный код, работающий в результате первого инжекта, имеет значительное сходство с кодом вредоносной библиотеки icutils.dll. Адреса импортируемых функций получаются по значениям CRC32 от их имен (рис. 12).
Рис. 12. Получение адресов импортируемых функций
В результате исполнения вредоносного кода ВПО загружает изображение с ресурса hxxps://i.imgur[.]com/sGD7lrl.png и сохраняет его в файл на диске по пути %TEMP%/< random-hex-string >.png.
Участок кода, отвечающий за загрузку (рис. 13), также схож с кодом загрузки исполняемого файла вредоносной библиотекой icutils.dll. Это показывает, что злоумышленники повторно используют код на отдельных этапах загрузки ВПО.
Рис. 13. Код загрузки изображения
Содержимое загруженного изображения используется для получения исполняемого файла загрузчика Silence, а также кода и данных, осуществляющих его исполнение в адресном пространстве дочернего процесса cmd.exe (#7 на рис. 9).
Полученный код прописывает файл, загруженный с hxxps://pastebin[.]com/raw/Jyujxy7z, в автозагрузку. Происходит это так:
- во время исполнения полученного кода исполняемый файл копируется на диск в произвольную папку, находящуюся в директории %TEMP%, с именем local.exe;
- в директории %TEMP% создается ярлык с именем <random-hex-string>.lnk, который далее копируется с именем local.lnk в папку %UserProfile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup.
После этого вредоносный код исполняет загрузчик Silence в адресном пространстве дочернего процесса cmd.exe (#7).
Анализ распакованного загрузчика
Главный цикл общения с управляющим сервером изображен на рис. 14.
Рис. 14. Главный цикл общения с управляющим сервером
Общение загрузчика с управляющим сервером строится по следующему принципу:
- загрузчик обращается по адресу hxxp(s)://minkolado[.]top/ и получает число — порядковый номер жертвы;
- все последующие обращения осуществляются по адресу hxxp(s)://minkolado[.]top/{num};
- ответ управляющего сервера будет содержать команду для загрузчика.
Получение адресов импортируемых функций и расшифровка строк
Псевдокод функции для получения адресов API-функций изображен на рис. 15.
Рис. 15. Псевдокод функции для получения адресов API-функций
Аналогичный код присутствовал в образцах главного модуля Silence.
Как и в главном модуле Silence, строки получаются по идентификатору и расшифровываются с помощью XOR.
Список всех расшифрованных строк представлен в таблице ниже (не все расшифрованные строки используются в действительности).
Идентификатор |
Строка |
0 |
pcinfo.txt |
1 |
log.txt |
2 |
Kernel32.dll |
3 |
CreateProcessW |
4 |
WinInet.dll |
5 |
InternetOpenW |
6 |
Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:42.0) Gecko/20101111 Firefox/42.0 |
7 |
InternetConnectW |
8 |
HttpSendRequestExW |
9 |
HttpOpenRequestW |
10 |
cmd /C %s %s \"%s\" |
11 |
InternetReadFile |
12 |
HttpQueryInfoW |
13 |
HttpSendRequestW |
14 |
InternetQueryDataAvailable |
15 |
InternetWriteFile |
16 |
InternetSetOptionW |
17 |
InternetCloseHandle |
18 |
InternetQueryOptionW |
19 |
HttpEndRequestW |
20 |
GET |
21 |
POST |
22 |
minkolado.top |
23 |
443 |
24 |
80 |
25 |
MSCF |
26 |
URLDownloadToFileW |
27 |
Urlmon.dll |
28 |
cmd /c makecab /V3 \"%s\" \"%s\" |
29 |
temp.cab |
30 |
cmd /c expand \"%s\" \"%s\" |
31 |
/content/%s |
32 |
/%d/%s |
33 |
introduce.dat |
34 |
CreateThread |
35 |
GetModuleFileNameW |
36 |
Shell32.dll |
37 |
SHGetFolderPathW |
38 |
>> |
39 |
echo ---%d--- |
40 |
netstat -na |
41 |
ipconfig |
42 |
whoami |
43 |
hostname |
44 |
tasklist |
45 |
systeminfo |
46 |
/ |
47 |
/%d |
48 |
/%d/%s |
49 |
svchost.exe |
50 |
jest |
51 |
praktycznie |
52 |
poligraficznym |
53 |
nasz |
54 |
cmd /c ping localhost -n 15 > nul & del \"%s\" |
55 |
ShlWApi.dll |
56 |
PathCombineW |
57 |
Sleep |
Описание команд с управляющего сервера
Команды с управляющего сервера обрабатываются в функции CommandHandler (рис. 16).
Рис. 16. Псевдокод функции CommandHandler
Загрузчик поддерживает следующие команды:
- new_identity_command
- nop_command
- download_and_execute_command
- set_destroy_command
- pc_info_command
Имена команд взяты в соответствии с именами классов, унаследованных от класса server_command_base (рис. 17). Класс server_command_base содержит поле размером 4 байта под идентификатор команды с управляющего сервера (на рис. 16 определен как command_code).
Рис. 17. Некоторые классы, определенные злоумышленниками
Далее приведем детальное описание каждой команды.
new_identity_command
Команда выполняется в том случае, если с управляющего сервера была получена строка, конвертируемая в целочисленное значение. После получения данной команды загрузчик изменяет порядковый номер пользователя, то есть относительный адрес, по которому происходит взаимодействие с управляющим сервером.
Например, если сервер прислал строку «01337», то адрес взаимодействия с C&C для данного зараженного пользователя поменяется на hxxp(s)://minkolado[.]top/1337.
nop_command
Команда выполняется в том случае, если с управляющего сервера получена строка jest («есть» по-польски). При получении данной команды загрузчик ничего не делает.
download_and_execute_command
Команда выполняется в том случае, если с управляющего сервера получена строка nasz («наш» по-польски). Вместе со строкой nasz передается относительный адрес для скачивания дополнительного вредоносного ПО.
При получении данной команды загрузчик совершает следующие действия:
- загружает данные с полученного адреса;
- проверяет заголовок загруженных данных — первые 4 байта должны составлять заголовок CAB-файла (MSCF);
- если скачанные данные имеют верный заголовок, сохраняет их в файл %UserProfile%\AppData\Local\temp.cab;
- с помощью стандартной утилиты Windows expand извлекает из CAB-архива temp.cab файл svchost.exe.
Если файл svchost.exe успешно извлечен, он запускается из той же директории.
set_destroy_command
Команда выполняется в том случае, если с управляющего сервера получена строка praktycznie («практически» по-польски).
При получении данной команды загрузчик самоудаляется с использованием команды ping localhost -n 15 > nul & del {self_file_name}.
pc_info_command
Команда выполняется в том случае, если с управляющего сервера получена строка poligraficznym («печать» по-польски). При получении данной команды загрузчик собирает и отправляет на управляющий сервер информацию о зараженной системе. Это происходит следующим образом:
- загрузчик перенаправляет результат выполнения команд netstat -na, ipconfig, whoami, hostname, tasklist, systeminfo в файл %UserProfile%\AppData\Local\pcinfo.txt;
- с помощью стандартной утилиты Windows makecab загрузчик запаковывает файл pcinfo.txt в файл temp.cab;
- перед следующим запросом команды с управляющего сервера (это происходит каждые три секунды) файл temp.cab будет загружен на C&C с именем introduce.dat (hxxp(s)://minkolado[.]top/{num}/introduce.dat).
undefined_command
Следует отметить, что в коде загрузчика присутствует еще один класс-обработчик команды с сервера — undefined_command. Он используется, если с C&C пришли некорректные данные.
Злоумышленники назвали этот класс с опечаткой — undefinded_command (рис. 18).
Рис. 18. Класс undefinded_command
Сводная таблица
Для наглядности сведем все в одну таблицу.
Название класса-обработчика |
Строка, которая приходит с сервера |
Краткое описание |
new_identity_command |
Строка, конвертируемая в целочисленное значение |
Установить относительный адрес, по которому происходит взаимодействие с управляющим сервером |
nop_command |
jest |
Ничего не делать |
download_and_execute_command |
nasz |
Скачать CAB-архив с дополнительным ВПО, распаковать и запустить файл из архива |
set_destroy_command |
praktycznie |
Самоудалиться |
pc_info_command |
poligraficznym |
Собрать информацию о зараженной системе с помощью системных утилит Windows и загрузить CAB-архив с информацией на управляющий сервер |
undefinded_command |
? |
? |
IOCs
md5
- 0c37a0c640ccae74fca520f578707961 — DOC-файл
- 1d53c2a16a049c7340e31a603ccd95dc — загрузчик Silence
- f10b8d4d286d8f48574c41e81c2e87f6 — распакованный загрузчик Silence
URL
- hxxp(s)://minkolado[.]top/