Перейти к содержимому
ADMIN
FUTURE
Главная страница » Антивирус молчит: сервером управляет легальная программа удалённого доступа
FIELD NOTES / 21.10.2026

Антивирус молчит: сервером управляет легальная программа удалённого доступа

Максим Шаповалов23 мин чтения
Антивирус молчит: проверка подписанного RMM, NetSupport и разрешения на управление сервером

В этой статье

02:17. На сервере появился ещё один администратор

Утром бухгалтерия работает как обычно. Ночная копия успешна, служба приложения запущена, антивирус не сообщает об обнаружениях. Но при разборе сетевой активности администратор замечает незнакомый процесс. Название напоминает инструмент поддержки. Файл подписан известным издателем. Рука уже тянется закрыть карточку: наверное, установили подрядчики.

Подрядчики отвечают: «Не наш». Внутренняя поддержка — тоже. Программа тем временем поддерживает соединение с внешним адресом. Самая важная неопределённость теперь не в том, является ли файл подделкой. Вопрос другой: кто получил возможность управлять сервером через совершенно настоящий инструмент?

Это составной учебный сценарий, а не история конкретного заказчика. Время условное. Мы не будем запускать найденный агент, подключаться к неизвестной консоли или воспроизводить вредоносную установку. Построим расследование из доступных наблюдений: процесс, файл, способ запуска, конфигурация, управляющая сторона и действия.

Сразу договоримся о дисциплине: «файл настоящий», «программа разрешена в компании» и «этот сеанс разрешён» — три разных утверждения. Даже если первое подтверждено, два других ещё предстоит проверить.

Октябрьский повод: что сообщила BI.ZONE

В публикации BI.ZONE от 15 октября 2026 года об Insolent Hyena, переименованной исследователями в Insolent Werewolf, упоминается развёртывание NetSupport Manager атакующими. Отдельно описаны фишинг и ClickFix среди способов первоначального доступа. Это не означает, что каждую установку NetSupport породила одна и та же цепочка.

Материал служит свежим примером злоупотребления легитимным удалённым доступом. Дальнейшее расследование — самостоятельная методика для администратора, не пересказ всех находок BI.ZONE и не утверждение о компрометации самого производителя программы.

Важно не перепутать класс инструмента и разрешение на его использование. RMM и средства удалённого управления полезны поддержке. Но полезная возможность не проверяет намерение того, кто её включил. Та же кнопка передачи файла может доставить согласованное обновление или неразрешённый материал. Различие устанавливают по контексту и доказательствам.

Почему молчание антивируса ничего не разрешает

Антивирус не обязан считать каждый экземпляр средства поддержки вредоносным: компания может официально им пользоваться. Однако из этого нельзя делать противоположный универсальный вывод — будто такие инструменты невидимы защите. Обнаружение зависит от продукта, настроек, телеметрии и поведения. Название статьи описывает симптом, а не обещает атакующему незаметность.

Проверьте и саму исходную посылку: агент защиты работает, обновляется, передаёт события, не исключён из контроля? Пустая панель при оборванном сборе — не то же самое, что отсутствие обнаружений на исправном узле. Но даже исправная защита не заменяет реестр разрешённых каналов администрирования.

Разделение легитимного использования и злоупотребления рассматривается в руководстве CISA по безопасности удалённого доступа. Для нашего расследования практический вывод узкий: анализируйте не только репутацию исполняемого файла, но и происхождение установки, управляющую сторону и доступные действия.

Три проверки вместо одного «подписано»

Проверка подлинности отвечает, с каким файлом мы имеем дело. Проверка разрешения — кто согласовал именно эту установку на этом сервере. Проверка управления — какой субъект мог инициировать сеансы и команды. Они связаны, но ни одна не является автоматической заменой остальных.

В учебном случае издатель и версия выглядят ожидаемо. Зато нет заявки, владелец ресурса не подтверждает агент, а конфигурация отличается от принятой в компании. Это достаточная причина продолжить расследование. Но пока не установлены сеанс и действие, нельзя дописывать в отчёт «базу точно скачали».

Мы будем собирать цепочку: происхождение → запуск → настройки → управление → действие → последствие. Отдельная ветвь — кто мог изменить эту цепочку после установки. Разрешённый вчера агент может сегодня иметь другие настройки или скомпрометированную управляющую учётную запись.

Расследование RMM: происхождение, процесс, конфигурация, управление и последствия
Авторская схема Admin Future. Настоящий подписанный файл не подтверждает разрешение на удалённое управление.

Сервер управления — ещё не человек за экраном

У разных продуктов различается архитектура. Агент может соединяться с собственным сервером организации, сервисом поставщика или промежуточным узлом связности; возможны и прямые варианты. Не переносите понятие SaaS-tenant на любой продукт без проверки. Для NetSupport выясняют конкретную роль Client, Control и Connectivity Server/Gateway в установленной версии.

Адрес в соединении способен принадлежать посреднику, а не компьютеру оператора. Совпадение IP с известным облаком не доказывает разрешённое управление. И наоборот: непривычный адрес может оказаться согласованной новой площадкой поддержки. Нужны подтверждение владельца и привязка к разрешённой конфигурации, а не угадывание по географии IP.

Сравнивают идентификатор устройства, доступный управляющий контур, разрешённые группы/ключи и учётные записи операторов — в терминах конкретного продукта. Общий ключ доступа или идентификатор подключения не является сам по себе персональной атрибуцией. Точные действия человека проверяют по доступной истории управления и журналам назначения.

До перезапуска: что сохранить и чего не делать

При активном разрушении согласованное сдерживание важнее идеальной коллекции. Если время позволяет, до изменений фиксируют процесс и его время жизни, текущие соединения, службу или иной автозапуск, исходные файлы и настройки, журналы и состояние защиты. Для каждого наблюдения записывают узел, UTC-время, источник и ограничения.

Не открывайте агент ради проверки, не нажимайте «подключиться» к неизвестному серверу и не запускайте его конфигуратор на исходном экземпляре: можно изменить артефакты или активировать нежелательную связь. Исследуйте сохранённую копию как данные в выделенной среде. Не отправляйте внутренние конфигурации и журналы в публичные анализаторы без отдельного разрешения.

Не удаляйте службу первой же командой. Потеря канала управления может быть необходимой мерой, но удаление не заменяет решение о сдерживании и может уничтожить полезный контекст. Проверьте независимый аварийный доступ: подозрительный инструмент иногда оказывается единственным оставшимся способом администрировать узел.

Процесс: сначала установить, что именно работает

Начните с PID, полученного из реального наблюдения, а не с предполагаемого имени файла из статьи. Имя можно изменить. На сервере способны одновременно работать разрешённый экземпляр и посторонняя копия, поэтому «такой продукт у нас есть» ещё не закрывает конкретную находку.

# Local selected Windows host, approved read. Use the PID from an actual observation.
$ObservedPid = 0
if ($ObservedPid -le 0) { throw 'Set the observed PID; do not use the automatic $PID variable.' }
$Process = Get-CimInstance Win32_Process -Filter "ProcessId=$ObservedPid" -ErrorAction Stop
if (-not $Process) { throw 'Process absent: use historical telemetry, not a guessed replacement PID.' }
$Process | Select-Object Name,ProcessId,ParentProcessId,CreationDate,ExecutablePath,CommandLine
$Owner = Invoke-CimMethod -InputObject $Process -MethodName GetOwner -ErrorAction Stop
if ($Owner.ReturnValue -ne 0) { Write-Warning ('GetOwner failed: ' + $Owner.ReturnValue) }
$Owner | Select-Object ReturnValue,Domain,User
Get-CimInstance Win32_Process -Filter "ProcessId=$($Process.ParentProcessId)" -ErrorAction Stop |
    Select-Object Name,ProcessId,CreationDate,ExecutablePath
# Snapshot only: a parent PID may have been reused; this is not a historical process tree.
# Command lines can contain secrets. Restrict output, do not paste it into public tickets.
# Does not launch, stop, debug or reconnect to the selected program.

Родительский PID в живом снимке не является историческим деревом. Родитель завершился, номер переиспользовали — и мы видим другую программу. Для прошлого используют телеметрию создания процессов с временем жизни и устойчивым идентификатором, где он доступен. У системного агента текущим владельцем часто окажется системная учётная запись; это не имя установившего его человека.

Поле CommandLine полезно для поиска параметров и конфигурации, но способно содержать секреты. Отказ чтения, пустой путь или неудачный GetOwner — ограничение доступа исследователя либо особенности процесса, а не доказательство отсутствия программы или анонимного управления.

Служба — только один из способов пережить выход пользователя

Если агент работает службой, фиксируют точное имя, исполняемую строку, режим запуска и учётный контекст. Но отсутствие службы ничего не оправдывает: возможны пользовательский запуск, задание планировщика и переносимый экземпляр. Не превращайте поиск слова NetSupport в полную инвентаризацию каналов доступа.

# Exact observed service name. A portable/user-mode agent may have no service.
$ObservedServiceName = 'REPLACE_EXACT_OBSERVED_SERVICE_NAME'
if ($ObservedServiceName -like 'REPLACE_*') { throw 'Set the observed service name.' }
$Services = @(Get-CimInstance Win32_Service -ErrorAction Stop |
    Where-Object Name -eq $ObservedServiceName)
if ($Services.Count -ne 1) { throw 'Service absent or ambiguous; inspect other launch mechanisms.' }
$Services | Select-Object Name,DisplayName,State,StartMode,StartName,ProcessId,PathName
# PathName is a command line, NOT automatically the executable's literal file path.
# A service account is not proof of who originally installed or authorized the agent.
# No Win32_Product query, installer repair, service restart or startup changes.

PathName у службы — строка запуска, а не обязательно чистый путь к EXE. Не передавайте её целиком в проверку подписи и тем более не исполняйте. Сопоставьте с текущим процессом и отдельно выделите подтверждённый файл. Режим Automatic показывает настройку запуска сейчас, не дату появления агента.

Для первичного расследования не используем Win32_Product. Microsoft предупреждает о проверке согласованности MSI-пакетов при таких запросах. Диагностика не должна незаметно превратиться в восстановление установленных программ. Список установленного ПО тоже не охватывает все переносимые копии.

Подпись: доказательство о файле, а не доверенность на управление

Проверяют хеш, путь, версию и Authenticode выбранного файла. Get-AuthenticodeSignature возвращает сведения о подписи; результат интерпретируют вместе с состоянием доверия на проверяющей системе. Недоступность проверки отзыва не равна подтверждённой подделке.

# Exact observed local executable path; do not pass the service command line.
$ObservedFile = 'REPLACE_FULL_LOCAL_EXECUTABLE_PATH'
if ($ObservedFile -like 'REPLACE_*' -or $ObservedFile -notmatch '^[A-Za-z]:\\') {
    throw 'Set the verified local drive path to the selected executable.'
}
$File = Get-Item -LiteralPath $ObservedFile -ErrorAction Stop
if ($File.PSIsContainer) { throw 'Select one file, not a directory.' }
$File | Select-Object FullName,Length,CreationTimeUtc,LastWriteTimeUtc
Get-FileHash -LiteralPath $ObservedFile -Algorithm SHA256 -ErrorAction Stop
$Signature = Get-AuthenticodeSignature -LiteralPath $ObservedFile -ErrorAction Stop
$Signature | Select-Object Status,StatusMessage,SignatureType
$Signature.SignerCertificate | Select-Object Subject,Issuer,Thumbprint,NotBefore,NotAfter
$File.VersionInfo | Select-Object CompanyName,ProductName,FileVersion,OriginalFilename
# Reads file metadata/signature; does not execute it. Version strings are not trusted identity.
# Signature trust/revocation evaluation can depend on local policy, time and PKI connectivity.
# A valid signature does NOT approve the installation, configuration or remote operator.

Valid не означает «установлено нашей поддержкой». Подписан конкретный файл, а не любой соседний модуль, его настройки и каждое действие оператора. Если есть признаки изменения загружаемых компонентов, исследуют соответствующую телеметрию; одной подписи главного EXE недостаточно для оценки всего процесса. Мы не воспроизводим загрузку подозрительных модулей для проверки этой гипотезы.

Сравнение с утверждённым пакетом полезнее одиночной репутационной оценки. Но даже полное совпадение EXE может соседствовать с чужими настройками. Временные метки файла помогают ориентироваться, а не доказывают дату установки: их меняют копирование, обновление и иные операции.

Настройки: на кого работает настоящий агент

В конфигурации ищут управляющие назначения, доступные профили и сведения, позволяющие сопоставить экземпляр с разрешённым контуром. Секреты не выводят в общий терминальный протокол. Сначала сохраняют метаданные, хеш и права конкретного установленного артефакта, а содержимое разбирают в защищённой копии.

# One confirmed configuration artifact, not a recursive search for every secret.
$ConfigPath = 'REPLACE_VERIFIED_LOCAL_CONFIGURATION_FILE'
if ($ConfigPath -like 'REPLACE_*' -or $ConfigPath -notmatch '^[A-Za-z]:\\') {
    throw 'Set the verified local configuration file path.'
}
$ConfigFile = Get-Item -LiteralPath $ConfigPath -ErrorAction Stop
if ($ConfigFile.PSIsContainer) { throw 'Select one configuration file.' }
$ConfigFile | Select-Object FullName,Length,CreationTimeUtc,LastWriteTimeUtc
Get-FileHash -LiteralPath $ConfigPath -Algorithm SHA256 -ErrorAction Stop
Get-Acl -LiteralPath $ConfigPath -ErrorAction Stop | Select-Object Owner,Sddl
# Contents intentionally not printed: configuration can contain management keys/secrets.
# Preserve original bytes in approved evidence storage and analyze a copy as data.
# A matching filename is not proof this is the active configuration; inspect version/policy.
# Do not launch a configurator, save the file, recompute vendor checksums or redeploy it.

Для NetSupport нельзя считать единственным вариантом Client32.ini. Документация производителя описывает переход к Client32u.ini начиная с v12.50. Установленная версия и фактический путь важнее универсального примера папки. Знакомое имя файла не доказывает, что процесс читает именно его.

Владелец должен подтвердить конкретные настройки и область управления, а не только название продукта. Если вчера согласовали один сервер связности, а сегодня экземпляр использует другой, это самостоятельное изменение, даже при неизменном хеше EXE.

Локальный INI может быть не последним словом

Производитель NetSupport описывает получение параметров Gateway как из конфигурации клиента, так и из реестра, обычно через Group Policy. Поэтому исправленный локальный файл ещё не доказывает исправленное действующее состояние. Настройки могут повторно поступить из разрешённой системы развёртывания, которая сама нуждается в проверке.

Выясняют источник и приоритет настроек именно для установленной версии: пакет развёртывания, локальная конфигурация, политика, параметры запуска. Не предполагают, что любая запись реестра используется только потому, что она существует. Нужны документированная модель и доступные наблюдения действующего экземпляра.

Не редактируйте исходный файл ради красивого результата. Вендорский конфигуратор способен пересчитать контрольные данные и изменить несколько артефактов одновременно. Это уже вмешательство. Для расследования сначала фиксируют состояние; для исправления отдельно согласуют поддерживаемый путь, владельца и проверку того, что старая конфигурация больше не возвращается.

Сеть: соединение видно, но кто на другом конце?

Снимок TCP связывают с установленной личностью процесса. Get-NetTCPConnection показывает текущие соединения и слушатели, а не историю за ночь. Программа может использовать другой процесс для связи; это устанавливают отдельно, не автоматически приписывая ей любой трафик узла.

# Local live TCP snapshot for the actual observed process. No connection to the remote endpoint.
$ObservedPid = 0
if ($ObservedPid -le 0) { throw 'Set the currently verified PID.' }
$Before = Get-CimInstance Win32_Process -Filter "ProcessId=$ObservedPid" -ErrorAction Stop
if (-not $Before -or -not $Before.CreationDate) { throw 'Process identity/lifetime unavailable.' }
$Before | Select-Object Name,ProcessId,CreationDate,ExecutablePath
try {
    Get-NetTCPConnection -OwningProcess $ObservedPid -ErrorAction Stop |
        Select-Object LocalAddress,LocalPort,RemoteAddress,RemotePort,State,CreationTime,OwningProcess
} catch {
    Write-Warning ('No matching connections OR query failure: ' + $_.Exception.Message)
}
$After = Get-CimInstance Win32_Process -Filter "ProcessId=$ObservedPid" -ErrorAction Stop
if (-not $After -or $After.CreationDate -ne $Before.CreationDate) {
    Write-Warning 'Process ended or PID was reused during capture. Do not merge this as one identity.'
}
# Does not show historic/terminated/UDP connections or identify a human behind a relay.
# No DNS lookup, HTTP request, login, scan or callback to an unfamiliar management server.

Удалённый IP и порт — транспортные наблюдения. Они не доказывают личность оператора, содержимое сеанса или передачу базы. Для истории сопоставляют EDR, DNS, прокси, сетевые события и доступные журналы управления. NAT, общий relay и прокси способны скрывать конечного оператора от одного локального снимка.

Не посещайте подозрительный адрес, чтобы узнать, что там откроется. При необходимости исследование внешней инфраструктуры выполняют отдельно, с разрешением и из подходящей среды. В статье такой запрос не нужен: сначала сравнивают уже наблюдённые назначения с утверждённым контуром.

Кто установил: из SYSTEM не получается фамилия

Для службы интересны System/7045 и, при настроенном аудите, Security/4697. Для MSI — события установки и история системы развёртывания. Но установка могла быть переносимой, а служба — появиться позже файла. Отсутствие одного события не превращается в доказательство отсутствия установки.

Системный контекст в событии способен означать работу агента развёртывания. Тогда нужно установить задание в его консоли: кто создал, какой пакет выбрал, какие цели указал, кто согласовал. Нельзя остановиться на «установил SYSTEM», как нельзя по одной записи с доменной учётной записью обвинить конкретного человека: её могли использовать посторонние.

Проверяют загрузку пакета, появление файлов, команду запуска и последующую регистрацию. При наличии 4688 учитывают настройку командной строки и версию события. PID, время, узел и контекст должны сойтись; совпавшая дата создания каталога не заменяет эту работу.

Фишинг и ClickFix: не смешивать доставку и дальнейшее управление

ClickFix строится вокруг ложной необходимости что-то исправить или подтвердить: человеку предлагают выполнить действие в ОС вместо обычной проверки в браузере. Microsoft разбирает этот приём как социальную инженерию. Мы не воспроизводим команды и страницы такой доставки.

Первый след может находиться на рабочей станции сотрудника, а не на сервере с агентом. Установка на сервер требует отдельного объяснения: какие права, какой вход или механизм развёртывания обеспечили продолжение. «Был ClickFix» не является универсальным ответом на вопрос, почему процесс оказался под SYSTEM на другом компьютере.

Сохраняют письмо и заголовки, историю событий защиты и браузера в разрешённом объёме, файл и доступную цепочку запуска. Не просят пользователя повторить шаги на рабочем устройстве. Профилактика — понятный путь обращения в поддержку и правило не исполнять предложенное сайтом «исправление»; она дополняет ограничение полномочий, но не заменяет его.

Что делал оператор: рабочий стол не обязан оставлять дочерний shell

Удалённое управление — не только запуск PowerShell. Оператор может открыть приложение и действовать через его интерфейс. Поэтому отсутствие дочернего cmd.exe или сценария не означает отсутствия действий. Напротив, сам по себе дочерний процесс ещё не доказывает преступное назначение: согласованная поддержка тоже запускает диагностику.

Ищут следы входа и сеансов в доступных журналах продукта, а затем сопоставляют с файлами, процессами, приложением и базой. История передачи файла, если она существует и была включена, не равна доказательству передачи всех данных. Возможности журналирования и срок хранения проверяют по конкретной версии и настройкам, а не обещают из общей статьи про RMM.

Sysmon может дать дополнительные процессные, файловые и сетевые наблюдения при предварительной настройке. Он не выносит вердикт вместо исследователя. События загрузки модулей и сетевые события не следует без оценки объёма включать на всех серверах в разгар инцидента.

Таблица: факт, версия и следующий источник

В нашей учебной истории обнаружены настоящая программа, неподтверждённая установка и отличающаяся конфигурация. Этих фактов достаточно для реагирования по установленной процедуре, но недостаточно для завершённого рассказа о каждой операции атакующего. Таблица помогает не смешать установленное с возможным.

НаблюдениеЧто установленоЧего ещё не знаем
Подпись ValidРезультат проверки конкретного файлаКто разрешил установку и управление
Есть служба / процессНаблюдаемый способ запуска / исполнениеПервоначальный установщик и все прошлые запуски
В конфигурации другой GatewayСодержимое выбранного артефактаДействует ли он, кто и когда изменил
Есть TCP-соединениеТекущая транспортная связь процессаЛичность оператора, команды и переданные данные
Нет детектов / дочернего shellВ этой выборке нет таких наблюденийОтсутствие чужого управления
Владелец не подтвердил агентРазрешение не подтвержденоПолная цепочка проникновения и последствий

Если владелец подтверждает установку, всё равно остаётся вопрос, не захвачен ли его управляющий аккаунт. Если не подтверждает — исследуют происхождение и последствия. Возможен третий вариант: старый забытый договор и действующий агент без владельца. Это нарушение управления доступом, даже когда злой умысел пока не установлен.

Сбор журналов: ограниченная выборка, не универсальный антивирус

Сохраните блок как Get-RmmIncident.ps1. Он читает существующие локальные Windows-журналы за положительный интервал не больше 30 минут. Для Security нужны права. Отсутствующий канал Sysmon или отключённый аудит остаются явно обозначенными ограничениями, а не поводом автоматически устанавливать средства сбора.

# Save as Get-RmmIncident.ps1. Local existing Windows logs; no agents installed or auditing changed.
[CmdletBinding()]
param(
    [Parameter(Mandatory=$true)][datetimeoffset]$Start,
    [Parameter(Mandatory=$true)][datetimeoffset]$End,
    [ValidateRange(10,2000)][int]$MaxEventsPerLog=500
)
if ($End -le $Start -or ($End-$Start).TotalMinutes -gt 30) {
    throw 'Use a positive incident window of at most 30 minutes.'
}
$Specs = @(
    @{Log='Security';IDs=@(1102,4624,4648,4688,4697,4698,4702)},
    @{Log='System';IDs=@(104,7045)},
    @{Log='Application';IDs=@();Provider='MsiInstaller'},
    @{Log='Microsoft-Windows-Sysmon/Operational';IDs=@(1,3,7,11,22)},
    @{Log='Microsoft-Windows-PowerShell/Operational';IDs=@(4103,4104)},
    @{Log='Microsoft-Windows-Windows Defender/Operational';IDs=@()}
)
foreach ($Spec in $Specs) {
    try {
        $Info = Get-WinEvent -ListLog $Spec.Log -ErrorAction Stop
        if (-not $Info.IsEnabled) { Write-Warning ('DISABLED: ' + $Spec.Log); continue }
        $Filter = @{LogName=$Spec.Log;StartTime=$Start.LocalDateTime;EndTime=$End.LocalDateTime}
        if ($Spec.IDs.Count -gt 0) { $Filter.Id=$Spec.IDs }
        if ($Spec.ContainsKey('Provider')) { $Filter.ProviderName=$Spec.Provider }
        $Events = @(Get-WinEvent -FilterHashtable $Filter -MaxEvents $MaxEventsPerLog -ErrorAction Stop)
        if ($Events.Count -ge $MaxEventsPerLog) {
            Write-Warning ('CAPPED: ' + $Spec.Log + '. Narrow the window or acquire separately.')
        }
        foreach ($Event in $Events) {
            [pscustomobject]@{
                Computer=$Event.MachineName;Log=$Event.LogName;Provider=$Event.ProviderName
                Id=$Event.Id;RecordId=$Event.RecordId
                TimeUtc=$Event.TimeCreated.ToUniversalTime().ToString('o');Xml=$Event.ToXml()
            }
        }
    } catch {
        Write-Warning ($Spec.Log + ': no matching records OR read failure; inspect: ' + $_.Exception.Message)
    }
}
# No matching records, missing channels and truncation are coverage limits, NOT a clean result.
# Sysmon/module/network/script events require prior configuration; do not enable them fleet-wide here.
# This selection is not a full forensic image. RMM, proxy, DNS and deployment-console logs are separate.

При CAPPED сужают окно и собирают соседние интервалы либо согласуют получение полных журналов. Не делайте вывод об отсутствии запуска, просмотрев только последние 500 событий насыщенного канала. Отсутствие записей может объясняться настройками, перезаписью или ошибкой чтения.

Выборка не охватывает все журналы RMM, почты, прокси и консоли развёртывания. Их получают отдельно у владельцев. UTC-время и исходный XML помогают сопоставлению, но Logon ID одного узла не становится глобальным идентификатором человека на другом.

Сохраняем материалы и границы достоверности

Укажите реальное окно с часовым смещением и уже созданную папку дела с ограниченным доступом. Скрипты и их результаты могут содержать секреты. Даже имя управляющего сервера иногда относится к непубличной архитектуре, поэтому общий чат не подходит для хранения исходного вывода.

# One selected host and restricted existing case directory. Replace all placeholders.
$CollectorPath = 'REPLACE_FULL_PATH_TO_Get-RmmIncident.ps1'
$CaseDirectory = 'REPLACE_EXISTING_RESTRICTED_CASE_DIRECTORY'
$StartText = 'REPLACE_START_ISO8601_WITH_UTC_OFFSET'
$EndText = 'REPLACE_END_ISO8601_WITH_UTC_OFFSET'
if (@($CollectorPath,$CaseDirectory,$StartText,$EndText) -match 'REPLACE_') {
    throw 'Set the reviewed script, restricted directory and exact incident window.'
}
if (-not (Test-Path -LiteralPath $CollectorPath -PathType Leaf)) { throw 'Collector missing.' }
if (-not (Test-Path -LiteralPath $CaseDirectory -PathType Container)) { throw 'Case directory missing.' }
$Rows = @(& $CollectorPath -Start ([datetimeoffset]::Parse($StartText)) -End ([datetimeoffset]::Parse($EndText)) -MaxEventsPerLog 500)
if ($Rows.Count -eq 0) { throw 'No records collected. Review warnings; do not report a clean host.' }
$CaseFile = Join-Path $CaseDirectory ('RMM-events-' + [guid]::NewGuid().ToString('N') + '.clixml')
$Rows | Export-Clixml -LiteralPath $CaseFile -NoClobber -Encoding UTF8 -ErrorAction Stop
Get-FileHash -LiteralPath $CaseFile -Algorithm SHA256
# Protect original XML: command lines and scripts may contain secrets or personal information.
# Preserve collection warnings separately. CLIXML is not native EVTX or tamper-proof storage.
# No execution-policy bypass, malware upload, event-log clearing or remediation included.

CLIXML с XML событий — удобная рабочая копия, не полный EVTX и не криминалистический образ. Для нативных журналов применяют согласованный экспорт, например средства wevtutil, без очистки. Хеш обнаруживает изменение относительно сохранённого файла; он не подтверждает, что источник был не скомпрометирован до получения.

PowerShell-блоки этой статьи проверены статически. В рамках подготовки материала они не выполнялись в Windows-лаборатории. Перед использованием необходим разрешённый пилот и проверка совместимости. Никакие команды статьи не запускались на клиентских серверах, не останавливали агенты и не меняли защиту.

Временная линия вместо истории «по ощущениям»

В учебном эпизоде администратор сначала видит ночное соединение. Позже находится установка днём раньше. Нельзя автоматически считать первое увиденное соединение первым управлением: до него могла отсутствовать телеметрия. Аналогично дата публикации расследования BI.ZONE ничего не говорит о дате установки на вашем узле.

Учебный этап, не реальные событияИскомое подтверждениеОграничение
Доставка пакетаПисьмо / источник / запись развёртыванияНе обязательно тот же узел, что сервер
Запуск и установкаИстория процессов, MSI / служба / задачаSYSTEM не идентифицирует человека
Получение настроекФайл / политика / исходный пакетТекущий файл не доказывает старое содержимое
Связь и управлениеПроцесс + сеть + доступная история управленияRelay не равен конечному оператору
Действие и результатФайлы / приложение / база / защитаСоединение не доказывает эксфильтрацию

Проверяют альтернативные объяснения: согласованное обслуживание, переезд собственного Gateway, повторная доставка старого пакета. Подтверждение должно относиться к экземпляру, настройкам, времени и действию. Общее «мы иногда пользуемся такой программой» не объясняет конкретный сеанс. Если полноты недостаточно, это и есть корректный вывод, а не повод дорисовать атаку.

Сдерживание: не дать чужому каналу продолжаться

Когда управление не разрешено или есть подтверждённые вредоносные действия, решение принимают по процедуре реагирования. Возможны ограничение связности выбранного узла, блокирование установленного канала и меры в управляемой консоли — если она действительно принадлежит организации. При активном ущербе сбор не должен задерживать сдерживание.

Но блокировка одного общего IP способна затронуть разрешённые сервисы, а удаление единственного агента — лишить аварийного доступа. Оцените точную область и зависимость, назначьте исполнителя, обеспечьте резервный канал. Не пытайтесь входить в чужую консоль или использовать найденный ключ для проверки: это не нужно для подтверждения того, что компания такого управления не разрешала.

Не полагайтесь исключительно на firewall сервера, если атакующий мог получить на нём административные права. Существенный контроль нужен вне его полномочий. При этом остановка процесса — не доказательство, что уже установленное соединение, второй экземпляр и все механизмы повторного запуска устранены. Проверка результата должна соответствовать выбранной мере.

Почему удаления агента недостаточно

Удалённый инструмент мог быть входом, продолжением или одним из нескольких каналов. После его удаления остаются вопросы: какие действия выполнены, появились ли учётные записи и задания, изменились ли настройки приложения, раскрывались ли секреты. Удаление установщика не отзывает уже украденные полномочия.

Если скомпрометирован собственный управляющий контур, исследуют его операторов, роли, историю и остальные обслуживаемые узлы. Если инструмент пришёл из чужого контура, это не означает автоматически взлом всей штатной поддержки. Область устанавливают по данным. Решение о восстановлении узла из доверенного состояния зависит от уровня полученных полномочий и полноты исследования.

NIST SP 800-61r3 задаёт общий контекст реагирования и восстановления. В практическом протоколе нужны собственник решения, критерии восстановления, подтверждение отсутствия повторной доставки и список оставшихся неизвестных. «EXE больше нет» — лишь один пункт такого протокола.

Как находить чужое, не запрещая поддержку

Создайте разрешённый профиль инструмента: владелец, цели установки, утверждённый пакет/версия, управляющий контур, источник конфигурации, полномочия операторов и порядок отзыва. Разрешение только по издателю слишком широко: настоящий агент с чужими настройками может остаться формально разрешённым.

Полезные сигналы — новый экземпляр на сервере без заявки, запуск из непривычного места, смена управляющего назначения, появление новой службы или неподтверждённое задание развёртывания. По одному сигналу не выносится окончательный вердикт. В событии должны быть конкретный узел, процесс, путь, наблюдаемое изменение, владелец проверки и источник данных.

Не добавляйте всю папку продукта в исключения только потому, что он нужен поддержке. Если есть ложное срабатывание, разбирают конкретный объект и правило. И не требуйте от администраторов искать обходы ради каждой задачи: разрешённый путь должен быть работоспособным, документированным и достаточно удобным, чтобы им действительно пользовались.

Контроль приложений: разрешённый EXE — не вся политика

App Control for Business позволяет строить правила выполнения. Начинают с согласованного пилота и наблюдения, учитывая зависимости приложения. Массовое принудительное включение непроверенной политики на серверах может остановить разрешённое обслуживание.

Контроль исполнения закрывает часть задачи, но не определяет владельца управляющей стороны. Если программе разрешили работу, нужно отдельно ограничить её конфигурацию, доставку настроек и возможности доступа. Путь, хеш, издатель и версия имеют разные свойства при обновлениях; выбирают правила с учётом эксплуатации, а не обещают один вечный хеш для всего парка.

Сам разрешённый продукт тоже требует сопровождения. В рекомендации NetSupport от декабря 2025 года обсуждаются исправления компонентов и работа с Gateway-ключами и политиками. Это версия документа, не заявление о «самой последней версии» на любую дату. Перед обновлением проверяют актуальные рекомендации для всей используемой связки, а при раскрытии ключа — поддерживаемый порядок его замены.

Приёмка: доказываем не только наличие штатного канала

На пилотном ресурсе проверяют разрешённое действие, соответствующий управляющий контур и видимость результата. Затем согласованно отзывают выбранный доступ и отдельно проверяют новый вход, существующий сеанс и повторную доставку агента/настроек. Не нужно для этого устанавливать чужой агент или выполнять вредоносные команды: достаточно собственной тестовой конфигурации и безопасной операции.

Сценарий дополняет проект ограничения доступа подрядчика. Там мы строили границы маршрута и полномочий; здесь проверяем, не возник ли параллельный канал управления, который вообще не зависит от того VPN. Это разные вопросы к одной защищаемой инфраструктуре.

Итог аудита — не список всех EXE со словом remote. Это подтверждённый реестр каналов, понятные владельцы, проверенные настройки, журналируемые действия и работающий отзыв. Для клиента такой результат полезнее обещания «наш антивирус всё поймает»: его можно принять испытанием и повторно проверить после смены подрядчика или обновления.

Главный вывод и источники

Легальная программа не становится вредоносной от одного незнакомого имени — и не становится разрешённой от одной правильной подписи. Администратор должен связать конкретный экземпляр с подтверждённым владельцем, управлением и действиями. Если такой связи нет, расследование не закончено.

В нашем учебном начале самое опасное решение было бы закрыть находку со словами «известный производитель». Самое бесполезное — удалить всё удалённое управление и оставить компанию без поддержки. Рабочий путь лежит между ними: сохранить контекст, установить полномочия, ограничить чужой канал и подтвердить возвращение к доверенному состоянию.

Первоисточники: BI.ZONE об Insolent Hyena/Werewolf, Microsoft о ClickFix, NetSupport о Client32u.ini, NetSupport о Gateway-настройках, сопровождение безопасности NetSupport. Документация Windows, событий, контроля приложений и реагирования связана с соответствующими разделами.

Материал проверен 21 октября 2026 года. Обложка и схема — авторские иллюстрации Admin Future, не снимки исследованной BI.ZONE инфраструктуры. Команды диагностические; решения об изменении production принимаются отдельно после оценки риска и полномочий.

МШ

Максим Шаповалов

Системный администратор. 17+ лет работы с инфраструктурой.

Обсудить задачу ↗

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх