Хабрахабр

Программа-вымогатель Sodinokibi: детальное изучение

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


Авторы текста: Равикант Тивари и Александр Кошелев

Что мы знаем о Sodinokibi?

Sodinokibi скорее всего распространяется теми же самыми злоумышленниками, которые были известны атаками вымогателей из семейства GandCrab, которое, судя по сообщениям на подпольных форумах, больше не будет развиваться.

Попав в систему, вредоносное ПО старается запустить себя с расширенными правами, чтобы получить доступ ко всем файлам и ресурсам ПК без ограничения…
Sodinokibi старается не заражать компьютеры в Иране, России и других странах бывшего СССР. Sodinokibi использует уязвимость Oracle WebLogic (CVE-2019-2725), чтобы получить доступ к компьютеру жертвы.

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

Пользовательские файлы шифруются при помощи Salsa20.

Для генерации и распространения ключей Sodinokibi использует алгоритм Diffie-Hellman на эллиптических кривых.

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

32806964 BTC (≈ $2 500) за восстановление доступа к зашифрованным файлам. На данный момент вымогатели просят 0. При этом, если выкуп не будет уплачен в течение 4 дней, вымогатели обещают удвоить сумму…

Как работает Sodinokibi?

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

Для того, чтобы сделать обнаружения еще более сложным для антивирусов, эта программа-вымогатель совершает операции над строками, используя DJB-хэш, а не сами строки… Названия API и другие параметры были расшифрованы во время работы ПО при помощи алгоритма RC4.

Инициализация

Sodinokibi начинает работу с создания динамической таблицы импорта. Первым делом программа убеждается в том, что она является единственной копией в системе методом проверки мьютексов. После проверки она расшифровывает при помощи RC4 конфигурацию JSON, которая хранится в файле программы и проверяет булево значение ключа “exp”. Если его значение равно “true”, Sodinokibi старается запустить эксплойт. В нашем сэмпле так и было, поэтому он исполнял функцию эксплуатации уязвимостей


Расшифрованная конфигурация JSON

Этот патч устраняет множество уязвимостей, приведенных ниже. Код, выполняющий запуск эксплойта, проверяет, было ли установлено обновление от 11 сентября 2018 (KB4457138) на компьютере. Мы полагаем, что программа-вымогатель пытается повысить привилегии до администратора при помощи CVE-2018-8440. И если его нет на машине, Ransomware переходит к запуску 32- или 64-битного шеллкода в зависимости от платформы, на которой исполняется зловред.


Snippet 1

Перечень уязвимостей, которые устраняет патч KB4457138:

Патч KB4457138 исправляет уязвимости:

  • CVE-2018-8457, CVE-2018-8335, CVE-2018-8424, CVE-2018-8455, CVE-2018-8468, CVE-2018-8447, CVE-2018-8475, CVE-2018-8271, CVE-2018-8440, CVE-2018-8464, CVE-2018-8469, CVE-2018-8421, CVE-2018-8442, CVE-2018-8367, CVE-2018-8443, CVE-2018-8465, CVE-2018-8419, CVE-2018-8466, CVE-2018-8410, CVE-2018-8467, CVE-2018-8462, CVE-2018-8452, CVE-2018-8446, CVE-2018-8449, CVE-2018-8420, CVE-2018-8433, CVE-2018-8438, CVE-2018-8435, CVE-2018-8456, CVE-2018-8354, CVE-2018-8434, CVE-2018-8470, CVE-2018-8332, CVE-2018-0965, CVE-2018-8315, CVE-2018-8439, CVE-2018-8392, CVE-2018-8425, CVE-2018-8393.

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

Оно не будет пытаться заразить компьютеры из следующих стран, если таковые параметры местоположения были выставлены в настройках компьютера. После того, как Sodinokibi успешно запускается в режиме администратора, ПО проводит дополнительную предварительную проверку и уточняет значение ключа “bro” в конфигурации JSON и выясняет страну нахождения.


Уточнение языковых ID

Перечень стран-исключений

  • Румыния, Россия, Украина, Беларусь, Эстония, Латвия, Литва, Таджикистан, Иран, Армения, Азербайджан, Грузия, Казахстан, Кыргызстан, Туркменистан, Узбекистан, Татарстан

*Примечание редактора: по неизвестной причине авторы специально выделяют татарскую локаль в России

После этого вымогатель удаляет теневые копии Windows при помощи vssadmin, а также отключает систему восстановления Windows Recovery при помощи bcdedit: После прохождения проверки вредоносное ПО прекращает процесс mysql.exe (если он был запущен), чтобы получить доступ к файлам MySQL и зашифровать их.

vssadmin.exe Delete Shadows /All /Quiet & bcedit /set
recoveryenabled No & bcedit /set {default} bootstatuspolice ignorealfailures

Интересно, что перед удалением самого каталога, зловред сначала заменяет контент во всех таких папках случайным набором байтов, чтобы сделать восстановление невозможным в принципе. Перед тем, как зашифровать файлы пользователя Sodinokibi проводит поиск по всем файловым системам, включая сетевые папки, чтобы обнаружить каталоги с названием “backup”, и безвозвратно удаляет их. К счастью, файлы Acronis Backup нельзя удалить так просто, потому что они защищаются на уровне ядра, специально, чтобы не допустить подобных действий со стороны программ-вымогателей.

Генерация ключей

Sodinokibi использует протокол генерации и обмена ключами Diffie–Hellman на эллиптических кривых (ECDH). Выработанные сеансовые ключи используются в алгоритмах симметричного шифрования.При этом шифрование разных типов данных происходит разными методами — AES и Salsa20.

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

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

Шаг 1. Генерация сессионной пары из закрытого (секретного, случайного числа) и открытого ключа на локальной машине.


Генерация локальных закрытого и открытого ключей

Шифрование закрытого ключа из Шага 1 происходит при помощи открытого ключа из конфигурации JSON

Шаг 2. Генерация еще одной пары закрытого и открытого ключей.

Шаг 3. Используя закрытый ключ из Шага 2 и открытый ключ (значение pk key) из JSON генерируется общий ключ, а посе его хеширования получается симметричный ключ.


Генерация симметричного ключа при помощи общего ключа

Шаг 4. Генерация 16-битного IV ( инициализационнного вектора).

Шаг 5. Шифрование закрытого ключа, сгенерированного на Шаге 1, при помощи AES с ключом и IV, которые получились в ходе Шагов 3 и 4.

Шаг 6. Вычисление CRC32 для зашифрованного закрытого ключа, который получился на шаге 5.

Шаг 7. Добавление IV и CRC32 в конец буфера, содержащего зашифрованный закрытый ключ из Шага 5.

Шаг 8. Сохранение буфера в сопоставленный файл со смещением (пометка “sk_key” ).


Шифрование закрытого ключа из Шага 1 при помощи открытых ключей злоумышленника

Шифрование закрытого ключа из Шага 1 при помощи открытого ключа, содержащегося в бинарном файле.

Шаг 9. Повторение шагов со 2 по 7 с использованием другого открытого ключа, который был встроен в бинарный файл на Шаге 3.

Шаг 10. Сохранение буфера в сопоставленный файл со смещением в памяти (отметка “0_key”)
sk_key, 0_key и pk_key записываются в реестр соответствующим образом, в зависимости от полученных программой прав доступа…

HKLM\SOFTWARE\recfg\sk_key или HKCU\SOFTWARE\recfg\sk_key
HKLM\SOFTWARE\recfg\0_key или HKCU\SOFTWARE\recfg\0_key
HKLM\SOFTWARE\recfg\pk_key или HKCU\SOFTWARE\recfg\pk_key

Зашифрованный секретный ключ в реестре
Генерация ключей для отдельных файлов с Salsa20

Шаг 11. Генерация новой пары из открытого и закрытого ключа.

Шаг 12. Генерация общего ключа с использованием открытого ключа сессии, созданного на Шаге 2, и хэширования для получения очередного симметричного ключа, необходимого для генерации ключей в Salsa20.

Шаг 13. Установка ключа 256-бит (32 байт) в Salsa20

Шаг 14. Генерация 8-битного IV для ключей Salsa20

Шаг 15. Генерация ключа Salsa20

Шаг 16. Использование Salsa20 key_state для шифрования пользовательских файлов при помощи Salsa20.


Генерация ключей Salsa20 для каждого файла
Повторение Шагов 11 — 16 для каждого шифруемого файла.

Иллюстрация шифрования и дешифрования

Чтобы лучше понять, как ключи генерируются и передаются между компьютерами злоумышленника и жертвы, нужно разобраться, как работает алгоритм Diffie Hellman — это несложно сделать по иллюстрации.

Процесс шифрования


Обмен ключами Diffie-Hellman на эллиптических кривых (ECDH)


Подробное описание процесса шифрования в Sodinokibi

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

image
Процесс дешифрования (секрет злоумышленника — это его закрытый ключ)

image
Упрощенно процесс дешифрования пользовательских файлов проиллюстрирован ниже.

Шифрование файлов на локальных жестких дисках и в сетевых папках

Для шифрования пользовательских файлов Sodinokibi использует I/O Completion Ports и запускает несколько потоков шифрования, но не более чем вдвое превышающее количество ядер процессора на машине, ассоциируя эти потоки с специально созданным портом I/O. Эти потоки используют функцию GetQueuedCompletionStatus Win API, чтобы дождаться поступления пакета на порт I/O перед началом шифрования файла.

Для всех файлов, которые не попадают под перечень исключений в названиях папок, файлов и расширениях вызывается функция AddFileToIoCompletionPort и затем PostQueuedCompletionStatus Это передаёт выполнение потоку шифрования, который ждет информации на I/O completion port, чтобы запустить шифрование файлов. Как только потоки создаются и переходят в ожидание поступления пакетов I/O, Sodinokibi начинает перебирать файлы пользователя на всех локальных дисках и во всех сетевых папках, исключая CDROM и RAMDISK и назначать их соответствующим I/O completion ports.

Функция AddFileToIoCompletionPort также генерирует уникальный ключ Salsa20 для каждого файла, который подлежит шифрованию, и передает ключ Salsa20 потоку шифрования вместе с другими метаданными, которые должны быть записаны после шифрования при помощи параметра lpOverlapped функции PostQueuedCompletionStatus Win API.

Когда файлы, подлежащие шифрованию, кончаются, потоки переходят в зацикливание и ждут, пока общее количество зашифрованных и переименованных файлов не достигнет общего количества файлов, переданных на I/O completion port. После обработки файлов в каждом каталоге, кроме являющихся исключением, создается файл с требованием о выкупе.

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

image

Перечень папок-исключений

  • "$windows.~bt"
  • «intel»
  • «program files (x86)»
  • «program files»
  • «msocache»
  • "$recycle.bin"
  • "$windows.~ws"
  • «tor browser»
  • «boot»
  • «system volume information»
  • «perflogs»
  • «google»
  • «application data»
  • «windows»
  • «programdata»
  • «windows.old»
  • «appdata»
  • «mozilla»
  • Исключения в файлах
  • «bootfont.bin»
  • «boot.ini»
  • «ntuser.dat»
  • «desktop.ini»
  • «iconcache.db»
  • «ntldr»
  • «ntuser.dat.log»
  • «thumbs.db»
  • «bootsect.bak»
  • «ntuser.ini»
  • «autorun.inf»
  • Исключения в расширениях
  • «themepack»
  • «ldf»
  • «scr»
  • «icl»
  • «386»
  • «cmd»
  • «ani»
  • «adv»
  • «theme»
  • «msi»
  • «rtp»
  • «diagcfg»
  • «msstyles»
  • «bin»
  • «hlp»
  • «shs»
  • «drv»
  • «wpx»
  • «deskthemepack»
  • «bat»
  • «rom»
  • «msc»
  • «lnk»
  • «cab»
  • «spl»
  • «ps1»
  • «msu»
  • «ics»
  • «key»
  • «msp»
  • «com»
  • «sys»
  • «diagpkg»
  • «nls»
  • «diagcab»
  • «ico»
  • «lock»
  • «ocx»
  • «mpa»
  • «cur»
  • «cpl»
  • «mod»
  • «hta»
  • «exe»
  • «icns»
  • «prf»
  • «dll»
  • «nomedia»
  • «idx»

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

Файлы шифруются алгоритмом Salsa20 при помощи функции EncryptAndWrite. После этого поток переименовывает файл, добавляя к названию случайно сгенерированное название.

Ниже приведен пример вызова функции EncryptingThreadRoutine.

image
Структура файлов после шифрования

image
Структура зашифрованного файла

Сетевая активность

После завершения процесса шифрования, программа-вымогатель готовит данные для отправки на сервер управления. Данные включают в себя различные поля из конфигурации JSON, системную информацию и ключи шифрования. Подготовленные данные также записываются в реестр под ключом “[HKLM|HKCU]\SOFTWARE\recfg\stat”, прежде чем они будут зашифрованы AES и отправлены на сервер злоумышленника…

image

Передача данных по сети

Название домена состоит из: sochi-okna23[.]ru + часть адреса 1

  • «wp-content»
  • «static»
  • «content»
  • «include»
  • «uploads»
  • «news»
  • «data»
  • «admin»

и часть адреса 2

  • «images»
  • «pictures»
  • «image»
  • «temp»
  • «tmp»
  • «graphic»
  • «assets»
  • «pics»
  • «game»

image
Генерация URL

Требование выкупа

В Sodinokibi имеется шаблон для составления требования о выкупе, в котором оставлены места для пользовательских данных. В них происходит автоматическая подстановка имени, user id (uid – описание приведено выше) и ключа. Требование выкупа размещается в каждой директории, не считая исключений.

image

Дешифрование

image

Перейти на него следуя инструкциям, приведенным в требовании о выкупе… Для этой программы-вымогателя нет бесплатного способа расшифровать данные, и единственная возможность восстановить данные — использовать сервис дешифрования, предоставленный злоумышленником.

image

Заключение

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

Благодаря этому обе системы способны защитить пользователей от Sodinokibi. Средства киберзащиты содержатся в персональном решении Acronis True Image 2019, а также в бизнес-системах Acronis Backup, которые сопровождаются anti-malware модулем на базе искусственного интеллекта, который называется Acronis Active Protection.

Теги
Показать больше

Похожие статьи

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть