Содержание статьи
В IT-сообществе принято считать безусловным злом любой софт, который крадет персональные данные пользователя и приносит огромную прибыль киберпреступникам. Между тем существуют вполне легальные компании, которые разрабатывают и продают трояны.
Нелегальное легально
Неужели действительно кто-то разрабатывает и продает вредоносное ПО легально? Да, только тот же самый софт, за создание которого еще вчера могли привлечь к ответственности, разрабатывается не со злым умыслом, а для решения вполне легитимных задач. Скажем, спецслужбы могут осуществлять с помощью программ, которые совсем недавно использовались как трояны, сбор оперативной информации — где тут вредоносность? Восьмого октября 2011 года крупнейший европейский хакерский клуб Chaos Computer Club (CCC) опубликовал отчет о реверс-инжиниринге трояна, который немецкая полиция якобы использовала не только для сбора пользовательских данных, но и для скрытой установки программного обеспечения на зараженные компьютеры. Власти официально этот факт подтвердили. А в декабре исследователь и завсегдатай форума XDA-developers Тревор Экхарт обнаружил, что ряд современных смартфонов, в том числе Android и iPhone, скрыто следят за действиями пользователей и передают собранную «статистику» производителям. Подробнее об этих двух инцидентах можешь прочитать во врезке. Сейчас же я предлагаю рассмотреть один из таких «легальных троянов» — Remote Control System, узнать, что о нем говорят разработчики, и разобраться, что он на самом деле собой представляет.
Хакер #157. Деньги на багах в Chrome
Remote Control System
Скажу прямо, сам производитель предоставляет о программе крайне скудную информацию. На официальном сайте итальянской компании HackingTeam можно найти всего лишь несколько презентаций и два видеоролика. Однако этого вполне достаточно для понимания того, что возможности RCS просто огромны. Программа позволяет собирать информацию об операционной системе, нажатиях клавиш, автоматически делает скриншоты экрана, окон и областей, в которых пользователь кликнул мышкой. Вдобавок программа умеет перехватывать переписку в чатах, а также разговоры в Skype, Google Talk и других IM. Если у зараженного пользователя подключена веб-камера, троян может делать с ее помощью фотографии и передавать их на сервер атакующего. Более того, в RCS имеется специальный модуль, который постоянно сканирует файловую систему зараженного компьютера, а затем передает на сервер файлы с определенными расширениями. Существуют версии зловреда для Windows, Mac и ряда мобильных платформ, среди которых следует особо выделить iPhone и Android. Производитель заверяет, что RCS совершенно не видна в зараженной системе и антивирусы с файерволами ей тоже не помеха. И это действительно так: при работе на зараженной машине троян не вызывает подозрений у «Антивируса Касперского» со стандартными настройками, файервол Zone Alarm спокойно пропускает трафик, а RootkitRevealer Руссиновича не показывает ничего подозрительного. Один лишь Wireshark, установленный на компьютере-маршрутизаторе, фиксирует некоторое количество HTTP-POST-запросов к одному из серверов в интернете.
Carrier IQ: легальный троян в смартфонах
Копаясь в прошивке Android-смартфонов фирмы HTC, Тревор Экхарт обнаружил программу, работающую в скрытом режиме и собирающую информацию о нажатиях клавиш на диалере или клавиатуре, просмотре рекламных объявлений, получении СМС, включении и отключении экрана, получении звонков, местоположении и т. д. Дальнейшие исследования показали, что эта программа является детищем фирмы Carrier IQ, которая активно сотрудничает с производителями как смартфонов, так и простых мобильных телефонов. Производитель оборудования получает исходники программы от CIQ, дорабатывает их и внедряет в прошивку устройства. Кроме того, CIQ предоставляет удобный интерфейс для работы с полученными данными.
Элементы кода программы были найдены в прошивках с Sense UI, а также на аппаратах производства Samsung с интерфейсом Touch Wiz. В результате проделанной работы Тревор написал программу, которая позволяет проверить телефон на наличие этого руткита и, если в смартфоне есть права root, попытаться удалить руткит подробнее читай тут.
Обнаружение
Как оказалось, обнаружить троян довольно легко, достаточно лишь загрузиться с загрузочной флешки и прошерстить винчестер зараженного компьютера. RCS создает директорию либо в корне диска C, либо в %APPDATA%, а также генерирует ключ реестра со случайным именем в разделе Run, причем при работе зараженной системы директория и ключ не видны для файл-менеджеров и редакторов реестра. Чуть позже я расскажу, почему, а пока остановлюсь на компонентах трояна.
Модная нынче тенденция реализовывать малварь не в виде exe, а в виде библиотеки dll не обошла стороной и разработчиков RCS. Вообще, версия этого трояна для Windows включает в себя следующие компоненты (имена модулей могут отличаться в зависимости от версии/хозяина):
- Основной модуль 7KOmPPPs.TRK (DLL, x86).
- Файл конфигурации a5jt555f.Qu6.
- Кодек для кодирования речи CrThBBBT.7ar (DLL, x86).
- Дополнительный x64-модуль tms5ggg8.T4t (DLL, x64).
- Драйвер x64 0Cfkvvvw.HiO (SYS, x64).
- Драйвер x86 YDxohhhn.pYS (SYS, x86).
Любой здравомыслящий человек сразу задаст вопрос о скрытой установке x64-драйвера в систему. Здесь нет ничего необычного, разработчики пошли по пути наименьшего сопротивления и просто подписали его своей электронной подписью. К слову сказать, это их и палит (смотри первую иллюстрацию), так как Гугл моментально наводит нас на сайт производителя трояна.
Где собака зарыта?
Сразу скажу, что я коснусь в основном только x86-версии RCS. Как уже отмечалось ранее, основной модуль представляет собой динамическую библиотеку для архитектуры x86. Dll экспортирует восемь функций с ничем не примечательными именами: HFF1, HFF2, ..., HFF8. Значение ключа реестра в разделе Run, запускающее троян, имеет следующий вид:
rundll32.exe "c:\trSMKKK0\7KOmPPPs.TRK",HFF8
— и намекает на то, что в первую очередь необходимо изучить восьмую функцию HFF8. Вообще, закидывая dll в IDA, я думал, что нарвусь на какой-нибудь пакер или навороченную защиту, но и с этим разработчики не стали заморачиваться — антиотладочных средств я не обнаружил, программа имела только защиту против статического анализа кода, которая скорее направлена против антивирусов, нежели реверсера. Поэтому разбирать по косточкам эту малварь было легко, удобно и интересно.
Запуск
Работу функции HFF8 можно логически разделить на несколько блоков. Первый — проверка основных модулей трояна: сначала он проверяет, является ли rundll32.exe текущим процессом, далее перебирает все dll, подгруженные в адресное пространство, затем пытается получить в каждом из них адрес функции HFF1 и сравнивает полученный адрес с уже имеющимся значением. Далее при помощи функции GetModuleFileNameExW троян получает имя своей главной dll (с путем), преобразует его в ASCII и оставляет только имя файла. Путь к файлу и имя файла сохраняются в двух разных буферах в shared-сегменте, где выделена память для данных, доступ к которым нужен другим процессам, в чье адресное пространство также подгружена dll с трояном. Затем каждый символ полученного имени заменяется на другой в соответствии с некоторой таблицей, а новое имя файла (если все предыдущие шаги завершились успешно) копируется в shared-сегмент как имя файла с настройками. Каждый символ имени файла с настройками также кодируется при помощи некой таблицы для преобразования в имя еще одной части трояна. Таким образом и создаются все необходимые имена файлов, которые записываются в shared-сегмент динамической библиотеки. После имен файлов в разделяемый сегмент копируются имена объектов FileMapping. Всего таких объектов три, и их названия имеют префиксы KMS1, KMS2, KMS3. После каждого префикса идет еще восемь hex-значений. Троян считает проверку успешной, если найден основной модуль. Наличие остальных модулей на данном этапе не проверяется.
Второй блок — активация системы маскировки трояна. На этом этапе инициализации троян сначала пытается открыть устройство MSH4DEV1, которое создается x86-драйвером (номер 6 в списке файлов). Если все проходит успешно, то handle устройства сохраняется. Далее выполняется поиск антивирусного ПО, установленного на зараженной машине. Для поиска троян всегда использует один алгоритм: перебирает загруженные в систему драйвера и ищет нужный по определенному имени. Список распознаваемых антивирусов довольно внушителен: Avira, Avast, Eyee, ProcGuard, McAfee, Kerio, Comodo, Panda, TrendMicro, Ashampoo, Kaspersky, AVG, BitDefender и еще пара-тройка экзотических для наших широт продуктов. Учитывая особенности каждого антивируса, троян пытается установить в систему драйвер YDxohhhn.pYS (если он до сих пор не установлен), который копируется в системную директорию Windows и переименовывается в ndisk.sys. Установка выполняется при помощи функций ADVAPI32 типа CreateService, StartService и т. д. Затем троян пытается открыть устройство MSH4DEV1 и найти загруженный драйвер ndisk.sys. Отмечу, что драйвер устанавливается только в том случае, если на компьютере имеется любая антивирусная программа.
R2D2
Осенью крупнейший европейский хакерский клуб Chaos Computer Club (CCC) опубликовал отчет о «полицейском трое», который, как потом признали власти, действительно применялся силовыми ведомствами для сбора пользовательских данных. Из-за того что в основном модуле трояна имеется строка C3PO-r2d2-POE, ему присвоили имя R2D2. Малварь состоит из DLL с именем mfc42ul.dll и драйвера winsys32.sys для архитектуры x86. При заражении DLL прописывается в ветку реестра SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_/DLLs и, следовательно, подгружается в адресное пространство каждого GUI-приложения. Малварь скрыто делает скриншоты экрана, перехватывает нажатия клавиш клавиатуры, записывает звонки, совершаемые при помощи Skype, и передает всю эту информацию на удаленный сервер. Отмечу, что здесь механизм перехвата звонков такой же, как и в RCS. Самый главный фейл, который допустили разработчики, — это использование во всех версиях малвари фиксированных ключей шифрования и алгоритма AES в режиме ECB при полном отсутствии аутентификации, что позволяет практически любому пользователю интернета управлять зараженной машиной.
Исследователи из CCC зареверсили протокол взаимодействия немецкой малвари с командным сервером и разработали альтернативную программу управления. Члены клуба CCC также обнаружили еще одну версию трояна, о чем сообщает одна из последних заметок на их официальной странице www.ccc.de.
Третий блок — подготовка к шифрованию данных. Для шифрования данных используется алгоритм AES в режиме CBC с длиной блока и ключа по 128 бит. Вектор инициализации всегда нулевой, а сами ключи хранятся в открытом виде в сегменте данных. На этом этапе для каждого ключа выполняется процедура KeyExpansion, в ходе которой генерируются раундовые ключи. Результаты ее работы для каждого ключа помещаются в shared-сегмент. Такой подход значительно сокращает время, затрачиваемое на шифрование, так как он устраняет необходимость каждый раз разворачивать 128-битный ключ в набор раундовых ключей.
В четвертом блоке инициализируются агенты-процедуры сбора пользовательских данных. В процессе инициализации заполняется массив пар ключ-значение, где ключом является идентификатор агента, а значением — структура с указателями на функции первоначальной инициализации, функцию, код которой будет выполняться в другом процессе, и процедуру обработки полученных пользовательских данных. При этом для каждого агента также вызывается функция первоначальной инициализации. В ходе инициализации агентов дешифруется файл с настройками и инициализируются только те сборщики данных, которые указаны в конфиге.
В пятом блоке запускаются удаленные потоки, собирающие пользовательские данные. В запуске принимают участие другие экспортируемые функции: HFF1, HFF2, HFF3. После создаются локальные потоки, которые получают собранные пользовательские данные и обрабатывают их. На этом процедура начальной инициализации завершается, и указанный инициализационный поток погружается в бесконечный цикл (while(true){ Sleep(1000); }).
В ходе инициализации троян также проверяет, не заражена ли уже система. Алгоритм проверки на заражение достаточно прост: троян ищет объекты FileMapping с определенными именами (KMS1..., KMS2..., KMS3...), и если находит, то система считается зараженной и процесс инициализации прекращается. Следует сказать несколько слов и о вызове системных функций. Все функции WinAPI вызываются по адресам, которые выдает GetProcAddress. Имена всех вызываемых функций зашифрованы шифром простой замены. Эти имена хранятся в сегменте данных и расшифровываются каждый раз непосредственно перед использованием.
Версия трояна для 64-битных систем в принципе ничем не отличается от версии под x86. В ней используется тот же самый основной модуль, однако после запуска троян проверяет, не является ли система 64-битной, и если является, то в игру вступают dll и драйвер, написанные специально под x64.
Android-версия RCS
Android-версия описываемого трояна представляет собой обыкновенный apk-файл, который при установке запрашивает максимальное количество разрешений, что вполне может насторожить даже самых неопытных пользователей. Мне не удалось полностью декомпилировать apk в Java-сценарий при помощи ApkManager, так как код трояна слегка обфусцирован. Однако большая его часть вполне успешно восстанавливается, правда, без имен классов, переменных и т. д. ApkManager оставляет в виде опкодов невосстановленные участки кода и оборачивает их в комментарии, что позволяет почерпнуть дополнительную информацию о трояне. При разархивировании apk-файла сразу бросается в глаза, что в этой версии используется native-библиотека (so), а также имеется зашифрованный файл с ресурсами. Оказывается, этот файл также шифруется по алгоритму AES в режиме CBC. При этом последний блок дополняется по схеме PKCS#5 и, как и прежде, используется нулевой вектор инициализации. В данном случае ключ хранится не в открытом виде, а вырабатывается из фиксированной строки при помощи многократного вычисления хеш-функции. В расшифрованном файле с ресурсами находится множество строковых пар ключ-значение, позволяющих получить информацию об используемых криптографических алгоритмах.
Дальнейший анализ показал, что при запуске троян пытается проэксплуатировать какую-нибудь уязвимость в Android и получить права root (на моем кастомном билде ему это сделать не удалось). RCS также собирает пользовательские данные (SMS, MMS, контакты) и информацию о сети сотовой связи, периодически включает микрофон телефона и записывает разговоры вокруг и передает всё это добро на удаленный сервер. В диспетчере приложений малварь пытается замаскироваться под com.android.service, а при работе ест много памяти и сильно расходует батарею. Вообще, здесь следует отдать должное производителям Dr.Web Light — антивируса для Android, так как он спокойно палит этот троян и выдает пользователю соответствующее предупреждение.
Работа агента
В большинстве случаев код, внедренный в удаленный процесс, делает одно и то же: подгружает в адресное пространство своего процесса dll основного модуля. После этого открываются FileMapping'и (функция HFF4), а на определенные функции устанавливаются хуки (функция HFF3). По завершении этих процедур dll выгружается из адресного пространства процесса, а поток впадает в бесконечный цикл (засыпает на одну секунду, просыпается и засыпает вновь).
При установке хуков проверяется имя текущего процесса. Если оно не попадает в определенный список, то устанавливаются только те хуки, которые направлены на маскировку трояна в системе. Вообще, этот зловред распознает следующие процессы:
pcts*.exe
k7*.exe
avk.exe
admin.exe
bgscan.exe
avp.exe
pavark.exe
rku*.exe
svv.exe
IceSword.exe
gmer.exe
avgscanx.exe
RootkitRevealer.exe
avscan.exe
avgarkt.exe
sargui.exe
uncrackme.exe
hiddenfinder.exe
hackmon.exe
TaskMan.exe
outlook.exe
skypepm.exe
skype.exe
chrome.exe
firefox.exe
Распознавание процессов осуществляется только по именам, поэтому, переименовав RootkitRevealer.exe в ololo.exe, мы сможем легко обнаружить троян. 🙂
Процессы взаимодействуют друг с другом посредством открытых файл-маппингов. На адресное пространство процесса маппится не какой-то определенный файл, а участок свопа. Маппинг с префиксом имени KMS1 имеет маленький размер (порядка 20 Кб) и служит для управления агентами. Каждый агент периодически заглядывает в DWORD по адресу «начало/маппинга» + «идентификатор/агента» и считывает оттуда определенную команду основного модуля. Второй маппинг служит для передачи основному модулю собранных данных и имеет размер порядка 300 Кб. Данные в виде картинки переводятся в формат JPEG, голосовые данные кодируются кодеком speex (CrThBBBT.7ar). Обработанная информация шифруется с помощью алгоритма AES в режиме CBC (с нулевым вектором инициализации), сохраняется в текущей директории и удаляется после передачи на сервер. Имена сохраняемых в директории файлов представляют собой зашифрованную простой заменой строку вида LOG/XXXX/YYYYYYYYY.log, где XXXX — идентификатор агента, а Y...Y — случайные числа. Данные передаются по протоколу HTTP в теле POST-запроса. Какая-либо аутентификация как на сервере, так и на клиенте отсутствует, поэтому, зареверсив этот простенький алгоритм передачи, можно здорово заспамить удаленный сервер и попытаться угнать его клиенты. 🙂
Отдельный агент, постоянно сканирующий файловую систему компьютера, подготавливает для передачи файлы с определенными расширениями. Следует упомянуть и еще об одном потоке, который постоянно сканирует список текущих процессов, чтобы заражать новые процессы. Троян запускает новые процессы на компьютере от имени explorer.exe за счет инжекции кода в Эксплорер. Зловред использует крайне забавный способ для мониторинга активности Firefox: загружает из интернета библиотеки mozcrt19.dll, softokn3.dll и mozsqlite3.dll, которые просто посылают запросы к SQLite-базам браузера. Подобным образом троян работает и с некоторыми другими программами.
Реакция антивируса
В качестве эксперимента я установил «Антивирус Касперского» и настроил его на максимальное информирование. При загрузке системы АВ выдает сообщение о запуске dll как приложения и попытке получения доступа к защищенному хранилищу паролей. В этом сообщении, прямо скажем, нет ничего информативного, что раскрывало бы суть вирусной активности на компьютере (если бы я был обыкновенным пользователем, то, наверное, вообще никак на него не прореагировал). При этом журнал антивируса начинает пестреть сообщениями о разрешенном внедрении кода в сторонний процесс, о разрешенном доступе к хранилищу паролей и так далее. В общем, никакой пользы для конечного пользователя нет. Единственный положительный момент состоит в том, что «Касперский» видит папку с трояном, однако она не вызывает у него никаких подозрений, то есть заметить ее довольно сложно.
Summary
Вообще, видео на сайте производителя испугало меня больше, чем сам троян. Его несложно обнаружить и нейтрализовать, к тому же после знакомства с современными средствами создания ботнетов от расковырянной коммерческой малвари остаются весьма противоречивые впечатления. Версия для Android вообще не выдерживает критики — она может испортить жизнь только тем пользователям, которые вообще не следят за своим смартфоном, устанавливают приложения из неизвестных источников и безразлично относятся к количеству подтверждений, запрашиваемых приложениями. На примере этого трояна хорошо видно, что технологии коммерсантов отстают от технологий их криминальных коллег — создателей Zeus, TDSS, SpyEye и других подобных вещей.