Сравнивая #Notpetya И #Petya - Можно Ли Расшифровать Ваши Файлы? Обновлено



Сравнивая #NotPetya и #Petya - можно ли расшифровать ваши файлы? Обновлено

Эксперт Positive Technologies Дмитрий Скляров представил сравнительный анализ печально известного вируса-вымогателя NotPetya, атаковавшего компании во вторник с образцом Petya 2016 года, и поделился своими наблюдениями о возможности восстановления зашифрованных им данных.

Мы рассмотрели части двух вирусов, отвечающих за шифрование MFT. Это шифрование выполняется, если у программы-вымогателя есть права администратора.



Что делает NotPetya

В момент заражения (ещё под Windows) вирус записывает в начало диска код, который будет запущен после перезагрузки, а в определённые сектора - его конфигурацию, данные для сканирования и исходную MBR. Прежде всего, давайте посмотрим на сектор 0x20 диска, который является чем-то вроде «конфига» для конкретной машины.

При заражении в сектор 0x20 записываются следующие значения: — Индикатор того, что MFT не зашифрован (значение 0) — EncryptionKey (случайная последовательность длиной 32 байта) — Nonce (случайная последовательность длиной 8 байт) — Персональный установочный ключ (случайная последовательность длиной 60 символов из алфавита «123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz») Случайные данные получаются с помощью функции CryptGenRandom, которая считается криптостойкой.

В сектор 0x21 со значением 0x07 записывается 512 байт. Исходный MBR записывается в сектор 0x22, в котором каждый байт подвергается операции XOR со значением 0x07. После первой перезагрузки MFT шифруется.

До этого: - читается сектор 0х20, — установлен флаг шифрования MFT (значение 1), — EncryptionKey копируется во временный буфер, — поле с EncryptionKey затирается нулевыми байтами - на диск записывается сектор 0х20, — прочитать сектор 0x21 (все 0x07), — его содержимое зашифровано с помощью EncryptionKey + Nonce, — на диск записывается сектор 0x21. Затем сектора MFT шифруются с использованием того же EncryptionKey + Nonce. Код алгоритма шифрования очень похож на алгоритм Salsa20, но есть отличия.

Вместо константы «расширить 32-байтовый k» используется константа «-1nvalid s3ct-id».

И до сих пор мне не удалось повторить результаты шифрования с использованием известного ключа.

Возможно у них где-то баг, который вроде бы подтверждается эта почта .

Алгоритм Salsa20 рассматривается настойчивый .

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

Ключ должен представлять собой строку символов из набора «0123456789abcdef» длиной 32. Эта строка передается через некую функцию, которая принимает на вход произвольное количество байт и выводит 32 байта.

Предположительно это хеш-функция SPONGENT (нужно проверить).

Затем выходные данные обрабатываются одной и той же функцией 128 раз, и этот результат принимается как EncryptionKey. Для проверки правильности ключа делается попытка расшифровать содержимое сектора 0x21, и если ожидаемый открытый текст там есть (все 0x07), запускается процесс расшифровки MFT и восстановления MBR.

Могут ли злоумышленники расшифровать файлы пользователя?

По моему мнению, возможность восстановления после оплаты авторами не была предусмотрена.

И вот почему:

  1. Персональный установочный ключ, который необходимо сообщить авторам вируса после выплаты выкупа, никак не связан с EncryptionKey. Оба являются случайными данными.

    Получить другой от одного невозможно, если только злоумышленники не знают что-то о CryptGenRandom. Другой вариант — они должны отправить пару установочных ключей EncryptionKey+Personal на свой сервер, но о такой активности вроде никто не сообщил (да и в коде я этого не увидел, хотя это не исключено на 100%).

  2. Если я правильно угадал с хеш-функцией SPONGENT, то ключ дешифрования должен быть выходом хеша, и чтобы вычислить то, что должен ввести пользователь, этот хэш необходимо перевернуть (129 раз), что вряд ли осуществимо на современных технологиях.

  3. ? Размер EncryptionKey составляет 32*8 == 256 бит. Шестнадцатеричный ключ, введенный пользователем, имеет размер 32*4 == 128 бит. Любая операция может только уменьшить энтропию.

    Из 32 шестнадцатеричных символов невозможно получить 32 байта с конкретными значениями.



Отличия от образца Petya 9 января 2016 г.

Петя не хотел заражать мою тестовую машину.

Возможно ему нужна сеть или что-то еще.

Пришлось выкинуть это из памяти.

У меня не было времени посмотреть код, формирующий используемые сектора из MBR, установленного вредоносным ПО, но я посмотрел скриншоты и код, который будет выполнен после перезагрузки.

Отличия:

  1. Используются сектора 0x36-0x39 (в отличие от 0x20-0x23 для NotPetya).

  2. Большинство сервисных функций (вывод текста, чтение/запись секторов) идентичны Petya.
  3. Есть функция и строки для отображения баннера с черепом.

    NotPetya также имеет очень похожую функцию, но она, вероятно, никогда не вызывается, а строки обнуляются.

  4. Длина Личного установочного ключа — 90 символов (15 групп по 6 символов) против 60 у NotPetya. Используя алфавит из 58 символов, можно закодировать максимум 527 бит информации (против 351 у NotPetya).

  5. В дампе Petya показаны строки secp256k1 и secp192k1, что предполагает, что персональный установочный ключ получен из EncryptionKey и рассчитывается с использованием криптографии на основе эллиптических кривых.

  6. Ключ, введенный пользователем для начала расшифровки, должен представлять собой строку из алфавита «123456789abcdefghijkmnopqrstuvwxABCDEFGHJKLMNPQRSTUVWX» длиной 16 символов.

  7. Нет ничего похожего на SPONGENT (или любой другой хеш).

  8. Salsa20 использует исходную константу «расширить 32-байтовый k».

    При этом код функций практически идентичен, и если код Petya, вероятно, был сгенерирован компилятором (сработала оптимизация на повторяющихся символах), то в NotPetya похоже просто заменили константы.

Петя:

Сравнивая #NotPetya и #Petya - можно ли расшифровать ваши файлы? Обновлено

НеПетя:

Сравнивая #NotPetya и #Petya - можно ли расшифровать ваши файлы? Обновлено

Я бы предположил, что существовал еще один образец Petya, из которого NotPetya был создан путем замены констант и строк.

Еще раз повторю, что NotPetya скорее всего не предусматривал возможности расшифровки файлов своих жертв, но в Petya с этим все было хорошо.

Что касается самостоятельного восстановления диска, то это возможно.

Оба вируса имеют очень схожие ошибки в реализации алгоритмов шифрования, что приводит к возможности быстрого выбора ключа шифрования и восстановления всех зашифрованных данных.

В 2016 году исследователи описал метод восстановить данные, зашифрованные Petya, без уплаты выкупа.



УПД

Среди разных версий вредоносной программы Petya 2016 года, которая под разными цветами ( 1 , 2 ) выступал в дуэте с вымогателем Мишей, а также в так форме, следует обратить внимание на PetyaGoldenEye.malware , впервые опубликованное на VirusTotal в декабре прошлого года.

Код, который NotPetya записывает в начало диска при заражении и который запускается из MBR, чрезвычайно похож на код, написанный PetyaGoldenEye: SHA256:b5ef16922e2c76b09edd71471dd837e89811c5e658406a8495c1364d0d9dc690.

Обнаружены различия между NotPetya и PetyaGoldenEye:

  • Изменены многие текстовые строки (исправлен текст выкупного сообщения, удалено изображение с черепом);
  • Изменены смещения некоторых строк (начала строк «сдвинулись» из-за изменения размера сообщений);
  • В функции по адресу 0000:86E0 перепрыгивается (никогда не выполняется) кусок кода, отвечающий за отображение баннера (мигающего «черепа и скрещенных костей») перед нажатием любой клавиши;
  • Там цвет баннера поменяли с желтого (0xE) на красный (0xC), но баннер по-прежнему не показывается;
  • По адресу 0000:848E удален вызов функции, очищающей буфер клавиатуры (заменен тремя инструкциями NOP) (не требуется, поскольку нажатия не предполагалось);
  • В функции по адресу 0000:96D4 (расширение для Salsa20) начальное состояние строки заменяется с «расширить 32-байтовый k» на «-1nvalid s3ct-id»;
  • В функции по адресу 0000:998E (перестановка для SPONGENT) было изменено начальное значение LFSR (сдвиговый регистр с линейной обратной связью); вместо 0x9E используется 0xA3.
Никаких дальнейших изменений в коде обнаружено не было.

Теперь давайте посмотрим на криптографию.



Хэш-функция ГУБКА

Код, реализующий SPONGENT, вероятно, был взят отсюда .

Если в функции permute() заменить начальное значение переменной «lfsr» и переписать функцию Spongent() так, чтобы она принимала на вход не строку с нулевым завершением, а указатель на массив и длину массива , мы получим код, эквивалентный тому, который используется в NotPetya. Примечательно, что начальное значение LFSR == 0x9E (как описано в оригинальной спецификации для SPONGENT-256/256/16) дает 140 раундов, а начальное значение 0xA3, используемое в NotPetya, дает 152 раунда (криптостойкость немного увеличена).



Функция шифрования Salsa20

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

отсюда .

Если в функции s20_expand32() заменить значение массива «o» и заменить тело функции s20_littleendian() на строку «return *(__int16*)b;», мы получим код, эквивалентный тому, который используется в NotPetya. Поскольку функция s20_littleendian() реализована некорректно (вероятно, из-за неправильного определения типа или ошибки 16-битного компилятора), значения двух из каждых четырех байтов в массиве "keystream" никак не используются.

.

Это фактически делает ключ шифрования 128-битным, а не 256-битным.

Однако полный перебор 128-битного ключевого пространства считается неразрешимой задачей на современном уровне технологий.



Выводы и предположения

Авторы Petya реализовали шифрование MFT с использованием сильных (хотя и не очень широко используемых) криптографических примитивов, код для которых был позаимствован из репозиториев на GitHub. Во время подготовки первой версии (Петя Рыжий) ошибки , и это позволило расшифровать данные без уплаты выкупа.

В последующих версиях (Petya Green, PetyaGoldenEye) ошибки были частично исправлены, и осталась только ошибка преобразования типов, уменьшив эффективную длину ключа вдвое.

Предпринимались попытки реализовать атаку на исправленный версия , но они не привели к успеху.

Авторы NotPetya, вероятно, не имели доступа к исходному коду Petya и не могли внести в него необходимые изменения и перекомпилировать проект. За основу они взяли существующий код от PetyaGoldenEye, проанализировали его с помощью дизассемблера и внесли изменения с помощью шестнадцатеричного редактора.

Поиск способов вернуть файлы, зашифрованные NotPetya, продолжается.

Теги: #notpetya #petya #вирус-вымогатель #информационная безопасность

Вместе с данным постом часто просматривают: