Содержание статьи
Троян Win32/Carberp появился не так давно, в первой половине 2010 года, и можно сказать, что этот вирус имеет неплохой потенциал. Он использует достаточно большое количество необычных трюков для обхода эвристических алгоритмов современных антивирусов и сканеров. «Полезная» нагрузка же делает его сравнимым с Zeus’ом или SpyEye. В этой статье мы рассмотрим некоторые особенности данного троянца.
С чего же все началось?
Когда мы принялись исследовать этого зловреда, из пяти семплов, посланных на VirusTotal.com, только один определялся многими антивирусами, у остальных четырех семплов количество детектов было гораздо меньшим. Сравнив все экземпляры при помощи плагина BinDiff для IDA, мы обнаружили, что код был идентичным. Посмотрев внимательнее на файлы в редакторе HIEW, картина стала проясняться. Во-первых, отличались некоторые поля PE-заголовка. Во-вторых, в первой секции «.text» не было кода вообще, а единственное, что там было прописано, — имена двух библиотек (kernel32.dll и advapi32.dll), а также название одной функции (EqualPrefixSid), которые окружены случайными последовательностями байтов. Эти данные используются при распаковке вируса. Ну и наконец, отличались таблицы релокаций. Предпоследние секции «.reloc» были различного размера, и сами значения релоков также не совпадали. Именно эти три отличая позволяли данному вирусу обходить сигнатуры.
Также, помимо пяти семплов одной версии зловреда, были исследованы еще две версии, которые отличались друг от друга как механизмами защиты, так и своим функционалом.
Наконец мы приступили непосредственно к исследованию. При анализе вирусов часто приходится сталкиваться со сложностями при снятии навесной защиты из-за различных антиотладочных приемов и обфускации. Но с данным экземпляром проблем не возникло, его упаковщик снялся без особых усилий. Впрочем, самое интересное начинается дальше.
Временные файлы
При анализе этого зловреда мы сначала не поняли, зачем же он создает временные файлы, копируя в них стандартные библиотеки Windows (ntdll.dll, kernel32.dll и ws2_32.dll). Оказалось, что это делается для безопасности вируса. После создания копии библиотеки, он отображает ее к себе в память, находит нужные ему при работе функции и сравнивает первые 10 байт с теми, что находятся в импортированной библиотеке. Если они не совпадают, значит какая-то «недобрая» программа поставила хук на эту функцию, и вирус сразу восстанавливает эти 10 байт из оригинальной библиотеки, а точнее — из образа ее копии. Поэтому с уверенностью можно сказать, что желающие поизучать внутренности Carberp’а могут отложить API Monitor на дальнюю полку своего жесткого диска :).
Вызовы API-функций также сделаны с изюминкой. В программе присутствует механизм, который получает на вход константу, а на выходе высчитывает необходимый адрес. Конечно, этот подход значительно затрудняет статический анализ зловреда, хотя также имеет и свои минусы — если поставить точку останова на конец функции расшифрования, то легко можно отследить последовательность вызова функций, а написав парочку скриптов для OllyDbg и IDA, можно восстановить их названия и без проблем статически исследовать код. В одной из исследуемых версий трояна также использовалось шифрование всех текстовых строк, используемых программой, что значительно затруднило анализ вредоносных возможностей.
Завоевание новых территорий
Во многих троянах код «полезной нагрузки» не выполняется при первом запуске — он инжектируется в какой-то уже работающий процесс и начинает действовать уже там. Данный вредонос — не исключение, и для внедрения он использует процесс explorer.exe. Только делает он это очень необычно.
Первым делом, процесс вызывает функцию CreateProcess с выставленным флагом CREATE_SUSPENDED, тем самым создавая новый, приостановленный дочерний процесс explorer. exe. Затем вызовом функции ZwCreateSection создается объект «секция» (SectionObject — это часть памяти, которая может разделяться между разными процессами) со всеми возможными правами (чтение, запись, исполнение). Далее секция мапится в контекст трояна функцией ZwMapViewOfSection и при помощи memcpy вредонос копирует свою распакованную копию в эту область памяти. После этого, секция отображается в контекст дочернего explorer.exe, и тем самым туда заносится вредоносный код. Но это еще не конец, ведь вредоносный код должен также выполниться explorer’ом. Для этого функцией ReadProcessMemory из процесса explorer.exe копируется место, где находится спроецированный исходный файл, в контекст вредоносной программы. Создается еще одна секция, которая сначала отображается в троянскую программу, а потом в нее с помощью memcpy копируется полученная из explorer’а часть памяти. Следующим шагом патчатся несколько байт на точке входа таким образом, чтобы происходил прыжок на вредоносную функцию. И наконец, секция отображается в контекст explorer’а на то место, где раньше находился исходный образ.
Теперь все готово для запуска дочернего explorer’а. Троян вызывает ZwResumeThread, тем самым запуская вредоносный код, уже находящийся в другом процессе. Получив управление в новом месте, Carberp начинает работать в полную силу, запуская вредоносные функции payload’а и внедряясь во все запускаемые процессы. Естественно, во всех новых захваченных территориях вредонос также производит описанную выше проверку на наличие хуков в необходимых ему API-функциях.
В более новой версии Carberp’а нами был обнаружен другой способ заражения порожденного процесса explorer.exe. Первые шаги остались неизменными — сначала создается глобальная секция, которая мапится в дочерний процесс, и туда копируется вредоносный код. А дальше вызывается недокументированная функция ZwQueueApcThread, которая ставит в очередь на выполнение в explorer’е асинхронный вызов одной из вредоносных функций, находящихся в образе секции. При вызове ZwResumeThread начинается выполнение вредоносного кода.
Игра в прятки
Прежде чем обсуждать функции, которыми может похвастаться данный вредонос, стоит разобрать еще несколько интересных моментов его жизни. Конечно же, как и любой уважающий себя вирус, Carberp прописывается в автозагрузку, причем банально копируя себя под случайным именем в директорию %HOMEDRIVE%%HOMEPATH%StartMenuProgramsStartUp. Тем не менее, не все так просто! В вирусе предусмотрен механизм, позволяющий скрыть присутствие файла в системе.
После внедрения трояна в дочерний explorer.exe, вызываются механизмы, которые инжектируют его в исходный explorer. Сначала происходит поиск PID-процесса. Стоит отметить, что в программе заложено два способа поиска. Первый способ заключается в последовательном вызове функций FindWindow ("Shell_ TrayWnd", 0) и GetWindowThreadProcessId (hWnd, &id), таким образом, в переменной id должен появиться нужный PID. Если же по какой-то причине функция вернула «id=0», то происходит обыкновенный перебор процессов и поиск нужного.
Когда заветный PID найден, программа внедряется в explorer давно известным способом — ZwOpenProcess + WriteProcessMemory. Также вредонос делает хук двух функций в захваченном процессе — NtQueryDirectoryFile и NtResumeThread из библиотеки ntdll.dll. Чтобы уйти от детекта некоторыми антируткитами (например, RootkitUnhooker), хук делается не совсем стандартным способом. Троян подменяет не адрес нужной функции, а адрес функции KiFastSystemCall. Так для чего же подменяются функции? NtQueryDirectoryFile перебирает все файлы, находящиеся в директории. Она вызывается почти во всех программах (в том числе в explorer и cmd) при обзоре каталогов файловой системы. Ее подмена необходима для того, чтобы скрыть факт присутствия файла. NtResumeThread вызывается explorer’ом при смене директории и при (!) запуске приложения. Таким образом, если explorer заражен, то при запуске любого приложения вредоносная «закладка» определяет PID запускаемого процесса и инжектится в него, также подменяя вышеупомянутые функции. Легко понять, что при старте системы троян автоматически запускается, заражает explorer, а соответственно и все порожденные им процессы.
На этом заканчивается список средств защиты, используемых Carberp’ом. Полный список средств защиты, применяемый этим трояном, приведен в таблице 2.
Начинка
Разобравшись со всеми защитными механизмами трояна, мы приступили к изучению вирусной начинки. Оказалось, что в нем имеет место вполне стандартный функционал похищения пользовательских данных, сравнимый с функционалом того же IBank’а или Zeus’а и дополненный неплохим протоколом обмена данных между компьютерами жертвы и злоумышленника. Собирая по всей системе пользовательские сертификаты, пароли к учетным записям и прочей ключевой информации, добытые с помощью работающего кейлоггера и снятия скриншотов рабочего стола, вредонос упаковывает все найденное в cab-архив и готовит его к отправке.
Общение с хозяином
Теперь посмотрим на реализованный в трояне протокол обмена данными. Условно в нем можно выделить этап установки соединения и непосредственно рабочий этап обмена информацией.
Этап установки соединения
1 — Зараженный компьютер
1. Установка соединения с сервером 1.
2.Отправка строки GET-запросом, предусматривающей указание параметров:
- uptime;
- downlink;
- uplink;
- id (зашифрованная строка, содержащая информацию о зараженной системе);
- statpass (начальный пароль);
- comment.
Вот пример такого запроса:
/stat?uptime=<val1>&downlink=<val2>&uplink=<val3>
&id=<val4>&statpass=<val5>&comment=<val6>
3.Ожидание приема информации от сервера.
2 – Сервер злоумышленника
- Отправка информации зараженному компьютеру. Могут быть отправлены следующие коды:
- ok;
- badpass;
- session: <№ сессии>.
3 — Зараженный компьютер
1. Распознавание полученной от сервера информации:
- ok — соединение установлено;
- badpass, session — повторная передача начальной информации от сервера.
Этап передачи данных
1 — Зараженный компьютер
1. Отправка строки POST-запросом на сервер 2, предусматривающей указание параметров:
- относительного пути, по которому на сервере злоумышленника будут располагаться переданные файлы;
- зашифрованная строка, содержащая закодированную строку с информацией о системе и кодовое слово.
Передаваемая строка может выглядеть так:
1|palladin|05B45905A93F7D4B843D385AAE079AF1|0|0
А зашифрованная следующим образом:
a=e15e327af46a915c1b0014a284c052787ea7d63c8c40b1
a3dcafea6bb8e7076b0f6601861783dff7cbca429eb76a47
Шифрование строки сопровождается дополнением избыточности.
2.Отправка сформированного .cab-файла с похищенной информацией серверу 2.
3.Периодически происходит проверка установленного соединения. Данное действие аналогично предыдущему, за исключением того, что передается строка:
0|check|00000000000000000000000000000000|
2 — Сервер
1. На стороне сервера осуществляется расшифровка принятого сообщения. Отправка уведомления об успешном приеме проверочного пакета.
2. Отправка информации зараженной машине. Вот что сервер может отправить в зависимости от версии троянца.
3 — Зараженный компьютер
1.Распознавание принятой информации.
Надо сказать, что передачу информации Carberp осуществляет грамотно: инициализация связи сопровождается зашитым в троян паролем, состояние канала связи периодически проверяется специальными пакетами, передаваемая информация шифруется, а шифротекст при этом наполняется избыточностью. Более того, возможно удаленное управление зловредом — в разбираемой нами версии присутствовал функционал по разбору команд от удаленного сервера.
Здесь вирусописатели предусмотрели возможность обновления вируса, возможность самоудаления и загрузки дополнительных модулей. Кстати, последние направлены на целевые банковские системы. Заполучить образец такого модуля нам, к сожалению, не удалось, но с высокой вероятностью в нем можно обнаружить механизм перехвата выполняемой клиентом транзакции и подмены страниц аутентификации на страничках интернет-банкинга.
Дополнительные возможности
Дополнительную убойность троянцу добавляют специальные плагины, которые он загружает вдобавок к основному функционалу. На момент исследования у нас было три зашифрованных плагина с символичными именами miniav.plug, killav.plug и passw.plug (именно в таком виде их удалось достать с сервера, с которым Carberp взаимодействует).
Потратив немного времени на исследование шифрованных файлов и написание к ним декриптора на языке python, удалось выяснить, что содержимое этих плагинов соответствует их названию. Действительно, miniav.plug занимается устранением конкурентов — если на компьютере жертвы помимо Carberp’a присутствует другой зловред, например, тот же самый Zeus, то последний безжалостно удаляется из системы. Плагин killav.plug нейтрализует работу антивирусных систем, ну а passw.plug способен перехватывать вводимые пользователем пароли.
Заключение
Итак, мы немного рассказали о защитных трюках трояна, о весьма элегантном способе заражения других процессов, наконец, непосредственно о его вредоносном функционале. Налицо эволюция технологий сокрытия от антивирусных эвристик и сигнатур. К слову, на момент начала исследования далеко не все антивирусные продукты могли отнести файл к классу вредоносных. Поэтому надо держать руку на пульсе — уже сейчас некоторые вирусные аналитики предполагают стремительное развитие Carberp’а.