В январе 2022 года некоторые владельцы систем хранения данных NAS (Network Attached Storage) обнаружили зашифрованные файлы с расширением .deadbolt. Тогда же издание Bleeping Computer опубликовало новость о 3600 зараженных устройствах. С этого момента сообщения об атаках на NAS-устройства программ-вымогателей семейства DeadBolt появлялись регулярно. По заявлениям самой группы, оперирующей шифровальщиком DeadBolt, они эксплуатируют выявленные ими 0-day-уязвимости в программном обеспечении NAS. С каждой выявленной уязвимостью связана новая серия атак.
В середине июня этого года компания QNAP, производитель сетевых систем хранения данных (NAS) и видеорегистраторов (NVR), обнаружили серию атак DeadBolt, нацеленных на NAS-устройства, работающие под управлением QTS 4.2.x, 4.3.x, 4.4.x. Ранее, в феврале 2022 года, программы-вымогатели DeadBolt были использованы для атак на NAS-устройства ASUSTOR. Уже в начале сентября QNAP в очередной раз выпустила предупреждение об участившихся атаках с применением DeadBolt (CVE-2022-27593).
Команда реагирования Group-IB провела расследование инцидента, связанного с атакой DeadBolt, и проанализировала использованный в ней сэмпл программы-вымогателя. В этом блоге мы представляем первый полноценный анализ шифровальщика DeadBolt с полной декомпиляцией программного кода.
Ключевые выводы:
Цель
Вымогательство денежных сумм:
- у жертв за разблокировку данных, зашифрованных на NAS-устройстве;
- у производителей NAS – за техническую информацию об использованной в атаке уязвимости и предоставление мастер-ключа для расшифровки данных клиентов.
Жертвы
Компании малого и среднего бизнеса, учебные заведения, физические лица. Страна пребывания жертвы для атакующих не имеет значения.
Сумма выкупа
- С жертв – 0,03 — 0,05 BTC (менее $1 000);
- С производителей NAS – 10-50 BTC (от $200 000 до $1 000 000).
Период активности
С января 2022 года по настоящее время.
Начальный вектор атаки
Уязвимости в программном обеспечении NAS (CVE-2022-27593 и другие).
Программа-вымогатель
Кросс-платформенное семейство программ, разработанное на языке программирования Go, с использованием средств анти-анализа.
Программа может осуществлять шифрование или расшифровку данных. Для взаимодействия с жертвой программа использует веб-интерфейс самого NAS-устройства.
Особенности
Отсутствие контактов злоумышленников с жертвой. Жертва получает ключ расшифровки в деталях транзакции после выплаты выкупа.
Не дожидайтесь атаки!
Получите первичный анализ вашего инцидента от специалистов Group-IB бесплатно
Анализ программы-вымогателя DeadBolt
В рамках исследованного нами инцидента NAS-устройство QNAP функционировало под управлением уязвимой версии QTS 4.3.6.1446 build 20200929, вследствие чего и стало мишенью для атаки злоумышленников. Неудивительно, что спустя некоторое время сотрудники компании при обращении к веб-интерфейсу NAS-устройства увидели сообщение с требованием выкупа за разблокировку файлов, хранящихся в NAS.
Любопытно, что атакующие вымогают выкуп не только у жертвы их атаки, но также и у производителя NAS-устройства, в программном обеспечении которого они выявили уязвимость.
За 10 BTC злоумышленники обещают вендору передать все технические детали использованной уязвимости нулевого дня, а за 50 BTC – дополнительно к этому передать еще и мастер-ключ для разблокировки файлов пострадавших клиентов. С жертв же вымогатели требуют достаточно скромную по меркам современных вымогателей сумму – 0.03-0.05 BTC, что на момент написания этого блогпоста составляет порядка $1000.
Жертва выплачивает требуемую сумму на указанный адрес, а ключ расшифровки, как обещают атакующие, будет доставлен в деталях транзакции, внутри кода OP_RETURN bitcoin blockchain. Для этого жертва должна отслеживать адрес, на который был произведен платеж, на предмет новых транзакций, содержащих OP_RETURN.
Использованная в атаке программа-вымогатель DeadBolt представляет собой 32-битную программу для Linux/ARM формата ELF, разработанную на языке программирования Go. Программа была обфусцирована и сжата упаковщиком UPX. Также из программы удалена идентифицирующая информация о сборке Go. Анализ такого образца может вызывать некоторые затруднения, поэтому мы более подробно остановимся на описании логики работы DeadBolt. Для этого мы дополнительно провели полную декомпиляцию кода Go вымогателя.
В зависимости от аргументов командной строки программа осуществляет шифрование или расшифровку файлов:
- шифрование файлов: {RANSOM_APP} -e {config} {dir}
- расшифровка файлов: {RANSOM_APP} -d {key} {dir} где
- RANSOM_APP – путь к программе-вымогателю DeadBolt;
- dir – пути для шифрования/расшифровки файлов, разделенные запятой;
- config – путь к файлу конфигурации;
- key – ключ для расшифровки файлов.
Шифрование
При запуске в режиме шифрования программа-вымогатель загружает список расширений шифруемых файлов и конфигурацию из указанного в командной строке текстового файла в формате JSON.
После загрузки конфигурации для предотвращения восстановления ее содержимого, файл перезаписывается нулевыми байтами и удаляется.
Файл конфигурации DeadBolt при запуске программы содержит следующие данные:
Поля «client_id«, «master_key_hash«, «key» содержат шестнадцатеричные строки, длина «client_id«, «key» составляет 32 символа, а «master_key_hash» – 64 символа. Значение поля «key» представляет собой шестнадцатеричную строку с ключом для шифрования файлов. Описания всех полей будет приведено ниже.
Далее для замены страницы веб-интерфейса NAS-устройства программа создает файлы:
/home/httpd/index.html
/mnt/HDA_ROOT/update_pkg/SDDPd.bin
/mnt/HDA_ROOT/update_pkg/.SDDPd_required
После этого программа приступает к шифрованию файлов.
Ранее существовавший файл /home/httpd/index.html предварительно переименовывается в /home/httpd/index.html.bak. Замененный DeadBolt файл /home/httpd/index.html представляет собой shell-скрипт, который обрабатывает входящие HTTP-запросы.
Скрипт проверяет, что метод входящего HTTP-запроса – POST. Если в URL содержится параметр (query string) «action=decrypt» совместно с «key={KEY}«, где KEY – ключ расшифровки, то shell-скрипт проверяет соответствие значения key хешу ключа, использованного при шифровании, или хешу мастер-ключа. В случае соответствия одному из хешей, скрипт запускает программу-вымогатель DeadBolt в режиме расшифровки, указав при этом значение key в соответствующем аргументе командной строки. Если в URL содержится параметр «action=status«, скрипт возвращает в формате JSON данные со статистикой процесса расшифровки файлов.
Факт запуска процесса расшифровки проверяется по содержимому файла /tmp/deadbolt.pid, завершение процесса расшифровки – по содержимому файла /tmp/deadbolt.finish, текущее количество расшифрованных файлов содержится в файле /tmp/deadbolt.status.
Для других методов HTTP-запроса скрипт отображает содержащуюся в его теле сжатую в gzip-архив HTML-страницу с требованием выкупа и дополнительной информацией. Изображения HTML-страницы приведены в самом начале блога.
Код JavaScript, содержащийся в HTML-странице, периодически проверяет статус расшифровки, направляя запрос POST /index.html?action=status.
При вводе пользователем корректного значения ключа расшифровки в соответствующее поле и нажатии на кнопку «Decrypt Files«, направляется запрос POST /index.html?action=decrypt&key={KEY}, где KEY – введенное значение ключа.
Shell-скрипт /mnt/HDA_ROOT/update_pkg/SDDPd.bin содержит в себе gzip-архив с содержимым скрипта /home/httpd/index.html, созданного ранее программой-вымогателем.
Cкрипт /mnt/HDA_ROOT/update_pkg/SDDPd.bin предназначен для закрепления в системе, при выполнении он восстанавливает содержимое shell-скрипта DeadBolt /home/httpd/index.html и запрещает его изменение.
Шифрование файлов
Программа осуществляет многопоточное шифрование файлов по указанным в командной строке путям. Многопоточность реализована в программе штатными средствами Go.
Расширения шифруемых файлов:
.3dm | .3ds | .3fr | .3g2 | .3gp | .3pr | .7z | .ab4 | .accdb | .accdc |
.accde | .accdr | .accdt | .ach | .acr | .act | .adb | .ads | .agdl | .ai |
.ait | .al | .apj | .arw | .asf | .asm | .asp | .aspx | .asx | .avhd |
.avi | .awg | .back | .backup | .backupdb | .bak | .bank | .bay | .bdb | .bgt |
.bik | .bin | .bkf | .bkp | .blend | .bpw | .c | .cdf | .cdr | .cdr3 |
.cdr4 | .cdr5 | .cdr6 | .cdrw | .cdx | .ce1 | .ce2 | .cer | .cfg | .cfp |
.cgm | .cib | .class | .cls | .cmt | .conf | .cpi | .cpp | .cr2 | .craw |
.crl | .crt | .crw | .cs | .csh | .csl | .csr | .csv | .dac | .dat |
.db | .db3 | .db4 | .db_journal | .dbc | .dbf | .dbx | .dc2 | .dcr | .dcs |
.ddd | .ddoc | .ddrw | .dds | .der | .des | .design | .dev | .dgc | .disk |
.djvu | .dng | .doc | .docm | .docx | .dot | .dotx | .dr | .drf | .drw |
.dtd | .dwg | .dxb | .dxf | .dxg | .edb | .eml | .eps | .erbsql | .erf |
.exf | .fdb | .ffd | .fff | .fh | .fhd | .fla | .flac | .flv | .fpx |
.fxg | .gdb | .git | .gray | .grey | .gry | .gz | .h | .hbk | .hdd |
.hpp | .ib | .ibank | .ibd | .ibz | .idx | .iif | .iiq | .incpas | .indd |
.io | .iso | .jar | .java | .jpe | .jpeg | .jpg | .jrs | .js | .kc2 |
.kdbx | .kdc | .key | .kpdx | .lua | .m | .m4v | .max | .mdb | |
.mdbx | .mdc | .mdf | .mef | .mfw | .mkv | .ml | .mmw | .moneywell | .mos |
.mov | .mp3 | .mp4 | .mpg | .mrw | .msi | .my | .myd | .nd | .ndd |
.nef | .nk2 | .nop | .nrg | .nrw | .ns2 | .ns3 | .ns4 | .nsd | .nsf |
.nsg | .nsh | .nsn | .nwb | .nx2 | .nxl | .nyf | .obj | .oda | .odb |
.odc | .odf | .odg | .odm | .odp | .ods | .odt | .oil | .orf | .ost |
.otg | .oth | .otp | .ots | .ott | .ova | .ovf | .p12 | .p7b | .p7c |
.p7r | .pages | .pas | .pat | .pcd | .pct | .pd | .pdb | .pdd | |
.pef | .pem | .pfx | .php | .pio | .piz | .pl | .plc | .pmf | .png |
.pot | .potm | .potx | .ppam | .pps | .ppsm | .ppsx | .ppt | .pptm | .pptx |
.prf | .ps | .ps1 | .psafe3 | .psd | .pspimage | .pst | .ptx | .pvi | .pvk |
.py | .pyc | .qba | .m | .m4v | .max | .mdb | .mdbx | .mdc | |
.mdf | .mef | .mfw | .mkv | .ml | .mmw | .moneywell | .mos | .mov | .mp3 |
.mp4 | .mpg | .mrw | .msi | .my | .myd | .nd | .qbb | .qbm | .qbr |
.qbw | .qbx | .qby | .r3d | .raf | .rar | .rat | .raw | .rb | .rdb |
.rm | .rtf | .rw2 | .rwl | .rwz | .s3db | .sas7bdat | .say | .sd0 | .sda |
.sdb | .sdf | .sh | .sl3 | .sldm | .sldx | .spc | .sql | .sqlite | .sqlite3 |
.sqlitedb | .sr2 | .srf | .srt | .srw | .st4 | .st5 | .st6 | .st7 | .st8 |
.stc | .std | .sti | .stw | .stx | .svg | .swf | .sxc | .sxd | .sxg |
.sxi | .sxm | .sxw | .tar | .tex | .tga | .thm | .tiff | .tlg | .txt |
.vbk | .vbm | .vbox | .vcb | .vdi | .vfd | .vhd | .vhdx | .vmc | .vmdk |
.vmem | .vmfx | .vmsd | .vmx | .vmxf | .vob | .vsd | .vsdx | .vsv | .wallet |
.wav | .wb2 | .wdb | .wmv | .wpd | .wps | .x11 | .x3f | .xis | .xla |
.xlam | .xlk | .xlm | .xlr | .xls | .xlsb | .xlsm | .xlsx | .xlt | .xltm |
.xltx | .xlw | .xvd | .ycbcra | .yuv | .zip |
Программа-вымогатель DeadBolt не шифрует файлы в каталогах:
/dev
/sys
/proc
/usr/share
/usr/bin
/usr/sbin
/sbin
Также программа пропускает при шифровании файлы и каталоги с именами:
.swap
.qpkg
.samba
.@root
.@sys
.ssh
@system
@zlog
.system
.@system
.@ezsync
.@iscsi
.@snapshots
.@thumbnail
.@tmp
.@uploads
.@trashcan
.@plugins
.@CNID
К именам зашифрованных файлов добавляется расширение «.deadbolt«. В каждом из указанных в командной строке путей вымогатель создает текстовый файл с требованием выкупа !!!_IMPORTANT_README_WHERE_ARE_MY_FILES_!!!.txt.
Шифрование содержимого файлов производится с помощью алгоритма AES-128 CBC. Для его реализации используются стандартные криптографические пакеты Go «crypto/aes» и «crypto/cipher«. В качестве ключа шифрования используется значение, указанное в файле конфигурации, 16-байтный вектор инициализации IV является случайным для каждого файла. Для его генерации используется стандартная функция rand.Read из криптографического пакета Go «crypto/rand«.
Файлы шифруются полностью, предварительно файл при необходимости дополняется нужным количеством нулевых байтов до размера, кратного размеру блока AES (16 байт).
После шифрования данных в конец файла добавляется блок метаданных размером 128 байт.
Смещение | Размер | Описание |
000h | 8 | Маркер «DEADBOLT» |
008h | 8 | Размер оригинального файла (порядок байт little-endian) |
010h | 16 | Идентификатор клиента (ClientID), указанный в конфигурации |
020h | 16 | Вектор инициализации IV AES CBC |
030h | 32 | Хеш SHA-256 ключа шифрования |
050h | 32 | Хеш SHA-256 мастер-ключа шифрования (MasterKeyHash), указанный в конфигурации |
070h | 16 | Нулевые байты |
Конфигурация
Как уже было сказано, конфигурационные данные DeadBolt содержатся в текстовом файле в формате JSON, который впоследствии удаляется так, чтобы его невозможно было восстановить.
Параметры конфигурации:
Параметр | Описание |
---|---|
client_id | Идентификатор клиента (ClientID) в виде шестнадцатеричной строки (hex-строки), 32 символа |
master_key_hash | Хеш SHA-256 мастер-ключа шифрования (MasterKeyHash) в виде hex-строки, 64 символа |
key | Ключ AES-128 CBC для шифрования файлов (Key) в виде hex-строки, 32 символа |
payment_address | Адрес для выплаты выкупа жертвой (PaymentAddress) |
payment_amount | Сумма выкупа для жертвы (PaymentAmount) |
vendor_address | Адрес для выплаты выкупа производителем NAS (VendorAddress) |
vendor_name | Название производителя NAS (VendorName) |
vendor_email | Адрес электронной почты производителя NAS (VendorEmail) |
vendor_amount | Сумма выкупа для производителя NAS (VendorAmount) |
vendor_amount_full | Полная сумма выкупа для производителя NAS (VendorAmountFull) |
Расшифровка
Для расшифровки файлов в командной строке DeadBolt указываются ключ и пути для расшифровки. Как мы видели выше, пользователю это не потребуется: после приобретения ключа, расшифровка файлов запускается через веб-интерфейс NAS-устройства, он только должен ввести в поле корректный ключ.
Пути, использованные для шифрования файлов, и другие параметры подставляются в shell-скрипты при их создании в начале процесса шифрования.
Для расшифровки файлов необходимо ввести либо ключ, который содержится в файле конфигурации, или так называемый мастер-ключ. Что подразумевается под мастер-ключом станет ясно после анализа функции расшифровки файла.
В начале расшифровки программа DeadBolt создает текстовый файл /tmp/deadbolt.pid, который содержит идентификатор ее процесса, в ходе расшифровки программа обновляет количество расшифрованных файлов в текстовом файле /tmp/deadbolt.status, а по завершении создает файл /tmp/deadbolt.finish, который содержит «1«. Эти файлы, как уже сказано выше, используются shell-скриптами DeadBolt для их синхронизации с процессом расшифровки и отображения статуса его выполнения.
Перед расшифровкой файла DeadBolt считывает метаданные, проверяет маркер «DEADBOLT» и получает размер оригинального файла.
Далее проверяется корректность указанного ключа для расшифровки.
Как мы видим из кода, если указанный ключ шифрования совпадает по хешу с тем, что был использован для шифрования файла, то он непосредственно и используется для расшифровки. Если же ключ соответствует хешу мастер-ключа, то с помощью этого ключа, который является мастер-ключом, и идентификатора клиента, программа-вымогатель вычисляет ключ шифрования/расшифровки. Он соответствует первым 16 байтам хеша SHA-256, полученного от мастер-ключа и идентификатора клиента (ClientID).
Таким образом, для проведения серии атак злоумышленники генерируют мастер-ключ, а для каждой атаки и под каждую жертву — еще и ее идентификатор, с помощью чего и получают ключ шифрования для этой атаки.
По завершении расшифровки программа удаляет свои файлы.
Дополнительные сведения
В теле программы-вымогателя содержатся вложенные файлы (Go embedded files), которые используются в качестве шаблонов для создания shell-скриптов и других вспомогательных файлов.
Go embedded file | Описание |
---|---|
res_qnap/qnap_persist.sh | Шаблон shell-скрипта для закрепления в веб-интерфейсе NAS QNAP (/mnt/HDA_ROOT/update_pkg/SDDPd.bin) |
res/ext.txt | Текстовый файл со списком расширений шифруемых файлов |
res/note.html | Шаблон HTML-файла для отображения сообщения с требованием выкупа при обращении к веб-интерфейсу NAS-устройства |
res/note.txt | Шаблон текстового файла с требованием выкупа (!!!_IMPORTANT_README_WHERE_ARE_MY_FILES_!!!.txt) |
res/unlock_cgi.php | Шаблон PHP-скрипта для замены веб-интерфейса NAS. В данном образце не используется. |
res/unlock_cgi.sh | Шаблон shell-скрипта для замены веб-интерфейса NAS (/home/httpd/index.html). |
res/uuid | UUID, не используется |
В шаблонах используются следующие переменные для подстановки значений в скрипты и дополнительные файлы:
Переменная | Описание |
---|---|
{PAYMENT_ADDRESS} | Адрес для выплаты выкупа жертвой, содержит значение соответствующего поля конфигурации payment_address |
{PAYMENT_AMOUNT} | Сумма выкупа для жертвы, содержит значение соответствующего поля конфигурации payment_amount |
{VENDOR_ADDRESS} | Адрес для выкупа производителем NAS, содержит значение соответствующего поля конфигурации vendor_address |
{VENDOR_AMOUNT} | Сумма выкупа для производителя NAS, содержит значение соответствующего поля конфигурации vendor_amount |
{VENDOR_AMOUNT_FULL} | Полная сумма выкупа для производителя NAS, содержит значение соответствующего поля конфигурации vendor_amount_full |
{VENDOR_EMAIL} | Адрес электронной почты производителя NAS, содержит значение соответствующего поля конфигурации vendor_email |
{VENDOR_NAME} | Название производителя NAS, содержит значение соответствующего поля конфигурации vendor_name |
{MASTER_KEYHASH} | Хеш SHA-256 мастер-ключа в виде hex-строки, содержит значение соответствующего поля конфигурации master_key_hash |
{KEYHASH} | Вычисленный хеш SHA-256 ключа, использованного для шифрования, в виде hex-строки |
{PATH_PID_FILENAME} | Путь к тестовому файлу, содержащему идентификатор процесса (PID) программы-вымогателя при расшифровке, значение жестко зашито в коде программы: «/tmp/deadbolt.pid« |
{PATH_STATUS_FILENAME} | Путь к текстовому файлу, содержащему текущее количество расшифрованных файлов, значение жестко зашито в коде программы: «/tmp/deadbolt.status« |
{PATH_FINISH_FILENAME} | Путь к текстовому файлу, сигнализирующему завершение работы программы-вымогателя при расшифровке, значение жестко зашито в коде программы:»/tmp/deadbolt.finish« |
{CGI_URL} | CGI URL, значение жестко зашито в коде программы:»/index.html« |
{CGI_ENCODED} | Сконвертированный в строку gzip-архив с shell-скриптом для замены веб-интерфейса NAS |
{INDEX_PAGE_COMPRESSED} | Сконвертированный в строку gzip-архив с содержимым HTML-файла, используемого для замены веб-страницы NAS-устройства |
{PATH_CRYPT} | Пути шифрования, указанные в командной строке при запуске |
{PATH_TOOL} | Путь к запущенной программе-вымогателю |
С частью исходных кодов DeadBolt в виде демонстрационного проекта можно ознакомиться по ссылке.
Заключение
При анализе DeadBolt мы не увидели чего-то очень сложного, например, криптографических схем с использованием алгоритмов асимметричного шифрования. Их методы просты и эффективны. С долей иронии отметим весьма «дружественный» веб-интерфейс программы-вымогателя.
Атакующие не похищают данные клиента и, соответственно, не используют метод двойного вымогательства (Double Extortion), как многие RaaS (Ransomware-as-a-Service). Контакты жертвы со злоумышленниками отсутствуют как таковые: жертва либо платит на указанный адрес и получает ключ из деталей транзакции, либо нет. Возможно, в связи с этим DeadBolt и не требует от жертв астрономических сумм выкупа.
Однако, стоит отметить менее распространенную практику, используемую группой DeadBolt, это попытки злоумышленников требовать одновременно выкуп еще и с производителей NAS. DeadBolt существует достаточно продолжительное время, и, судя по всему, такая «бизнес-модель» работает и оправдывает себя.
Пример DeadBolt показывает, насколько злоумышленники изощренно используют любые средства и возможности для достижения своих преступных намерений, и они не прощают любых оплошностей потенциальной жертвы в обеспечении информационной безопасности своей инфраструктуры.
Рекомендации для компаний
Для контроля уровня информационной безопасности инфраструктуры организации могут использовать продукт Group-IB Attack Surface Management. Решение обеспечит полную инвентаризацию интернет-ресурсов организации, позволит выявить уязвимости и оценить критические риски для принятия мер повышения защищенности.
Реагирование на инциденты информационной безопасности любой сложности, проводимое специалистами Group-IB, сведет к минимуму последствия инцидентов и позволит организации избежать их повторения в будущем.
Наши рекомендации по настройке NAS:
- Осуществлять обновление программного обеспечения / прошивки NAS-устройства;
- Настроить двухфакторную аутентификацию (2FA) в учётной записи администратора на NAS
- Включить журнал подключений (System Connection Logs) на NAS-устройстве
- Настроить отправку событий журналов (системного журнала и журнала подключений) на удалённый Syslog-сервер
- Устанавливать пароли в соответствии со сложной парольной политикой
- Отключить учётную запись admin и создать отдельную учётную запись с правами администратора
- Выключить неиспользуемые сервисы на NAS-устройстве (например: FTP-сервер, Telnet и так далее)
- Переназначить порты основных сервисов (SSH, FTP, HTTP/HTTPS и другие) со значений по умолчанию на другие
- Отключить автоматический проброс портов в myQNAPcloud (QNAP)
Следуя миссии Group-IB — борьбе с киберпреступностью — мы продолжим изучать методы, инструменты и тактику группы DeadBolt.
Также мы считаем своей задачей делиться своими находками с коммьюнити по кибербезопасности и призываем исследователей совместно изучать сложные угрозы, обмениваться данными и использовать наши технологии, как инструмент борьбы со злоумышленниками.
Если вам интересно то, что мы делаем и вы хотели бы уметь так же, приглашаем вас на наши курсы по форензике, реагированиям на инциденты и Threat Intelligence. Также у нас открыто много технических и других вакансий — присоединяйтесь к команде Group-IB.