Grabduck

История борьбы с трояном-файлошифровальщиком – поход в центр управления за ключом

:

Введение


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

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

Заключение


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

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