Когда ты независимый аналитик или сотрудник небольшой компании, то возникает проблема содержания базы различных вредоносных семплов в порядке. Кто-то использует для этого собственный приватный или локальный сервер с каким-нибудь Wiki-движком или самописной оберткой для базы данных. Но когда у тебя большое количество вроде бы однотипных семплов, то иногда хочется сделать небольшую заметку на будущее при поверхностном анализе для интересных файлов, а автоматический анализ, увы, не всегда справляется.

 

Intro

Сегодня речь пойдет о Viper. Под таким коротким названием скрывается модульный фреймворк для организации бинарных файлов и их анализа. Viper ориентирован на вирусных аналитиков и эксплойт-разработчиков, но он также пригодится и для обычных реверсеров из-за интересных модулей, база которых постоянно пополняется. К тому же немаловажным плюсом является то, что он написан на Python, и это позволяет модифицировать его под себя на лету.

 

Установка

Рассматривать установку мы будем на примере Debian-подобной системы. Для начала установим зависимости и сторонние программы, которые нам пригодятся для комфортной работы.

Так как фреймворк написан на Python, то нам потребуется для начала установить менеджер пакетов/библиотек — pip (на OS X я дополнительно использовал easy_install, о причине напишу в конце раздела):

sudo apt-get install gcc python-dev python-pip

После этого устанавливаем библиотеки для основного функционала:

sudo pip install SQLAlchemy PrettyTable python-magic

Далее соберем первую программу из исходников — ssdeep. Скачиваем последнюю версию с официального сайта проекта:

~ $ tar -zxvf ssdeep-X.XX.tar.gz
~ $ cd ssdeep-X.XX
~ $ ./configure && make
~ $ sudo make install
~ $ sudo pip install pydeep

После этого уже можно переходить к установке самого фреймворка, но для полноты возможностей нужно установить две программы: YARA и androguard. Об этих утилитах мы уже писали, но повторюсь на всякий случай. Так же скачиваем последние версии с их официальных сайтов и собираем.

YARA:

~ $ tar zxf v3.0.0.tar.gz
~ $ cd yara-3.0.0/
~ $ bash build.sh
~ $ sudo make install
~ $ cd yara-python/
~ $ sudo python setup.py install

Androguard:

~ $ tar zxf androguard-1.9.tar.gz
~ $ cd androguard-1.9/
~ $ sudo python setup.py install

Теперь наконец-то можно скачать исходники и самого фреймворка. Можно взять архив с самого сайта, но там до сих пор указана версия 1.0 без многих интересных возможностей, поэтому будем использовать dev-версию:

git clone https://github.com/botherder/viper.git

И теперь уже устанавливаем собственно сам фреймворк:

$ cd viper
$ sudo pip install -r requirements.txt
Первый запуск фреймворка Viper
Первый запуск фреймворка Viper

Все описанные шаги без проблем воспроизводятся в рамках OS X. Лично я для этого использовал macports. Единственная ошибка, с которой я столкнулся, была в невозможности отобразить цвета консоли (пример ошибки представлен на скриншоте), вместо этого выводился набор лишних символов. Эта проблема решилась установкой пакета:

$ sudo easy_install readline

В начале я пробовал его установить через pip, но, увы, процесс завершился с ошибкой.

Пример ошибки с цветами в OS X
Пример ошибки с цветами в OS X
Пример окна в OS X после решения проблемы
Пример окна в OS X после решения проблемы

На Windows сам фреймворк тоже можно поставить, только без использования сторонних программ, которые собираются из исходников, или воспользоваться эмулятором *nix-среды — cygwin.

В комплекте к фреймворку также идет скрипт для его обновления:

$ ./update.py

На выходе ты получишь статус: обновился или нет тот или иной файл. До выхода версии 1.1 я столкнулся с проблемой, что скрипт не мог удалить какой-то файл во время процесса обновления. Ошибка оказалась в том, что до изменения этот файл был папкой с файлами. В таком случае поможет или ручное удаление, или клонирование фреймворка в другое место с переносом базы.

viper_update

 

Android-вирусы

Начнем изучение функционала фреймворка на примере Android-вирусов. Для этого мы и устанавливали androguard (без него команда apk просто не будет работать). Загрузим первый семпл в фреймворк:

viper > open -f ~/samples/malware.apk

И первая команда, которая будет использоваться для любых файлов, — info.

viper malware.apk > info

Вывод информации о файле
Вывод информации о файле

Теперь мы точно знаем, что это Java-архив и, возможно, Android, поэтому выведем общую информацию о файле через аргумент -i, используя установленный ранее androguard:

viper malware.apk > apk -i

Компоненты Android-приложения
Компоненты Android-приложения

Здесь мы узнаем о названии приложения и его компонентах: Activity, Receivers, Broadcasts. Это в основном пригодится после декомпиляции.

Далее мы можем узнать о требуемых правах доступа:

viper malware.apk > apk -p

Первым делом ищем различные READ_SMS, RECORD_AUDIO или просто странные права доступа. В моем случае приложение требует не просто чтение внешней карты памяти, а ее монтирование android.permission.MOUNT_UNMOUNT_FILESYSTEMS.

И вывести содержимое APK-архива с указанием типа файла:

viper malware.apk > apk -f

Такая возможность может помочь найти ложные файлы, как в моем случае, под изображениями прячутся sh-скрипты и ELF-файлы.

Список и тип файлов из Android-приложения
Список и тип файлов из Android-приложения

Также все указанные выше операции можно вывести сразу:

viper malware.apk > apk -a

Для примера я вывел информацию о другом Android-вирусе, популярном Dendroid. Здесь все как по учебнику, приложение хочет читать и отправлять SMS, звонить, доступ к микрофону и прочее.

Вывод информации о вирусе Dendroid
Вывод информации о вирусе Dendroid

Но вернемся к нашему первому трояну. Этот семпл я часто даю в качестве примера тем, кто только начинает анализировать вредоносные программы для ОС Android. Здесь мы видим, что приложение не требует доступа к SMS или звонкам, что обычно и смущает немного продвинутого пользователя.

И последняя, самая нужная функция — декомпиляция приложения:

viper malware.apk > apk -d /tmp/decompiled_apk
[*] Processing the APK, this may take a moment...
[*] Decompiling Code
[*] Decompiled code saved to /tmp/decompiled_apk

Еще одна особенность — мы можем запускать терминальные команды прямо из фреймворка, используя символ !. Откроем наш декомпилированный код:

viper malware.apk > ! gedit /tmp/decompiled_apk

Декомпилированный код Android-вируса
Декомпилированный код Android-вируса

Вспомним странные файлы «изображения» и попробуем найти по их имени что-нибудь интересное. Был найден код, в котором изменялось расширение png на sh, выставлялись права на выполнение и запускались через командную строку:

...
v0 = new StringBuilder("chmod 775 ").append(this.getFilesDir()).append("/gbfm.sh ").append(this.getFilesDir()).append("/install.sh ").append(this.getFilesDir()).append("/installsoft.sh ").append(this.getFilesDir()).append("/runme.sh ").toString();
android.util.Log.i("GameService", v0);
Runtime.getRuntime().exec(v0);
...

После поверхностного анализа были найдены строчки в одном из бинарных файлов (gbfm.sh):

...
[**] Gingerbreak/Honeybomb -- android 2.[2,3], 3.0 softbreak
[**] (C) 2010-2011 The Android Exploid Crew. All rights reserved.
...

Это указало на то, что создатели использовали исходники эксплойта Gingerbreak, которые автор выкладывал для получения прав администратора на Android-телефоне. И надо отдать вирмейкерам должное — они изменили некоторые строчки, но не стали удалять копирайты :).

Помимо Android-программ, заодно немного затронем модуль для анализа Java-файлов jar. У него не так много функций: список файлов внутри JAR-архива, возможность вытянуть его содержимое и информация из файла manifest. Сделаем дамп одного из Java-эксплойтов:

viper out.jar > jar -d /tmp/jar

viper_jar
Дамп вредоносного JAR-архива

Как видишь, это одна из разновидностей эксплойтов, которую просто как анализировать, так и создавать. Внутрь архива мы можем вставить, используя стандартные средства, любой exe-файл и без манипуляций с Java.

 

Вредоносные документы

Перед тем как перейти к модулям, ответственным за работу с офисными документами, разберем несколько общих модулей.

Для начала возьмем команду shellcode. Она ищет по своей базе шаблоны шелл-кодов и выводит смещения, по которым они могут быть найдены.

viper malware.docx > shellcode

Помимо поиска шелл-кодов внутри файла, тебе может потребоваться поиск XOR-ключей. Хоть и XOR-шифрование считается довольно слабым, его все равно продолжают использовать. Поэтому был добавлен модуль, который брутит файл с помощью XOR-метода и ищет определенные строки. По умолчанию взяты самые распространенные:

  • This Program
  • GetSystemDirectory
  • CreateFile
  • IsBadReadPtr
  • IsBadWritePtrGetProcAddress
  • LoadLibrary
  • WinExec
  • CreateFileShellExecute
  • CloseHandle
  • UrlDownloadToFile
  • GetTempPath
  • ReadFile
  • WriteFile
  • SetFilePointer
  • GetProcAddr
  • VirtualAlloc
  • http

Также можешь задать и сам вручную через аргумент -s:

viper malware > xor -s www

Начнем с офисных документов формата doc/docx. Для работы с такими файлами создан модуль office.

viper > open -f ~/Downloads/document.doc

Для начала узнаем метаданные файла (шаблон, время создания и прочее):

viper.py document.doc > office -m

Метаданные офисного документа
Метаданные офисного документа

Часть из этих данных мы можем узнать также через команду info.

Теперь узнаем, что за OLE-объекты присутствуют в файле:

viper document.doc > office -o
[*] OLE Info:
+---------------------+--------+
| Test | Result |
+---------------------+--------+
| Summary Information | True |
| Word | True |
| Excel | False |
| PowerPoint | False |
| Visio | False |
| Encrypted | False |
| Macros | False |
| Flash Objects | 1 |
+---------------------+--------+

Вот и первая странность — SWF-ролик внутри документа. И если честно, я еще не встречал «хорошего» Word-документа с видео внутри. Также ты можешь увидеть OLE-структуры doc-файла:

viper document.doc > office -s

viper_office_s

Теперь вытащим все объекты из документа, в том числе и SWF-файл:

viper document.doc > office -e /tmp/documentdoc

Дамп файлов из Word-документа
Дамп файлов из Word-документа

Теперь все объекты находятся внутри раздела с названием documentdoc. Для нас интерес представляют:

  • Saved Decompressed Flash File to /tmp/documentdoc/ObjectPool-_1382429393-Contents-FLASH-Decompressed1
  • Saved Flash File to /tmp/documentdoc/ObjectPool-_1382429393-Contents-FLASH-1

Как видишь, офисный модуль автоматически разархивировал SWF-файл, но мы все равно воспользуемся встроенным модулем swf, чтобы рассмотреть и его работу. Правда, пока что весь его функционал заключается в распаковке Flash-ролика и автоматическом открытии в фреймворке с выводом дампа в шестнадцатеричном виде на экран:

viper document.doc > open -f /tmp/documentdoc/ObjectPool-_1382429393-Contents-FLASH-1
viper ObjectPool-_1382429393-Contents-FLASH-1 > swf decompress
...
[*] Flash object dumped at /tmp/ce79b287214d513ff1b1030be96cda90.swf
[*] Session opened on /tmp/ce79b287214d513ff1b1030be96cda90.swf
viper ce79b287214d513ff1b1030be96cda90.swf >

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

viper ce79b287214d513ff1b1030be96cda90.swf > strings -H
- bit.ly
- flash.net
- flash.events
- adobe.com

Если последние три — системные домены, то первая — это ссылка на сервис по сокращению URL-адресов, которая ведет на загрузку и запуск exe-файла. Саму же ссылку можно увидеть в hex-дампе или при выводе всех строчек из файла:

viper ce79b287214d513ff1b1030be96cda90.swf > strings -a

По аналогии с офисными документами в фреймворке есть возможность работать с файлами в формате PDF. Информация о файле:

viper.py document.pdf > pdf id

Объекты в PDF-документе:

viper.py document.pdf > pdf streams

Которые можно сдампить и при желании сразу открыть внутри фреймворка:

viper.py document.pdf > pdf streams -o 1

Как видишь, эти модули довольно просты и при анализе эксплойтов таких форматов требуют дополнительные программы. Например, утилита от Adobe для анализа SWF-файлов SWF Investigator или комплект SWFTools. Но при желании и наличии времени все это можно добавить в виде модулей, что облегчит и увеличит скорость анализа.

 

Анализ PE-файлов

Ну и наконец-то рассмотрим функционал для анализа вредоносных программ для ОС Windows. Для этого мы будем использовать модуль pe. В качестве подопытного я нашел семпл DarkComet. Первое, что нам пригодится, — это экспортные и импортные функции:

viper rat.exe > pe exports
viper rat.exe > pe imports
Вывод полезной информации из семпла DarkComet
Вывод полезной информации из семпла DarkComet

Вывод секций файла:

viper rat.exe > pe sections
[*] PE Sections:
+--------+---------+-------------+-------------+----------------+
| Name | RVA | VirtualSize | RawDataSize | Entropy |
+--------+---------+-------------+-------------+----------------+
| .text | 0x1000 | 0x8ae24 | 569344 | 6.54885313411 |
| .itext | 0x8c000 | 0x19d4 | 6656 | 5.97676038071 |
| .data | 0x8e000 | 0x3878 | 14848 | 4.73261717247 |
| .bss | 0x92000 | 0x74b0 | 0 | 0.0 |
| .idata | 0x9a000 | 0x4084 | 16896 | 5.19010406822 |
| .tls | 0x9f000 | 0x38 | 0 | 0.0 |
| .rdata | 0xa0000 | 0x18 | 512 | 0.195869406087 |
| .reloc | 0xa1000 | 0x88f4 | 35328 | 6.73169432225 |
| .rsrc | 0xaa000 | 0x1ca04 | 117760 | 4.99518655683 |
+--------+---------+-------------+-------------+----------------+

Язык, на котором, возможно, написана программа, и время ее компиляции:

viper rat.exe > pe language
[*] Probable language: Delphi
viper rat.exe > pe compiletime
[*] Compile Time: 2012-01-15 20:49:40

Троян типа Rat я взял неслучайно. Автором и одним из контрибьюторов кода выложено большое количество готовых модулей для вытаскивания полезной информации из вирусов такого типа. Для этого используется модуль с одноименным названием rat, и на данный момент, как видишь, уже поддерживается порядка 20 типов троянов.

viper rat.exe > rat -l
[*] List of available RAT modules:
- modules/rats/darkcomet.py
- modules/rats/blackshades.py
- modules/rats/bluebanana.py
- modules/rats/darkrat.py
- modules/rats/xtreme.py
- modules/rats/cybergate.py
- modules/rats/pandora.py
- modules/rats/smallnet.py
- modules/rats/clientmesh.py
- modules/rats/greame.py
- modules/rats/albertino.py
- modules/rats/unrecom.py
- modules/rats/bozok.py
- modules/rats/adwind.py
- modules/rats/luxnet.py
- modules/rats/arcom.py
- modules/rats/poisonivy.py
- modules/rats/lostdoor.py
- modules/rats/xrat.py
- modules/rats/punisher.py
- modules/rats/blacknix.py

Из них мы можем сразу вытянуть адрес управляющего сервера и, возможно, данные к FTP-серверу:

viper rat.exe > rat -a
[*] Automatically detected supported RAT DarkComet
[*] Configuration:
...
| GENCODE | -smcAx/.rVLD |
| MUTEX | DC_MUTEX-V918LXH |
| NETDATA | darkrat.ddns.net:1604 |
...

Помимо модуля, еще используются готовые правила для программы YARA, но ориентированные не только на RAT:

viper rat.exe > yara scan

YARA-правила при желании можно редактировать прямо из фреймворка. Достаточно вывести список текущих и выбрать номер желаемого. По умолчанию все редактирования ведутся из редактора nano:

viper rat.exe > yara rules
viper rat.exe > yara rules --edit 1

Немного ниже я распишу подробнее работу с большим количеством семплов, а пока что рассмотрим некоторый массовый функционал модуля pe. Для примера я взял набор семплов по трояну SpyEye. У большинства команд для модуля pe есть возможность сравнить текущий открытый файл с другими, используя аргумент --scan. Я приведу некоторые из них:

viper malware.exe > pe language --scan
viper malware.exe > pe resources --scan
viper malware.exe > pe compiletime --scan

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

viper_pe_compare

Также ты можешь найти свежий материал для исследования, воспользовавшись различными трекерами вредоносных (как изначально, так и вследствие взлома) сайтов. К примеру:

Фреймворк позволяет загружать файлы и работать с ними не только локально, но и по URL-адресу:

viper > open -u http://site.com/malware.exe -t

Аргумент -t позволяет скачать файл не напрямую, а через Tor (зачем лишний раз палить IP-адрес аналитиков?). Для этого нужно поставить сам Tor и Python-библиотеку для него:

sudo apt-get python-socksipy privoxy tor

Файл загружается во временную папку /tmp и со случайным именем, которое будет указано после в командной строке viper. После манипуляций с семплом или сразу после загрузки можно сохранить файл на диск с помощью команды store (она также автоматически добавит его в текущий проект, о котором мы поговорим позже):

viper tmprvGrYl > store

По умолчанию они сохраняются в раздел binaries фреймворка.

Сохранение загруженного файла на диск
Сохранение загруженного файла на диск
 

Массовый анализ

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

Новые проекты создаются через аргумент -p или --project name_project при запуске фреймворка. Если проект с таким именем есть в базе, то он будет загружен, если нет, то будет создан.

После запуска фреймворка ты можешь вывести список всех проектов и изменить на нужный в данный момент:

viper > projects -l
viper > projects -s project_name

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

Управление проектами внутри фреймворка
Управление проектами внутри фреймворка

Возможно, все твои подопытные хранились в одном месте, например в разделе «Загрузки», или был получен архив с большим количеством различных семплов. В этом случае ты можешь создать отдельный проект и загрузить как все файлы из папки, так и соответствующие какому-то критерию:

  • --file-size (-s) — по размеру (возможный максимум);
  • --file-type (-y) — по типу файла;
  • --file-name (-n) — по шаблону имен;
  • --tags (-t) — по тегам.

Разберем на примере самого нужного критерия при большом количестве семплов — типа файла. Для этого воспользуемся уже упомянутой командой store, но с другими аргументами. Загрузка всех файлов:

viper > store --folder /home/dukebarman/samples

Загрузка exe-файлов:

viper > store --folder /home/dukebarman/samples --file-type PE32

Загрузка Java-файлов:

viper > store --folder /home/dukebarman/samples --file-type Java

viper_store_all

Если не уверен в типе файла, то его можно посмотреть в разделе Type, если откроешь нужный файл и введешь команду info.

Помимо этого, поддерживается команда find. После загрузки всех файлов в проект ты можешь осуществить поиск по нужным параметрам: all, latest, name, type, mime, md5, sha256, tag и note. К примеру, найдем все APK-файлы:

viper > find name *.apk

Или просто выведем все семплы из текущего проекта:

viper > find all

После чего мы можем открыть нужный файл через его номер. Например, под номером 3:

viper > open -l 3

Поиск Android-приложений в базе с помощью команды find
Поиск Android-приложений в базе с помощью команды find

Следующая полезная команда — fuzzy. Позволяет сравнить открытый файл с другими семплами в проекте и найти похожие. По умолчанию выводит те, у кого схожесть выше 50%. Но если задать параметр -v, то он выведет процент схожести для каждого файла. Пример работы представлен на скриншоте.

Далее можно проверить все добавленные семплы с помощью YARA (если в данный момент не открыт какой-либо файл), и при желании она автоматически добавит теги к семплам:

viper project > yara scan --tag

Проверка всех семплов проекта с помощью YARA
Проверка всех семплов проекта с помощью YARA

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

viper > sessions --list
viper > sessions --switch 1

Команда close используется для завершения работы с текущей сессией, но не с самим фреймворком.

 

Outro

Несколько возможностей мы с тобой не успели рассмотреть, поэтому распишу вкратце:

  • работа с песочницами (см. врезку);
  • clamav — сканирование файла с помощью локального антивируса clamav;
  • exif — метаданные;
  • idx — парсинг Java *.idx файлов;
  • html, email — импорт вредоносных файлов из тела письма или HTML-страницы.

После прочтения у тебя наверняка возникли идеи, что можно добавить или изменить в этом фреймворке. Поэтому приглашаю задавать свои вопросы на канале ###viper IRC-сервера irc.freenode.net. Также ты можешь их написать или сообщить об ошибке в раздел issues GitHub-репозитория. Лично я в данный момент использую этот фреймворк для приведения в порядок своей базы с различным вредоносными эксплойтами (SWF, docx, Java и так далее), найденными на просторах интернета.

Ну а пока что на этом все, остается лишь пожелать тебе удачи в исследовании серпентария темной стороны.

Борис dukeBarman Рютин

Известный реверсер, докладчик на множестве конференций, постоянный автор «Хакера» и большой фанат вселенных Blizzard :) В данный момент работает аналитиком в компании "Digital Security" (@DSecRU) и ведёт блог http://dukebarman.pro.

Теги:

2 комментария

  1. 02.02.2015 at 11:17

    Как ни смотрел, на картинке с импортируемыми функциями этих функций так и не увидел. 🙂

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

Check Also

Целенаправленная социальная инженерия. Нестандартные техники введения в заблуждение

В предыдущей статье мы разобрали массовые атаки. Но их применимость ограничена: пентестер …