Содержание статьи
Первые шаги
Итак, представим для начала, что у нас на руках зараженная машина. Первым делом нужно выполнить три основных действия: изолировать компьютер от других в сети, сделать дамп памяти и снять образ диска.
При отключении зараженного компьютера от сети стоит помнить, что если мы имеем дело с вирусом-шифровальщиком, то есть шанс потерять пользовательские данные. Малварь может начать шифровать их, когда прервется соединение с сетью, поэтому первым делом оцени, насколько важны данные на зараженном ПК и стоит ли рисковать.
Лучше всего будет создать для карантина виртуальную сеть (VLAN) с выходом в интернет и переместить туда зараженные ПК. В крупной компании это потребует слаженных действий сотрудников службы кибербезопасности и сетевых администраторов, в мелкой — разноплановых навыков единственного сисадмина.
Дальше необходимо снять дамп памяти. Делается это с самого начала, потому что при копировании жесткого диска потребуется выключить компьютер и содержимое оперативной памяти будет потеряно. Программу, снимающую дамп, лучше всего запускать с внешнего носителя, чтобы не оставлять лишних следов на жестком диске — данные с него понадобятся нам в неизмененном виде.
Чтобы малварь не успела среагировать на выключение системы, проще всего выдернуть кабель питания. Метод, конечно, варварский, зато гарантирует моментальное отключение. Сохранить данные на жестком диске нетронутыми для нас важнее, чем беспокоиться об исправности других компонентов.
Дальше запустим ПК, используя загрузочный носитель с любой операционной системой в режиме forensic и ПО для получения образа жесткого диска. Чаще всего используется образ диска в формате E01 (Encase Image File Format). Его поддерживает большое число приложений как для Windows, так и для Linux.
INFO
Режим forensic — это загрузка без монтирования физических дисков. Это позволяет исключить внесение любых изменений в исследуемый диск. Профессиональные криминалисты также используют устройства, позволяющие заблокировать любые попытки обращения к диску для записи.
Изучение дампов
Дампы памяти и диска, скорее всего, содержат всё, что нам необходимо, — тело вредоносной программы и оставленные ей следы. Можем приступать к поиску.
Я рекомендую начинать с изучения копии диска, а дамп памяти использовать, если на диске не удастся обнаружить никаких следов либо как дополнительный источник. При анализе содержимого диска в первую очередь обращаем внимание на автозагрузку, планировщик задач и начальный сектор загрузки диска.
WWW
На сайте Microsoft есть документация по автозагрузке сервисов и библиотек.
Чтобы понять, каким путем малварь проникла на компьютер, стоит исследовать время создания и изменения файлов на диске, историю браузера и почтовый архив пользователя. Если получится установить хотя бы примерное время заражения, то это будет плюсом. В интернете есть неплохие подборки путей в файловой системе и реестре, на которые стоит обращать внимание в первую очередь (вот, например, неплохая статья Group-IB об этом).
Из дампа памяти ты тоже можешь извлечь некоторую уникальную информацию, например какие были открыты документы и вкладки браузера в момент заражения, какие были активные сетевые подключения, рабочие процессы (в том числе скрытые).
Анализ файла
Когда у тебя на руках окажется файл, вызывающий подозрения, нужно будет как-то удостовериться, что это и есть экземпляр вредоносной программы. Конечно, если это известный вирус, то его можно выявить антивирусом (для проверки сразу всеми антивирусными движками есть сайт virustotal.com). Но все чаще попадаются уникальные случаи, не детектируемые антивирусными программами. Такие вредоносные программы имеют статус FUD (Fully UnDetectable).
Также нельзя исключать, что ты столкнулся с угрозой нулевого дня (0-day) — той, о которой еще никому не известно (и у разработчиков есть ноль дней на ее устранение — отсюда и название). Малварь, которая эксплуатирует зиродеи и имеет статус FUD, представляет серьезную угрозу не только для отдельных компьютеров, но и для целых компаний.
Перед началом анализа подозрительного файла необходимо сделать следующее.
- Подготовить стенд для исследования — виртуальную машину с установленной операционной системой, подходящей для запуска исследуемого файла.
- Настроить выход в интернет, желательно обеспечив скрытие своего реального IP-адреса, чтобы не потерять связь с серверами управления малвари (тебя могут распознать как вирусного аналитика и ограничить доступ, чтобы скрыть какие-то функции).
- Сделать снимок (snapshot) первичного состояния виртуальной машины.
INFO
Ни в коем случае не подключай стенд в корпоративную сеть — это может вызвать массовое заражение других компьютеров.
Существует два подхода к анализу ПО — динамический и статический. Как правило, для лучшего эффекта используют более подходящий для ситуации метод или оба метода одновременно. Например, может быть необходимо изучить поведение вредоносной программы, чтобы выявить характерные маркеры без анализа алгоритмов. Поэтому выбор методов и инструментов может меняться в ходе анализа.
Статический анализ
Начнем со статического анализа, поскольку он не требует запускать вредоносный код и точно не вызовет заражения на твоем компьютере.
Рассмотрим начальные заголовки исполняемого файла для Windows.
- DOS-заголовок файла, также известный как DOS-заглушка. Благодаря ему возможен запуск программы в DOS (обычно всего лишь выводится надпись This program cannot be run in DOS mode). Можно увидеть начало заголовка по характерным буквам
MZ
.
- Сразу же за первым идет используемый современными ОС заголовок со всеми необходимыми параметрами для исполняемого файла (например, смещение до таблицы импорта/экспорта, начало секции исполняемого кода). Начало заголовка можно найти по характерным буквам PE, а описание формата есть на сайте Microsoft.
Можно сказать, что заголовок исполняемого файла содержит справочник о том, где и что именно находится внутри самого файла, какие разрешения должны быть выданы секциям, все настройки для корректной работы, поэтому анализ заголовка может дать ценную первоначальную информацию.
Кроме этого, необходимо просмотреть, нет ли в файлах строковых данных. По ним можно впоследствии определять подобные файлы или даже получить важную информацию вроде адресов серверов управления.
Перед разработчиками малвари всегда стоит задача как можно сильнее маскировать свое творение и всячески усложнять обнаружение и анализ. Поэтому очень часто используются упаковщики для исполняемых файлов.
INFO
Упаковщики ― утилиты для сжатия и шифрования исполняемых файлов. Используются не только создателями малвари, но и разработчиками легитимного ПО для защиты от взлома своих программ. Самописные упаковщики, специально созданные для затруднения анализа, не всегда детектируются программами и потребуют от аналитика дополнительных действий, чтобы снять упаковку.
Более глубокий (и в то же время сложный) анализ любых исполняемых файлов ― это применение дизассемблеров. Ассемблерный код понятнее для человека, чем машинный, но из-за объемов разобраться в нем бывает далеко не так просто. В отдельных случаях возможно восстановить исходный код программ на языке высокого уровня путем декомпиляции — если удастся определить, какой использовался компилятор и алгоритм обфускации.
Словарь терминов
- Дизассемблеры ― программы для перевода машинного кода в относительно удобочитаемый и понятный язык ассемблера.
- Декомпиляция — восстановление исходного кода программы на изначальном языке программирования.
- Обфускация ― изменение исходного кода программы так, что его функциональность сохраняется, но сам он усложняется и в нем появляется ничего не добавляющий мусор.
- Обфускаторы ― программы для автоматизации обфускации.
- Псевдокод ― как правило, так называют неформальный язык описания алгоритмов, который позволяет представить исследуемый код на ассемблере в более читаемом виде. При переводе в псевдокод малозначимые элементы алгоритма отбрасываются.
Анализ кода на ассемблере ― трудоемкий процесс, который требует больших затрат времени и хороших навыков низкоуровневого программирования, поэтому для быстрого анализа можно преобразовать полученный код в псевдокод. Читать псевдокод более удобно, чем ассемблер, это можно увидеть по следующему примеру, где слева оригинальный код на ассемблере, а справа — псевдокод.
Динамический анализ
Чтение псевдокода или кода на ассемблере подобно распутыванию клубка ниток — кропотливо и трудоемко. Поэтому можно воспользоваться другим видом анализа — динамическим. Динамический анализ подразумевает запуск исполняемого файла и отслеживание выполняемых им действий, таких как обращение к веткам реестра, отправка и получение данных по сети, работа с файлами.
WARNING
Динамический анализ предполагает запуск исследуемого файла. Это необходимо делать на виртуальной машине, изолированной от других компьютеров, чтобы избежать возможности распространения вредоноса по сети.
Анализировать поведение программы можно, отслеживая и перехватывая запуск приложений на уровне ОС либо подключившись к работающему процессу и перехватывая вызовы библиотек и API. А чтобы детально разобрать процесс выполнения программы, лучше всего воспользоваться одним из отладчиков.
INFO
Отладчик ― утилита или набор утилит, который используется для тестирования и отладки целевого приложения. Отладчик может имитировать работу процессора, а не запускать программу на настоящем железе. Это дает более высокий уровень контроля над выполнением и позволяет останавливать программу при заданных условиях. Большинство отладчиков также способны запускать выполнение исследуемого кода в пошаговом режиме.
Неважно, используешь ты отладчик или какую-то программу, которая позволяет контролировать вызовы API, — работать придется в ручном режиме. А это значит, что потребуются углубленные знания операционной системы, зато ты получишь самые полные данные об объекте исследования.
Однако анализ можно и автоматизировать. Для этого используются так называемые песочницы (sandbox) — тестовые среды для запуска ПО.
Песочницы делятся на два типа: офлайновые и онлайновые. Для получения наиболее полной картины я рекомендую использовать сразу несколько источников данных и не исключать какой-то из типов песочниц. Чем больше информации ты соберешь, тем лучше.
Пример анализа
Поскольку анализ малвари всегда упирается в практические навыки, эта статья была бы неполной без демонстрации его на примере. Проведем экспресс-анализ и установим природу исполняемого файла.
Для начала определимся с последовательностью действий. Вот что нам нужно сделать:
- получить хеш-сумму с файла;
- воспользоваться онлайновым сервисом для проверки файла;
- собрать статические данные из файла;
- проверить файл в песочнице (локальной или в интернете);
- запустить файл в виртуальной среде для отслеживания выполняемых действий;
- снять оболочки и получить развернутый в памяти вредонос;
- проанализировать код в дизассемблере.
Допустим, нам необходимо исследовать неизвестный файл Sample.exe
.
Для хранения файла рекомендую первым делом изменить расширение, например на Sample._exe
, чтобы избежать случайного запуска.
Делаем снимок (snapshot) виртуальной машины, на которой и будем запускать исполняемый файл (изначальное состояние системы нам еще пригодится), и считаем хеш-сумму файла.
Скопируем результат и воспользуемся virustotal.com для проверки.
Как можно увидеть из скриншота выше, вердикт VT ― 54 из 70. С высокой долей вероятности это вредоносное ПО, но давай не будем на этом останавливаться и воспользуемся другим сервисом — Any.run.
Видим, что он выдает схожий результат (смотри в правом нижнем углу). Кроме того, можно собрать дополнительные данные о том, что делала программа. А именно:
- после старта продублировала себя в памяти;
- обратилась к серверу 208.91.199.224 по порту 587. На платформе можно посмотреть сетевой дамп взаимодействия с сервером управления малварью (их часто называют Command & Control, C2 или C&C);
- добавила запрет на запуск диспетчера задач;
- скопировала себя в отдельную пользовательскую директорию;
- добавила себя в автозагрузку.
Даже если бы вердикт не указал на возможную угрозу, отключение диспетчера задач и добавление в автозагрузку не сулит ничего хорошего для пользователя, особенно если учесть, что все это было сделано сразу же после запуска.
Итак, уже два сервиса подтвердили, что это малварь. Продолжаем. Воспользуемся инструментом под названием DIE.
WWW
Detect it easy (DIE) ― утилита, позволяющая импортировать и экспортировать список ресурсов, извлекать манифест и версию ПО, просматривать вычисления энтропии. Есть возможность добавить свои собственные алгоритмы обнаружения или изменить существующие. Это делается с помощью скриптов на языке, напоминающем JavaScript.
Как можно видеть на скриншоте, малварь написана на Visual Basic. Ты легко нагуглишь структуру программ на Visual Basic 6.0 и описание принципов их работы. Если коротко, то запускаются они в виртуальной среде, а значит, нам нужно поймать момент, когда этот код будет распакован в памяти. Также можно проанализировать структуру файла и получить название проекта, использованные формы и прочие данные.
Другой способ узнать, что малварь написана на Visual Basic, — использовать CFF Explorer.
WWW
CFF Explorer ― набор инструментов с единым минималистичным интерфейсом, который позволяет просматривать и при необходимости редактировать все секции заголовка исполняемого файла. Здесь же можно увидеть импорты и экспорты функций из библиотек, перечень самих библиотек и адресацию секций.
В этом случае мы увидим характерную импортированную библиотеку — ее наличие говорит о том, что используются функции Visual Basic.
Следующим шагом запускаем Hiew и, перейдя на начало исполняемого кода, обнаруживаем вызов функции из библиотеки.
WWW
Hiew ― редактор двоичного кода со встроенным дизассемблером для x86, x86-64 и ARM. Также им можно открывать физические и логические диски как файл. Hiew ― «легковесная» (в отличие от IDA) и при этом очень мощная программа, которая позволяет составить первое впечатление об исследуемом объекте.
На данном этапе нам достаточно знать, что при запуске будет исполняться код на Visual Basic.
Пришло время попробовать вытащить код и зафиксировать поведение при запуске. Для этого нам потребуется приготовленная виртуальная машина с Windows, Process Dump и API Monitor.
WWW
API Monitor ― программа, которая позволяет контролировать вызовы функций API приложениями и сервисами в Windows, перехватывает информацию о запуске приложений или подключается к выполняемому процессу, чтобы просмотреть используемые библиотеки и вызовы API.
В API Monitor запускаем Sample.exe
и получаем следующую картину: стартует еще один процесс, после чего первый завершается, далее программа добавляется в автозагрузку.
Находим указанный исполняемый файл, это первоначальный файл, записанный в директорию пользователя.
Программа еще и отключает возможность вызвать диспетчер задач.
Этого уже вполне достаточно, чтобы с уверенностью сказать, что файл вредоносный.
Выгрузим из оперативной памяти работающий процесс. Воспользуемся утилитой для выгрузки дампа процесса ― Process Dump. PID берем из данных API Monitor, он отображается рядом с именем процесса.
В результате будут выгружены все библиотеки, которые использует приложение. Также обнаруживаем, что в адресном пространстве, кроме основного исполняемого файла, есть еще и спрятанные, это можно увидеть ниже, в имени файла есть слово hiddenmodule.
Проверяем каждый полученный исполняемый файл в DIE.
Видим, что два из трех файлов написаны на C++, а один на VB.NET.
Обратим внимание на приложение, написанное на VB.NET. Его можно открыть любым отладчиком для работы с .NET, например dnSpy. И мы получим читаемый код на Visual Basic, осталось только убрать обфускацию. В данном случае алгоритм усложнили, добавив множество переходов по коду при помощи команды GoTo
.
Для анализа двух оставшихся файлов воспользуемся дизассемблером IDA.
WWW
IDA ― популярный интерактивный дизассемблер компании Hex-Rays. Имеет бесплатную и пробную версии, чего вполне достаточно для первичного знакомства. Также компания выпускает версию Pro. Основная задача программы ― это перевод исполняемых файлов из бинарного вида в читаемый код на ассемблере.
Как видно из примера, IDA позволяет получить код программы на ассемблере, но для более удобного просмотра и первоначальной оценки можно воспользоваться плагином Snowman и получить псевдокод.
Использование псевдокода упрощает анализ, но не всегда дает ожидаемый результат. Дизассемблирование и создание псевдокода выполняются автоматически, и у вирусописателей есть техники для их усложнения. Такое вот вечное противостояние меча и щита, интеллекта создателя малвари и интеллекта вирусного аналитика.
Мы, когда использовали API Monitor, уже выявили вредоносную сущность этого файла по совершаемым действиям. Но пока что не знаем, каков потенциал этой малвари. Чтобы получить полный алгоритм работы этого исполняемого файла, необходимо углубляться в анализ как ассемблерного кода, так и программы на Visual Basic, но это выходит за рамки статьи.
Заключение
Если у тебя создалось впечатление, что мы бросили исследование в самом начале пути, то оно отчасти справедливо: здесь мы проделали лишь те действия, которые не требуют знания ассемблера. Однако, как видишь, провести экспресс-анализ и установить, чего можно ждать от малвари, вполне реально и без этого.
При полноценном же разборе потребуется глубокое понимание принципов работы операционной системы и, конечно, знание ассемблера.
Если ты серьезно решил встать на путь вирусного аналитика, то тебе поможет литература по reverse engineering, анализу малвари, системному программированию и ассемблеру, а также практика, много практики. Рекомендую решать крэкми и зарегистрироваться на hybrid-analysis.com для получения примеров работающих вредоносов. Тебя ждет долгий путь, но дорогу осилит идущий!
Полезные материалы
- «Шпаргалка по основным инструкциям ассемблера x86/x64»
- «Введение в реверсинг с нуля» Рикардо Нарвахи (есть перевод на русский)
- Reverse Engineering Using Radare2
- Radare2 Book
- Книга Practical Malware Analysis: The Hands-On Guide to Dissecting Malicious Software
- Книга «Ассемблер и дизассемблирование»
- Memory Forensics and Analysis Using Volatility
- «Разбор Memory Forensics с OtterCTF и знакомство с фреймворком Volatility»
- Malware Researcher’s Handbook (Demystifying PE File)
- «Сигнатурные дела: анализатор файлов и антивирус — своими руками»