Программа-вымогатель Sodinokibi: детальное изучение
О программе-вымогателе 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
Для того, чтобы расшифровать данные, потребуются закрытые ключи злоумышленника. Но они нигде не публикуются, и поэтому восстановить файлы оказывается невозможно.
Процесс дешифрования (секрет злоумышленника — это его закрытый ключ)
Упрощенно процесс дешифрования пользовательских файлов проиллюстрирован ниже.
Шифрование файлов на локальных жестких дисках и в сетевых папках
Для шифрования пользовательских файлов 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, сигнализирующих о завершении процесса. Благодаря этому достигается прекращение работы дополнительных потоков шифрования, которые находились в ожидании данных.
Перечень папок-исключений
- »$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.
Структура файлов после шифрования
Структура зашифрованного файла
Сетевая активность
После завершения процесса шифрования, программа-вымогатель готовит данные для отправки на сервер управления. Данные включают в себя различные поля из конфигурации JSON, системную информацию и ключи шифрования. Подготовленные данные также записываются в реестр под ключом »[HKLM|HKCU]\SOFTWARE\recfg\stat», прежде чем они будут зашифрованы AES и отправлены на сервер злоумышленника…
Передача данных по сети
Название домена состоит из: sochi-okna23[.]ru + часть адреса 1
- «wp-content»
- «static»
- «content»
- «include»
- «uploads»
- «news»
- «data»
- «admin»
и часть адреса 2
- «images»
- «pictures»
- «image»
- «temp»
- «tmp»
- «graphic»
- «assets»
- «pics»
- «game»
Генерация URL
Требование выкупа
В Sodinokibi имеется шаблон для составления требования о выкупе, в котором оставлены места для пользовательских данных. В них происходит автоматическая подстановка имени, user id (uid — описание приведено выше) и ключа. Требование выкупа размещается в каждой директории, не считая исключений.
Дешифрование
Для этой программы-вымогателя нет бесплатного способа расшифровать данные, и единственная возможность восстановить данные — использовать сервис дешифрования, предоставленный злоумышленником. Перейти на него следуя инструкциям, приведенным в требовании о выкупе…
Заключение
Мы рекомендуем использовать продвинутые средства защиты от программ-вымогателей и своевременно обновлять антивирусные системы. Все продукты Acronis содержат улучшенную защиту от вымогателей и могут защитить вас от подобной атаки, минимизируя риск потерять данные.
Средства киберзащиты содержатся в персональном решении Acronis True Image 2019, а также в бизнес-системах Acronis Backup, которые сопровождаются anti-malware модулем на базе искусственного интеллекта, который называется Acronis Active Protection. Благодаря этому обе системы способны защитить пользователей от Sodinokibi.