Windows VSS и утилита vshadow - Повышаем шансы восстановления файлов после работы шифровальщиков

imageВ последнее время пользователи компьютеров с OC Windows в корпоративном секторе всё чаще и чаще сталкиваются с угрозой шифрования рабочих файлов. Как показывает практика, периодические информационные письма о потенциальной опасности ссылок в письмах от незнакомых адресатов или “Судебных приставов” влияние на пользователей оказывают слабое. В этой заметке мы рассмотрим административные действия, которые помогут увеличить шансы восстановления пользовательских файлов после деструктивных действий программ шифровальщиков. В качестве основного инструмента мы будем использовать утилиту vshadow.exe и возможности технологии создания VSS-снимков в ОС Windows.

Сразу следует сделать важную оговорку о том, что данный метод поможет только в случае отсутствия у пользователей полных административных прав на их компьютерах. Ибо пользователь с административными правами способен, зачастую сам не понимая того, запустить зловредное ПО, способное на сегодняшний день оперировать данными VSS-снимков, попросту удаляя их.

Итак, нам понадобится утилита vshadow.exe, которую можно достать из пакета Windows SDK. Характерно для этой утилиты то, что, хоть версии vshadow.exe в разных версия ADK и не отличаются, но размер исполняемого файла в разных версиях ADK разный. Поэтому, чтобы свести возможные коллизии в работе утилиты на разных версиях ОС Windows к минимуму, мы будем использовать "родной" vshadow для каждой версии ОС.

Разложим соответствующие копии файлов vshadow.exe по подпапкам в зависимости от версии и разрядности ОС Windows. Затем создадим PowerShell-скрипт, который будет отвечать за распространение нужной копии vshadow на клиентские компьютеры корпоративной сети с параллельным включением механизма "Точек восстановления".

Пример такого PS-скрипта:

$OSVersion = (Get-WmiObject -Class Win32_OperatingSystem).Version
$OSArch = (Get-WmiObject -Class Win32_OperatingSystem).OSArchitecture
$Sys64 = "$env:SystemRoot\Sysnative"
$Sys32 = "$env:SystemRoot\System32"
$myInv = $myInvocation.MyCommand.Definition
$SCritpRoot = [System.IO.Path]::GetDirectoryName($myInv)
$vShadowPath = "$SCritpRoot\vShadow"

IF ($OSVersion -like "5.1*") {
#Включаем восстановление системы
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore" -Name DisableSR -PropertyType DWORD -Value "0" -Force
#Задаём процент использования диска по умолчанию
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore\cfg" -Name DiskPercent -PropertyType DWORD -Value "10" -Force
#Перезапускаем службу восстановления системы
Restart-Service -name srservice
} ELSE {
      #Находим все жесткие диски в формате С:\
      $Disks = [System.IO.DriveInfo]::getdrives()| ?{$_.DriveType -eq "Fixed" }
      #Влючаем ввостановление системы для всех жестких дисков
      Enable-ComputerRestore $Disks
      #Находим все жесткие диски в формате С:
      $LogicalDisks = (GET-WMIObject –query "SELECT * from win32_logicaldisk where DriveType = '3'")
      If ($LogicalDisks -ne $null) {
        foreach ($LD in $LogicalDisks) {
         $Disk = $LD.DeviceID
         #Задаем максимально допустимый размер для хранения точек ввостановления
           Foreach ($LogicalDisk in $LogicalDisks) {
           $PrevVerEnable = "vssadmin.exe Resize ShadowStorage /For=$Disk /On=$Disk /MaxSize=10%"
           chcp 1251
           IF (Test-Path "$Sys64\vssadmin.exe") {
             cmd /c "$Sys64\$PrevVerEnable"
           } ELSE {
                cmd /c "$Sys32\$PrevVerEnable"
                               }
           }
        }
      }
}
#####################################
# Копирование vshadow
#
 if ($OSArch -like "*32*") {
    if ($OSVersion -like "6.1*") {
    $vShadowPath = $vShadowPath + "\7\x86\vshadow.exe"
    }
    if ($OSVersion -like "6.2*") {
    $vShadowPath = $vShadowPath + "\8\x86\vshadow.exe"
    }
    if ($OSVersion -like "6.3*") {
    $vShadowPath = $vShadowPath + "\8.1\x86\vshadow.exe"
    }
    if ($OSVersion -like "10.*") {
    $vShadowPath = $vShadowPath + "\10\x86\vshadow.exe"
    }
    Copy-Item $vShadowPath $Sys32 -Force
}
 if ($OSArch -like "*64*") {
    if ($OSVersion -like "6.1*") {
    $vShadowPath = $vShadowPath + "\7\x64\vshadow.exe"
    }
    if ($OSVersion -like "6.2*") {
    $vShadowPath = $vShadowPath + "\8\x64\vshadow.exe"
    }
    if ($OSVersion -like "6.3*") {
    $vShadowPath = $vShadowPath + "\8.1\x64\vshadow.exe"
    }
    if ($OSVersion -like "10.*") {
    $vShadowPath = $vShadowPath + "\10\x64\vshadow.exe"
    }
    Copy-Item $vShadowPath $Sys64 -Force
}

Скрипт нужно распространить на клиентские компьютеры для последующего выполнения любым удобным для способом. Мы традиционно для этого используем возможности System Center 2012 R2 Configuration Manager (SCCM). В SCCM создаётся пакет, в котором настраивается программа для запуска скрипта следующим образом:

powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -WindowStyle Hidden -File .\EnablePreviousVersions.ps1

Обратите внимание на то, что в скрипте используется виртуальный каталог "$env:SystemRoot\Sysnative", который доступен только в 64-битных ОС. Пришлось использовать его из-за того, что Powershell скрипты в SCCM могут выполнятся только в 32-битном контексте.

После распространения vshadow необходимо настроить расписание запуска этой утилиты для периодического создания VSS-снимков системы. Воспользуемся механизмом GPP в конфигурации компьютера и создадим задание для планировщика Windows.

Задание необходимо запускать от имени NT AUTHORITY\СИСТЕМА.
image

Настраиваем создание снимка каждый день в нужное нам время, команда для создания снимка:

%windir%\system32\vshadow.exe -p %SystemDrive%

image

image

При этом включим и настроим нацеливание Item-Level Targeting таким образом, чтобы задание планировщика создавалось на клиентском компьютере только в том случае, если в системе имеется утилита vshadow.exe. 

image

По аналогии сделаем ещё одно задание планировщика, которое будет отвечать за удаление старых VSS-снимков, например 1 раз в неделю командой (правила определения того, что снимок является устаревшим мы раздали на компьютеры ранее с помощью выше-указанного PS-скрипта):

%windir%\system32\vshadow.exe -do=%SystemDrive%

image

image

Что делать, если пользователь "словил шифровальщика"?
Открываем командную строку от имени административной учётной записи и смотрим доступные нам VSS-снимки с помощью команды:

vshadow.exe -q

image

В данном примере мы видим, что нам доступен 1 снимок.

Для использования данных в снимке смонтируем её, например, как диск "X:" командой:

vshadow.exe -el={fb3feb40-dc51-4681-9783-207ec9a72518},X:

image

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

image

Для отключения диска воспользуемся командой:

mountvol X:\ /D

На этом, пожалуй, всё. Удачных вам восстановлений!

Обновление 02.09.2016

Для тех кому не очень хочется выкачивать Windows SDK под разные версии и разрядности ОС Windows, соответствующие копии утилиты vshadow.exe, совместимые с Windows 7/8/8.1/10 в варианте для 32-бита и 64-бита, можно найти в одном архиве.

Всего комментариев: 13 Комментировать

  1. Eugene Leitan /

    Либо если есть SCDPM, то можно упростить себе жизнь :)

    System Center 2012 R2 DPM — Особенности настройки End-User Recovery
    https://blog.it-kb.ru/2015/03/17/system-center-2012-r2-dpm-end-user-recovery/

  2. mcl /

    Суть та же, только целиком на PowerShell и теневое копирование выполняется для всех локальных несъемных дисков. Список дисков определяется в том же скрипте.
    При ошибках записывает сообщения в журнал.
    ------------------
    #проверяем наличие источника событий "MyShadowCopy" и создаем его если нужно
    if ([System.Diagnostics.EventLog]::SourceExists("MyShadowCopy") -eq $False) {
    New-EventLog –LogName Application –Source "MyShadowCopy"
    }

    # Получаем список всех локальных физических дисков
    $diskdrives = get-wmiobject Win32_DiskDrive | ?{$_.MediaType -eq "Fixed hard disk media"}

    foreach ( $disk in $diskdrives ) {
    #запрос для получения списка разделов (partitions) для указанного физического диска
    $part_query = 'ASSOCIATORS OF {Win32_DiskDrive.DeviceID="' + $disk.DeviceID.replace('\','\\') + '"} WHERE AssocClass=Win32_DiskDriveToDiskPartition'
    #получаем список разделов
    $partitions = @( get-wmiobject -query $part_query )
    # для каждого раздела ищем связанные логические диски
    foreach ($partition in $partitions) {
    #запрос для получения логических дисков для указанного раздела
    $vol_query = 'ASSOCIATORS OF {Win32_DiskPartition.DeviceID="' + $partition.DeviceID + '"} WHERE AssocClass=Win32_LogicalDiskToPartition'
    #получаем список логических дисков
    $volumes = @(get-wmiobject -query $vol_query)
    #для каждого логического диска выполняем команду создания теневой копии
    foreach ( $volume in $volumes) {
    try {
    Write-EventLog –LogName Application –Source "MyShadowCopy" –EntryType Information –EventID 1 –Message "Creating ShadowCopy of disk $($volume.name)"
    if ((Get-WmiObject -list win32_shadowcopy).Create($volume.name+ "\","ClientAccessible").ReturnValue -eq 0) {
    Write-EventLog –LogName Application –Source "MyShadowCopy" –EntryType Information –EventID 2 –Message "Successfully created ShadowCopy of disk $($volume.name)"
    }
    else {
    Write-EventLog –LogName Application –Source "MyShadowCopy" –EntryType Warning –EventID 4 –Message "Error creating ShadowCopy of disk $($volume.name)"
    }
    }
    catch {
    Write-EventLog –LogName Application –Source "MyShadowCopy" –EntryType Error –EventID 3 –Message "WMI Error creating ShadowCopy of disk $($volume.name)"
    }
    }

    }
    }

    1. Виталий Якоб / Автор записи

      Спасибо! =)

  3. Юрий Быков /

    Касперский не спасает, да?

    1. Алексей Максимов /

      Касперскому некогда. Он в трейсах колупается и пытается понять почему KES лагает :)

  4. kondv /

    Мы вот так решаем эту проблему http://it-school.pw/virus-shifrovalshhik-vystraivaem-zashhitu/

  5. Алексей Максимов /

    В конец заметки добавлена ссылка архив с vshadow.exe, совместимыми с Windows 7/8/8.1/10 в варианте для 32-бита и 64-бита.

  6. Александр Чохар /

    мои меры по предотвращению и спасению. Корп сектор.
    1. на фалойвых серверах FSRM + поглядывайте какие новые расширения влазяту шифровальщиков и пополняйте базу
    2. Профили - редирект на сервак и опять же FSRM.
    3. Резервные копии
    4. Архивные копии

  7. vech2k /

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

    1. Алексей Максимов /

      vshadow -revert={SnapID}

      1. vech2k /

        Сделал снимок
        Создал папку, в ней файл (допустим в документах)
        Вернул снимок, новосозданные папка с файлом затруться?

        помню возился с какими то снимками, удивило что возврат на предыдущий снимок не удалял мусор который был создан после снимка

  8. Обратная ссылка: Open Live Writer — Куда пропал мой контент из черновика, и что теперь делать ? | Блог IT-KB /

  9. BBK /

    Здравствуйте.

    А функции Delete ShadowStorage (Удаление ассоциации хранилищ теневых копий тома) в вашей версии файла нет?

    В целом необходим vssadmin c серверными функциями, но работающий в windows7, для решения проблемы связанных с Сопоставлением хранилища теневых копий (https://ibb.co/0B6m8Lk).

Добавить комментарий