Jump to content
BBOYMIG

Запуск AVZ удаленно

Recommended Posts

Добрый день!

Можно ли как либо организовать запуск AVZ на удаленных компьютерах со сбором стандартных скриптов 2,4,8 и данные логи отправить в определенную папку?

Я так понимаю, что AVZ можно указать скрипт, который бы он выполнял, но как указать папку с которую нужно скопировать данные результаты проверки?

avz.exe script=update.txt
----------------------------
***update.txt***
begin
ExecuteAVUpdate;
ExecuteStdScr(2);
ExecuteStdScr(4);
ExecuteStdScr(8);
ExitAVZ;
end.

 

Спасибо.

Share this post


Link to post

BBOYMIG , можно при чём разными способами. Можно и чисто скриптом AVZ, для этого почитайте справку насчёт его команд.

Либо более простой способ скопировать с помощью батника. Вы AVZ как собираетесь запускать? Через планировщик? Если да, то туда же можно воткнуть батник для копирования.

И не понятно для чего вы собираетесь запускать стандартный скрипт №4 и №8 если это по сути одно и тоже. Разница только в том, что в №8 команда обновления базы уже вставлена.

Share this post


Link to post
17 минут назад, regist сказал:

BBOYMIG

И не понятно для чего вы собираетесь запускать стандартный скрипт №4 и №8 если это по сути одно и тоже. Разница только в том, что в №8 команда обновления базы уже вставлена.

Спасибо. Понял.

17 минут назад, regist сказал:

BBOYMIG ,

Либо более простой способ скопировать с помощью батника. Вы AVZ как собираетесь запускать? Через планировщик? Если да, то туда же можно воткнуть батник для копирования.

Bat файлом задачей в KSC.

17 минут назад, regist сказал:

BBOYMIG , можно при чём разными способами. Можно и чисто скриптом AVZ, для этого почитайте справку насчёт его команд. 

\\name_server\avz4\avz.exe HiddenMode=0 NQ=Y MiniLog=Y Script=std2 Script=std8 QuarantineBaseFolder=C:\

Пробовал так, но ничего не происходит.

Сделал такой скрипт update.txt :

var
AVZLogDir : string;
begin
ExecuteAVUpdate;
CreateDirectory('C:\'+GetComputerName);
AVZLogDir := ('C:\'+GetComputerName);
ExecuteStdScr(2);
ExecuteStdScr(8);
ExitAVZ;

Запускаю его

avz.exe Script=update.txt

Выдает ошибку:

Выполнение скрипта из файла
Ошибка скрипта: ';' expected, позиция [10:1]
Выполнение скрипта завершено

Лучше бы конечно команду одной строчкой без скрипта.

Edited by BBOYMIG
Добавление информации

Share this post


Link to post

Скрипт заработал, когда добавил :

end.

Я правильно понимаю, что в стандартных скриптах встроены пути карантина и логов и явно указывать пути карантина не имеет смысла?

А если ли сами эти скрипты?

Share this post


Link to post

Почитал еще эту тему:

Задача только сбор информации для анализа без удаления и лечения ВПО. Скрипт, который Олег предлагает для этого подойдет?

Share this post


Link to post

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

var
 PCName   : string;
 SavePath : string;
begin
 // Подготовка папки для сохранения данных
 PCName := GetComputerName;
 SavePath := NormalDir('\\my_server\my_share\'+PCName);
 CreateDirectory(SavePath);
 // ********* Настройка AVZ ********
 SetupAVZ('UseQuarantine=Y'); // Включить карантин подозрительных
 SetupAVZ('Priority=-1');     // Пониженный приоритет
 SetupAVZ('EvLevel=3');       // Эвристика на максимум
 SetupAVZ('ExtEvCheck=Y');   // Расширенный анализ включен
 SetupAVZ('KeyloggerSearch=N');        // Выключить антикейлоггер
 // Отключить антируткит
 SetupAVZ('AntiRootKitSystemUser=N');
 SetupAVZ('AntiRootKitSystemKernel=N');
 SetupAVZ('AntiRootKitSystem=N');
 // Активирование сторожевого таймера на 15 минут
 ActivateWatchDog(60 * 15);
 // Запуск сканирования
 RunScan;
 // Добавление данных о имени ПК
 AddToLog('---------------');
 AddToLog('Протокол с компьютера '+PCName);
 // Исследование системы и сохранение логов в заданном месте
 ExecuteSysCheckEX(SavePath + 'syscheck.htm', $FFFFFFFF, true, 1+4+8+16+64);
 // Автокарантин
 ExecuteAutoQuarantine;
 // Генерация архива с собранными файлами
 CreateQurantineArchive(SavePath + 'quarantine.zip');
 // Сохранение протокола
 SaveLog(SavePath + 'log.txt');
 // Очистка карантина
 ClearQuarantineEx(true);
 // Завершение работы AVZ
 ExitAVZ;
end.

.

Share this post


Link to post
49 минут назад, BBOYMIG сказал:

Почитал еще эту тему:

Задача только сбор информации для анализа без удаления и лечения ВПО. Скрипт, который Олег предлагает для этого подойдет?

Да, этот скрипт подойдет. Но там сбор лога и карантина ведется во временную папку, а затем производится отправка лога и карантина ведется по FTP. В моем примере вместо FTP применяется сохранение на указанный путь (лькальный или сетевой). Из практики сохранение в сетевую папку проще, но по FTP - надежнее, так как юзер, из под которого запускается AVZ, может не иметь прав на заданную в скрипте сетевую шару.

Share this post


Link to post
59 минут назад, Zaitsev Oleg сказал:

Да, этот скрипт подойдет. Но там сбор лога и карантина ведется во временную папку, а затем производится отправка лога и карантина ведется по FTP. В моем примере вместо FTP применяется сохранение на указанный путь (лькальный или сетевой). Из практики сохранение в сетевую папку проще, но по FTP - надежнее, так как юзер, из под которого запускается AVZ, может не иметь прав на заданную в скрипте сетевую шару.

Очень приятно услышать ответ от автора данного продукта! Есть еще один небольшой вопрос. Если мы указали режим работы HiddenMode=3, а съемный носитель в момент проверки недоступен, то AVZ будет выдавать какие либо диалоговые окна?

Share this post


Link to post

Написал небольшой BAT файл. Помимо AVZ будут запускаться и другие программы, поэтому и приходится монтировать сетевой диск, т.к. некоторые программы не могут понять путь UNC.

chcp 1251
set disk1=C:
%disk1%
mkdir %disk1%\%COMPUTERNAME%\
rem определение свободного имя диска, монтирование сетевого диска  
for /F "tokens=2" %%i in ('net use * \\KSC\klshare\Utilities\Analysis ^| find ":"') do set disk=%%i
echo %disk%

%disk%

REM AVZ
mkdir %disk1%\%COMPUTERNAME%\AVZ\ 
echo f|xcopy /y "%disk%\avz4\update.txt" "%disk1%\%COMPUTERNAME%\AVZ\avz.txt" >nul
%disk%\avz4\avz.exe NQ=Y HiddenMode=0 Script=%disk1%\%COMPUTERNAME%\AVZ\AVZ.txt Priority=-1
net use %disk% /delete /yes
exit

Можно как либо передать параметр  %disk1%\%COMPUTERNAME%\ в скрипт AVZ.txt и заменить код:

('C:\'+PCName +'\AVZ\');

Даже не знаю как грамотно данный процесс реализовать, чтобы и безопасно было и все работало.

Share this post


Link to post
4 часа назад, BBOYMIG сказал:

Написал небольшой BAT файл. Помимо AVZ будут запускаться и другие программы, поэтому и приходится монтировать сетевой диск, т.к. некоторые программы не могут понять путь UNC.


chcp 1251
set disk1=C:
%disk1%
mkdir %disk1%\%COMPUTERNAME%\
rem определение свободного имя диска, монтирование сетевого диска  
for /F "tokens=2" %%i in ('net use * \\KSC\klshare\Utilities\Analysis ^| find ":"') do set disk=%%i
echo %disk%

%disk%

REM AVZ
mkdir %disk1%\%COMPUTERNAME%\AVZ\ 
echo f|xcopy /y "%disk%\avz4\update.txt" "%disk1%\%COMPUTERNAME%\AVZ\avz.txt" >nul
%disk%\avz4\avz.exe NQ=Y HiddenMode=0 Script=%disk1%\%COMPUTERNAME%\AVZ\AVZ.txt Priority=-1
net use %disk% /delete /yes
exit

Можно как либо передать параметр  %disk1%\%COMPUTERNAME%\ в скрипт AVZ.txt и заменить код:


('C:\'+PCName +'\AVZ\');

Даже не знаю как грамотно данный процесс реализовать, чтобы и безопасно было и все работало.

По вопросу выше про HiddenMode - в идеале в этом режиме никакие сообщения и ошибки не выдаются, чтобы юзер вообще не видел процесс запуска и работы AVZ. По той-же причине рекомендую включать сторожевой таймер на 15-20 минут для того, чтобы в случае сбоя работы скрипта или какой-то ошибки процесс AVZ не висел до бесконечности. По той-же причине в моем примере отключается антикейлоггер - он в ходе работы "дразнит" кейлоггеры имитацией ввода с клавиатуры, что может напугать пользователя и ввести тестовую строчку в какое-то активное в этот момент приложение.

В скрипт передать параметр элементарно - есть функция скрипта GetParamByName(имя), позволяющая извлекать из командной строки AVZ параметры по их именам (соответственно, параметр должен задаваться в формате имя=значение без пробелов, по аналогии с штатными параметрами AVZ (см. http://z-oleg.com/secur/avz_doc/index.html?script_getparambyname.htm). Чтобы не пересечься с стандартными параметрами AVZ стоит своим параметрами давать некие префиксы, типа User_ - это не обязательно, но рекомендуется. Можно также получать параметры позиционно, по порядковому номеру в командной строке, но в данном примере это неудобно.

Т.е. в скрипте это будет выглядеть примерно так:

SavePath := NormalDir(GetParamByName('User_SavePath'));

Share this post


Link to post

В bat файле прописал:
 

set disk=C:\

set User_SavePath=%disk%\%COMPUTERNAME%\AVZ

В скрипте прописал:

 SavePath := NormalDir(GetParamByName('User_SavePath?'));
 CreateDirectory(SavePath);

Выдает ошибку.

Ошибка.jpg

Share this post


Link to post
57 минут назад, BBOYMIG сказал:

NormalDir(GetParamByName('User_SavePath?'));

Так естественно не сработает, так как

1. И знак "?" там явно лишний

2. Функция GetParamByName берет параметр по имени не из переменных окружения, а из командной строки AVZ. Как следствие, такой вариант не сработает с гарантией

3. Если есть желание передать путь не через командрую строку, а через переменную окружения, то технически это можно сделать, но функция скрипта будет уже другой:

SavePath := NormalDir(GetEnvironmentVariable('User_SavePath'));
CreateDirectory(SavePath);

Share this post


Link to post
3 часа назад, Zaitsev Oleg сказал:

Если есть желание передать путь не через командрую строку, а через переменную окружения, то технически это можно сделать, но функция скрипта будет уже другой:


SavePath := NormalDir(GetEnvironmentVariable('User_SavePath'));
CreateDirectory(SavePath);

Спасибо! Всё получилось! Есть еще два вопроса.

1.Будет ли правильно в скрипте указывать обновление антивирусных баз и модулей, если папка из которой запускают задачу с правами только на чтение?

2. Я  так понимаю, чтобы пополнить базу чистых файлов, необходимо отправить карантин в сервис  Пополнение базы чистых файлов?

А если архив весит более 200 мб?

Как быстро пополняются баз данных?

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

3. Данная команда анализирует все записи автозагрузки в системе или только информацию от запущенного пользователя?

 ExecuteSysCheckEX(SavePath + 'syscheck.htm', $FFFFFFFF, true, 1+4+8+16+64);
Edited by BBOYMIG
Дополнительные вопросы

Share this post


Link to post
19 минут назад, BBOYMIG сказал:

Спасибо! Всё получилось! Есть еще два вопроса.

1.Будет ли правильно в скрипте указывать обновление антивирусных баз и модулей, если папка из которой запускают задачу с правами только на чтение?

2. Я  так понимаю, чтобы пополнить базу чистых файлов, необходимо отправить карантин в сервис  Пополнение базы чистых файлов?

А если архив весит более 200 мб?

Как быстро пополняются баз данных?

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

3. Данная команда анализирует все записи автозагрузки в системе или только информацию от запущенного пользователя?


 ExecuteSysCheckEX(SavePath + 'syscheck.htm', $FFFFFFFF, true, 1+4+8+16+64);

1. Если папка только на чтение, команда обновления баз в скрипте клиента бессмысленна и даже вредна. Необходимо на сервере, на котором расшарена эта папка, настроить запуск AVZ  через задание планировщика, на выполнение скрипта, обновляющего базы. Этот скрипт обновит базы AVZ, следовательно, все, кто запускают его через сетевую шару, будет использовать эти обновленные базы.

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

3. Да. Она смотрит системные ключи + автозапуски всех юзеров.

Share this post


Link to post
2 часа назад, Zaitsev Oleg сказал:

По запросу я могут посмотреть карантины приоритетно, это несложно.

Файл сохранён как    180910_123349_Comp_1_5b9664ad1001c.zip
Размер файла    24854974
MD5    5ba7fc5e1f02b291c484f25c39e710bd

Спасибо ещё раз за помощь! Редко, когда так оперативно отвечают на вопросы.

Share this post


Link to post
Файл сохранён как	180910_130024_Comp_2_5b966ae873b1b.zip
Размер файла	49089479
MD5	fc9dfcc1e7e8aa4dfdca74cfd7ca579f

 

   
   

Share this post


Link to post

Оба карантина ушли в БД чистых, завтра утром базы уже будут содержать информацию по файлам из этих карантинов.

Могу предложить небольшую оптимизацию скрипта  (на изучение сети это особо негативно не скажется). В скрипт в раздел настройки после SetupAVZ включить команду:

 AddQuarantineFilter('%WinDir%\assembly\NativeImages*\*.dll');

Это приведет к тому, что огромные DLL из этой папки не будут попадать в карантины, что уменьшит их объем в несколько раз. Периодически можно такую инструкцию следует убирать, для получения полной картины. Команды AddQuarantineFilter можно вызывать многократно, каждая добавляет определенную маску (к примеру, можно блокировать карантин каких-то неинтересных объектов, или масками типа '*.docx' исключить карантин документов, даже если они прописаны в автозапуск.

Share this post


Link to post
23 часа назад, BBOYMIG сказал:

2. Я  так понимаю, чтобы пополнить базу чистых файлов, необходимо отправить карантин в сервис  Пополнение базы чистых файлов?

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

1) https://virusinfo.info/content.php?r=125-page-uploadclean лимит 80 MB

2) https://virusinfo.info/content.php?r=290-free-online-malware-scanner лимит 256 MB

23 часа назад, BBOYMIG сказал:

А если архив весит более 200 мб?

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

3) http://avz.safezone.cc/ лимит 250 MB (а если он больше, то можно залить на обменник и оставить там в теме ссылку).

4) http://z-oleg.com/secur/avz/upload_qr.php лимит 20 MB. И считаю его давно пора увеличить.

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

Share this post


Link to post

Коллеги, спасибо за ответ!

Я еще прочитал информацию, что AVZ умеет выдавать отчет в формате CSV.

Добавил в отчет строчку:

Добавил в отчет строчку SaveCSVLog(SavePath + 'avz.csv');

Отчет пустой.  Может, я что либо упустил?

Есть еще вопрос по функционалу.

AVZ видит все процессы в системе? Можно ли списком в формате CSV выгрузить все процессы с хешем?

Можно ли сделать скрипт, который бы выгружал информацию по пользователям. Их полное имя, логин, SID, время, дату регистрации, время последнего входа?

Share this post


Link to post

SaveCSVLog сохраняет список сигнатурных детектов и подозрений. Если детектов и подозрений нет - список будет пустой.

Список процессов напрямую AVZ не может сохранить в CSV. Но это можно сделать средствами скриптового языка, если необходимо - покажу как (по сути, скрипт имеет доступ к протоколу исследования системы в XML формате, поэтому может прочитать необходимый тег XML лога и конвертировать его в CSV. Вторая тонкость - AVZ видит все процессы, но в лог попадут только те, что не проходят по базе безопасных. Для XML конкретно для процессов фильтр отключатся и можно получить все процессы.

 

Share this post


Link to post
function GetField(AName : string) : string;
begin
 Result := AName + '="'+WMI_GETFIELD(AName)+'"';
end;

begin
 if WMI_INIT('localhost', 'root\cimv2') then
  if WMI_QUERY('SELECT * FROM Win32_UserAccount') then
   while WMI_FETCH do begin
    Addtolog(GetField('AccountType')+', '+
             GetField('Caption')+', '+
             GetField('Description')+', '+
             GetField('Disabled')+', '+
             GetField('Domain')+', '+
             GetField('FullName')+', '+
             GetField('InstallDate')+', '+
             GetField('LocalAccount')+', '+
             GetField('Lockout')+', '+
             GetField('Name')+', '+
             GetField('PasswordChangeable')+', '+
             GetField('PasswordExpires')+', '+
             GetField('PasswordRequired')+', '+
             GetField('SID')+', '+
             GetField('SIDType')
             );
end;

Вот такой скрипт вернет список локальных пользователей ПК.

Share this post


Link to post
40 минут назад, Zaitsev Oleg сказал:

function GetField(AName : string) : string;
begin
 Result := AName + '="'+WMI_GETFIELD(AName)+'"';
end;

begin
 if WMI_INIT('localhost', 'root\cimv2') then
  if WMI_QUERY('SELECT * FROM Win32_UserAccount') then
   while WMI_FETCH do begin
    Addtolog(GetField('AccountType')+', '+
             GetField('Caption')+', '+
             GetField('Description')+', '+
             GetField('Disabled')+', '+
             GetField('Domain')+', '+
             GetField('FullName')+', '+
             GetField('InstallDate')+', '+
             GetField('LocalAccount')+', '+
             GetField('Lockout')+', '+
             GetField('Name')+', '+
             GetField('PasswordChangeable')+', '+
             GetField('PasswordExpires')+', '+
             GetField('PasswordRequired')+', '+
             GetField('SID')+', '+
             GetField('SIDType')
             );
end;

Вот такой скрипт вернет список локальных пользователей ПК.

Добавил в конец

end.

Скрипт заработал, но выгрузил мне все учетные записи в домене.

54 минуты назад, Zaitsev Oleg сказал:

 Если необходимо - покажу как.

Очень был бы этому рад! Многие задачи я решаю через CSV файлы.

Share this post


Link to post
15 часов назад, BBOYMIG сказал:

Очень был бы этому рад! Многие задачи я решаю через CSV файлы.

Вот функция:

Цитата

function CreateCSVProcessReport(AReportFile : string) : boolean;
const
 FieldSeparator = ';';
var
 Lines : TStringList;
 i   : integer;
begin
 Result := false;
 if SC_INIT then begin
   if SC_SelectNode('AVZ\PROCESS') then begin
    Lines := TStringList.Create;
    for i := 0 to SC_GetItemsCount - 1 do
      if SC_GetTagName(i) = 'ITEM' then
       Lines.Add(SC_GetParamVal(i, 'PID', '') + FieldSeparator +
                 SC_GetParamVal(i, 'File', '') + FieldSeparator +
                 SC_GetParamVal(i, 'CheckResult', '') + FieldSeparator +
                 SC_GetParamVal(i, 'MD5', '') + FieldSeparator
                 );
    Lines.SaveToFile(AReportFile);
    Lines.Free;
    Result := true;
   end else
    AddToLog('[CSV] Ошибка: в результатах исследования нет данных о процессах');
   SC_FREE;
 end else
   AddToLog('[CSV] Ошибка: данные исследования системы недоступны')
end;

Сам код функции должна находиться в начале скрипта (до begin скрипта), а вот место ее вызова очень важно - вызов должен следовать непосредственно после вызова ExecuteSysCheckEX, так как функцией используются данные исследования системы. Единственный параметр - полное имя файла, в который следует сохранить отчет. По аналогии можно вытащить любые другие данные исследования системы, так как через функции SC_SelectNode + SC_GetTagName и SC_GetParamVal можно получить доступ к любому тегу XML отчета.

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

We use cookies to make your experience of our websites better. By using and further navigating this website you accept this. Detailed information about the use of cookies on this website is available by clicking on more information.