Содержание статьи
Когда ты независимый аналитик или сотрудник небольшой компании, то возникает проблема содержания базы различных вредоносных семплов в порядке. Кто-то использует для этого собственный приватный или локальный сервер с каким-нибудь 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
~ $ 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
Все описанные шаги без проблем воспроизводятся в рамках OS X. Лично я для этого использовал macports. Единственная ошибка, с которой я столкнулся, была в невозможности отобразить цвета консоли (пример ошибки представлен на скриншоте), вместо этого выводился набор лишних символов. Эта проблема решилась установкой пакета:
$ sudo easy_install readline
В начале я пробовал его установить через pip, но, увы, процесс завершился с ошибкой.
На Windows сам фреймворк тоже можно поставить, только без использования сторонних программ, которые собираются из исходников, или воспользоваться эмулятором *nix-среды — cygwin.
В комплекте к фреймворку также идет скрипт для его обновления:
$ ./update.py
На выходе ты получишь статус: обновился или нет тот или иной файл. До выхода версии 1.1 я столкнулся с проблемой, что скрипт не мог удалить какой-то файл во время процесса обновления. Ошибка оказалась в том, что до изменения этот файл был папкой с файлами. В таком случае поможет или ручное удаление, или клонирование фреймворка в другое место с переносом базы.
Android-вирусы
Начнем изучение функционала фреймворка на примере Android-вирусов. Для этого мы и устанавливали androguard (без него команда apk
просто не будет работать). Загрузим первый семпл в фреймворк:
viper > open -f ~/samples/malware.apk
И первая команда, которая будет использоваться для любых файлов, — info
.
viper malware.apk > info
Теперь мы точно знаем, что это Java-архив и, возможно, Android, поэтому выведем общую информацию о файле через аргумент -i
, используя установленный ранее androguard
:
viper malware.apk > apk -i
Здесь мы узнаем о названии приложения и его компонентах: 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-файлы.
Также все указанные выше операции можно вывести сразу:
viper malware.apk > apk -a
Для примера я вывел информацию о другом Android-вирусе, популярном Dendroid. Здесь все как по учебнику, приложение хочет читать и отправлять SMS, звонить, доступ к микрофону и прочее.
Но вернемся к нашему первому трояну. Этот семпл я часто даю в качестве примера тем, кто только начинает анализировать вредоносные программы для ОС 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
Вспомним странные файлы «изображения» и попробуем найти по их имени что-нибудь интересное. Был найден код, в котором изменялось расширение 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
Как видишь, это одна из разновидностей эксплойтов, которую просто как анализировать, так и создавать. Внутрь архива мы можем вставить, используя стандартные средства, любой 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
Теперь вытащим все объекты из документа, в том числе и SWF-файл:
viper document.doc > office -e /tmp/documentdoc
Теперь все объекты находятся внутри раздела с названием 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
Вывод секций файла:
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 семплов скомпилированы в одно и то же время до секунды, что наводит на мысль об использовании одного и того же криптора. В подтверждение к этому мы также видим, что схоже не только время, но и ресурсы приложения.
Также ты можешь найти свежий материал для исследования, воспользовавшись различными трекерами вредоносных (как изначально, так и вследствие взлома) сайтов. К примеру:
Фреймворк позволяет загружать файлы и работать с ними не только локально, но и по 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
Если не уверен в типе файла, то его можно посмотреть в разделе 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
Следующая полезная команда — fuzzy
. Позволяет сравнить открытый файл с другими семплами в проекте и найти похожие. По умолчанию выводит те, у кого схожесть выше 50%. Но если задать параметр -v
, то он выведет процент схожести для каждого файла. Пример работы представлен на скриншоте.
Далее можно проверить все добавленные семплы с помощью YARA (если в данный момент не открыт какой-либо файл), и при желании она автоматически добавит теги к семплам:
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 и так далее), найденными на просторах интернета.
Ну а пока что на этом все, остается лишь пожелать тебе удачи в исследовании серпентария темной стороны.