Наверное, каждый читатель ][ слышал о таком зловреде, как Zeus. Этот бот появился еще в 2007 году и уже тогда наделал много шума. Со временем разработчик данного троя «отошел от дел» и его начинание продолжили другие группы киберпреступников. Данного зловреда отличает от других ботов очень высокое распространение в мире и богатый функционал по краже конфиденциальных данных пользователей.

Сегодня мы подвергнем детальному разбору одну из последних (на момент сдачи статьи – конец сентября – прим. ред.) модификаций этого трояна, определяемого ЛК как Trojan-Spy.Win32.Zbot.anyz. Разбор будет поделен на несколько этапов, каждый из которых будет подробно раскрывать одну из составных частей трояна: «внешний вид», «упаковка и защита», «полезная нагрузка». Под «внешним видом» подразумевается структура файла, особенности PE-заголовка, количество и расположение секций и т.д.

Далее будут разобраны такие методы защиты от детектирования антивирусами и разбора в отладчике, как антиэмуляция и обфускация. Завершится обзор основным функционалом Zbot’а: куда подключается, что ворует, что перехватывает и т.д. В течение статьи будут описаны все тулзы, использованные при разборе.

 

Ну-с, приступим

Взглянув на файл из Hiew, я сразу же увидел UPX – об этом же говорила и точка входа, стандартная для этого пакера. Меня сильно удивила таблица экспортируемых функций, расположенная по RVA – 0x1000, хотя как раз по этому адресу располагается секция UPX0, у которой Physical Size нулевой. Таким образом, при маппировании файла в память загрузчиком, начиная с ImageBase + 0x1000 и на протяжении VirtualSize секции UPX0, все будет забито нулями. Следовательно, экспорты некорректны, и были добавлены разработчиками явно не для того, чтобы экспортировать функции. Также в файле присутствуют ресурсы. Я попробовал просмотреть их с помощью ResHacker’а, однако он обнаружил только элемент типа «Dialog» и не смог его корректно обработать. Таким образом, помимо фэйковых экспортов, файл содержит еще и фэйковые ресурсы. По-видимому, это было сделано для того, чтобы Zbot больше походил на нормальные приложения. Все поля хедера прекрасно разбираются с помощью Hiew.

Получив некоторую первичную информацию, я перешел к более детальному анализу. Для начала мне было необходимо распаковать файл, чтобы можно было по-человечески воспользоваться отладчиком. Я использовал консольную версию пакера UPX, которая прекрасно справилась со своей задачей. В результате ее работы я получил полностью рабочий, распакованный PE’шник с корректными импортами.

На первый взгляд даже в распакованном файле практически невозможно было определить функционал – строки отсутствовали, большинство блоков данных было закриптовано, а код, соответственно, сильно обфусцирован. Помолясь, я приступил к отладке с помощью IDA 5.1 и декомпиляции при помощи Hexrays. Обфускация выполнена довольно просто и очень легко вычислялась – она представляет собой множество вложенных CALL’ов, содержащих логические/арифметические операции над [EBP + xx].

Помимо обфускации с помощью машинных команд, применяется еще и множественный вызов API-функций, не несущих «полезной нагрузки» – так называемые FakeAPI. Эта методика применяется для обхода эмуляторов, которые поддерживают работу только с определенными функциями или вовсе не поддерживают такие вызовы. В данном экземпляре встречается, например, такая экзотическая функция, как HiliteMenuItem, при этом в качестве параметров ей передаются сплошные нули, что, согласись, весьма подозрительно :).

В результате получается, единственное, что делает весь исполняемый код – выделяет память с помощью VirtualAlloc’а, записывает туда один из зашифрованных блоков файла, расшифровывает и переходит на него. На рисунке 4 показан весь алгоритм декриптовки, найденный с помощью IDA. Таким образом, код, расположенный под UPX’ом, оказался для меня крайне неинтересным.

 

Выковыриваем тело

Перейдем к отладке фрагмента кода, который располагается в выделенной с помощью функции VirtualAlloc памяти. Первое, с чем я столкнулся – антиэмуляция на основе чтения полей системной структуры PEB (Process Environment Block). Зловред получает значение «ReadOnlyStaticServerData», которое, согласно книге «Introduction to NT Internals» содержит: «This field has a pointer to a pointer to a system-wide shared memory location (read-only). It is usually empty». На деле же, в реальной системе, в результате нескольких переходов по указателям я наткнулся на юникодную строку «C:\WINDOWS». Зловред берет одно из двойных слов этой строки и сравнивает со своим эталонным значением. В случае неудачи – завершается. Далее я встретил еще одну антиэмуляцию – вызов NtQuerySystemInformation через прямой вызов сервиса 0xAD и дальнейшее сравнение одного из полей структуры SYSTEM_PERFOMANCE_INFORMATION с эталонными значениями. В итоге все исполнение свелось к очередной дешифровке, в результате чего адресное пространство исходного процесса стало содержать полностью новый PE’шник. Для получения корректного дампа я пользовался PETools и связкой LordPE + ImpRec 1.6 (PETools сама сразу же подправляет дамп, но второй вариант более гибкий в использовании).

Итак, передо мной оказался оригинальный бот Zeus, который, по-видимому, и распространяют разработчики. Все остальное, что описывалось до этого – просто оболочка, которая позволяет эффективно распространять целевой продукт. Оказалось, что сам Zeus написан на C и скомпилирован при помощи Студии, файл обладает релоками, ИАТ’ом, импортами. В целом, вся структура довольно стандартна, осталось разобрать сам функционал. Для этого я использовал виртуальную машину VMWare совместно с отладчиком IDA. На виртуальной системе присутствовали такие программы для мониторинга, как FileMon, RegMon, Process Explorer и дамперы PETools и LordPE. Как я упоминал ранее, в дополнение к IDA был заюзан декомпилятор Hex-Rays, который преобразует ASM-код в C-код. Он значительно помог мне при разборе. К примеру, практически по точке входа начинается разбор командной строки.

Таким образом выяснилось, что Zbot проверяет четыре ключа: «-f», «-i», «-n», «-v». Оказалось, что ключ «-I» скорее всего расшифровывается как «Information», поскольку его использование заставляет программу показывать сведения о сборке бота в MessageBox’е. Ключ «-n» отключает удаление оригинального файла (по умолчанию Zeus копирует себя в Application Data к текущему пользователю и удаляет себя). А ключ «-v» переводит приложение в режим ожидания и ждет определенного сообщения с помощью GetMessageW. В общем, выяснилось, что эти ключи предназначены скорее для разработчика или для распространителя, нежели для использования их на зараженной тачке.

Несмотря на то, что рассматриваемый файл уже ничем не упакован, он содержит несколько закриптованных участков исполняемого кода и зашифрованные строки. Напрягает тот факт, что Зевс во время работы копирует такие строчки в стек и уже там их декриптует. Следовательно, нельзя просто снять дамп и наслаждаться содержимым, а нужно под отладчиком отслеживать работу с определенными фрагментами памяти.

Далее было выяснено, что Zeus создает батник, который удаляет оригинальный файл; содержимое батника примерно следующее (получено на виртуальной машине):

@echo off
:d
del "c:\zbot.exe"
if exist "c:\zbot.exe" goto d
del /F "C:\DOCUME~1\antonie\LOCALS~1\Temp\tmp8c7f7853.bat"

Конечно, основное назначение бота – подключаться к командному центру и получать оттуда команды, чтобы в дальнейшем делать то, что сказано, но я об этом расскажу в последнюю очередь. Для начала упомяну о нескольких интересных вещах, обнаруженных в процессе анализа строк.

Zeus использует такие функции из библиотеки cabinet.dll, как FCICreate, FCIAddFile, FCIFlushCabinet и др. Они позволяют работать с cab-архивами, через которые можно передавать плагины и конфигурационные файлы для бота. Другая сторонняя либа – nspr4.dll – представляет собой «The Netscape Portable Runtime (NSPR)», позволяющий «allows compliant applications to use system facilities such as threads, thread synchronization, I/O, interval timing, atomic operations, and several other low-level services in a platform-independent manner». Наш бот использует для обращения со своим сервером соответствующие функции из NSPR: PR_OpenTCPSocket, PR_Close, PR_Read, PR_Write и прочие. Для слежения за действиями пользователя Zeus непрерывно ищет окна с классами #32768, ConsoleWindowClass, CiceroUIWndFrame, MDIClient, SysListView32. Чтобы узнать язык ввода, производится обращение к языковой панели, которая отображается в нижнем правом углу и показывает раскладку клавиатуры через класс CiceroUIWndFrame. Для проверки названий классов я использовал улититку Spy++ из набора Microsoft Visual Studio.

Теперь можно рассказать и о самом основном – работе бота с командным центром. Практически сразу после запуска Zeus пытается подключиться к серверу ****case.cc, который был закрыт уже во время разбора сэмпла. Тем не менее, поискав в интернете инфу по этому домену, мне удалось получить достаточно много ценных данных. Сам домен располагается в Китае и часто меняет IP-адреса. А на сайте clean-mx.de удалось обнаружить статистику обращений по данному адресу.

Как видно из таблицы, Zeus скачивает как конфигурационные файлы, так и других зловредов (это оказались более свежие конфиги того же Зевса, отличающиеся устройством антиэмуляции и произвольным мусором. Тем не менее, большим процентом антивирусов они не детектировались).

К сожалению, живые конфиги найти не удалось, поэтому нельзя сказать точно, для кражи чего использовались Zeus’ы, подключающиеся к этому СС.

 

Заключение

На этом разбор нового Zeus’а закончен. Оказалось, что под очень мощной защитой, которая довольно качественно устроена и сильно усложняет работу как исследователям, так и антивирусам, скрывается довольно стандартный бэкдор. Он подключается к серверу и ждет от него команд, при этом обладая возможностями, которые позволяют тщательно следить за пользовательской машиной и его личными данными. Высокая распространенность данного бота обусловлена, прежде всего, отличной технической поддержкой разработчиков, регулярно обновляющих свое детище. Не стоит забывать и о том, что распространение, как правило, организуется через «партнерки» и позволяет разработчикам не думать о том, как продукт попадет к пользователям. О том, что Zeus – не одиночный зловред, говорит и техническая инфа о сборке, которая выводится ключом «-i».

Оставить мнение

Check Also

Windows 10 против шифровальщиков. Как устроена защита в обновленной Windows 10

Этой осенью Windows 10 обновилась до версии 1709 с кодовым названием Fall Creators Update …