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



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

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


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

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

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

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

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

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

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

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


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

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

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


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




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

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


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

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

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

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

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

vssadmin.exe Delete Shadows /All /Quiet & bcedit /set {default}
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 перед началом шифрования файла.

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

Функция 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 содержат улучшенную защиту от вымогателей и могут защитить вас от подобной атаки, минимизируя риск потерять данные.

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

Комментарии (9)


  1. tvr
    06.08.2019 13:25

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

    Интересно, по каким критериям составлялся?
    Ностальгия, низкая платежеспособность?
    Или навести тень на плетень?


    1. ivlad Автор
      06.08.2019 15:19

      Для меня загадка, почему список такой и как в списке с названием "bro" могут оказаться одновременно, скажем, Армения и Азербайджан.


      Учитывая, что авторы выделяют Татарстан, думаю, они не жители стран бывшего СССР. При этом, Румыния стоит на первом месте, а Молдавии в списке нет. Учитывая, что в Румынии, кажется, сильны юнинонистские настроения, я не исключаю, что авторы находятся в Румынии.


      Разумееется, это может быть и попыткой навести исследователей на ложный след.


      1. Raimon
        06.08.2019 18:44

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

        Кажется наоборот, это тандем программиста из постсоветского пространства и Ирана :).


        1. ivlad Автор
          06.08.2019 19:30

          SUBLANG — это про язык, а не про Асю локаль (https://docs.microsoft.com/en-us/windows/win32/intl/language-identifier-constants-and-strings).


          тандем программиста из постсоветского пространства и Ирана :).

          Непонятно, почему тогда нет SUBLANG_BASHKIR_RUSSIA или подобного. В общем, есть пространство для спекуляций. :)


        1. dobrev
          07.08.2019 07:26

          При этом, Румыния стоит на первом месте, а Молдавии в списке нет. Учитывая, что в Румынии, кажется, сильны юнинонистские настроения, я не исключаю, что авторы находятся в Румынии.

          Извините, если кого обидел, но разве в Молдове не румынский язык? Не нашёл Молдовы в этом списке.


      1. Dmitri-D
        07.08.2019 02:03

        при этом, Румыния стоит на первом месте,

        список отсортирован, вот поэтому


        1. ivlad Автор
          07.08.2019 13:24

          Тоже верно. Ну, может, тогда Иран. Надо бы плотнее покопать.


    1. Cenzo
      07.08.2019 05:58

      Еще и английский текст для выкупа ну с очень явными ошибками и выделением «как результат» запятой. Даже машинный перевод на translate.google.com и то получается читабельнее. «Your files are encrypted, and, as a result you can't use them it». Если честно я даже не могу представить фразу на русском, чтобы в конце оказалось «it». Далее — «Instructions into TOR, instructions into WWW» — не видел у русскоязычных никогда таких ошибок в английском. Моё имхо, что ошибки не характерные для русского, возможно на другом языке так строят фразы. А может специально так коверкали.


  1. teecat
    07.08.2019 10:49

    Поэтому статическим антивирусам, которые используют сигнатуры на основе читаемых строк...

    Можно контрольные суммы файлов или ссылку на вирустотал?

    И если не сложно — как распространяется? спам, зараженные сайты…