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

Intro

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

Установка

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

Так как фреймворк написан на Python, то нам потребуется для начала установить менеджер пакетов/библиотек - pip (на Mac 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

После этого уже можно переходить к установке самого фреймворка, но для полноты возможностей нужно установить 2 программы: 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

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

$ sudo easy_install readline

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

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

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

$ ./update.py

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

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

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

viper malware.apk > info
viper malware.apk > apk -i

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

viper malware.apk > apk -p

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

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

viper malware.apk > apk -f

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

viper malware.apk > apk -a

Для примера я вывел информацию о другом android-вирусе, популярном Dendroid. Здесь всё как по учебнику, приложение хочет читать и отправлять 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
...
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

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

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

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

viper malware.docx > shellcode
  • 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

Теперь узнаем, что за 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 document.doc > office -e /tmp/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

Если последние 3 системные домены, то первая - это ссылка на сервис по сокращению 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

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

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

viper rat.exe > pe exports
viper rat.exe > pe imports
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

На скриншоте я привёл полный вывод информации из этих команд.

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

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

Фреймворк позволяет загружать файлы и работать с ними не только локально, но и по 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

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

viper > find name *.apk

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

viper > find all

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

viper > open -l 3
viper project > yara scan --tag
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 и т.д.) найденными на просторах Интернета.

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

На момент публикации в блоге Viper получил несколько новых модулей, в том числе gui в виде собственного web-сервера.

Hints

Запуск дизассемблера

Один из модулей позволяет запустить IDA Pro с тем сэмплом, который мы анализируем в этот момент, но так как не у всех IDA устанавливается через установщик или просто пути к ней сбились, то пропишите путь к ней в ручную в этом модуле. Для этого откроем файл modules/ida.py и изменим пару:

'linux2': 'idaq'

Например на:

'linux2': '/home/dukebarman/SOFT/idademo66/idaq'

Помимо модуля для запуска IDA, еще имеется скрипт для запуска фреймворка radare2, о котором я писали ранее (см. номер 188 ][). Запускается довольно просто:

viper > r2

Можно запустить и с GUI в виде web-сервера:

viper > r2 -w

При чём тут змеи?

Не удивляйся такому названию нашей статьи, Viper в переводе означает змея или гадюка, что отразилось на логотипе фреймворка. Так же это название является именем змееподобного и ядовитого героя в популярной игре от компании Valve, что наверняка понравится людям знакомой с ней.

Заметки

Фреймворк поддерживает возможность указания заметок и тэгов к файлам. По поводу заметок приведён хороший пример в документации проекта. Создать заметку с названием Domains и указывать в файлах url-адреса к которым обращается сэмпл:

viper malware.exe > notes --add
Enter a title for the new note: Domains
viper malware.exe > notes --view 1
[*] Title: Domains
[*] Body:
- panel.site.com
- config.site.com

Ну и конечно указание различных тэгов к файлам, которые можно потом увидеть в информации о файле и использовать при поиске:

viper a97dee5538d508990ae2e5c2d920d280 > tags --add Dendroid, apk

Песочницы

Мы не рассмотрели с тобой взаимодействие с различными песочницами. В частности у фреймворка есть возможность отправлять сэмпл напрямую в запущенную как локально, так и удаленно песочницу cuckoo (о ней и её установке мы уже писали ранее в журнале, помимо наших статей есть свежая статья на habrahabr.ru) через одноименную команду cuckoo указав хост и порт, на котором она запущена.

Помимо использования своей песочницы, ты так же можешь проверить наличие отчётов о проверке текущего сэмпла в нескольких онлайн-песочницах:

Ну и конечно есть возможность проверить наличие хэша сэмпла в базе Virustotal:

viper > virustotal

И при желании загрузить его напрямую (через некоторое время снова проверь командой выше):

viper > virustotal --submit

Написание своего модуля

Пример простейшего модуля для фреймворка:

from viper.common.abstracts import Module
from viper.core.session import __sessions__

class MyModule(Module):
    cmd = 'mycmd' # команда, которую ты вводишь в фреймворке
    description = 'Описание модуля'

    def run(self):
        # Проверка на открытую сессию.
        if not __sessions__.is_set():
            # Нет открытой сессии.
            return

        # Вывод атрибутов открытого файла.
        print("MD5: " + __sessions__.current.file.md5)

        # Манипуляции с файлом
        do_something(__sessions__.current.file.path)

Помимо модулей ты можешь обращаться к запущенному файлу с помощью любой системной команды и переменной $self. Например:

viper word_object.bin > ! hexdump $self

Более подробно ты можешь прочитать в Документации по фреймворку

Ссылки