Коллеги, доброго времени суток.

В связи с шумихой вокруг Petya/NonPetya, моим коллегой Владиславом Ковалевым был разработан скрипт на PowerShell для борьбы с вредителем, за что ему огромное спасибо. Надеюсь кому-то будет полезен. Если кому интересно, прошу под кат

Скрипт petya_youshellnotpass выполняет следующее:

— создает правила в фаерволе, блокирующее уязвимые порты;
— ищет в C:\Windows файлы perfc и удаляет при обнаружении;
— создает новые файлы perfc и устанавливает на них запрет для всех;
— ищет в папке Temp для каждого пользователя exe-файлы и выводит список найденных, нужно просмотреть и удалить подозрительные файлы (вручную, самим)

Правило запуска:
Выполняется в обычном режиме Windows (не безопасном и не PE).

1.Запустить powershell console от админа и прописать:
Set-executionpolicy unrestricted -force

2.Выполнить скрипт petya_youshellnotpass. Внимательно следить за выводом скрипта. Проверить файлы, которые он найдет в папке Temp.

3.В powershell console ввести команду:
Set-executionpolicy restricted -force

Код:

# Get the ID and security principal of the current user account
$myWindowsID=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$myWindowsPrincipal=new-object System.Security.Principal.WindowsPrincipal($myWindowsID)
 
# Get the security principal for the Administrator role
$adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator
 
# Check to see if we are currently running "as Administrator"
if ($myWindowsPrincipal.IsInRole($adminRole))
   {
   # We are running "as Administrator" - so change the title and background color to indicate this
   $Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Elevated)"
   $Host.UI.RawUI.BackgroundColor = "DarkBlue"
   clear-host
   }
else
   {
   # We are not running "as Administrator" - so relaunch as administrator
   
   # Create a new process object that starts PowerShell
   $newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell";
   
   # Specify the current script path and name as a parameter
   $newProcess.Arguments = $myInvocation.MyCommand.Definition;
   
   # Indicate that the process should be elevated
   $newProcess.Verb = "runas";
   
   # Start the new process
   [System.Diagnostics.Process]::Start($newProcess);
   
   # Exit from the current, unelevated, process
   exit
   }

$Compname = Get-WmiObject -Class win32_computersystem | select -expa name
$Cred = $Compname+"\admin"

Write-Verbose -Message "Start process" -Verbose
Write-Verbose -Message "Adding firewall rule" -Verbose

try{New-NetFirewallRule -Action Block -Description Peta.A -Direction Inbound -DisplayName Peta.A_Block -Profile Any -Protocol TCP -LocalPort 135,139,445,1024-1035}
catch{netsh advfirewall firewall add rule name="Petya.A_Block" protocol=TCP dir=in localport=135,139,445,1024-1035 action=block}



if((Test-Path -Path C:\Windows\perfc) -eq $true)
{
    try
    {
    Remove-Item -Path C:\Windows\perfc -Force -ea Stop
    Write-Verbose -Message "File perfc was already exist" -Verbose
    }
    catch {Write-Verbose -Message "File perfc already fixed" -Verbose}
}

if((Test-Path -Path C:\Windows\perfc.dll) -eq $true)
{
    try
    {
    Remove-Item -Path C:\Windows\perfc.dll -Force -ea Stop
     Write-Verbose -Message "File perfc.dll was already exist" -Verbose
     }
      catch {Write-Verbose -Message "File perfc.dll already fixed" -Verbose}
}

if((Test-Path -Path C:\Windows\perfc.dat) -eq $true)
{
    try
    {
    Remove-Item -Path C:\Windows\perfc.dat -Force -ea stop
    Write-Verbose -Message "File perfc.dat was already exist" -Verbose
    }
     catch {Write-Verbose -Message "File perfc.dat already fixed" -Verbose}
}

try{
New-item -Path C:\Windows -ItemType File -Name Perfc -Force -ea Stop
New-item -Path C:\Windows -ItemType File -Name Perfc.dll -Force -ea Stop
New-item -Path C:\Windows -ItemType File -Name Perfc.dat -Force -ea stop
}catch{Write-Verbose -Message "Dont need to create new files"}

Write-Verbose -Message "Successfully created" -Verbose
$acl1 = Get-acl  C:\Windows\Perfc
$acl2 = Get-acl  C:\Windows\Perfc.dll
$acl3 = Get-acl  C:\Windows\Perfc.dat

$acl1.SetAccessRuleProtection($true,$true)
$acl2.SetAccessRuleProtection($true,$true)
$acl3.SetAccessRuleProtection($true,$true)

$accrule1 = New-Object System.Security.AccessControl.FileSystemAccessRule("NT AUTHORITY\SYSTEM","FullControl","Deny")
$accrule2 = New-Object System.Security.AccessControl.FileSystemAccessRule("BUILTIN\Администраторы","FullControl","Deny")
$accrule3 = New-Object System.Security.AccessControl.FileSystemAccessRule("BUILTIN\Администраторы","ReadAndExecute","Allow")
$accrule4 = New-Object System.Security.AccessControl.FileSystemAccessRule("BUILTIN\Администраторы","ReadAndExecute","Allow")

$acl1.SetAccessRule($accrule1)
$acl1.SetAccessRule($accrule2)
$acl1.SetAccessRule($accrule3)
$acl1.SetAccessRule($accrule4)

$acl2.SetAccessRule($accrule1)
$acl2.SetAccessRule($accrule2)
$acl2.SetAccessRule($accrule3)
$acl2.SetAccessRule($accrule4)

$acl3.SetAccessRule($accrule1)
$acl3.SetAccessRule($accrule2)
$acl3.SetAccessRule($accrule3)
$acl3.SetAccessRule($accrule4)

Set-Acl -AclObject $acl1 -Path C:\Windows\Perfc -ea SilentlyContinue
Set-Acl -AclObject $acl2 -Path C:\Windows\Perfc.dll -ea SilentlyContinue
Set-Acl -AclObject $acl2 -Path C:\Windows\Perfc.dat -ea SilentlyContinue

Write-Verbose -Message "Searching for exe files in temp" -Verbose

$Prof= Get-ChildItem -Path "C:\Users" -Force |where {!($_.Name -like "Все пользователи")-or!($_.Name -like "Public")}| select -expa fullname

[array]$TempFiles = $null
[array]$TempPath = $nell

Foreach ($P in $Prof)
{

$TempPath = $P+"\AppData\Local"
Get-ChildItem -Path "$TempPath" -Force -Recurse -ErrorAction SilentlyContinue | where {$_.name -like "*.exe"} | select name,fullname | Format-Table -HideTableHeaders

}

if ($TempFiles -eq $null){Write-Verbose -Message "None exe file was found" -Verbose}
else{Write-Warning -Message "$TempFiles" -Verbose}



Write-Host "Press any key to continue ..."

$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Поделиться с друзьями
-->

Комментарии (27)


  1. Tto_ogarin
    01.07.2017 12:30

    А в чем автоматизация блокирования? Я так понимаю это проверка на «вшивость» отдельно взятой машины?


    1. djipa
      01.07.2017 12:37
      -1

      В том, что не нужно делать все операции руками. Создание файлов perfc и правил для fw останавливает дальнейшее распространение.


  1. vilgeforce
    01.07.2017 13:22
    +1

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


    1. frees2
      01.07.2017 13:48
      +1

      Ну скопируете и дальше что, загрузите резервные вирусы? Грамотное это какое?
      Вот по вашей теме.

      Официальные требования к бухгалтерам разработчиков.
      Dr.Web.
      1. В трее Windows нажмите правой кнопкой мыши на значке антивируса, в открывшемся окне нажимаем на значок «замок» для внесения изменений, потом появится значок настроек, открываем настройки.

      2. В окне выбираем «Исключения»

      3. Необходимо выбрать слева в меню «Каталоги и файлы» и нажать пиктограмму «Добавить»

      4. В открывшемся окне нажимаем на кнопку «Обзор» и выбираем каталог с программой, по умолчанию он находится по путиC:\Program Data\Medoc IS и нажимаем «Ок».


      1. vilgeforce
        01.07.2017 13:58

        Грамотное — данные, а не вирус. Наличие нескольких ревизий, недоступность предыдущих ревизий на перезапись и так далее.


    1. djipa
      01.07.2017 13:53
      +1

      А с чего Вы решили, что это вместо резервного копирования?

      По заявлениям Директора по вопросам технологической политики Центрально-Европейской группы стран Microsoft Михаила Шмелева: «Не меньше двухсот дней назад произошло заражение». Какой глубины должен быть backup?

      Кроме этого пока не ясен источник заражения и нет нормального, системного решения, подобные кустарные методы могут остановить распространение.


      1. vilgeforce
        01.07.2017 14:00
        +1

        Источник заражения практически наверняка установлен — M.E.Doc и это уже не в первый раз. Если же за 200 дней никто не понял, что данные нарушены — они и не нужны были. А инкрементному бэкапу так вообще поперек — он только изменения хранит.


        1. djipa
          01.07.2017 14:08

          1. После первой информации в сми про M.E.Doc, это было в начале июня, мы выделили его в отдельный vlan;
          2. То что M.E.Doc был одним из источников, это не означает что он был единственным;
          3. Данные 200 дней были целые, но в них мог находиться вирус в спящем режиме, соответственно backup скомпрометирован. И восстановление с него приведет к повторному инциденту ИБ.


          1. vilgeforce
            01.07.2017 14:12
            -1

            Если вы говорите о других источниках — неплохо было бы знать что никто из исследователей их не нашел до сих пор. Данные в которых вирус (что уже, в целом, смешно) — не целые данные.


            1. djipa
              01.07.2017 14:29

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

              До вечера 27.06.2017 данная модификация вируса не детектилась, соответственно знать, что данные не целые не представлялось возможным.


            1. Serge78rus
              01.07.2017 14:34

              Заражение через M.E.Doc актуально только для Украины, а заражения зафиксированы и за ее пределами.


              1. frees2
                01.07.2017 18:56

                Все магазины Ehituse ABC закрыты из-за кибератаки
                Ehituse ABC Tartu — Краски Vivacolor: Производство красок в Украине

                Компания «Сен-Гобен» присутствует в Украине с 1996 года.

                Голландское предприятие TNT, которое занимается логистикой.
                Як і інші компанії по всьому світу, ми стикаємося з проблемами в наших системах мережі TNT.


            1. djipa
              01.07.2017 14:35

              Вот это еще один вопрос без ответа.


            1. Vanellope
              01.07.2017 15:47

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


              1. djipa
                01.07.2017 15:48

                Нет, про это и написал Serge78rus


            1. teecat
              03.07.2017 10:58

              Так это постоянно так. Проблема не шифровальщики, а downloader'ы. Программы, которые проникают, осматриваются, размещают полезную нагрузку, очищают логи и удаляются. Метод проникновения остается неизвестным и все в цикреповторяется


        1. qwerty1023
          01.07.2017 14:17

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


          1. djipa
            01.07.2017 14:41
            +2

            Ну верить бухгалтеру, это сомнительная затея. Но такие же аргументы я слышал не раз и от ИТ.

            Списать все на M.E.Doc, исключив при этом возможность другого источника проникновения — не правильно, как по мне.


          1. frees2
            02.07.2017 12:47

            Моя бухгалтерша уверяет, что обновления никакие не устанавливала

            Смешно.

            -У вас стоит антивирус Касперский?
            -Стоит.
            — Сработал?
            -Не сработал.
            -Вы нажимали кнопку третью — исключения антивируса?
            — Да. Поставила две галочки. Как и положено! Чтобы программа загружалась.


  1. ildarz
    01.07.2017 16:05
    +2

    Мда.


    Set-executionpolicy unrestricted -force… Set-executionpolicy restricted -force

    Да? А если там, например, remotesigned было (типично для ПК в доменной среде)?


    Смысл всей части скрипта до добавления правил файрвола совершенно непонятен. Зачем это всё?


    New-NetFirewallRule -Action Block ....

    Открываем список правил, смотрим, какие соответствуют блокируемым портам — там не только SMB и NetBIOS. Вы ТОЧНО уверены, что это надо слепо блокировать? :/ В конце-концов, если уж вам SMB-сервер на машине не нужен, ну так погасите службу LanmanServer, зачем над файрволом издеваться?


    try
    {
    Remove-Item -Path C:\Windows\perfc -Force -ea Stop
    Write-Verbose -Message "File perfc was already exist" -Verbose
    }
    catch {Write-Verbose -Message "File perfc already fixed" -Verbose}
    , и т.п.

    Если файл существует и вы не можете его удалить — значит, всё хорошо и всё починено? А вы не думали, что удаление может не пройти по какой-то другой причине? Ну, скажем, файл открыт?


    $accrule1 = New-Object ..........

    Во-первых, правила 3 и 4 у вас одинаковы. Во-вторых, зачем вешать на один и тот же объект для одного и того же принципала одновременно Deny Full Control и Allow R&E? В-третьих, использовать локализованные имена для well-known security principals — дурной тон.


    Get-ChildItem -Path "$TempPath" -Force -Recurse -ErrorAction SilentlyContinue | where {$_.name -like "*.exe"}

    Ух, это вообще застрелиться. Особенно на каком-нибудь ноуте с 5400 HDD, где темп сто лет не чистился, настройки кэша IE по умолчанию, и т.п. Параметр -filter не для настоящих мужчин, да? :)


    1. djipa
      01.07.2017 16:34
      -1

      Я с Вами полностью согласен, скрип очень далек от идеала, писался на скорую руку, но для нас он свою задачу выполнил, может быть кому-то тоже поможет.


      1. soondook
        02.07.2017 12:35
        -1

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


  1. o_serega
    02.07.2017 10:01
    +1

    На фоне защиты от зловреда, первый пункт такой ироничный: Set-executionpolicy unrestricted -force


  1. khanid
    02.07.2017 12:00

    Так себе способ, честно говоря.
    Политика исполнения может быть выставлена определённой на целевых машинах не просто так. Это во-первых.
    Во-вторых, на каждой машине надо делать ручками. Потому что на какой-нибудь 8.1 с подтянутыми политиками в части выполнения скриптов (как у меня) даже в подписанном CodeSigning сертификатом к C:\Windows просто так не пустит (Это ещё раз к слову о Set-executionpolicy unrestricted -force — пока это так, что-то помимо вас может успеть отработать — для многих это неприемлемый риск).
    Пройти через админшару и руками раскидать этот perfc займёт меньше времени, имхо. Кстати, на сотню виндовых серверов у меня такой действие (руками) заняло минут 15-20 времени.

    Автоматизация — это хорошо. Но только не когда это автоматизация ради автоматизации.


  1. mazahakajay
    02.07.2017 19:16

    Извините, что немного не по теме, но в последнее время столько статей про Петю, что я даже и не знаю куда писать.

    Думаю во многих крупных компаниях люди используют outlook, а вместе с ним и архивы почты *.pst.
    Так вот, почтовые архивы можно спасти даже если диск зашифровало (видимо обусловлено тем, что Петя шифрует только первый мегабайт файла).
    Если MBR не перезаписаны, просто копируем с шифрованного жесткого почтовые архивы на рабочий компьютер с установленным outlook`ом, и пытаемся открыть архив там. Если при открытии возникает ошибка, запускаем утилиту scanpst.exe и пробуем восстановить. Пока не было ни одного полностью потерянного архива.

    Если же MBR перезаписан, то понадобится R-Studio, полное сканирование диска, а дальше как описано выше. Надеюсь кому-нибудь это поможет, ведь в почте содержится процентов 30 % рабочей информации


  1. HomeDimoN
    04.07.2017 18:32

    рекомендую заменить в скрипте строчку (пример с Блога MSDN немного устарел):
    $newProcess.Arguments = $myInvocation.MyCommand.Definition;

    на
    $newProcess.Arguments = '"'+$script:myInvocation.MyCommand.Definition +'"';

    или (тут можно добавить параметры по вкусу):
    $newProcess.Arguments = '-ExecutionPolicy RemoteSigned -File "' + $script:MyInvocation.MyCommand.Path + '"';


    можно подписать файл скрипта (сертификат «можно купить»/«уже есть», или сделать самоподписанный):
    function sign ($filename) {
    $cert = gci cert:\currentuser\my -codesigning|Out-gridview -PassThru
    $cert|fl
    Set-AuthenticodeSignature $filename $cert
    }


  1. HomeDimoN
    04.07.2017 19:00

    рекомендую заменить в скрипте фрагмент:

    Старый фрагмент
    if((Test-Path -Path C:\Windows\perfc) -eq $true)
    {
    try
    {
    Remove-Item -Path C:\Windows\perfc -Force -ea Stop
    Write-Verbose -Message "File perfc was already exist" -Verbose
    }
    catch {Write-Verbose -Message "File perfc already fixed" -Verbose}
    }

    if((Test-Path -Path C:\Windows\perfc.dll) -eq $true)
    {
    try
    {
    Remove-Item -Path C:\Windows\perfc.dll -Force -ea Stop
    Write-Verbose -Message "File perfc.dll was already exist" -Verbose
    }
    catch {Write-Verbose -Message "File perfc.dll already fixed" -Verbose}
    }

    if((Test-Path -Path C:\Windows\perfc.dat) -eq $true)
    {
    try
    {
    Remove-Item -Path C:\Windows\perfc.dat -Force -ea stop
    Write-Verbose -Message "File perfc.dat was already exist" -Verbose
    }
    catch {Write-Verbose -Message "File perfc.dat already fixed" -Verbose}
    }