Недавно наши аналитики обнаружили новый вариант вредоносной программы MiniDuke (Kaspersky, Symantec), который распространялся с использованием эксплойта для уязвимости CVE-2014-1761. Этой уязвимости были подвержены все версии MS Word 2003-2013 до выхода соответствующего исправления MS14-017. MiniDuke представляет из себя бэкдор небольшого размера (около 20 КБ) и позволяет атакующим получать полный доступ к скомпрометированной системе. Он имеет столь малый размер, поскольку разработан с использованием ассемблера. ESET обнаруживает MiniDuke как Win32/SandyEva.
В новой версии этой вредоносной программы злоумышленники добавили вспомогательный компонент, выполненный на JavaScript. Он предназначен для работы с удаленным C&C-сервером через Twitter.
Рис. RTF-документ с эксплойтом CVE-2014-1761 на борту.
Вышеупомянутый документ назывался Proposal-Cover-Sheet-English.rtf. Мы получили его 8-го апреля, спустя всего три дня после того как новый исполняемый файл MiniDuke был скомпилирован (временная метка 5 апреля из PE-заголовка). Этот исполняемый файл доставляется эксплойтом и его размер составляет 24 КБ.
Функциональные возможности шелл-кода, который исполняется после срабатывания уязвимости, довольно просты и понятны. После расшифровки своего кода и получения адресов некоторых функций, экспортируемых библиотекой kernel32.dll, он расшифровывает файл полезной нагрузки и размещает его в директории %TEMP% и файле «a.l». Этот сброшенный на диск файл представляет из себя библиотеку, которая затем будет загружена в память с использованием стандартной функции kernel32!LoadLibraryA.
Шелл-код содержит анти-отладочные механизмы и проверяет первые байты вызываемых API на предмет присутствия там перехватов или брейкпоинтов, используемых отладчиками. В случае присутствия каких-либо аномалий (несовпадение пролога функции с оригиналом), шелл-код пропускает первые пять начальных байт функции путем ручного исполнения пролога (mov edi, edi; push ebp; mov ebp, esp) из своего кода.
Рис. Шелл-код проверяет пролог функции на предмет присутствия там инструкций передачи управления стороннему коду. Видно, что в случае присутствия модификации, пролог исполняется непосредственно из шелл-кода.
На следующей диаграмме представлен поток исполнения (execution flow) кода вредоносной программы, в случае успешной эксплуатации уязвимости. Как мы уже указывали выше, эта версия полезной нагрузки MiniDuke состоит из двух компонентов, которые мы называем основным модулем и модулем TwitterJS.
Рис. Действия вредоносной программы.
Как только вредоносная DLL MiniDuke получает управление, она проверяет контекст своего процесса на принадлежность к rundll32.exe, а также текущую директорию на совпадение с %TEMP%. В случае выполнения этих условий, вредоносная программа предполагает, что она была запущена в первый раз и начинает процесс своей установки в систему. MiniDuke собирает информацию о системе и шифрует свои данные конфигурации на основе этой информации. Такой метод использовался в OSX/Flashback и ему было присвоено название watermarking (Bitdefender). Это приводит к тому, что данные конфигурации, хранящиеся в DLL, невозможно извлечь на другом компьютере. Собираемая вредоносным кодом информация, на основе которой данные будут зашифрованы, не изменилась с предыдущей версии и основывается на следующих значениях.
- Серийный номер тома (через использование kernel32!GetVolumeInformationA).
- Информация о CPU (с помощью инструкции cpuid).
- Имя компьютера (kernel32!GetComputerNameA).
Когда MiniDuke сгенерировал зашифрованную версию своей DLL, он записывает ее в файл в директории «%ALLUSERSPROFILE%Application Data». Имя файла, как и расширение, выбирается на основе значений, перечисленных здесь. Для обеспечение своей выживаемости после перезагрузки MiniDuke создает скрытый файл ярлыка .LNK в директории «Startup», который указывает на компонент вредоносной программы. Название файл ярлыка генерируется с помощью одного из нижеуказанных значений.
Как нетрудно догадаться, для исполнения dll через .LNK будет использован rundll32.exe. При этом команда будет иметь вид:
«C:Windowssystem32rundll32.exe %path_to_main_module%, export_function»
«C:Windowssystem32rundll32.exe C:DOCUME~1ALLUSE~1APPLIC~1data.cat, IlqUenn»
Когда rundll32 исполняет DLL MiniDuke, код из этой библиотеки уже будет исполняться по другому сценарию (запущен не в первый раз). Для расшифровки своих данных вредоносный код начинает собирать информацию о системе, которую мы упоминали выше. Как и в случае с предыдущей версией MiniDuke, эта версия выполняет проверку следующих запущенных процессов в системе.
При обнаружении одного из этих процессов в системе, вредоносный код некорректно расшифровывает свои данные, что приводит к невозможности работы с удаленным C&C-сервером. В случае корректной расшифровки своих данных и отсутствия запущенных процессов из списка выше, MiniDuke получает страницу сервиса Twitter аккаунта @FloydLSchwartz для поиска URL-адресов удаленного C&C-сервера. Для поиска на странице используется тэг «X)))» (предыдущая модификация вредоносной программы осуществляла поиск по тэгу «uri!»). Если тэг найден, вредоносный код расшифровывает URL из данных, которые следуют за тэгом. Обнаруженный нами аккаунт @FloydLSchwartz в Twitter содержит на своей странице только ретвиты без упоминания вышеуказанного тэга.
Рис. Аккаунт в Twitter, который используется для извлечения информации о C&C-сервере вредоносной программы.
На следующем шаге MiniDuke собирает на зараженной системе следующую информацию:
- имя компьютера и домена;
- код страны IP-адреса зараженного компьютера, полученный через www.geoiptool.com;
- информация о версии ОС;
- имя контроллера домена, имя пользователя и групп, которые ему принадлежат;
- список AV-продуктов, установленных в системе;
- конфигурация Internet proxy;
- версия вредоносной программы.
Эта информация затем отправляется на C&C-сервер вместе со специальным запросом на получение полезной нагрузки. Конечный URL-адрес, который используется для взаимодействия с C&C-сервером выглядит следующим образом: "<url_start>/create.php?<rnd_param>=<system_info>".
- url_start – URL-адрес, полученный через аккаунт Twitter;
- rnd_param – произвольным образом сгенерированные символы в нижнем регистре;
- system_info – информация о системе, зашифрованная, а затем закодированная через base64.
Пример такого URL приведен ниже.
Полезная нагрузка загружается с использованием API urlmon!URLDownloadToFileA и представляет из себя файл с именем «fdbywu».
Рис. Функция получения полезной нагрузки.
Загруженная полезная нагрузка представляет из себя фальшивый файл изображения в формате GIF8. Этот файл содержит зашифрованный исполняемый код. MiniDuke обрабатывает этот загруженный файл аналогично своей предыдущей версии. Целостность данных проверяется с использованием RSA-2048, затем данные исполняемого файла расшифровываются и сохраняются в отдельном файле. Далее файл запускается на исполнение. Для проверки целостности исполняемого файла внутри GIF используется открытый ключ RSA-2048, который аналогичен используемому в предыдущей версии вредоносной программы.
В том случае, если MiniDuke не удается получить адрес C&C-сервера из аккаунта в Twitter, он генерирует специальное имя пользователя для поиска, основанного на текущей дате. Поисковый запрос изменяется каждые семь дней и напоминает механизм резервного копирования в прошлых версиях вредоносной программы, которые использовали поиск Google. Реализацию этого DGA алгоритма на Python можно найти здесь.
Модуль TwitterJS встраивается в копию системного файла Windows cryptdll.dll. Вредоносный код вставляет в эту системную dll блок кода, перенаправляя на этот код одну из экспортируемых функций. Ниже на скриншоте показана таблица экспорта модифицированной версии этой библиотеки.
Этот файл (модифицированная копия cryptdll.dll) затем сохраняется как поток данных NTFS (ADS) для файла NTUSER.DAT в директории %USERPROFILE% (системный файл, который представляет из себя часть системного реестра). Далее вызов этой библиотеки регистрируется как команда Open для диска. Таким образом она будет вызываться каждый раз, когда пользователь будет пытаться открыть логический диск через проводник. Ниже приведено содержимое файла скрипта init.cmd, который используется вредоносной программой для установки модуля TwitterJS (cryptdll.dll) в систему.
Будучи загруженным, TwitterJS инициирует создание экземпляра COM-объекта JScript и расшифровывает сам файл JScript, который содержит логику работы модуля.
Перед его запуском, MiniDuke применяет к нему обфускацию. Скриншоты ниже показывают результат двух различных обфускаций. Мы можем увидеть, что переменные имеют различные значения. Возможно, это делается для того, чтобы препятствовать их исследованию со стороны различных систем обнаружения, которые сканируют код в точке входа JScript.
Рис. Результат первой обфускации.
Рис. Результат второй обфускации.
Назначение этого скрипта заключается в использовании Twitter для нахождения C&C и извлечение кода JScript для исполнения. Он генерирует аккаунт пользователя Twitter для поиска информации. Поиск осуществляется с использованием выражения, которое меняется каждые семь дней. Далее бот посещает профили пользователей Twitter, которые были получены в результате выполнения поискового запроса и ищет в твитах ссылки, которые заканчиваются на «.xhtml». Как только такой URL был найден, бот берет строку ссылки и заменяет «.xhtml» на «.php». Информация о компьютере внедряется в параметр Accept HTTP-заголовка.
Первая ссылка на полученной странице должна содержать данные, закодированные base64. Название атрибута ссылки используется в качестве ключа для алгоритма XOR, используемого для расшифровки JScript. Наконец, Miniduke рассчитывает хэш извлеченного скрипта и сравнивает его с хэшем, зашитым в его коде TwitterJS. Если они совпадают, полученный скрипт исполняется с использованием вызова eval().
Алгоритм хэширования, используемый в этом компоненте, очень похож на SHA-1, но не идентичен ему, так как на выходе получаются разные хэши. Мы решили выяснить, что именно авторы изменили в оригинальном алгоритме. Одна из возможных гипотез заключалась в том, что алгоритм был модифицирован таким образом, чтобы допустить возможные коллизии (баг). Однако внешне все выглядит похожим на оригинальную схему: используются те же математические шаги и константы. Мы наблюдали различие для коротких сообщений, например, второе 32-битное двойное слово в хэше было отличным от того, которое генерируется обычным SHA-1.
SHA1(«test»): a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
TwitterJS_SHA1(«test»): a94a8fe5dce4f01c1c4c0873d391e987982fbbd3
Мы выяснили, почему второе двойное слово в хэше не совпадает с оригинальным алгоритмом. Проблема вызвана неправильным использованием области видимости переменных (scope). Как показано ниже, в коде SHA-1 переменная f используется дважды. Но в функции Z перед ее использованием отсутствует ключевое слово var, которое объявляло бы ее как локальную переменную. Видно, что потом функция Z вызывается еще раз с глобальной переменной f, которая уже была инициализирована самой функцией.
Возможное объяснение этой ошибки заключается в том, что имена переменных генерировались каким-то автоматическим инструментом перед непосредственным внедрением скрипта в полезную нагрузку. Скорее всего, в первоначальном варианте скрипта эти две переменные имели разные названия.
Нам удалось сгенерировать предполагаемые названия аккаунтов в Twitter для 2013-2014 гг. и проверить активны ли они сейчас. На момент нашего исследования, активным был только один аккаунт @AA2ADcAOAA. Этот аккаунт был сгенерирован упомянутым скриптом между 21-м и 27-м августа 2013 г. и не имел твитов.
Пытаясь обнаружить потенциальных жертв этого вредоносного кода, мы зарегистрировали специальные аккаунты в Twitter и сгенерировали твиты с ссылками для ботов. Нам удалось получить несколько подключений из четырех компьютеров, расположенных в Бельгии, Франции и Великобритании. Мы связались с центрами быстрого реагирования CERT этих стран для уведомления о зараженных компьютерах.
Мы обнаруживаем RTF-документ с эксплойтом как Win32/Exploit.CVE-2014-1761.D и компонент MiniDuke как Win32/SandyEva.G.
Автор: esetnod32