Содержание статьи
- Общие закономерности
- Trojan-Ransom.Win32.Rakhni
- Поиск файлов для шифрования
- Коммуникация с командным сервером
- Шифрование файлов
- Другие особенности
- Trojan-Ransom.Win32.Cryakl
- Генерация ключей
- Шифрование файлов
- Коммуникация с командным сервером
- Другие особенности
- Trojan-Ransom.Win32.Aura
- Коммуникация с командным сервером
- Шифрование файлов
- Другие особенности
- Trojan-Ransom.Win32.Shade
- Основная функциональность
- Дополнительная функциональность
- Другие особенности
- На закуску
- Червь-шифровальщик
- Ransomware as a service
- Вместо заключения
В прошлых статьях мы описывали несколько нашумевших в зарубежных СМИ шифровальщиков. Однако в русскоязычном сегменте Паутины сегодня правят бал не CryptoWall и не CTB-Locker — на нашей родине сформировалась «экосистема» из других видов троянов-вымогателей, в большинстве своем не выходящих на мировую арену. Сегодня мы познакомимся с некоторыми из них, а в качестве бонуса пробежимся по модным тенденциям мирового ransomware-строения.
Общие закономерности
- Большинство отечественных троянов-вымогателей, в отличие от своих любящих публичность коллег (CryptoLocker, CryptoWall, TorrentLocker, TeslaCrypt), никак не афишируют свое название.
- Авторы троянов часто используют «простые» средства разработки, готовые утилиты для шифрования, иногда даже обычные архиваторы, что дает повод задуматься о квалификации писателей малвари. Разумеется, из этого правила встречаются исключения.
Trojan-Ransom.Win32.Rakhni
Также получил имена Trojan.Encoder.398 и Win32/Filecoder.NDE, авторское название неизвестно. Этот троян появился в 2013 году (который можно считать годом ransomware: тогда мы наблюдали взрывной рост их числа). С тех пор Rakhni претерпел немало изменений, но не будем углубляться в историю, а разберем современный семпл, обнаруженный в сентябре 2015-го.
Обычно этот троян распространяется в неупакованном виде. Открываем файл в Hiew (рис. 1) и сразу видим характерные устрашающие фразы, адрес почты злоумышленника, а также список расширений, по которым будет производиться поиск файлов. Опытный взгляд определит, что файл написан в среде Delphi (та-ак, а кто тут говорил, что на Delphi больше не пишут? 🙂 — Прим. ред.), проверить это можно с помощью PEiD, Detect It Easy или любого другого удобного инструмента. По строкам в конце файла также легко обнаружить, что использована библиотека DCPCrypt2, — можно предположить, что реализация криптоалгоритмов взята именно оттуда (в дальнейшем это подтвердилось).
Хакер #202. Скажи нет большому брату!
Для анализа написанных на Delphi семплов удобно воспользоваться Interactive Delphi Reconstructor — можно разбирать прямо в нем, а можно сгенерировать IDC-скрипт для последующего импорта в IDA. Большинство библиотечных функций IDR распознает верно, поэтому пропустим рутину статического анализа и перейдем к самому интересному — результатам.
Поиск файлов для шифрования
Троян проходит по подключенным дискам, ищет файлы по списку расширений, их пути сохраняет в зашифрованном виде в текстовый файл %TEMP%\allfiles.list
. Пути шифруются алгоритмом Blowfish в режиме CFB-8, в качестве ключа используется хеш SHA-1 от содержащейся в теле строки lklaljga, а общее число найденных файлов сохраняется в глобальной переменной.
Коммуникация с командным сервером
После завершения поиска всех файлов с подходящими расширениями троян отправляет запрос к C&C:
http://<cnc.url>/index.php?ui=s&id=<install-id>&c=<num-files>
Здесь install-id
— строка, сгенерированная на основе имен машины и пользователя, num-files
— число файлов, пригодных для шифрования.
В ответ сервер отдает строку с данными в формате JSON:
{
"email": "filesos@yeah.net",
"key": "<file-encryption-password>", // Пароль для шифрования файлов
"ext": "<extension-suffix>", // Строка, добавляемая к расширению зашифрованного файла после адреса почты злоумышленника
"hashType": 1, // Номер хеша для шифрования файлов
"cipherType": 2, // Номер шифра для шифрования файлов
"cmType": 3, // Режим шифра
"saltSize": 4, // Размер соли
"Ct": 5, // Номер шифра для шифрования имен
"Ht": 6, // Номер хеша для шифрования имен
"KeyStr": "<name-encryption-password>" // Пароль для шифрования имен
}
Если C&C не ответил, троян не прерывает выполнение — вместо этого он использует один из четырех зашитых в тело вариантов такого JSON-конфига.
Шифрование файлов
Rakhni считывает заранее сгенерированный файл %TEMP%\allfiles.list
со списком путей, расшифровывает каждую строку и обрабатывает соответствующий файл. На основе данных из JSON-конфига выбирается один из восемнадцати шифров:
- Blowfish;
- Cast128;
- Cast256;
- DES;
- ГОСТ;
- ICE;
- IDEA;
- MARS;
- MISTY1;
- 3DES;
- RC4;
- RC5;
- RC6;
- Rijndael (основа стандарта AES);
- Serpent;
- TEA;
- Twofish;
- RC2
и один из девяти хешей:
- SHA-1;
- SHA-256;
- SHA-512;
- MD4;
- MD5;
- HAVAL;
- RIPEMD-128;
- RIPEMD-160;
- Tiger.
Затем генерируется соль заданной длины, пароль из конфига хешируется с солью, результат используется как ключ для выбранного шифра. IV генерируется каждый раз новый (впоследствии, как и соль, он сохраняется в начале зашифрованного файла). Содержимое каждого файла затем шифруется в выбранном режиме (CBC, CFB-8, CFB, OFB либо CTR).
WWW
Ссылки для тех, кто хочет познакомиться с типами шифров и режимами их работы либо освежить знания:
На этом, однако, современный семпл Rakhni не останавливается. Чтобы еще сильнее напакостить, он шифрует и имя файла — в качестве параметров шифрования использует поля Ct, Ht, KeyStr из конфига, хеширует без соли, режим шифра берет CFB-8. Полученный массив зашифрованных байтов кодирует в Base64, а иногда попадающиеся символы / заменяет строкой {slash}
. В итоге зашифрованный файл получает выглядящее подобным образом имя:
HNo0WXDGQqCW6Upfo0SO9NTFcRM592wdN52nTg==.filesos@yeah.net_Lklde
Требования злоумышленника троян сохраняет в файлах КаК_РаСшИфРоВаТь_ФаЙлЫ.html
.
Другие особенности
Как и многие другие криптовымогатели, Rakhni удаляет теневые копии, однако делает это он необычным способом. Он дропает на диск и запускает VBS-скрипт, а тот выполняет запрос к системе WMI (классу Win32_ShadowCopy
), чтобы удалить имеющиеся предыдущие версии файлов. Зачем это сделано именно так? Можно предположить, что таким образом автор пытается обмануть проактивный детект антивирусов.
Trojan-Ransom.Win32.Cryakl
Он же Ransom:Win32/Simlosap.A, Trojan.Encoder.567, Win32/Filecoder.CQ.
«Лаборатория Касперского» год назад опубликовала разбор актуальной на тот момент версии этого трояна. Сейчас же мы рассмотрим современный образец и увидим, что изменилось за прошедшие месяцы.
Cryakl обычно распространяется в упакованном виде. Мне встречались семплы, упакованные Armadillo, но в последнее время чаще применяется самописный пакер на Visual Basic. Действует он незамысловато: расшифровывает полезную нагрузку в виде оригинального PE, запускает копию своего процесса и внедряет в него целевой код.
Пакер снимается тривиально: ставим точку останова на
CreateProcess
, когда она срабатывает, ищем регион с правами RW, размером около 400 Кбайт и располагающийся перед адресами, по которым спроецированы системные DLLНа рис. 2 видно, что этот регион действительно содержит нечто похожее на PE-файл. Дампим регион, извлекаем из него нетронутый оригинальный PE.
Рассматриваем распакованный семпл, при помощи подручных средств определяем компилятор (Delphi 6.0–7.0 — 2001–2002 года выпуска, между прочим!), загружаем файл в IDR, IDA или другой инструмент для статического анализа. Строки FGIntPrimeGeneration
, FGInt
, FGIntRSA
, содержащиеся внутри тела, наталкивают на мысль, что троян использует стороннюю реализацию RSA. Исходники библиотеки FGInt, которые можно найти с помощью любого поисковика, сильно помогают в процессе разбора. Кстати, реализация RSA в этой библиотеке вызывает отдельные размышления о судьбах мира, потому как работа с большими числами в процедуре RSAEncrypt
производится с помощью строкового представления в двоичной системе (то есть вместо числа 0x123
библиотека будет работать со строкой "100100011" = "\x31\x30\x30\x31\x30\x30\x30\x31\x31"
).
Генерация ключей
После старта троян генерирует идентификатор заражения в формате id = <случайная строка>-<дата и время>@<случайное число>
, а также несколько ключей для разных алгоритмов:
simpass
(2048 символов латинского алфавита в верхнем регистре) иpoly
(20 цифр от 0 до 9) для самописного симметричного шифра многозначной замены;- пару ключей RSA-768 (
rsaPub = (n,e), rsaPriv = (n,d)
, гдеe
= 65537,n
иd
генерируются по самодельной схеме).
В теле Cryakl зашиты еще три открытых ключа RSA-768 от злоумышленника. Когда вышеуказанные ключевые данные сгенерированы, они представляются в виде строк, затем каждая из них конкатенируется со строкой asshole и шифруется RSA на каждом из трех зашитых в теле ключей. Полученные шифрованные данные склеиваются через символ :
и сохраняются в глобальной переменной — назовем ее encrypedKeyData
.
Шифрование файлов
На основе simpass
для каждого файла генерируется свой «файловый ключ» fileKey
длиной 30 000 байт.
Первые 30 000 байт содержимого файла шифруются на fileKey
и poly
симметричным алгоритмом, который можно в виде псевдокода представить так:
for (int i = 0; i < 30000; i++)
buf[i] = TransformByte(buf[i], fileKey[i], poly[i % 20]);
Процедура TransformByte
представляет собой десять преобразований байта открытого текста на основе байта fileKey
и байта poly
:
switch (poly - '0'){
case 0:
result = b + key;
break;
case 1:
result = b - key;
break;
case 2:
result = b + key + poly;
break;
case 3:
result = b + key + poly - '0';
break;
case 4:
result = b - key - poly;
break;
case 5:
result = b - key - poly + '0';
break;
case 6:
result = b + poly - '0';
break;
case 7:
result = b - poly + '0';
break;
case 8:
result = b + poly;
break;
case 9:
result = b - poly;
break;
}
Если файл был длиннее 30 000 байт, троян выбирает три случайных блока по 1024 байт длиной и каждый из них шифрует RSA со сгенерированным при старте процесса открытым ключом.
После завершения этих действий Cryakl формирует служебную структуру и помещает ее в конце зашифрованного файла. Формат структуры выглядит так:
{ENCRYPTSTART} // Метка начала структуры
{
<4 hex-символа>-<4 hex-символа>: // Серийный номер системного тома (через дефис)
<32 hex-символа>: // Зашитая в семпл строка (выглядит как хеш)
<длинные числа через :> // Зашифрованные ключевые данные `encrypedKeyData`
}
{<буквы-дата@время@число} // ID, время заражения и случайное число
{<число>} // Оригинальный размер файла
{CL 1.1.0.0} // Версия Cryakl
{<имя.расширение>} // Оригинальное имя файла
{<32 hex-символа>} // MD5 от ключевых данных (`fileKey`, `poly`, `rsaPriv`)
{<число-1>}{<число-2>}...{<число-n>} // Числа, по которым генерируется `fileKey` на основе `simpass`
{BLOCKSSTART} // Метка начала информации о блоках, зашифрованных RSA
{<число>} // Коэффициент смещения блока (offs = coeff*1024)
{<число>} // Суммарный размер блока
{<бинарные данные>} // Последние байты зашифрованных данных блока
...
{BLOCKSEND} // Конец информации о блоках, зашифрованных RSA
{<число>} // Размер всей структуры (исключая это и следующее поля)
{ENCRYPTENDED} // Метка конца структуры
Зашифрованный файл в итоге переименовывается по схеме:
email-<адрес злоумышленника>.ver-CL 1.1.0.0.id-<идентификатор заражения-дата@время@случайное число>.randomname-<случайная строка>.<случайная строка>.cbf
Коммуникация с командным сервером
Запрос, отправляемый на C&C, имеет формат:
http://<cnc.url>/inst.php?vers=CL 1.1.0.0&id=<идентификатор заражения>&sender=<строка - статический идентификатор семпла>
В ответ ожидается строка GOOD
. Впрочем, если «отстук» не удался, троян не останавливается и все равно приступает к шифрованию файлов.
Другие особенности
На рабочий стол Cryakl ставит изображение, хранящееся в ресурсах семпла в формате JPG. При этом троян сначала сохраняет свой ресурс в файл desk.jpg
, затем конвертирует его в BMP при помощи классов TJPEGImage
и TBitmap
и уже BMP ставит на рабочий стол.
Автор трояна в качестве изображения обычно выбирает разных популярных персонажей. Если в статье «Лаборатории Касперского» бушевал Фантомас, то на этот раз главным героем стал герой «Южного парка» (рис. 3).
Trojan-Ransom.Win32.Aura
Это один из немногих шифровальщиков, разные версии которого атакуют жертв как в СНГ, так и в странах дальнего зарубежья. Известен также под именами Ransom:Win32/Isda, Trojan:W32/BandarChor, Trojan.Encoder.741.
Как и два предыдущих трояна, Aura написан на Delphi. Распространяется он в различном виде, чаще всего под пакерами, иногда даже многослойными (например, UPX + VB-пакер + UPX, ASPack + VB-пакер + UPX). После распаковки видим, что, в отличие от Rakhni и Cryakl, «полезная нагрузка» в которых начиналась сразу по точке входа, в Aura исполнение начинается со стандартной процедуры инициализации формы (рис. 4). Чтобы понять, где же сама полезная нагрузка, придется просмотреть все обработчики событий. В рассматриваемом семпле подготовка к работе производится в TForm1.FormCreate
, а поиск и шифрование файлов — в TForm1.Timer1Timer
.
Коммуникация с командным сервером
При старте Aura генерирует идентификатор заражения из десяти цифр, а также строку tail
вида .id-цифры_blockchain@inbox.com
, которая впоследствии будет использована как расширение зашифрованных файлов. Сразу после этого троян отправляет запрос на C&C:
http://<cnc.url>/script.php?number=255&id=<идентификатор заражения>&pc=<имя компьютера>&tail=<приведенная выше строка>
Параметр number
означает длину запрашиваемого пароля, в ответ на этот запрос C&C присылает строку символов длины (в нашем случае — 255). Рассматриваемая модификация Aura разбивает эту строку на восемь частей, которые впоследствии берутся для шифрования файлов. Другие модификации этого не делают, а используют пароль одним «куском». В виде псевдокода схему разбиения можно представить в виде:
LStrCopy(password, 1, 32, &passwordPart1);
LStrCopy(password, 33, 64, &passwordPart2);
LStrCopy(password, 65, 96, &passwordPart3);
LStrCopy(password, 97, 128, &passwordPart4);
LStrCopy(password, 129, 160, &passwordPart5);
LStrCopy(password, 161, 192, &passwordPart6);
LStrCopy(password, 193, 224, &passwordPart7);
LStrCopy(password, 225, 256, &passwordPart8);
Шифрование файлов
Перед тем как приступить к поиску файлов, Aura использует незамысловатый антиэмуляционный трюк — вызов API-функции с некорректными параметрами и проверка возвращаемого значения.
push 16713F4h ; cchData
push offset aFsasgd ; "fsasgd"
push 288FEB4h ; LCType
push 67608h ; Locale
call GetLocaleInfoA
call GetLastError
cmp eax, ERROR_INVALID_PARAMETER
jnz exit
Явных указаний, откуда взята реализация криптографии, в теле семпла не нашлось (строка StreamAES, конечно, намекает, но поиск по ней готового ответа не дал). Поэтому по константам подтверждаем предположение, что это действительно AES, анализируя (статически или динамически), выясняем, что использован режим CBC. Никакой процедуры превращения пароля в ключ не предусмотрено — просто берутся первые 16 байт пароля. В качестве IV используется всегда одно и то же значение — 16 байт от 0 до 15.
При шифровании файла рассматриваемый семпл трояна берет первые 30 000 байт содержимого файла (если его размер меньше, то берет файл целиком) и шифрует с паролем passwordPart1
. В начало файла записывается 32-битное число, равное размеру зашифрованных данных. После этого числа следует шифротекст без последнего dword’а, а последний dword шифротекста записывается в самый конец файла. После него в виде текстовой строки сохраняется смещение этого dword’а, а затем один байт, содержащий длину этой текстовой строки.
На этом шифрование первого слоя завершено, и троян повторяет те же действия с паролями passwordPart2, ..., passwordPart8. В итоге первые 30 000 байт файла оказываются зашифрованы восемь раз, а в конце зашифрованного файла формируется структура из восьми блоков — по одному для каждого слоя:
4 байта // Первый dword шифротекста
число в виде текстовой строки // Смещение этого dword’а
1 байт // Длина этой текстовой строки
Зашифрованный файл получает дополнительное расширение вида .id-цифры_blockchain@inbox.com
, где после id
содержится идентификатор заражения.
Примечание: шифрование в восемь слоев было обнаружено только в семплах с обратным адресом blockchain@inbox.com
. Все остальные модификации Aura не делят пароль от C&C на части и шифруют в один слой.
Другие особенности
Как и Cryakl, Aura ставит на рабочий стол обои с требованием выкупа. Они порой затрагивают злободневные темы: можно вспомнить годичной давности шумиху по поводу лихорадки Эбола — примерно тогда же распространялась модификация Aura с обратным адресом help@antivirusebola.com
и соответствующим визуальным рядом (рис. 5). В нашем сегодняшнем семпле обои рабочего стола эксплуатируют образ бывшего сотрудника АНБ, ныне борца за гласность Эдварда Сноудена (рис. 6).
Trojan-Ransom.Win32.Shade
Также известен как Ransom:Win32/Troldesh, Trojan.Encoder.858, Win32/Filecoder.ED; как и у остальных рассмотренных шифровальщиков, авторское название неизвестно. Не так давно был опубликован достаточно подробный обзор этого трояна, поэтому кратко перечислим его основные отличительные особенности и рассмотрим небольшие изменения, которые произошли со времени той публикации.
Shade написан на C++, распространяется обычно в упакованном виде (разные самодельные пакеры + UPX). Недавно были обнаружены случаи распространения Shade в виде PE внутри OLE-контейнера, встроенного в документ «Здравствуйте.docx». Как это выглядит с точки зрения жертвы, видно на рис. 7. Никакого автоматического заражения не происходит — жертве предлагается самостоятельно кликнуть на иконку внутри документа.
Основная функциональность
Для шифрования файлов троян использует алгоритм AES-256 в режиме CBC, на каждый файл генерирует два ключа: на одном шифрует содержимое, а на другом — имя файла; в качестве IV использует массив из 16 нулевых байт. Эти уникальные ключи AES он затем шифрует алгоритмом RSA на 3072-битном ключе, полученном от C&C, либо (в случае его недоступности) выбранном из набора ключей, зашитых в теле трояна.
Зашифрованные файлы переименовываются в base64(AES(originalName)).xtbl
либо originalName.ytbl
, если первый вариант по каким-то причинам невозможен. В недавно обнаруженных семплах на смену xtbl
пришло расширение breaking_bad
, а строку .ytbl
заменила строка .heisenberg
, что недвусмысленно отсылает к популярному сериалу.
Из других изменений в современных семплах по сравнению со старыми можно назвать и заметно уменьшившийся размер — ~780 Кбайт вместо ~1,8 Мбайт. Это произошло из-за отказа от линковки с клиентом Tor и вообще от использования C&C в этой анонимной сети.
Дополнительная функциональность
Когда файлы зашифрованы, Shade не завершает свой процесс, а в бесконечном цикле через случайные промежутки времени от одного до двух часов запрашивает у C&C список URL, ведущих на семплы дополнительного вредоносного ПО, которые затем скачивает и устанавливает в систему. Получается, что это не только шифровальщик, но и бот-загрузчик, поэтому настоятельно рекомендую провести полное лечение системы, в которой был обнаружен Shade.
Другие особенности
Из забавных наблюдений: в дампе памяти трояна можно обнаружить «пасхальное яйцо» — строку с обращением к антивирусным аналитикам. На рис. 8 и 9 показаны соответствующие строки из дампов семплов от 3 июня и 24 сентября 2015 года.
На закуску
Вкратце пройдемся по необычным криптовымогателям и трендам, наблюдающимся среди шифровальщиков.
Червь-шифровальщик
Полиморфный червь Virus.Win32.PolyRansom (Virus:Win32/Nabucur, W32/VirRnsm, одна из версий его также известна под именем Operation Global III) распространяется по всем доступным ему носителям. Отличие его от других червей в том, что он шифрует файл жертвы (простым алгоритмом xor dword + rol byte), помещает его в зашифрованном виде в тело своей морфированной копии (причем не в оверлей, а внутрь секции) и подменяет этой копией оригинальный файл. Так повторяется для определенного списка расширений, в этот список входит и exe. В результате лечение системы от такого заражения оказывается сложнее, чем от обычных червей и даже PE-инфекторов, ведь, если просто удалить всю малварь, жертва останется без своих файлов.
Когда копию червя запускают, он сам расшифровывает и открывает оригинальный файл, чтобы жертва ничего не заподозрила. Однако уже через несколько минут (когда червь распространится по доступным ему дискам) экран компьютера блокируется в стиле отошедших уже на второй план вымогателей прошлого (рис. 10).
Ransomware as a service
Модель распространения шифровальщиков, основанная на открытой для всех желающих партнерской программе. Грубо говоря, это онлайн-конструктор малвари: после регистрации на веб-ресурсе (как правило, расположенном в сети Tor) любой желающий может сгенерировать семпл и распространять его, как посчитает нужным (напоминаю читателям, что такие действия караются в соответствии с УК РФ). Создатель онлайн-конструктора автоматически забирает себе определенный процент от вырученных таким образом денег.
За последний год появилось по крайней мере два нашумевших в СМИ трояна-вымогателя, следующих этой схеме.
Tox
Один из них, Tox (не путать с одноименным децентрализованным мессенджером) был обнаружен в мае 2015 года. По данным сайта bleepingcomputer, за три дня функционирования этого сервиса произошло 900 заражений этим шифровальщиком. Уже в июне автор сервиса раскаялся и принял решение продать его.
Encryptor RaaS
Второй представитель прямо так и называет себя — Encryptor RaaS (Ransomware as a Service). Как выглядит интерфейс конструктора, можно посмотреть на kernelmode. Разработчик трояна заявляет, что его комиссия составит 20% от полученных вымогательством денег.
Encryptor RaaS (Trojan-Ransom.Win32.Raas, Ransom:Win32/Sarento, Trojan.Encoder.1479, Win32/Filecoder.EZ) для работы с большими числами использует библиотеку GMP. Файлы жертвы он шифрует блочным шифром RC5, ключ для каждого файла генерирует с помощью API-функции RtlGenRandom
. Затем ключ вместе со служебной информацией шифруется алгоритмом RSA на зашитом в теле трояна 2048-битном ключе.
Интересная особенность — троян специально не трогает файлы с именем wallet.dat
. В процедуре проверки имени файла есть такой код:
mov edi, offset aWalletDat ; "wallet.dat"
mov ecx, 0Bh
mov esi, ebx
repe cmpsb
jz exit
Сделано это, очевидно, чтобы случайно не лишить жертву способа заплатить выкуп.
Вместо заключения
Компьютерное вымогательство в последние годы набирает все больший размах. Чтобы не стать жертвой, используй здравый смысл и самое свежее ПО, а для всех ценных файлов регулярно и правильно делай резервные копии — они спасут данные не только от малвари, но и от поломки оборудования и других неприятных неожиданностей.
Приложение
При подготовке статьи исследованы следующие семплы шифровальщиков:
- a683a02903aaab1772ec1a044ed2d6f5 — Trojan-Ransom.Win32.Rakhni.walx
- 9e48f627161a068e32fb3d3c61a6a449 — Trojan-Ransom.Win32.Cryakl.ack
- d8d228235be285d8cc6a04dce4951079 — Trojan-Ransom.Win32.Aura.ws
- a404b281132627b96cc191162514cd7b — Trojan-Ransom.Win32.Shade.uy
- 2fe09acc8de48b8835361ea386a275f7 — Trojan-Ransom.Win32.Shade.ur