Драйвер
Драйвер является первым компонентом Duqu, который загружается в систему. По нашим данным, драйвер и другие компоненты этой вредоносной программы устанавливаются с помощью дроппера, использующего 0-day уязвимость (CVE-2011-3402). Драйвер прописывается в реестре по следующему пути: HKLMSystemCurrentControlSetServices. Конкретное имя ключа реестра отличается в разных версиях драйвера Duqu.
После загрузки драйвер расшифровывает маленький блок, содержащий ключ реестра и имя значения реестра, которое будет считано из этого ключа. Этот блок также содержит имя устройства, которое будет создано драйвером.
Все версии драйвера, которые нам известны, имеют одинаковое имя значения реестра: «FILTER».
Затем драйвер регистрирует процедуру DriverReinitializationRoutine, которая ставит в очередь процедуру WorkerRoutine, ответственную за инициализацию драйвера. В процедуре WorkerRoutine драйвер считывает значение «FILTER» из реестра и расшифровывает его с помощью «зашитого» ключа. На данный момент нам известны две версии процедуры расшифровки и два соответствующих ключа. Драйвер также находит модуль NTOSKRNL.EXE или NTKRNLPA.EXE и получает адреса API-функций для дальнейшего использования.
Расшифрованное значение «FILTER» из реестра содержит список записей: имя процесса (services.exe); путь к соответствующему файлу PNF DLL, который будет внедрен в этот процесс; а также ключ расшифровки (0xAE240682), который используется для расшифровки файла PNF DLL.
После инициализации драйвер регистрирует процедуру LoadImageNotifyRoutine, которая будет вызываться Windows каждый раз при загрузке нового модуля. Процедура проверяет, соответствует ли имя модуля одному из имен, указанных в значении «FILTER»; в случае соответствия начинается внедрение файла PNF DLL. Происходит расшифровка и копирование файла PNF DLL в выделенную область памяти этого процесса. Также происходит создание EXE файла-заглушки в этом процессе, который в дальнейшем используется как загрузчик файла PNF DLL.
Как только «KERNELL32.DLL» загружается в тот же процесс, драйвер определяет адреса API-функций, необходимые EXE файлу-загрузчику и меняет оригинальную точку входа модуля главного процесса таким образом, что сначала управление передается загрузчику.
Модуль загрузчика осуществляет первоначальную инициализацию PNF DLL и затем запускает одну из экспортируемых ей функций по номеру, который указан в конфигурации («FILTER»). После этого он восстанавливает оригинальную точку входа и передает управление оригинальному коду процесса. Загрузчик также взаимодействует с драйвером, используя специальный код IOCTL для изменения защиты памяти, в которой находится оригинальная точка входа.
Файл PNF DLL
Этот модуль хранится на диске как зашифрованный блок данных. В расшифрованном виде он представляет собой DLL-файл, упакованный UPX. Известные версии PNF DLL экспортируют 8 или 6 различных функций без имени (по порядковому номеру).
Экспорт 2 запускает Экспорт 6 в отдельном процессе.
Экспорт 4 запускает Экспорт 5 в отдельном процессе.
Экспорт 5 запускает поток исполнения в процессе «services.exe», который загружает ресурс 302 (см. ниже), и, если вызывающим кодом предоставлены корректные данные, устанавливает полностью новый набор компонентов Duqu.
Экспорт 6 останавливает работу драйвера и полностью удаляет все компоненты Duqu. Экспорт 8 и Экспорт 1 инициализируют модуль PNF DLL и запускают основные потоки исполнения.
Скорее всего, код первой функции предназначен для экспорта основного функционала DLL. Сначала он загружает конфигурационную информацию из другого PNF-файла – PNF-файла конфигурации. Если файла нет, он создается из зашифрованной зашитой копии, которая хранится в файле PNF DLL.
Имена конфигурационного файла отличаются в разных версиях Duqu. Конфигурационный PNF-файл содержит имя и путь к драйверу, к файлу PNF DLL и самому конфигурационному PNF-файлу.
Когда конфигурационный PNF-файл создается в первый раз, дата его создания записывается в файл. Файл также содержит значение TTL («time to live», время жизни): отдельный поток, запускаемый PNF DLL, отслеживает, прошло ли определенное TTL количество дней со дня создания; если да, то запускается процедура удаления Duqu.
Некоторые версии PNF DLL также запускают RPC сервер, схожий с RPC сервером, обнаруженным в Stuxnet.
PNF DLL также предоставляет API для управления конфигурационным файлом из внешних модулей через глобально доступные в системе объекты.
В зависимости от флагов в конфигурационном PNF-файле, код в PNF DLL ищет конкретные процессы: список имен процессов в конфигурационном PNF-файле, «explorer.exe», «svchost.exe»; после чего внедряет в них код. Внедряемый код хранится в ресурсе 302, находящемся в PNF DLL.
Ресурс 302
В зависимости от флага в конфигурационном PNF-файле, ресурс 302 является или DLL модулем-загрузчиком, или блоком данных (эквивалент распакованной «.zdata», см. ниже). Обе конфигурации были обнаружены в различных версиях Duqu. PNF DLL проверяет флаг в конфигурационном PNF-файле и определяет , передавать ли управление DLL-загрузчику или перейти к DLL с основным кодом и вызвать ее напрямую.
Модуль DLL-загрузчика похож на PNF DLL. Главной целью загрузчика является распаковка своей секции «.zdata» и передача управления основному коду, который содержится в распакованных данных.
Блок «.zdata» содержит заголовок, который начинается с идентификатора 0x48747193. Он содержит смещения и размеры DLL-загрузчика, блока конфигурации и DLL с основным кодом.
Конфигурационный блок
Конфигурационный блок содержит имя временного файла для использования %TEMP%~DR0001.tmp, дополнительный данные, контролирующие поведение основного кода, и информацию, необходимую для соединения с C&C. Существует два списка C&C, один содержит имена доменов, IP-адреса или имена сетевых папок; другой содержит IP-адреса в двоичном формате и используется для соединения с помощью сервиса Windows HTTP (winhttp). Несмотря на то, что конфигурационные блоки, которые мы обнаружили, похожи и предназначены только для соединения с C&C, используя HTTP и HTTPS, Duqu также может присоединяться к сетевому ресурсу и даже быть сервером.
Основной код
Мы все еще анализируем библиотеку, содержащую основной код Duqu. Она содержит 256 Кбайт кода на C++ с активным использованием STL и собственную сложную иерархию классов, возможно, собственный объектно-ориентированный инструментарий.
Основной модуль Duqu может соединяться с C&C, используя или библиотеку winhttp, или соединение с сетевым ресурсом IPC$. Для соединения он может использовать прокси-сервера, указанные в настройках Internet Explorer зараженного компьютера. Он также может работать в режиме HTTP-сервера и обрабатывать те же запросы, что и C&C сервер. Модуль может загружать внешние DLL-модули, предоставленные сервером C&C, и взаимодействовать с ними, используя предопределенный API. Наиболее интересный из известных на данный момент модулей – это модуль, ответственный за кражу информации. Также есть модули для обновления значения TTL в конфигурации PNF DLL, для чтения настроек сети и дисков зараженной машины.
Основной модуль также способен формировать PNF DLL файл с конфигурационным блоком и DLL с основным кодом, предположительно для установки на другие компьютеры.
Тайна Duqu: часть пятая