Скачивание и запуск загрузчика Silence
Документ с макросом
Злоумышленники распространяют ВПО с помощью писем от некой Вики, которая предлагает посмотреть запись секретных переговоров (тема письма: «Tramp novosti posmatri»). К письму приложен вредоносный документ в формате DOC.
В теле вредоносного документа спрятана DLL-библиотека: ее содержимое скрыто в виде таблиц (рис. 1).
![](https://habrastorage.org/webt/vm/kc/ue/vmkcuepglq5ugwsz-l5syrh6xcy.png)
Рис. 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.
![](https://habrastorage.org/webt/ws/vz/9l/wsvz9l_a6bn-s_o3w6eo1kfae7w.png)
Рис. 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), необходимых для корректной работы кода.
![](https://habrastorage.org/webt/ii/q2/zy/iiq2zyutfpgzlioxktpisco5z7y.png)
Рис. 3. Расшифровка кода с помощью XOR
![](https://habrastorage.org/webt/96/ec/km/96eckmiwosprvvbd2bunm0yef6s.png)
Рис. 4. Расшифровка данных с помощью XOR
После этого происходит следующее:
- создание дочернего процесса cmd.exe;
- запись расшифрованных кода и данных в адресное пространство процесса cmd.exe;
- передача управления записанному коду с помощью функции CreateRemoteThread.
Наглядно это представлено в псевдокоде из декомпилятора Hex-Rays (рис. 5).
![](https://habrastorage.org/webt/9-/1l/tn/9-1ltnldlk2kkbqg10k4fterifa.png)
Рис. 5. Инжект в cmd.exe
Как видно из скриншота, в параметр lpStartAddress записывается код из inj_func_start, а структура lpParameter содержит расшифрованные данные из inj_data_start (в том числе и адрес hxxps://pastebin[.]com/raw/Jyujxy7z).
Рассмотрим теперь код функции inj_func_start.
Адреса импортируемых функций получаются по значениям CRC32 от их имен (рис. 6).
![](https://habrastorage.org/webt/2g/1n/p2/2g1np2aflrnpi-aljte4fsaqery.png)
Рис. 6. Получение адресов импортируемых функций (константы со значениями CRC32 заменены на имена соответствующих им API-функций)
Далее происходит скачивание содержимого с ресурса hxxps://pastebin[.]com/raw/Jyujxy7z и запись этого содержимого в файл с расширением .dat (рис. 7).
![](https://habrastorage.org/webt/a7/kr/ue/a7kruedwj5_cn4dogu4roll8cly.png)
Рис. 7. Скачивание и запись в DAT-файл содержимого с ресурса hxxps://pastebin[.]com/raw/Jyujxy7z
После получения DAT-файла происходит его раскодирование из base64, расшифровка с помощью XOR и, в случае корректности, запись в файл — за все это отвечает функция DecryptAndSave. Наконец, с помощью функции CreateProcessW запускается исполняемый файл (рис. 8).
![](https://habrastorage.org/webt/1q/s9/dy/1qs9dy9ejqvl8o5xvxa4gj2ey9y.png)
Рис. 8. Получение и запуск исполняемого файла
Следует отметить, что функция DecryptAndSave выполняется успешно только в том случае, если первые 2 байта полученного содержимого — «MZ». Это помогает избежать скачивания некорректного содержимого, например если бы содержимое ресурса hxxps://pastebin[.]com/raw/Jyujxy7z было удалено (а это в итоге и произошло). После нескольких неудачных попыток процесс завершается.
Новая версия загрузчика Silence
Предыдущий загрузчик Silence, также известный как TrueBot, выполнял следующие действия:
- сбор информации о зараженной системе при помощи системных утилит Windows и запись полученной информации в файл;
- загрузку полученного файла на управляющий сервер и ожидание команды с сервера;
- самоудаление или загрузку и запуск дополнительного ПО в зависимости от полученной команды.
Новый загрузчик Silence сочетает в себе особенности TrueBot и главного модуля Silence. В частности, с главным модулем у него совпадают:
- практика присваивания идентификатора зараженным пользователям;
- способ получения импортируемых функций и расшифрованных строк.
Общий процесс исполнения загрузчика представлен на рис. 9.
![](https://habrastorage.org/webt/ee/5v/td/ee5vtdzs4piexnc9ghbjmahr5uq.png)
Рис. 9. Граф процессов во время исполнения загрузчика
Получение распакованного загрузчика
Как и 64-битная библиотека icutils.dll, загрузчик записывает свой код в адресное пространство процесса cmd.exe (#2 на рис. 9). В отличие от библиотеки загрузчик делает это дважды.
Вредоносный код и данные для осуществления первого инжекта расшифровываются с помощью XOR (рис. 10).
![](https://habrastorage.org/webt/1g/du/1w/1gdu1wnksnhhe4vnlulhonwatfo.png)
Рис. 10. Функция расшифровки кода и данных для первого инжекта
ВПО создает дочерний процесс cmd.exe (#2) в приостановленном состоянии. Далее ВПО перезаписывает точку входа созданного процесса (рис. 11), а также записывает расшифрованный код и данные в выделенную область памяти.
![](https://habrastorage.org/webt/gb/vu/ys/gbvuysipaxjislz91yqwt_gwjko.png)
Рис. 11. Код, которым перезаписывается точка входа процесса cmd.exe (#2)
Перед возобновлением процесса cmd.exe (#2) константа 0xCBCBCBCB (см. рис. 11) заменяется адресом выделенной области памяти, куда ранее были записаны вредоносный код и данные.
Вредоносный код, работающий в результате первого инжекта, имеет значительное сходство с кодом вредоносной библиотеки icutils.dll. Адреса импортируемых функций получаются по значениям CRC32 от их имен (рис. 12).
![](https://habrastorage.org/webt/90/3e/qg/903eqgyh1kohnzb4_jjuxk8kk2m.png)
Рис. 12. Получение адресов импортируемых функций
В результате исполнения вредоносного кода ВПО загружает изображение с ресурса hxxps://i.imgur[.]com/sGD7lrl.png и сохраняет его в файл на диске по пути %TEMP%/< random-hex-string >.png.
Участок кода, отвечающий за загрузку (рис. 13), также схож с кодом загрузки исполняемого файла вредоносной библиотекой icutils.dll. Это показывает, что злоумышленники повторно используют код на отдельных этапах загрузки ВПО.
![](https://habrastorage.org/webt/rs/gr/e2/rsgre2-khemja874jdrv1cxztqg.png)
Рис. 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.
![](https://habrastorage.org/webt/6c/i6/dq/6ci6dqrlaimgc_r3tlkhre4dizk.png)
Рис. 14. Главный цикл общения с управляющим сервером
Общение загрузчика с управляющим сервером строится по следующему принципу:
- загрузчик обращается по адресу hxxp(s)://minkolado[.]top/ и получает число — порядковый номер жертвы;
- все последующие обращения осуществляются по адресу hxxp(s)://minkolado[.]top/{num};
- ответ управляющего сервера будет содержать команду для загрузчика.
Получение адресов импортируемых функций и расшифровка строк
Псевдокод функции для получения адресов API-функций изображен на рис. 15.
![](https://habrastorage.org/webt/eb/hz/k7/ebhzk7kbotjvfdt-it3jggiselw.png)
Рис. 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).
![](https://habrastorage.org/webt/xe/tl/uo/xetluoiyhvvpwr2lhztyf8wes3w.png)
Рис. 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).
![](https://habrastorage.org/webt/nu/ax/of/nuaxofx7ifynblbsntydkkhd9qu.png)
Рис. 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).
![](https://habrastorage.org/webt/sw/an/pw/swanpwjozmk0cjmyepkqamhzqww.png)
Рис. 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/