13 минут
Змеиный укус. Python-фреймворк Viper для анализа малвари
Когда ты независимый аналитик или сотрудник небольшой компании, то возникает проблема содержания базы различных вредоносных сэмплов в порядке. Кто-то использует для этого собственный приватный или локальный сервер с каким-нибудь 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
~ $ 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
Все описанные выше шаги без проблем воспроизводятся в рамках Mac OS X. Лично я для этого использовал macports. Единственная ошибка с которой я столкнулся была в не возможности отобразить цвета консоли (пример ошибки представлен на скриншоте), вместо этого выводился набор лишних символов. Эта проблема решилось установкой пакета:
$ sudo easy_install readline
В начале я пробовал его установить через pip, но увы процесс завершился с ошибкой.
В комплекте к фреймворку так же идёт скрипт для его обновления:
$ ./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 сэмплов скомпилированы в одно и тоже время до секунды, что наводит на мысль об использовании одного и того же криптора. В подтверждение к этому мы так же видим, что схоже не только время, но и ресурсы приложения.
- Malware Domain List
- Zeus Tracker
- И другие…
Фреймворк позволяет загружать файлы и работать с ними не только локально, но и по 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
- сканирование файла с помощью локального антивируса clamavexif
- метаданные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
Более подробно ты можешь прочитать в Документации по фреймворку