Введение


История началась с того, что в начале дня раздался звонок. Взволнованный голос клиента рассказал, что комп не загружается, документы не открываются, а вместо привычного рабочего стола на экране угрожающая надпись с приблизительным смыслом: «заплати нам деньги и мы вернем тебе рабочий стол и документы». Знакомая многим ситуация: вероятнее всего на компьютере очередной винлокер, работы по выпилу вымогателя займут максимум 10 минут.

Ради удаления винлокера за 10 минут не хотелось ехать в другой конец города, поэтому договорились о том, что системник привезут ко мне, я его приведу в порядок и верну обратно.

Получил системник, включил. Загрузился виндовс ХР. Появился рабочий стол – никаких признаков винлокера, с первого взгляда все нормально. Однако, попытавшись открыть первый попавшийся документ с рабочего стола, получил в ответ «страшное» сообщение:

image

Естественно, как и любой человек, который не первый раз сталкивается с троянами-вымогателями, я отнесся к данному тексту с изрядной долей скепсиса. Наверняка, подумал я, здесь все дело в обычной программе, которая перенастроила на себя обработку открытия файлов с расширением .doc и .xls для того, чтобы пугать неопытных пользователей текстом с непонятными словами. Чтобы убедиться в этом предположении и поймать программу-хулигана, загрузил компьютер с образа для восстановления системы, открыл диск C в файловом менеджере и увидел совсем нерадостную картину: все файлы на локальных дисках внезапно приобрели расширение M5bFu, а их содержимое стало похоже на результат работы генератора случайных чисел. От прежнего содержимого файлов не осталось ни следа.

Итак, сообщение о том, что файлы зашифрованы оказалось чистой правдой. Зашифрованными оказались все файлы размером менее 2 гигабайт с расширением doc, xls, dbf, avi, jpg, txt, rar, zip – в общем все, что может представлять ценность для владельца информации. Среди зашифрованных файлов – база 1С и важные документы. Если 1С еще можно было восстановить из свежего бэкапа, то пропажа ценных документов и фотографий могла бы сильно пошатнуть здоровье клиента. Таким образом, выбора не было – пришлось взяться за расшифровку данных.

Этап 1. Поиск алгоритма шифрования


Опять же, будучи от природы слегка недоверчевым, решил, несмотря на явное указание алгоритма шифрования в сообщении, самостоятельно определить каким криптоалгоритмом зашифрованы данные в файлах (вдруг все не так страшно, как написано). Сначала проверяем самые простые и распространенные шифры замены: шифр цезаря, XOR и т.п.

Для анализа берем два файла dbf: один зашифрованный из зараженной системы, другой нетронутый из свежего бэкапа и сравниваем их друг с другом. На примитивный шифр замены ��ам могут указать области исходного dbf-файла, заполненные идущими подряд одинаковыми байтами, например со значением 0. Благо файлы dbf не отличаются высокой плотностью хранимой информации, и нулевых байтов в них предостаточно.



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

Таким образом, пришлось принять как гипотезу использование шифра RC6, указанного в сообщении от создателей трояна. Впоследствии гипотеза подтвердилась, а именно шифрование выполнено алгоритмом RC6 с длиной блока 16 байт, причем применяется он «влоб», по блок-схеме. Авторы реализации даже не озаботились о шифровании неполных блоков, менее 16 байт, оставив их как есть, незашифрованными.

Итак, алгоритм известен. Осталось дело за малым: найти ключ.

Этап 2. Поиск ключа


Для поиска ключа найдем сначала тело вредоносной программы (или то, что от этого тела осталось). В каталоге %SYSTEMROOT%\System32 находим 2 «лишних» exe-файла: system.exe и еще один исполняемый файл с рандомным именем (H3w2DWg.exe). Оба файла являются частью заразившего систему троянца, однако ни ��дин из файлов на момент обнаружения (апрель 2012 года) не опознавался антивирусами как вредоносный. На данный момент некоторые антивирусы опознают троянскую программу верно как Trojan.Encoder.136 (DrWeb) или как Win32/Filecoder.AF (ESET-NOD32), однако большинство антивирусов в лучшем случае думают что это просто слегка подозрительный файл. Вот ссылка на virustotal.

Раз троянец не опознается антивирусами, придется препарировать его самому. Вооружившись hiew32, OllyDbg и виртуальной машиной, приступил к вскрытию. Вскрытие показало, что файлы троянца не упакованы, не зашифрованы и написаны на Borland Delphi. Внутри также были обнаружены ссылки на зашифрованные файлы account.cfg, config.cfg и lock.cfg, лежащие также в %SYSTEMROOT%\System32. Путем отладки в недрах exe-файлов также был найден некий ключ в виде строки символов «1kv9yha029v9vi71xioa7h812ga811n9» длиной 32. С помощью этого ключа троянец расшифровывал файл lock.cfg.
Осталось понять каким образом данная строка преобразуется в ключ RC6. Длина ключа RC6 – от 128 бит и больше. В качестве первой попытки попробуем преобразовать каждый символ в 8-битное представление через ASCII-код. В результате получаем ключ длины 32*8=256 бит. Пишем программу на С++, подаем программе на вход ключ и файл lock.cfg. Запускаем процесс расшифровки. Неудача. Файл не расшифровался.

Какие остались варианты? Самый долгий и кропотливый – выдернуть алгоритм формирования ключа отладчиком из исполняемого файла. Оставил этот вариант на крайний случай из-за его избыточной трудоемкости. Вместо этого немного подумаем и поставим себя на место создателей вредоносной программы. Вряд ли авторы трояна самостоятельно реализовывали алгоритм шифрования. С большой вероятностью готовая реализация алгоритма на дельфи была скачана из интернета. Также вряд ли использовались готовые скомпилированные библиотеки, в них криптоалгоритм был бы реализован гораздо качественнее и уж точно не оставлял бы незашифрованными блоки менее 16 байт. Делаем вывод, что в троянце скорее всего использовалась студенческая учебная программа, исходники которой злоумышленники стащили из интернета.

Залазим в Гугль и ищем что-нибудь по ключевым словам Delphi RC6. Находим ссылку http://www.delphi-club.ru/delphi/rc6_encryption.html. Так и есть, модуль на Дельфи, который шифрует файл блоками без гаммирования и оставляет незашифрованным последний блок длиной менее 16 байт. Берем из реализации особенности формирования ключа, переписываем их на С++, компилируем программу расшифровки. Скармливаем программе 32-символьный ключ, пытаемся расшифровать файл lock.cfg. Опять неудача.

Остался вариант с OllyDbg и телом троянца. Не буду утомлять подробностями получения секретного алгоритма, по которому формировался ключ, тем более что сама процедура заняла не так уж много времени. Секрет был прост. Строка символов с ключом считывалась из ресурсов файла в кодировке ASCII (32 символа=32 байта), затем (видимо самим Delphi) преобразовывалась в UTF-16LE – получалось 64 байта (на практике байты просто разбавлялись нулями). И этот результат уже скармливался известному, благодаря исходникам на дельфи, алгоритму получения ключа. Длина ключа на выходе — 512 бит.

Полученным ключом файл lock.cfg был успешно расшифрован. Внутри файла обнаружился ключ к файлам config.cfg и account.cfg, а также список доменных имен сайтов для блокировки через файл hosts и список «вредных» по мнению троянца процессов (антивирусы, файрволлы) – тоже, вероятно, для блокировки.

Файл account.cfg содержал пару дополнительных ключей (в том же формате строки из 32 символов), номер счета на Деньги@Mail.ru, чей-то e-mail адрес, сведения о зараженном компьютере и еще какую-то мелкую информацию. В файле config.cfg, помимо всего прочего, был ip-адрес компьютера, который, по всем признакам, являлся управляющим сервером вредоносной программы.

Однако, как это ни печально, ни один из найденных в файлах ключей не подходил для расшифровки файлов на дисках зараженного компьютера. Еще од��о утверждение злоумышленников оказалось правдой: ключ для расшифровки файлов действительно не хранится на компьютере. Осталась последняя надежда – вытрясти ключ из управляющего сервера вредоносной программы. Согласно сообщению от авторов троянца, ключ хранится там в течение 7 дней, именно в этот срок его нужно добыть, иначе расшифровать файлы не получится – подбор 32-символьного ключа из комбинации цифр и латинских букв верхнего и нижнего регистра займет десятилетия, а файлы с ценными документами нужны срочно.

Этап 3. В центр управления за ключом


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

На виртуальную машину была установлена чистая операционная система, на основной машине запущен WireShark, на виртуальной – троянец. Выяснилось, что для связи используется незашифрованное соединение через TCP-порт 80. При первичном заражении на сервер уходят данные компьютера (ОС, процессор, память), а с сервера скачиваются дополнительные модули троянца, а также dll-файлы библиотеки SSLeay, которые затем используются для работы с сайтом Деньги@Mail.ru.

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

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

Обмен с управляющим сервером ведется в формате: «команда клиента – ответ сервера». Покопавшись в недрах вредоносной программы, вытащил список допустимых команд: mail, rekey, key, check_pay, get_masks, ssl, winlock и много других. Из WireShark’а узнал формат клиентских команд и параметров. Настало время экспериментов. Зайдя на сервер с помощью telnet и представившись зараженным компьютером (команда client_info с параметром в виде ключа), ввел команду key, в ответ на которую получил готовый ключ для расшифровки файлов.

В итоге дописал программу на С++, расшифровывающую все файлы на диске. Клиент получил обратно все свои файлы и рабочий стол впридачу.

Заключение


Отнюдь не считаю себя вирус-аналитиком и думаю, что в данном случае на пути к победе мне помогли несколько очевидных промахов злоумышленников. Во-первых, авторы вредоносной программы сами раскрыли много важной информации в своем сообщении пользователю: алгоритм шифрования и тот факт, что клю�� хранится на сервере. Во-вторых, обмен с сервером производился по открытым каналам с помощью достаточно простого текстового протокола – это существенно ускорило процесс получения ключа. В-третьих, авторы троянца не слишком заморачивались по поводу защиты своего продукта от декомпиляции и отладки, что в конечном итоге упростило анализ алгоритма шифрования и получения ключа. Да и общее впечатление: кто-то просто хотел по-быстрому срубить денег, не особо заботясь о защите своего продукта от взлома.

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