Введение
Злоумышленники постоянно ищут новые способы обхода защиты для достижения своих целей. В этом им помогают упаковщики, крипторы и обфускаторы кода. Тем не менее один из лучших способов избежать обнаружения и обеспечить максимальную совместимость — воспользоваться встроенной функциональностью операционной системы. В контексте шифровальщиков одним из ярких примеров является использование экспортируемых функций из криптографической библиотеки ADVAPI32.dll, таких как CryptAcquireContextA, CryptEncrypt и CryptDecrypt. В этом случае злоумышленники могут быть уверены, что вредоносная программа будет работать на разных версиях ОС с поддержкой этой DLL и не привлекать внимания подозрительным поведением.
Существуют и другие, не менее эффективные приемы. В недавнем инциденте наше внимание привлекла еще одна хитрая техника: злоумышленники шифруют тома встроенной функцией BitLocker и воруют ключи для расшифровки. Изначально функция BitLocker была призвана устранить угрозу утечки данных с потерянных, украденных или неправильно выведенных из эксплуатации устройств. Однако злоумышленники нашли способ эффективно эксплуатировать этот механизм в злонамеренных целях.
В упомянутом нами инциденте атакующим удалось внедрить и запустить продвинутый VBS-скрипт, открывающий возможность несанкционированного шифрования файлов с помощью BitLocker. Мы наблюдали использование этого скрипта и его модифицированных версий в Мексике, Индонезии и Иордании. Ниже мы подробно проанализируем вредоносный код, полученный в ходе реагирования на инцидент, и расскажем о том, как защититься от подобных угроз.
Это не первый случай, когда преступники шифруют диски с помощью BitLocker для последующего вымогательства. Ранее злоумышленники использовали эту функцию Microsoft для шифрования критически важных систем после получения контроля над ними. В данном же случае они предприняли дополнительные шаги, чтобы нанести максимальный ущерб и затруднить реагирование на инцидент.
Анализ VBS-скрипта
Примечательно, что авторы, в отличие от большинства других злоумышленников, не обфусцировали большую часть кода. Вероятнее всего, это объясняется тем, что на момент выполнения скрипта они уже имели полный контроль над целевой системой. Скрипт сохраняется по пути C:\ProgramData\Microsoft\Windows\Templates\ как Disk.vbs. В его первых строках содержится функция, позволяющая преобразовать строку с помощью объекта ADODB.Stream в ее двоичное представление. Эта функция в дальнейшем кодирует данные, отправляемые в запросах HTTP POST.
В самом начале функции main задействуется инструментарий управления Windows (WMI), чтобы запросить информацию об операционной системе с помощью класса Win32_OperatingSystem. Скрипт проверяет каждый объект в результатах запроса и автоматически завершается, если текущий домен отличается от целевого. После этого проверяется, содержит ли имя операционной системы следующие строки: «xp», «2000», «2003» и «vista». Если версия Windows совпадает с этими строками, скрипт автоматически завершает работу и удаляет себя.
После этого скрипт запрашивает дальнейшую информацию об ОС через WMI. Затем он выполняет операции по изменению размера диска, которые могут отличаться в зависимости от результатов проверки версии ОС. Эти операции охватывают только локальные накопители (DriveType = 3). В файловой системе обычно присутствуют следующие типы дисков:
1 2 3 4 5 6 7 8 9 |
$DriveType_map = @{ 0 = 'Unknown' 1 = 'No Root Directory' 2 = 'Removable Disk' 3 = 'Local Disk' ß этот тип накопителя и ищет вредоносная программа 4 = 'Network Drive' 5 = 'Compact Disc' 6 = 'RAM Disk' } |
Зловред не пытается выполнить те же операции на сетевых дисках (DriveType = 4) — вероятно, из опасения быть обнаруженным сетевыми средствами детектирования.
Чтобы изменить размер локальных дисков в Windows Server 2008 или 2012, скрипт определяет основной загрузочный раздел и сохраняет эту информацию. Он также сохраняет индекс различных разделов, а затем выполняет с помощью diskpart следующие действия:
- Сжимает каждый раздел, не используемый для загрузки ОС, уменьшая его на 100 МБ. В результате этой операции образуется свободное дисковое пространство (100 МБ для каждого раздела, отличного от загрузочного тома).
- Разбивает это свободное пространство на новые основные разделы размером 100 МБ.
- Форматирует разделы с параметром override, который при необходимости предварительно демонтирует том, и назначает каждому из них файловую систему и букву диска.
- Активирует разделы.
- Если процедура сжатия прошла успешно, скрипт сохраняет слово «ok» в переменную, после чего продолжает выполнение.
Если операция прошла успешно, код вызывает утилиту bcdboot, используя в качестве параметра букву диска, сохраненную на предыдущем этапе в качестве загрузочного тома, для переустановки загрузочных файлов на новые основные разделы.
Операции сжатия разделов для других версий ОС выглядят аналогично, но по соображениям совместимости реализованы в другом фрагменте кода. В примере ниже показана процедура для версий 7, 8 и 8.1.
Если в качестве операционной системы используется Windows 2008 или 7, то после завершения процедуры сжатия разделов в переменной matchedDrives сохраняются разделенные запятыми буквы дисков (если их файловая система — NFTS, exFAT, FAT32, ReFS или FAT). Ниже приведен пример значения этой переменной (код был модифицирован, чтобы вывести эту строку):
Затем скрипт добавляет следующие записи в реестр:
- fDenyTSConnections = 1: отключает RDP-соединения.
- scforceoption = 1: активирует аутентификацию по смарт-карте.
- UseAdvancedStartup = 1: требует использования PIN-кода BitLocker для аутентификации перед загрузкой.
- EnableBDEWithNoTPM = 1: позволяет использовать BitLocker без совместимого чипа TPM.
- UseTPM = 2: позволяет использовать TPM, если таковой имеется.
- UseTPMPIN = 2: позволяет использовать PIN-код для запуска с TPM, если таковой имеется.
- UseTPMKey = 2: позволяет использовать ключ запуска с TPM, если таковой имеется.
- UseTPMKeyPIN = 2: позволяет использовать ключ и PIN-код для запуска с TPM, если таковой имеется.
- EnableNonTPM = 1: позволяет использовать BitLocker без совместимого чипа TPM, запрашивает пароль или ключ запуска на USB-накопителе.
- UsePartialEncryptionKey = 2: требует использования ключа запуска с TPM.
- UsePIN = 2: требует использования PIN-кода для запуска с TPM.
При обнаружении ошибки скрипт перезагружает систему.
Проведя динамический анализ зловреда, мы можем подтвердить факт внесения следующих изменений в реестр:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
HKLM\SOFTWARE\Policies\Microsoft\FVE\UseTPMPIN: 0x00000002 HKLM\SOFTWARE\Policies\Microsoft\FVE\UseTPMKey: 0x00000002 HKLM\SOFTWARE\Policies\Microsoft\FVE\UseTPMKeyPIN: 0x00000002 HKLM\SOFTWARE\Policies\Microsoft\FVE\EnableNonTPM: 0x00000001 HKLM\SOFTWARE\Policies\Microsoft\FVE\UsePartialEncryptionKey: 0x00000002 HKLM\SOFTWARE\Policies\Microsoft\FVE\UsePIN: 0x00000002 HKLM\SOFTWARE\WOW6432Node\Policies\Microsoft\FVE\UseAdvancedStartup: 0x00000001 HKLM\SOFTWARE\WOW6432Node\Policies\Microsoft\FVE\EnableBDEWithNoTPM: 0x00000001 HKLM\SOFTWARE\WOW6432Node\Policies\Microsoft\FVE\UseTPM: 0x00000002 HKLM\SOFTWARE\WOW6432Node\Policies\Microsoft\FVE\UseTPMPIN: 0x00000002 HKLM\SOFTWARE\WOW6432Node\Policies\Microsoft\FVE\UseTPMKey: 0x00000002 HKLM\SOFTWARE\WOW6432Node\Policies\Microsoft\FVE\UseTPMKeyPIN: 0x00000002 HKLM\SOFTWARE\WOW6432Node\Policies\Microsoft\FVE\EnableNonTPM: 0x00000001 HKLM\SOFTWARE\WOW6432Node\Policies\Microsoft\FVE\UsePartialEncryptionKey: 0x00000002 HKLM\SOFTWARE\WOW6432Node\Policies\Microsoft\FVE\UsePIN: 0x00000002 |
Примечательно, что существует несколько функций, выполняющих эти операции, каждая из которых предназначена для конкретной версии Windows. В некоторых случаях скрипт проверяет, активны ли средства шифрования дисков BitLocker (BitLocker Drive Encryption Tools) через ID 266 в средствах удаленного администрирования сервера (Remote Server Administration Tools). Затем зловред проверяет, запущена ли служба BitLocker Drive Encryption Service (BDESVC). Если нет, то он запускает службу в системе.
Скрипт также изменяет метку новых загрузочных разделов на адрес почты злоумышленника, чтобы жертва могла связаться с ним (см. изображения ниже).
После этого вредоносная программа отключает механизмы, отвечающие за безопасность ключа шифрования BitLocker, и удаляет их. Метод удаления может различаться в зависимости от версии ОС. В случае с Windows Server 2008 или Windows 7 эту задачу выполняет VBS-скрипт, который после отключения средств защиты дополнительно принудительно удаляет их через PowerShell.
После завершения удаления скрипт активирует защиту цифровым паролем и функцию шифрования.
Стандартные защитные механизмы удаляются, чтобы пользователь не мог восстановить ключи, как показано в примере ниже.
На следующем этапе зловред генерирует 64-значный ключ шифрования посредством выбора 64 случайных символов из строки, состоящей из:
- цифр от 0 до 9;
- знаменитой панграммы (фразы, содержащей все буквы английского алфавита) «the quick brown fox jumps over the lazy dog» в нижнем и верхнем регистре;
- специальных символов.
Случайность этого ключа обеспечивается «зерном», которое составляется на основе различных параметров атакуемой системы, таких как занятый объем памяти и сетевая статистика. Позже эта информация отправляется злоумышленнику. Мы протестировали логику генерации ключей в нашей среде и, слегка изменив скрипт, смогли увидеть результат.
Затем код преобразует сгенерированный ключ шифрования в безопасную строку (с помощью соответствующей функции PowerShell, предотвращающей создание строкового объекта в памяти) и активирует BitLocker на дисках:
1 2 3 4 5 |
If Len((CreateObject("WScript.Shell").Exec("powershell.exe -Command ""$protectors = (Get-BitLockerVolume -MountPoint " & drives(i) & ").KeyProtector; if ($protectors -ne $null) { foreach ($protector in $protectors) { Remove-BitLockerKeyProtector -MountPoint " & drives(i) & " -KeyProtectorId $protector.KeyProtectorId } }""")).stdout.readall) > 0 Then: End If If Len((CreateObject("WScript.Shell").Exec("powershell.exe -Command $a=ConvertTo-SecureString " & Chr(34) & Chr(39) & strRandom & Chr(39) & Chr(34) & " -asplaintext -force;Enable-BitLocker " & drives(i) & " -s -qe -pwp -pw $a")).stdout.readall) > 0 Then: End If If Len((CreateObject("WScript.Shell").Exec("powershell.exe -Command Resume-BitLocker -MountPoint " & drives(i) & " ")).stdout.readall) > 0 Then: End If |
Затем скрипт создает объект запроса HTTP POST со следующими параметрами:
- использовать WinHTTP версии 5.1;
- принимать французский язык;
- игнорировать ошибки SSL (httpRequest.Option(4) = 13056 ➔ WinHttpRequestOption_SslErrorIgnoreFlags);
- отключить перенаправление (httpRequest.Option(6) = false ➔ WinHttpRequestOption_EnableRedirects).
Чтобы скрыть свой реальный адрес, злоумышленники использовали домен trycloudflare.com. Это официальный домен компании CloudFlare, назначение которого — предоставлять разработчикам быстрые туннели. Поддомен, настроенный злоумышленниками, назывался scottish-agreement-laundry-further.
Как показано на изображении ниже, вредоносная программа также включает в POST-запрос информацию о компьютере и сгенерированный ключ в качестве полезной нагрузки.
Скрипт также содержит цикл, который в случае ошибок пытается отправить информацию злоумышленнику до пяти раз.
После некоторых доработок мы смогли вывести данные, отправляемые злоумышленнику (см. изображение ниже). Обратите внимание, что данные содержат имя компьютера, версию Windows, затрагиваемые диски и строку с ключом. IP-адрес также будет зафиксирован на сервере злоумышленника, что позволит ему отслеживать каждую жертву.
После удаления средств защиты BitLocker и настройки шифрования диска скрипт выполняет ряд операций, заметая следы.
Он проверяет, является ли имя хоста целью зловреда, а затем удаляет файлы:
- \Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Preferences\ScheduledTasks\ScheduledTasks.xml
- \scripts\Login.vbs
- \scripts\Disk.vbs
- C:\ProgramData\Microsoft\Windows\Templates\Disk.vbs
Затем скрипт с помощью wevtutil очищает журналы Windows PowerShell и Microsoft-Windows-PowerShell/Operational. Он включает системный сетевой экран и удаляет все его правила. Он также удаляет задачи VolumeInit и VolumeCheck. В завершение вредоносная программа принудительно завершает работу компьютера.
1 2 3 4 5 6 |
If Len((CreateObject("WScript.Shell").Exec("wevtutil cl ""Windows PowerShell""")).stdout.readall) > 0 Then: End If If Len((CreateObject("WScript.Shell").Exec("wevtutil cl ""Microsoft-Windows-PowerShell/Operational""")).stdout.readall) > 0 Then: End If If Len((CreateObject("WScript.Shell").Exec("netsh advfirewall set allprofiles state on")).stdout.readall) > 0 Then: End If If Len((CreateObject("WScript.Shell").Exec("netsh advfirewall firewall delet rule name=all")).stdout.readall) > 0 Then: End If If Len((CreateObject("WScript.Shell").Exec("schtasks /Delete /TN ""VolumeInit"" /F")).stdout.readall) > 0 Then: End If If Len((CreateObject("WScript.Shell").Exec("schtasks /Delete /TN ""VolumeCheck"" /F")).stdout.readall) > 0 Then: End If |
После перезагрузки жертва увидит экран BitLocker. Если пользователь попытается обратиться к параметрам восстановления BitLocker, то увидит только сообщение об их отсутствии.
Тактики, техники и процедуры
Анализ показал, что автор зловреда хорошо разбирается в языке VBScript, во внутреннем устройстве Windows и системных утилитах, таких как WMI, diskpart и bcdboot. Ниже перечислены тактики, техники и процедуры (TTP), выявленные в этом сценарии.
Тактика | Техника | ID |
Execution | Command and Scripting Interpreter: Visual Basic | T1059.005 |
Execution | Windows Management Instrumentation | T1047 |
Execution | Command and Scripting Interpreter: PowerShell | T1059.001 |
Impact | Data Encrypted for Impact | T1486 |
Impact | System Shutdown/Reboot | T1529 |
Defense evasion | Clear Windows Event Logs | T1070.001 |
Defense evasion | Modify Registry | T1112 |
Defense Evasion | Disable or Modify System Firewall | T1562.004 |
Exfiltration | Exfiltration Over Web Service | T1041 |
Артефакты и цифровая криминалистика
Поскольку скрипт заметает следы, очищая журналы, удаляя созданные задачи и в итоге шифруя весь диск, получить криминалистические артефакты для идентификации вредоносной активности и поиска способов дешифровки было непросто.
К счастью, часть содержимого скрипта и выполняемых команд была записана в журнал стороннего сервиса, и эти данные удалось собрать для анализа. Таким образом из некоторых пострадавших систем мы получили безопасные строки, в которые преобразуются ключи шифрования:
Мы также попытались получить журналы сетевой активности, в которых хранились POST-запросы к командному серверу, но, к сожалению, наиболее распространенная конфигурация для логирования веб-активности поддерживает запросы GET, но не POST.
В итоге нам пришлось приложить немало усилий, чтобы все-таки получить доступ к POST-запросам. Этот случай наглядно демонстрирует важность логирования POST-трафика и сохранения всей активности критически важных систем в центральном хранилище. При этом объема хранилища должно быть достаточно для хранения данных в течение шести или более месяцев, чтобы избежать утраты доказательств, если злоумышленники удалят все следы на отдельных системах.
И последний, но не менее важный момент: некоторые системы в инфраструктуре заказчика остались незашифрованными и поначалу считались незатронутыми. Однако позднее мы выяснили, что они тоже были атакованы, но функция BitLocker в них не была настроена. Это позволило нам получить сам скрипт, проанализировать его поведение и собрать дополнительные доказательства.
Восстановление
Нам удалось заполучить некоторые парольные фразы и фиксированные значения, на основе которых злоумышленники создавали ключи шифрования. Однако скрипт также включает переменные значения, уникальные для каждой зараженной системы, что усложняет процесс дешифрования.
Предупреждение негативных последствий
Компаниям рекомендуется использовать BitLocker или другие средства шифрования (например, VeraCrypt) для защиты корпоративных секретов. Однако можно предпринять некоторые меры предосторожности, чтобы не дать преступникам злоупотребить этой функцией:
- Используйте хорошие и правильно настроенные защитные решения для конечных точек, чтобы вовремя обнаруживать угрозы, которые пытаются воспользоваться BitLocker.
- Внедрите сервис Managed Detection and Response (MDR) для проактивного мониторинга угроз.
- Если функция BitLocker включена, убедитесь, что используется надежный пароль, и храните ключи восстановления в безопасном месте.
- Предоставляйте пользователям минимально необходимые привилегии. Таким образом, они не смогут самостоятельно включать функции шифрования или изменять ключи реестра.
- Включите логирование и мониторинг сетевого трафика. Настройте логирование GET- и POST-запросов. В случае проникновения зловреда в систему запросы к домену злоумышленника могут содержать пароли или ключи.
- Отслеживайте события, связанные с выполнением VBS- и PowerShell-скриптов, и сохраняйте выявленные скрипты и команды во внешнем хранилище — это очень поможет в случае удаления локальных данных.
- Регулярно создавайте резервные копии, храните их на недоступных из интернета носителях и периодически проверяйте.
Если вам нужна помощь в расследовании атаки шифровальщика и восстановлении файлов, обратитесь к специалистам «Лаборатории Касперского» по адресу gert@kaspersky.com.
Заключение
Наш анализ инцидентов и вредоносного ПО показывает, что злоумышленники постоянно меняют свою тактику, чтобы избежать обнаружения. В этом инциденте мы наблюдали злоупотребление системной функцией BitLocker для несанкционированного шифрования данных. Из применяемого VBS-скрипта следует, что злоумышленники обладают хорошим пониманием внутреннего устройства Windows. И хотя анализ скрипта не представлял особой сложности, такие угрозы трудно поддаются обнаружению, поскольку уникальные строки внутри артефакта можно легко изменить, чтобы обойти правила YARA. Поэтому наиболее эффективным методом обнаружения угроз в таких сценариях является поведенческий анализ, который позволяет вынести вердикт по совокупности действий, выполняемых программой.
Решения «Лаборатории Касперского» детектируют угрозу, описанную в этой статье, как:
- Trojan.VBS.SAgent.gen
- Trojan-Ransom.VBS.BitLock.gen
- Trojan.Win32.Generic
Индикаторы компрометации
URL-адреса:
hxxps://scottish-agreement-laundry-further[dot]trycloudflare[dot]com/updatelog
hxxps://generated-eating-meals-top[dot]trycloudflare.com/updatelog
hxxps://generated-eating-meals-top[dot]trycloudflare.com/updatelogead
hxxps://earthquake-js-westminster-searched[dot]trycloudflare.com:443/updatelog
Адреса электронной почты:
onboardingbinder[at]proton[dot]me
conspiracyid9[at]protonmail[dot]com
Хеши MD5:
842f7b1c425c5cf41aed9df63888e768
ShrinkLocker: как BitLocker превращают в шифровальщик