Архитектура Ransomware (1/2)

Архитектура Ransomware (1/2)

Moody

В последние месяцы из-за перехода на удаленную работу (в связи с COVID-19) мы наблюдаем стремительный рост числа инцидентов, связанных с Ransomware. Не все они работают одинаково, и для того, чтобы эффективнее реагировать на инциденты в случае успешной атаки, мы должны хорошо понимать их внутреннее устройство. Я надеюсь, что цикл моих статей поможет вам полностью понять алгоритм шифрования, используемый Ransomware, или, по крайней мере, предотвратить дальнейшее заражение.

Один из лучших способов узнать, как что-то действительно работает, - это попытаться воссоздать это самостоятельно (именно то, что я и сделал). Сегодня я обозначу столпы, на которых держится данная индустрия. Во второй статье мы фактически запрограммируем собственный Ransomware, отталкиваясь от ранее изложенного.

Примечание: пара моих друзей, обладающих здравым рассудком (в отличие, от меня) подсказали, что публикация полного кода подобной программы может быть не лучшей идеей, поэтому мы просто закодируем НЕКОТОРЫЕ части, чтобы проиллюстрировать ключевые моменты.

Базовые принципы

Когда речь идет о Ransomware, первое, что вы должны различать, - это типы используемого шифрования. Существует два основных метода, которые используются большинством вымогателей из дикой природы. Давайте я кратко расскажу о них и поделюсь некоторыми полезными ссылками для самостоятельного изучения.

Симметричное шифрование

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

Асимметричное шифрование

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

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

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

Что использовать

Задумайтесь на минутку о течении обычной инфекции. Пэйлоад Ransomware доставляется по одному из путей (фишинг, уязвимое ПО и т. д.) и запускается на компьютере. Все файлы зашифровываются. Появляется окно с формой оплаты и требованием выкупа в обмен на расшифровку файлов. Как можно такое реализовать?

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

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

Это приводит нас к выводу, что нам необходимо совершенно точно выбрать асимметричное шифрование? Мы могли бы сгенерировать пару, жестко закодировать общедоступный ключ в коде и зашифровать с его помощью абсолютно все? Не совсем.

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

Итак, тогда что мы должны использовать?

Гибридный подход

Для решения названных проблем мы можем использовать гибридный подход. Суть его состоит в том, что при генерации пэйлоада, будет генерироваться набор открытых/закрытых ключей. Симметричный ключ будет храниться в пэйлоаде, и всякий раз, когда будет происходить заражение, пэйлоад будет использовать его для осуществления симметричного шифрования. После зашифрования основной информации, мы также зашифруем и этот ключ (и, конечно, уничтожим его из памяти / диска). Этот зашифрованный симметричный ключ будет лежать где-то на машине, и мы попросим жертву предоставить его нам в записке о выкупе. Но есть еще одна проблема.

Атака на основе подобранного открытого текста

Атака на основе подобранного открытого текста - это криптографическая атака, при которой атакующий зная исходный текст, и, имея на руках достаточно большой пласт зашифрованных файлов, может получить ключ расшифрования из зашифрованного результата. Если будет использоваться один и тот же ключ для всех файлов, при определенных условиях, теоретически его можно будет восстановить. Именно это и произошло с DirCrypt. Из-за комбинации плохих криптографических реализаций и повторного использования ключей, шифрование было отменено. Эту проблему можно решить, используя разные ключи для каждого файла. Мы можем генерировать симметричный ключ для каждого файла, зашифровать сам файл, зашифровать симметричный ключ открытым ключом в пэйлоаде, записать куда-нибудь зашифрованный симметричный ключ и удалить его открытое представление отовсюду.

Многие программы-вымогатели используют данный подход, когда создают текстовый файл на каждый зашифрованный файл, в который кладут зашифрованный ключ для расшифровки этого файла. В процессе расшифрования, программа считывает содержимое текстовика, расшифровывает каждый ключ с помощью закрытого ключа, а затем использует расшифрованный симметричный ключ для расшифровки исходного файла. Но мы пойдем дальше.

Техническое примечание: этот тип атаки на самом деле не влияет на шифр симметричного шифрования, который мы будем использовать (AES-256), поскольку по умолчанию он использует другой рандомизированный вектор инициализации (IV) для каждого потока файлов, но я хотел бы объяснить общие концепции, применимые ко всем Ransomware. Они могут помочь вам однажды восстановить данные, если разработчик вредоноса совершит ошибку...
Атака на основе подобранного открытого текста действительно может сыграть роль в случае с RSA 0шифрованием, поскольку оно не является случайным. В нашем случае это не проблема, потому что:
а) единственное, что мы будем шифровать при помощи RSA, - это ключи шифрования AES, который различны и не представляют опасности при анализе
б) мы будем использовать RSA в сочетании с оптимальным асимметричным заполнением, которое добавляет рандомизацию к шифрованию.

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

Из соображений скорости

Когда я программировал свой вымогатель, то использовал все наработки, о которых упоминал выше, однако, результаты меня не впечатлили. При использовании 32-битного ключа AES-256, первоначальные тесты показали, что скорость составляет примерно 1 ГБ/минуту. Эта скорость относительна, поскольку, на деле, все зависит от оборудования жертвы. Я, конечно же, использовал виртуальные машины, так как не хотел случайно зашифровать свой основной компьютер, однако, тратить 16 минут на шифрование обычного жесткого диска емкостью 1 ТБ было нежелательно. Итак, как современные Ransomware за секунды зашифровывают несколько гигабайт информации? Ответ кроется в файловой структуре.

Видите ли, вам, на самом деле, не нужно шифровать весь файл, чтобы сделать его непригодным для использования. В зависимости от его формата, шифрование заголовков и большей части начальных байтов достаточно, чтобы сделать файл не читаемым. Возможно, нам удастся обойтись шифрованием первых 5 мегабайт каждого файла. Я знаю, о чем вы думаете, и да, примитивные файлы, такие как файлы форматов txt / ascii, по-прежнему можно будет читать, используя программы вроде strings, но в большинстве случаев они не занимают больше пары килобайт. Кроме того, наиболее ценными файлами для жертвы обычно являются документы, изображения и видео. Вы все равно можете попытаться провести криминалистический анализ файлов и восстановить часть содержимого, но это крайне непрактичный ручной подход, который необходимо применять к каждому отдельному файлу.

Было бы идеально изменить конец файла, давайте воспользуемся этим, добавив две небольших структуры в конец.

  1. Вектор инициализации: при шифровании файлов с помощью AES вам понадобится нечто, называемое вектором инициализации. Он будет создаваться в начале процесса шифрования.
  2. Зашифрованный ключ дешифрования: его мы можем записывать в конец каждого файла. Это устранит необходимость в отдельном .txt с с ключом дешифрования для каждого файла.

Зашифрованная файловая структура в конечном итоге будет выглядеть примерно так:

Еще одно преимущество подхода «шифрование кусочка файла» состоит в том, что он позволяет нам модифицировать исходный файл, не создавая зашифрованную копию предыдущего, удаляя исходный. Это было бы полезно в спорных ситуациях, когда у нас имелось бы разрешения на запись в существующие файлы, но отсутствовало бы на создание нового. Это позволяет нам быстро обрабатывать огромные файлы (напр., БД MySQL на 500 ГБ).

Заключение

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

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

Чтобы сгенерировать асимметричные ключи для пэйлоада, я буду использовать команду ssh-keygen:

ssh-keygen -b 2048 -m pem -f pem

При помощи нее мы сгенерируем как открытый (pem.pub), так и закрытый ключ (pem) в формате pem. Мы свяжем pem.pub с нашим исполняемым файлом, чтобы протестировать нашу концептуальную вредоносную программу.

Конец первой части. Во второй части мы запрограммируем (некоторые части) вредоносного ПО и протестируем его выполнение, чтобы продемонстрировать, насколько быстро оно сможет зашифровать все файлы.


Прочитать оригинал этого материала на английском можно здесь.

Cybred - канал об информационной безопасности и конкурентной разведке, вдохновленный идеями олдскульных андеграундных интернет-сообществ о свободе распространения информации в сети и всеобщей взаимопомощи.

Report Page