Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 151, АВГУСТ 2011 г.

GENERATION CARBERP: Изучаем все секреты трояна Win32/TrojanDownloader.Carberp

Троян 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%\StartMenu\Programs\StartUp\. Тем не менее, не все так просто! В вирусе предусмотрен механизм, позволяющий скрыть присутствие файла в системе.

После внедрения трояна в дочерний 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 – Сервер злоумышленника

1. Отправка информации зараженному компьютеру. Могут быть отправлены следующие коды:

  • 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’а.

Содержание
загрузка...
Журнал Хакер #151Журнал Хакер #150Журнал Хакер #149Журнал Хакер #148Журнал Хакер #147Журнал Хакер #146Журнал Хакер #145Журнал Хакер #144Журнал Хакер #143Журнал Хакер #142Журнал Хакер #141Журнал Хакер #140Журнал Хакер #139Журнал Хакер #138Журнал Хакер #137Журнал Хакер #136Журнал Хакер #135Журнал Хакер #134Журнал Хакер #133Журнал Хакер #132Журнал Хакер #131Журнал Хакер #130Журнал Хакер #129Журнал Хакер #128Журнал Хакер #127Журнал Хакер #126Журнал Хакер #125Журнал Хакер #124Журнал Хакер #123Журнал Хакер #122Журнал Хакер #121Журнал Хакер #120Журнал Хакер #119Журнал Хакер #118Журнал Хакер #117Журнал Хакер #116Журнал Хакер #115Журнал Хакер #114Журнал Хакер #113Журнал Хакер #112Журнал Хакер #111Журнал Хакер #110Журнал Хакер #109Журнал Хакер #108Журнал Хакер #107Журнал Хакер #106Журнал Хакер #105Журнал Хакер #104Журнал Хакер #103Журнал Хакер #102Журнал Хакер #101Журнал Хакер #100Журнал Хакер #099Журнал Хакер #098Журнал Хакер #097Журнал Хакер #096Журнал Хакер #095Журнал Хакер #094Журнал Хакер #093Журнал Хакер #092Журнал Хакер #091Журнал Хакер #090Журнал Хакер #089Журнал Хакер #088Журнал Хакер #087Журнал Хакер #086Журнал Хакер #085Журнал Хакер #084Журнал Хакер #083Журнал Хакер #082Журнал Хакер #081Журнал Хакер #080Журнал Хакер #079Журнал Хакер #078Журнал Хакер #077Журнал Хакер #076Журнал Хакер #075Журнал Хакер #074Журнал Хакер #073Журнал Хакер #072Журнал Хакер #071Журнал Хакер #070Журнал Хакер #069Журнал Хакер #068Журнал Хакер #067Журнал Хакер #066Журнал Хакер #065Журнал Хакер #064Журнал Хакер #063Журнал Хакер #062Журнал Хакер #061Журнал Хакер #060Журнал Хакер #059Журнал Хакер #058Журнал Хакер #057Журнал Хакер #056Журнал Хакер #055Журнал Хакер #054Журнал Хакер #053Журнал Хакер #052Журнал Хакер #051Журнал Хакер #050Журнал Хакер #049Журнал Хакер #048Журнал Хакер #047Журнал Хакер #046Журнал Хакер #045Журнал Хакер #044Журнал Хакер #043Журнал Хакер #042Журнал Хакер #041Журнал Хакер #040Журнал Хакер #039Журнал Хакер #038Журнал Хакер #037Журнал Хакер #036Журнал Хакер #035Журнал Хакер #034Журнал Хакер #033Журнал Хакер #032Журнал Хакер #031Журнал Хакер #030Журнал Хакер #029Журнал Хакер #028Журнал Хакер #027Журнал Хакер #026Журнал Хакер #025Журнал Хакер #024Журнал Хакер #023Журнал Хакер #022Журнал Хакер #021Журнал Хакер #020Журнал Хакер #019Журнал Хакер #018Журнал Хакер #017Журнал Хакер #016Журнал Хакер #015Журнал Хакер #014Журнал Хакер #013Журнал Хакер #012Журнал Хакер #011Журнал Хакер #010Журнал Хакер #009Журнал Хакер #008Журнал Хакер #007Журнал Хакер #006Журнал Хакер #005Журнал Хакер #004Журнал Хакер #003Журнал Хакер #002Журнал Хакер #001