В связи с шумихой вокруг 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)
vilgeforce
01.07.2017 13:22+1Эпидемии и дальше будут наносить значительный ущерб, пока вместо грамотного резервного копирования будут применяться подобные кустарные методы.
frees2
01.07.2017 13:48+1Ну скопируете и дальше что, загрузите резервные вирусы? Грамотное это какое?
Вот по вашей теме.
Официальные требования к бухгалтерам разработчиков.
Dr.Web.
1. В трее Windows нажмите правой кнопкой мыши на значке антивируса, в открывшемся окне нажимаем на значок «замок» для внесения изменений, потом появится значок настроек, открываем настройки.
2. В окне выбираем «Исключения»
3. Необходимо выбрать слева в меню «Каталоги и файлы» и нажать пиктограмму «Добавить»
4. В открывшемся окне нажимаем на кнопку «Обзор» и выбираем каталог с программой, по умолчанию он находится по путиC:\Program Data\Medoc IS и нажимаем «Ок».vilgeforce
01.07.2017 13:58Грамотное — данные, а не вирус. Наличие нескольких ревизий, недоступность предыдущих ревизий на перезапись и так далее.
djipa
01.07.2017 13:53+1А с чего Вы решили, что это вместо резервного копирования?
По заявлениям Директора по вопросам технологической политики Центрально-Европейской группы стран Microsoft Михаила Шмелева: «Не меньше двухсот дней назад произошло заражение». Какой глубины должен быть backup?
Кроме этого пока не ясен источник заражения и нет нормального, системного решения, подобные кустарные методы могут остановить распространение.
vilgeforce
01.07.2017 14:00+1Источник заражения практически наверняка установлен — M.E.Doc и это уже не в первый раз. Если же за 200 дней никто не понял, что данные нарушены — они и не нужны были. А инкрементному бэкапу так вообще поперек — он только изменения хранит.
djipa
01.07.2017 14:081. После первой информации в сми про M.E.Doc, это было в начале июня, мы выделили его в отдельный vlan;
2. То что M.E.Doc был одним из источников, это не означает что он был единственным;
3. Данные 200 дней были целые, но в них мог находиться вирус в спящем режиме, соответственно backup скомпрометирован. И восстановление с него приведет к повторному инциденту ИБ.
vilgeforce
01.07.2017 14:12-1Если вы говорите о других источниках — неплохо было бы знать что никто из исследователей их не нашел до сих пор. Данные в которых вирус (что уже, в целом, смешно) — не целые данные.
djipa
01.07.2017 14:29То что до сих пор не нашел, не означает, что не найдет.
На данный момент есть не подтвержденная информация о том, что одним из векторов распространения были письма с вложением. Соответственно если мы делаем резервную копию пользовательских данных в виде pst файла, в котором есть письмо с вирусом, это ли не пользовательские данные в которых вирус? Не совсем понял Ваш сарказм.
До вечера 27.06.2017 данная модификация вируса не детектилась, соответственно знать, что данные не целые не представлялось возможным.
Serge78rus
01.07.2017 14:34Заражение через M.E.Doc актуально только для Украины, а заражения зафиксированы и за ее пределами.
frees2
01.07.2017 18:56Все магазины Ehituse ABC закрыты из-за кибератаки
Ehituse ABC Tartu — Краски Vivacolor: Производство красок в Украине
Компания «Сен-Гобен» присутствует в Украине с 1996 года.
Голландское предприятие TNT, которое занимается логистикой.
Як і інші компанії по всьому світу, ми стикаємося з проблемами в наших системах мережі TNT.
teecat
03.07.2017 10:58Так это постоянно так. Проблема не шифровальщики, а downloader'ы. Программы, которые проникают, осматриваются, размещают полезную нагрузку, очищают логи и удаляются. Метод проникновения остается неизвестным и все в цикреповторяется
qwerty1023
01.07.2017 14:17Моя бухгалтерша уверяет, что обновления никакие не устанавливала (и вообще она их только вручную ставит), никакие сообщения не открывала. Но вирусный процесс был запущен из процесса «медок». Поэтому, все же не понятно, как именно он попал на машину и по какому событию активизировался.
djipa
01.07.2017 14:41+2Ну верить бухгалтеру, это сомнительная затея. Но такие же аргументы я слышал не раз и от ИТ.
Списать все на M.E.Doc, исключив при этом возможность другого источника проникновения — не правильно, как по мне.
frees2
02.07.2017 12:47Моя бухгалтерша уверяет, что обновления никакие не устанавливала
Смешно.
-У вас стоит антивирус Касперский?
-Стоит.
— Сработал?
-Не сработал.
-Вы нажимали кнопку третью — исключения антивируса?
— Да. Поставила две галочки. Как и положено! Чтобы программа загружалась.
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 не для настоящих мужчин, да? :)
djipa
01.07.2017 16:34-1Я с Вами полностью согласен, скрип очень далек от идеала, писался на скорую руку, но для нас он свою задачу выполнил, может быть кому-то тоже поможет.
soondook
02.07.2017 12:35-1Спасибо большое! Скрипт очень помог автоматизировать данную задачу на десятках машин! Ну, а темп виндовый, желательно конечно регулярно зачищать!
o_serega
02.07.2017 10:01+1На фоне защиты от зловреда, первый пункт такой ироничный: Set-executionpolicy unrestricted -force
khanid
02.07.2017 12:00Так себе способ, честно говоря.
Политика исполнения может быть выставлена определённой на целевых машинах не просто так. Это во-первых.
Во-вторых, на каждой машине надо делать ручками. Потому что на какой-нибудь 8.1 с подтянутыми политиками в части выполнения скриптов (как у меня) даже в подписанном CodeSigning сертификатом к C:\Windows просто так не пустит (Это ещё раз к слову о Set-executionpolicy unrestricted -force — пока это так, что-то помимо вас может успеть отработать — для многих это неприемлемый риск).
Пройти через админшару и руками раскидать этот perfc займёт меньше времени, имхо. Кстати, на сотню виндовых серверов у меня такой действие (руками) заняло минут 15-20 времени.
Автоматизация — это хорошо. Но только не когда это автоматизация ради автоматизации.
mazahakajay
02.07.2017 19:16Извините, что немного не по теме, но в последнее время столько статей про Петю, что я даже и не знаю куда писать.
Думаю во многих крупных компаниях люди используют outlook, а вместе с ним и архивы почты *.pst.
Так вот, почтовые архивы можно спасти даже если диск зашифровало (видимо обусловлено тем, что Петя шифрует только первый мегабайт файла).
Если MBR не перезаписаны, просто копируем с шифрованного жесткого почтовые архивы на рабочий компьютер с установленным outlook`ом, и пытаемся открыть архив там. Если при открытии возникает ошибка, запускаем утилиту scanpst.exe и пробуем восстановить. Пока не было ни одного полностью потерянного архива.
Если же MBR перезаписан, то понадобится R-Studio, полное сканирование диска, а дальше как описано выше. Надеюсь кому-нибудь это поможет, ведь в почте содержится процентов 30 % рабочей информации
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
}
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}
}
Tto_ogarin
А в чем автоматизация блокирования? Я так понимаю это проверка на «вшивость» отдельно взятой машины?
djipa
В том, что не нужно делать все операции руками. Создание файлов perfc и правил для fw останавливает дальнейшее распространение.