Автоматизация блокирования Petya/NonPetya

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

    В связи с шумихой вокруг 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

      0
      А в чем автоматизация блокирования? Я так понимаю это проверка на «вшивость» отдельно взятой машины?
        –1
        В том, что не нужно делать все операции руками. Создание файлов perfc и правил для fw останавливает дальнейшее распространение.
        +1
        Эпидемии и дальше будут наносить значительный ущерб, пока вместо грамотного резервного копирования будут применяться подобные кустарные методы.
          +1
          Ну скопируете и дальше что, загрузите резервные вирусы? Грамотное это какое?
          Вот по вашей теме.

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

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

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

          4. В открывшемся окне нажимаем на кнопку «Обзор» и выбираем каталог с программой, по умолчанию он находится по путиC:\Program Data\Medoc IS и нажимаем «Ок».
            0
            Грамотное — данные, а не вирус. Наличие нескольких ревизий, недоступность предыдущих ревизий на перезапись и так далее.
            +1
            А с чего Вы решили, что это вместо резервного копирования?

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

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

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

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

                    До вечера 27.06.2017 данная модификация вируса не детектилась, соответственно знать, что данные не целые не представлялось возможным.
                      0
                      Заражение через M.E.Doc актуально только для Украины, а заражения зафиксированы и за ее пределами.
                        0
                        Все магазины Ehituse ABC закрыты из-за кибератаки
                        Ehituse ABC Tartu — Краски Vivacolor: Производство красок в Украине

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

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

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

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

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

                              Смешно.

                              -У вас стоит антивирус Касперский?
                              -Стоит.
                              — Сработал?
                              -Не сработал.
                              -Вы нажимали кнопку третью — исключения антивируса?
                              — Да. Поставила две галочки. Как и положено! Чтобы программа загружалась.
                        +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
                          Я с Вами полностью согласен, скрип очень далек от идеала, писался на скорую руку, но для нас он свою задачу выполнил, может быть кому-то тоже поможет.

                            –1

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

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

                            Автоматизация — это хорошо. Но только не когда это автоматизация ради автоматизации.
                              0
                              Извините, что немного не по теме, но в последнее время столько статей про Петю, что я даже и не знаю куда писать.

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

                              Если же MBR перезаписан, то понадобится R-Studio, полное сканирование диска, а дальше как описано выше. Надеюсь кому-нибудь это поможет, ведь в почте содержится процентов 30 % рабочей информации
                                0
                                рекомендую заменить в скрипте строчку (пример с Блога 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
                                }

                                  0
                                  рекомендую заменить в скрипте фрагмент:
                                  Старый фрагмент
                                  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}
                                  }


                                  на:
                                  Новый фрагмент
                                  $windows = $env:SystemRoot

                                  $files = @("perfc","perfc.dll","perfc.dat")

                                  $files | % {
                                  if((Test-Path -Path "$windows\$_") -eq $true) {
                                  try {
                                  Remove-Item -Path "$windows\$_" -Force -ea Stop
                                  Write-Verbose -Message "File [$windows\$_] was already exist" -Verbose
                                  } catch {
                                  Write-Verbose -Message "File [$windows\$_] already fixed" -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


                                  на:
                                  Новый фрагмент
                                  $files | % {
                                  try{
                                  New-item -Path $windows -ItemType File -Name $_ -Force -ea Stop
                                  }catch{Write-Verbose -Message "Dont need to create new files"}

                                  }

                                  Write-Verbose -Message "Successfully created" -Verbose

                                  $files | % {
                                  $acl = Get-acl "$windows\$_"
                                  $acl.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")

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

                                  Set-Acl -AclObject $acl -Path "$windows\$_" -ea SilentlyContinue
                                  }


                                  Преимущества:
                                  • папка может оказаться сааавсем не Windows
                                  • быстрая замена имен файлов

                                  P.S. фрагменты не тестировал!

                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                  Самое читаемое