#1 Используем SEP для борьбы с локальными администраторами - Вопросы по Symantec Endpoint Protection - Форумы Anti-Malware.ru Перейти к содержанию
Shell

#1 Используем SEP для борьбы с локальными администраторами

Recommended Posts

Shell

У меня часто спрашивают - а что НЕ умеет твой SEP? Часто этот вопрос вводит в ступор, потому как по сути SEP дает мне довольно таки огромный потенциал разрешения моих задач и целей.

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

Для этого мной решено использовать:

1) vbscript который будет запускаться в политике Host Integrity по расписанию и записывать данные в БД на SQL в центральном офисе.

2) собственно, саму отдельную БД на SQL 2008

3) обрабатывающие процедуры.

В скрипте сразу закладывается логика - какие пользователи разрешены (экономлю трафик), на каких компьютерах (по MAC, ибо много у которых меняется IP) не запускать скрипт.

Итак, делаем новую политику в Host Integrity, выбираем Custom Requirements. Все далее как на скриншоте ниже (в окне имени файла вводим любое имя.vbs, ставим удаление скрипта после его исполнения (скрипт будет во временной директории ОС), в строке выполнения команды пишем cscript %F%)

2f258c21605f.jpg

Теперь редактируем под себя и вставляем сам скрипт:

'НЕ ЗАПУСКАТЬ НА СЕРВЕРАХ И КОНТРОЛЛЕРАХ ДОМЕНА!'или убрать сначала блокировку учеток в группе админов...'On  Error Resume  Nexterrors = 0 'выставляем счетчик для результата в host integritySet objRun = CreateObject("wscript.Shell")strUserName = objRun.ExpandEnvironmentStrings("%USERNAME%")Dim strComputer, member, strUsername, IsMemberDim grp, obj, objRunstrComputer = "."'объявляем массив разрешенных имен пользователейdim AllowUsersAllowUsers = "Administrator,Администратор,shell,Boss"AllowUsers = Split(AllowUsers,",")'объявляем массив разрешенных локальных пользователейdim LocalAccountsLocalAccounts = "Administrator,Администратор"LocalAccounts = Split(LocalAccounts,",")'объявляем массив mac-адресов не подлежащих проверке.dim MacAddressesMacAddresses = "00:21:9b:e5:76:f8,00:26:2d:81:70:70,00:0e:a6:f5:41:fb"'00:23:54:BD:F3:08 MyMacAddresses = Split(MacAddresses,",")'задаем параиетры соединения с БДSet objConn = CreateObject("ADODB.Connection")Set objRecordset = CreateObject("ADODB.Recordset")Set objRecordsetLast = CreateObject("ADODB.Recordset")Set objRecordsetChange = CreateObject("ADODB.Recordset")ServerName = "10.0.0.2" 'имя или IP-адрес сервераDSN = "LocalAdmins" 'имя базы данныхUID = "vbs" 'логин пользователя SQL-сервераPWD = "Sfgs%4F#D" 'пароль пользователя SQL-сервераConnectString = "Provider=SQLOLEDB;" & _                "Data Source=" & ServerName & _                ";Initial Catalog=" & DSN & _                ";UID=" & UID & ";PWD=" & PWDobjConn.ConnectionString = ConnectStringobjConn.ConnectionTimeOut = 15objConn.CommandTimeout = 30'получаем имя компаSet WshNetwork = WScript.CreateObject("WScript.Network")'WScript.Echo " " &WshNetwork.ComputerName CompName = LCase(WshNetwork.ComputerName)'получаем полное имя доменаSet objSystemInfo = CreateObject("ADSystemInfo") 'wscript.echo objSystemInfo.DomainDNSNameDomainName = LCase(objSystemInfo.DomainDNSName)'получаем IP и MACSet objWMIService = GetObject( _     "winmgmts:\\" & strComputer & "\root\cimv2")Set IPConfigSet = objWMIService.ExecQuery _("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True")For Each IPConfig in IPConfigSet    If Not IsNull(IPConfig.IPAddress) Then         For i=LBound(IPConfig.IPAddress) _            to UBound(IPConfig.IPAddress)                If Not (IPConfig.IPAddress(i)="0.0.0.0") Then            IPAddress = IPAddr + IPConfig.IPAddress(i)            MACAddress = IPConfig.MACAddress            'Wscript.Echo "IP Address: " & IPAddress & " MACAddress: " & IPConfig.MACAddress                End if        Nextend ifnext'проверяем mac-адреса на исключенияFor Each address in MacAddresses    If LCase(address) = LCase(MACAddress) then    'Wscript.echo "Этот компьютер находится в исключениях проверки по критерию MAC"    Wscript.quit(0) 'и завершаем скрипт если MAC перечислен    Exit for    End ifNext'проверяем не заблокирован ли пользовательFunction dis(Username)    Set Accounts = GetObject("WinNT://" & strComputer & "")    Accounts.Filter = Array("user")        For each user in Accounts            If LCase(user.Name) = LCase(Username) then                If user.AccountDisabled = False then                dis = 0                'wscript.echo "Пользователь " & Username & " Не заблокирован"                Else                dis = 1                'wscript.echo "Пользователь " & Username & " Уже блокирован"                exit for                end if            end if        nextEnd function'ищем группу администраторов и проверяем её членовSet colGroups = GetObject("WinNT://" & strComputer & "") 'UPcolGroups.Filter = Array("group")Dim Result ()ReDim Result(1)For Each objGroup In colGroups    If  objGroup.Name = "Administrators" or objGroup.Name ="Администраторы" Then          i=0        For Each objUser in objGroup.Members                'проверяем языковое соответствие учетных записей администраторов                   if LCase(objUser.Name) = "administrators" and LCase(objGroup.Name) = "администраторы" or LCase(objUser.Name) = "администратор" and LCase(objGroup.Name) = "administrators" then                    Set ExistLocalAccounts = GetObject("WinNT://" & strComputer & "")                    ExistLocalAccounts.Filter = Array("user")                        For Each user In ExistLocalAccounts                            For Each allowuser In LocalAccounts                            c = 0                                If LCase(user.Name) = LCase(allowuser) then exit for                                    If user.AccountDisabled = False then                                    notallowaccs = user.Name                            c = 1                                    end if                        next                            if c = 1 then                            'wscript.Echo "Итог: НЕТ В БАЗЕ ЛОКАЛЬНОГО ПОЛЬЗОВАТЕЛЯ " & notallowaccs & " <--- Незаблокирован"                            'user.AccountDisabled = True                            'user.SetInfo                            errors = 1                            end if                                    Next                    Disabled = dis(objUser.Name)                    'wscript.echo "Обнаружено языковое несоответствие учетной записи администраторов"                    objConn.Open                    Set objRecordset = objConn.Execute("insert into CommonAdmins (CompName,DomainName,IPAddress,MacAddress,UserName,Disabled,GroupName,date) values ('" & CompName &"','"& DomainName &"','"& IPAddress &"','"& MACAddress &"','" & objUser.Name & "','"& Disabled &"','"& objGroup.Name &"', getdate())")                    objConn.Close                 end if         GroupName = objGroup.Name         IsMember = objUser.Name         Result(i)=IsMember         i=i+1         ReDim Preserve Result(i)         Next     End IfNextReDim Preserve Result(i-1)'сравниваем полученный массив пользователей-админов с разрешенными локальными админами.for each adminuser in Result    for each admins in AllowUsers     x = 0     if LCase(adminuser) = LCase(admins) then exit for    x = 1    next        if x = 1 then        isMember = adminuser        'WScript.Echo "Итог: НЕТ В БАЗЕ " & IsMember        errors = 1        Disabled = dis(IsMember)        objConn.Open        Set objRecordset = objConn.Execute("insert into CommonAdmins (CompName,DomainName,IPAddress,MACAddress,UserName,Disabled,GroupName,date) values ('" & CompName &"','"& DomainName &"','"& IPAddress &"','"& MACAddress &"','" & IsMember & "','"& Disabled &"','"& GroupName &"', getdate())")        objConn.Close         end ifnextIf errors = 1 Then   'WScript.echo "Выходим с кодом 1 для Host Integrity"        WScript.Quit(1) ' --- Quit with errorsElse    WScript.Quit(0) ' --- Quit with not errorsEnd If

Теперь готовим саму БД.

Делаем отдельную БД (или изменяем в параметрах скрипта ниже и выше на свои) с именем LocalAdmins. В ней создадим маленькую табличку

USE [LocalAdmins]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE [dbo].[CommonAdmins](    [iPAddress] [varchar](15) NULL,    [MACAddress] [varchar](17) NULL,    [userName] [varchar](128) NULL,    [Disabled] [nchar](10) NULL,    [GroupName] [varchar](50) NULL,    [Date] [datetime] NULL,    [incRegister] [int] NOT NULL,    [DomainName] [varchar](128) NULL,    [CompName] [varchar](128) NULL) ON [PRIMARY]GOSET ANSI_PADDING OFFGOALTER TABLE [dbo].[CommonAdmins] ADD  CONSTRAINT [DF_CommonAdmins_UserName]  DEFAULT (NULL) FOR [userName]GOALTER TABLE [dbo].[CommonAdmins] ADD  CONSTRAINT [DF_CommonAdmins_Disabled]  DEFAULT (NULL) FOR [Disabled]GOALTER TABLE [dbo].[CommonAdmins] ADD  CONSTRAINT [DF_CommonAdmins_IncRegister]  DEFAULT ((0)) FOR [incRegister]GO

Теперь создадим 2 процедуры. Как и в предыдущей теме, я использую две процедуры. Первая будет работать по таблице, вторая - отсылать письма по подготовленным критериям и уже отфильтрованной таблице первой процедурой.

Первая процедура :

Use LocalAdmins;GOAlter PROCEDURE Clean_LocalAdminsASBEGINDECLARE @comp varchar(128), @domain varchar(128), @ip varchar(15), @users varchar(128),@group varchar(50), @date datetime, @inc int;DECLARE LACursor0 CURSOR LOCAL FOR SELECT DISTINCT CompName,DomainName,convert(varchar(15),IPAddress),UserName,GroupName,Date,IncRegister  FROM CommonAdminsorder by dateDECLARE @count int--Заменяем IP в случае выдачи скриптом из диапазона Reserved\BcastUpdate CommonAdminsSet IPAddress = 'APIPA'Where IPAddress like '%169.254.%'--меняем домен для корректной регистрации объекта инцидентаUpdate CommonAdminsSet DomainName = 'sk.domain.gk'where IPAddress like '%10.1.2.%' or IPAddress like '%10.1.1.%' or IPAddress like '%10.1.3.%'Update CommonAdminsSet DomainName = 'office.domain.gk'where IPAddress like '%10.0.17.%' or IPAddress like '%10.0.18.%'--иногда, увы скрипт не отрабатывает из за выключения питания или потери канала. Удаляем неполные данныеDELETE from CommonAdminswhere (IPAddress is NULL and MACAddress is NULL) or UserName is NULL and (GroupName is NULL)    OPEN LACursor0    FETCH NEXT FROM LACursor0 INTO @comp,@domain,@ip,@users,@group,@date,@incWHILE @@FETCH_STATUS = 0    BEGIN--считаем количество новых записей - если есть новые, делаем их актуальными, увеличиваем инкремент (IncRegister) чтобы потом контролировать--отсылку письма    Select @count = COUNT(*) from CommonAdminsWhere CompName = @comp and DomainName = @domain and convert(varchar(15),IPAddress) = @ip and UserName = @users and GroupName = @group        if @count > 1 --or @count =  0        BEGIN        Update CommonAdmins        SET IncRegister = + @count        WHERE CompName = @comp and DomainName = @domain and convert(varchar(15),IPAddress) = @ip and UserName = @users and GroupName = @group        Delete from CommonAdmins where CompName = @comp and DomainName = @domain and UserName = @users and GroupName = @group and Date < @date        END            FETCH NEXT FROM LACursor0 INTO @comp,@domain,@ip,@users,@group,@date,@inc    END;        CLOSE LACursor0;    DEALLOCATE LACursor0;--удаляем неактуальные данные, старее 120 часов :)Delete from CommonAdmins where Date < DATEADD (HOUR, -120, getdate())ENDGO

Вторая процедура, которая будет отсылать письмо

-- ================================================Use LocalAdmins;GOAlter PROCEDURE IncMailASBEGINDECLARE @comp varchar(128), @domain varchar(128), @ip varchar(15), @users varchar(128),@group varchar(50), @date datetime, @inc intDECLARE LACursor1 CURSOR LOCAL FOR SELECT CompName,DomainName,IPAddress,UserName,GroupName,Date,IncRegister FROM CommonAdmins ORDER by UserNameDECLARE @xml NVARCHAR(MAX)DECLARE @body NVARCHAR(MAX)DECLARE @dopsubj varchar(10)--создаем отчеты    OPEN LACursor1    FETCH NEXT FROM LACursor1 INTO @comp,@domain,@ip,@users,@group,@date,@incWHILE @@FETCH_STATUS = 0    BEGIN        --PRINT @comp + @domain + @ip + @users + @group + CONVERT(VARCHAR, @date, 104)    --SELECT @comp + ', '+ @domain + ', '+ @ip + ', ' + @users + ', ' + @group + ', ' + CONVERT(VARCHAR, @date, 102)+ ', '+ CONVERT(VARCHAR, @date, 8) + ', ' + @inc                IF (@inc = 0 or @inc > 120)    and @users not like 'S-1-5-21%'        BEGIN     -- готовим письмо и отсылаем            if @inc >= 120            BEGIN            SET @dopsubj = ' ПОВТОРНО '            END            ELSE            SET @dopsubj = ' '                        --Оформляем и пишем письмо        SET @body ='Инцидент ' + @dopsubj + ' по классу информационная безопасность по объекту ' + @domain + ' "Пользователь - локальный администратор".        Пользователь ' + @users + ' на АРМ ' + @comp + ' с IP адресом ' + @ip +'  - локальный администратор ' + ' (Обнаружено событие ' + convert(varchar(24),@date) + ' по Мск).        Необходимо:1) В аттаче к инциденту прикрепить письменную объяснительную ИТ специалиста по факту инцидента.2) Обеспечить функционирование ПО без повышенных привилегий.3) Удалить пользователя из локальных администраторов.                            Письмо создано автоматически.                В группе локальных администраторов должны быть только следующие учетные записи:1)    2)3)'DECLARE @subj varchar(128)= 'Локальный администратор ' + ' Пользователь - локальный администратор. '+ ' Object: ' + @domain + ' '        EXEC msdb.dbo.sp_send_dbmail        @recipients=N'helpdesk@company.ru',        @copy_recipients =N'ваш_емайл@company.ru',        @body = @body,        @body_format = 'TEXT',        @subject =@subj,        @profile_name = 'Database Mail'        END--обновляем данные о том что инцидент выслан по данному пользователю        Update CommonAdmins        Set IncRegister = @inc + 1        Where CompName = @comp and UserName = @users and GroupName = @group        FETCH NEXT FROM LACursor1 INTO @comp,@domain,@ip,@users,@group,@date,@inc    END;        CLOSE LACursor1;    DEALLOCATE LACursor1;ENDGO

Ставим шедуллер в SQL Agent на вызов этих процедур

Use LocalAdmins;GOexec Clean_LocalAdminsexec IncMail

Выше описанный метод оттестирован (в настоящее время маленькие доработки) и работоспособен.

Минусы? Конечно есть что я просто физически не успеваю реализовать. Например, то что скрипт получает имя пользователей в несовсем удобном формате (нет приставки Domain\User или Computer\User - есть возможность обдурить скрипт :) , не отмечаются группа или пользователь ну и так, по мелочи)

В скриптах есть заремаренные дополнительные функции которые вы можете открыть если нужно (например, автоматическая блокировка учетной записи - аккуратнее с этим на серверах, т.к. блокируются и IIS_\IWAM_ - внесите сначала все то что нужно).

На вопросы отвечу позже, через пару неделек ;)

P.S. не забудьте создать пользователя vbs с паролем указанным в скрипте. Только дайте ему права минимальные на БД.

  • Upvote 15

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
deviss

Я в восхищении. Теоретически, конечно, это можно решить другими средствами, но интеграция в SEP - это замечательно.

Сами выработали практику? Читая документацию как-то не доводилось сталкиваться с подобными решениями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Shell
Я в восхищении. Теоретически, конечно, это можно решить другими средствами, но интеграция в SEP - это замечательно.

Сами выработали практику? Читая документацию как-то не доводилось сталкиваться с подобными решениями.

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

В планах потом скрипт перегнать на c++\c# и доработать немного. В данное время не успеваю - нужно было что то временное но работающее сделать.

Еще один вопрос не решенным остался - не получилось вернуть из скрипта код ошибки для host integrity. К примеру, если локальные админы найдены - вернуть host complince error...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

  • Сообщения

    • demkd
      ИИ — полезная штука, но, к сожалению, бесплатные версии, как тот же Google Gemini Flash, тупенькие на уровне 12b моделей, делают колоссальное число ошибок по мелочам. Яблочко от яблони... Мало того, "новое" у них обычно старое с отставанием на год, и это в лучшем случае. Я сейчас как раз занимаюсь новой, уже 3-й версией своего "Клавиатурного помощника". В нём будет поддержка локального ИИ, горячих ИИ-клавиш, голосовых команд, голосового ввода и вспомогательной LLM для переводов, правки текста и т.п. Именно локального ИИ без необходимости обращения в сеть и сопутствующих утечек данных И это не для старого железа — нужно как минимум много памяти и современный процессор, в идеале хотя бы RTX 5060 Ti 16 ГБ в качестве ускорителя. А результат, ну, такой себе. ИИ слишком склонен ошибаться, и доверять ему что-то серьёзное пока не стоит, даже код пишет, который как-то работает, но в нём масса мелких и незаметных ошибок и уязвимостей. 
      Текст исправлен с помощью Google Gemma 4 E4B. 
    • PR55.RP55
      Вы сказали: "Найди все новые ключи которые появились 2026 г. и ранее не использовались... Можешь ?"
      *Да, я могу помочь* составить список новых ключей реестра и путей
      автозагрузки, которые вредоносное ПО использует в текущих кампаниях
      (включая модификации 2026 года), маскируясь под легальные системные
      компоненты. ( скопирую частично) :   * *|HKLM\SOFTWARE\Classes\Protocols\Filter|* и *|\Handler|* — новые
          модификации Adware перехватывают протоколы edge:// или msproedg://
          для подмены поисковой выдачи.   * *|HKCU\Software\Microsoft\Windows\CurrentVersion\Lxss|* —
          использование подсистемы WSL для скрытого автозапуска
          Linux-ориентированных рекламных модулей, незаметных для стандартных
          триггеров автозагрузки Windows. Современные зловреды (особенно Adware и майнеры) научились прописываться
      в тихий автозапуск без создания классических ключей |Run| или
      |Services|. Они используют встроенный механизм Windows 10/11 —
      *псевдонимы выполнения приложений*.   * *Суть*: В реестре создается связь в ветке
          |HKCU\Software\Microsoft\Windows\CurrentVersion\App Paths| или через
          механизм |AppXPackage|. Зловред подменяет вызов легальной команды
          (например, при наборе пользователем |notepad| или |calc| в строке
          «Выполнить») и запускает свое тело.
        * *Что добавить в памятку*: Обращать внимание на появление кастомных
          записей в блоке «Псевдонимы приложений» и проверять, куда
          перенаправляются стандартные системные вызовы. 2. Подмена через каталоги |Lxss| (WSL — Windows Subsystem for Linux)
      Это одна из самых опасных современных тенденций, так как многие
      антивирусы до сих пор слабо сканируют Linux-среду внутри Windows.   * *Суть*: Майнеры и стилеры прописывают свой запуск внутри
          дистрибутива WSL (ключ реестра
          |HKCU\Software\Microsoft\Windows\CurrentVersion\Lxss|). При старте
          Windows запускается скрытая фоновая сессия WSL, которая активирует
          ELF-бинарник (Linux-вирус). В логах автозапуска Windows это выглядит
          как легальный старт службы |wsl.exe|, но с хитрыми аргументами.
        * *Что добавить в памятку*: Формула «А+В+С»: если |wsl.exe|
          запускается автоматически с флагами |-d| (конкретный дистрибутив)
          или скрытыми bash-скриптами — это 100% повод для изоляции и проверки
          содержимого виртуального диска VHDX. 3. Продвинутый Timestomping с подделкой под апдейты ОС
      Раньше вирусописатели просто копировали даты у соседних файлов
      (|kernel32.dll| и т.д.). Теперь они действуют умнее:   * *Суть*: Дата создания файла выставляется ровно на день/час крупного
          официального обновления Windows (например, подстраиваются под график
          Patch Tuesday от Microsoft). Аналитик смотрит на лог uVS, видит дату
          (например, |14.10.2025|) и думает: «А, ну это тогда накопительный
          апдейт прилетел, файл чистый».
        * *Что добавить в памятку*: Правило проверки контрольных сумм. Не
          верить датам, даже если они идеально совпадают со временем
          системного обновления. Если у файла из папки |System32| с
          «правильной» датой обновления отсутствует валидная ЭЦП (или статус
          |Цифр. подпись: НЕТ|) — это критический триггер. 4. Атаки типа Living off the Land (LotL) через новые системные утилиты
      Вместо использования заезженных |powershell.exe| или |cmd.exe|, которые
      сейчас жестко блокируются любым EDR/антивирусом, малварь перешла на
      легальные, но редкие утилиты Windows (LOLBins).   * *Суть*: Для скачивания и запуска вредоносного кода используются
          системные компоненты:
            o |curl.exe| (теперь встроен в Windows) — для скрытой загрузки
              полезной нагрузки.
            o |tar.exe| — для распаковки зашифрованных архивов со стилерами
              прямо «на лету».
            o |winget.exe| (Windows Package Manager) — для скачивания
              вредоносных утилит из легальных репозиториев.
        * *Что добавить в памятку*: В uVS нужно тщательно анализировать
          параметры запуска командной строки в Планировщике задач (|TASKS|),
          если там фигурируют |curl|, |tar| или |bitsadmin|, качающие что-то с
          внешних IP-адресов. 6. Скрытые модификации через COM-объекты (COM Hijacking без изменения
      файлов)
      Вместо перезаписи файлов в |System32| или создания явных ключей |Run|,
      малварь перехватывает легальные системные интерфейсы через реестр.   * *Суть*: Зловред прописывает путь к своей вредоносной DLL в ветку
          *|HKCU\Software\Classes\CLSID\{GUID}\InprocServer32|*. При этом
          берется GUID легального и часто используемого компонента Windows
          (например, Проводника, контекстного меню или планировщика). Как
          только система или пользователь совершает обычное действие
          (открывает папку, кликает правой кнопкой мыши), Windows
          автоматически подгружает вредоносную DLL.
        * *Что добавить в памятку*: В uVS такие объекты часто попадают в
          категорию «Подозрительные CLSID» или скрытые расширения оболочки.
          Если в ветке |HKCU| (пользовательский уровень) переопределяется
          системный GUID, который по умолчанию должен жить только в |HKLM|
          (уровень системы) — это явный признак перехвата. 7. Спуфинг цифровой подписи через уязвимости каталогов (Catalog Signing
      Spoofing)
      Малварь научилась обходить базовую проверку подписей, из-за чего в логах
      некоторых утилит файл может ошибочно помечаться как «Подписан Microsoft».   * *Суть*: Используются уязвимости в механизме проверки файлов через
          каталоги безопасности Windows (|.cat| файлы). Вредоносный бинарник
          модифицируется таким образом, что его хэш совпадает с хэшем
          легального файла в базе данных каталогов (используются коллизии или
          специфические уязвимости парсинга).
        * *Что добавить в памятку*: Правило двойной проверки. Если файл
          находится в нетипичном месте (например,
          |C:\Users\...\Temp\svchost.exe|), но uVS или ОС рапортует, что у
          него «Валидная подпись Microsoft» — необходимо принудительно
          отправлять хэш файла на VirusTotal через встроенную функцию uVS или
          проверять подпись сторонними утилитами (например, |Sigcheck| от
          Sysinternals) с проверкой отзывов сертификатов. 8. Эксплуатация механизма «Служб доставки обновлений» браузеров
      (Edge/Chrome Maintenance)
      Рекламное ПО (Adware) и кликеры ушли от создания собственных явных служб
      и теперь паразитируют на легальных планировщиках браузеров.   * *Суть*: Вредоносный скрипт не создает новую задачу в Планировщике.
          Вместо этого он модифицирует параметры /уже существующей/ легальной
          задачи, например, |MicrosoftEdgeUpdateTaskMachineCore|. В
          оригинальную команду дописывается скрытый аргумент
          (аргумент-паразит), который раз в сутки скачивает или запускает
          рекламный модуль. Аналитик видит знакомое имя задачи Edge, видит
          легальный путь к апдейтеру и пропускает её.
        * *Что добавить в памятку*: При анализе задач Планировщика (|TASKS|) в
          uVS нужно смотреть не только на имя файла, но и *полностью
          разворачивать строку аргументов*. Любые добавленные URL-адреса,
          вызовы |cmd /c|, или сторонние пути в параметрах легальных служб
          обновления — это стопроцентный признак компрометации. 10. Фейковые системные переменные в путях автозапуска
      Обман визуального восприятия аналитика через манипуляцию переменными среды.   * *Суть*: В реестре или планировщике путь к файлу прописывается как
          |%SystemRoot%\System32\drivers\malware.sys|. Но перед этим на уровне
          пользователя (|HKCU\Environment|) создается кастомная переменная
          |%SystemRoot%|, которая указывает вовсе не на |C:\Windows|, а на
          |C:\Users\Public\Documents|. В итоге аналитик глазами видит
          «безопасный» системный путь, а система при загрузке идет в скрытую
          пользовательскую папку.
        * *Что добавить в памятку*: Всегда проверять блок «Переменные
          окружения» в начале лога uVS. Любые попытки переопределить
          стандартные переменные вроде |%SystemRoot%|, |%WinDir%| или
          |%ProgramFiles%| на уровне текущего пользователя — это критическая
          угроза.
    • PR55.RP55
      Сейчас дал ИИ задание напиши скрипт и... Вот:  ( взял Инфо. из одного из старых образов) Скрипт лечения для uVS Чтобы полностью удалить эту службу, связанные с ней файлы и очистить ссылки в реестре, выполните следующий скрипт: text ; uVS v4.15.1 [Script] ; Target OS: Windows ; Удаление вредоносной службы и основного файла апдейтера delref %Network%\C:\PROGRAM FILES (X86)\YONTOO\Y2DESKTOP.UPDATER.EXE ; Удаление исполняемого файла в AppData, вызываемого через параметры службы delref %AppData%\YONTOO\YONTOODESKTOP.EXE ; Принудительное удаление самой службы из реестра delsrv Yontoo Desktop Updater ; Очистка остаточных путей и каталогов Yontoo deldir C:\Program Files (x86)\Yontoo deldir C:\Users\cappu44ino\AppData\Roaming\Yontoo ; Перезагрузка для применения изменений restart --------- Я сильно не увлекался - так для примера.  
    • PR55.RP55
      santy Модели ИИ ( я делал запрос к google ) - есть возможность задать вопрос ( дать задание ) по заранее выбранным настройкам: настройки: yaml [SYSTEM_OVERRIDE] ---------- Код он сам себе напишет :)  Главное задать нужные вопросы и потом попросить\ сохранить настройки в виде кода ) Единственно - не все ИХ модели нормально работают. Результаты тоже нужно проверять... Например:  получить Резюме... По записи - ( как в моём примере в Новые функции ) С заранее заданными параметрами - что нам нужно.  Это и для обучения и для экономии времени и когда оператор устал, для написания отчёта - по работе на семинар, при обсуждении на форуме, анализ новых угроз или появился новый ключ автозапуска; там где есть сомнение - что это... Построить цепочку - чтобы увидеть механику процесса\заражения. Увидеть аномалии - как то, что браузер "подписан" но это ЭЦП не головного офиса - а ЭЦП - пусть и "легитимное" - но смежников.  Аномалии пути; размера; схожесть имени и т.д. Никакие настройки uVS этого не дадут.  Можно увидеть никогда ранее неиспользуемый ключ запуска ( или его нестандартное применение ).  Если железо современное - то возможно? - локальные модели ИИ. Можно попробовать например дать задание: Найди все новые ключи которые появились 2026 г. и ранее не использовались...  
    • santy
      Как гипотетические варианты действий: ---------------------- - получить детальную расшифровку выбранного антивирусного детекта по результату проверки файла на VT из экрана ИНФО. Здесь я бы обратил внимание на три основных детекта: у Kaspersky, DrWeb, ESET, возможно + Microsoft. - получить расшифровку по цифровой подписи файла, насколько известна, и надежна. -  может стоит продумать свою классификацию детектов, и потом уже на основании данной классификации находить другие примеры/способы запуска и т.п.
×