Реверсинг малвари для начинающих. Внедрение shellcode и шифрование malware-кода

  • Автор темы HHIDE_DUMP
  • Дата начала
  • Просмотры 685
  • На форуме работает ручное одобрение пользователей. Это значит, что, если Ваша причина регистрации не соответствует тематике форума, а также Вы используете временную почту, Ваша учётная запись будет отклонена без возможности повторной регистрации. В дальнейшем - пожизненная блокировка обоих аккаунтов за создание мультиаккаунта.
  • Мы обновили Tor зеркало до v3!
    Для входа используйте следующий url: darkv3nw2...bzad.onion/
  • Мы вновь вернули telegram чат форуму, вступайте, общайтесь, задавайте любые вопросы как администрации, так и пользователям!
    Ссылка: https://t.me/chat_dark_time

HHIDE_DUMP

Гость
H

HHIDE_DUMP

Гость
Вся информация предоставлена исключительно в ознакомительных целях. Ни форум, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи. Если ты что-то делаешь — будь уверен и понимай, что ты делаешь!
В нашей сегодняшней статье мы разберем две интересные
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
современного поколения malware: обфускацию кода вредоноса при помощи шифрования и внедрение шелл-кода (англ. shellcode) после инфицирования — чтобы, например, выполнить какой-нибудь
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
или получить командную
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
.


Современные антивирусные движки и
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
с высокой долей вероятности позволяют обнаруживать еще неизвестные или малоизученные вирусы. Для того чтобы «расколоть» вредонос, антивирусное ПО сначала прогоняет по сигнатурной базе, затем, если не удается ничего обнаружить, выполняет код программы в собственной
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
и, наконец, запускает
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, рассматривая под лупой каждое действие вредоноса, будь то обращение к реестру, системным файлам, сторонним приложениям или проявление сетевой активности. Поэтому для скрытия присутствия вредоноса в системе применяются различные техники и методы, к примеру использование rootkits или bootkits.

Другая задача состоит в том, чтобы максимально усложнить вирусному аналитику ручной анализ образца малвари, когда он уже попал в антивирусную лабораторию. Это, в свою очередь, позволит оттянуть время до того, как сигнатуру малвари добавят в антивирусные базы или будет выпущена тулза для лечения инфекции.

Один из вариантов — шифрование собственного кода малвари (англ. encoding), часто также называемое
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
. «Запутывать» код возможно на уровне алгоритма, заложенного во вредонос, исходника (source code) и/или ассемблерного текста. Для создания запутанного ассемблерного кода (того, который мы видим в IDA Pro) могут применяться и специализированные компиляторы, использующие неочевидные или недокументированные возможности. Отдельная песня — класс специальных программ, выполняющих обфускацию (обфускаторов). В качестве примера такого софта для программ на платформе .NET
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, для Java —
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
. Будет полезна и старая добрая статья Криса Касперски «
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
». Вот
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
еще одна неплохая статья с теорией. Подробный рассказ про использование
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
.

Для тех же, кому лень разбираться в премудростях обфускаторов и писать свой запутанный код, есть готовые программы, которые работают по принципу «загрузил — выбрал опции — зашифровал». Найти их можно в кладовке легендарного
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
. Однако помни, что все эти тулзы давно уже изучены современными антивирусами и внесены в сигнатурные базы, так что халявы не будет.


При шифровании кода малвари вирусописатель выбирает конкретный метод, который наилучшим образом отвечает его целям. Иногда могут использоваться простые шифры, к примеру логические побитовые операции —
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, реализующие битовые сдвиги в машинных инструкциях, или же сложные алгоритмы, к примеру
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, изначально разработанный для кодирования сообщений электронной почты.

Часто используемый шифр, базирующийся на операции XOR, — это самый простой шифр, который весьма похож на всем известный
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
. XOR, или исключающее OR, — логическая, или, как еще называют, битовая, операция, которая может быть использована для изменения оригинального порядка битов в ассемблерном коде. Операция XOR для шифрования использует значение статического байта. Каждый байт текста последовательно изменяется. Для тех, кто не понял, хорошим подспорьем будет вот
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, там наглядно показывают, как текст шифруется, причем правило сдвига букв можно выбрать самому.

Существует еще несколько простых алгоритмов шифрования, основанных на использовании рассмотренных инструкций:

  • Алгоритмы ADD и SUB позволяют производить кодирование операциями ADD и SUB для отдельных байтов блока аналогично операции XOR. ADD и SUB — нереверсивные операции, поэтому их необходимо использовать совместно, то есть одну для шифрования, а другую для расшифровки.
  • ROR- и ROL-инструкции позволяют перевернуть несколько битов в байте справа или слева. Точно так же, как ADD и SUB, они должны использоваться вместе, поскольку они
    Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
    , то есть выполняются только в одну сторону.
  • ROT — это оригинальный шифр Цезаря. Обычно используется латинский алфавит (A–Z и a–z), начиная с любой буквы, или 94 печатных символа в стандартной кодировке символов
    Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
    .
  • Многобайтовые (Multibyte Instead) преобразования заключаются в том, что заменяется не один байт, данный алгоритм позволяет использовать больше ключевых значений (к примеру, часто берутся цепочки 4 или 8 байт длиной). В этом случае ради удобства применяют операции XOR для каждого блока.
Чуть более подробно о приемах обфускации, построенных на использовании простых операций, можно почитать в статье
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
.
  • IDA Pro имеет очень полезный плагин под названием
    Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
    , также идущий в пакете для разработчиков
    Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
    . Плагин ищет в теле дизассемблированной программы специфические константы, связанные с криптографическими алгоритмами. И нужно сказать, хорошо справляется со своей задачей, так как большинство
    Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
    давно известны и изучены и используют сигнатурные элементы, по которым можно вычислить алгоритм.
  • Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
    , он же просто KANAL, тоже весьма полезный инструмент, который использует те же принципы, что и плагин FindCrypt2 для IDA Pro. Однако Krypto ANALyzer предназначен для PE-анализатора, в нашем случае это неутомимый
    Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
    . Помимо констант и алгоритмов шифрования, Krypto ANALyzer распознает также таблицы Base64 и связанные с шифрованием функции из
    Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
    .
  • Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
    — один из инструментов, который позволяет искать признаки энтропии, в нашем случае шифрования в PE-файлах. Он выручит, когда первые два со своей задачей не справились, но у нас есть подозрение, что криптография в коде точно используется. Достаточно просто загрузить данный плагин в IDA Pro, поместив ida-ent.plw в каталог IDA, где лежат все плагины.
Шифрование кода malware с целью обфускации во многом зависит от компетенции вирусописателя. Для шифрования могут использоваться в самом простом случае логические побитовые операции, например
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, реализующие битовые сдвиги в машинных инструкциях, или сложные алгоритмы, к примеру
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, изначально разработанный для кодирования сообщений электронной почты.
Теоретическая часть
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
(англ. shellcode) — это часть кода, встроенного в малварь и позволяющего после инфицирования целевой системы жертвы получить
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, например /bin/bash в UNIX-подобных ОС, command.com в черноэкранной MS-DOS и cmd.exe в современных операционных системах Microsoft Windows. Очень часто шелл-код используется как полезная нагрузка
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, но это выходит за рамки нашего материала. Зачем все это нужно? Как ты понимаешь, мало просто инфицировать систему, проэксплуатировать уязвимость или положить какую-нибудь системную службу. Все эти действия хакеров во многих случаях нацелены на получение админского доступа к зараженной машине. Так что малварь — это всего лишь способ попасть на машину и получить shell, то есть управление. А это уже прямой путь к
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, созданию
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, превращающих целевую систему в
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, или просто выполнению иных деструктивных функций на взломанной машине.

Шелл-код обычно внедряется в память эксплуатируемой программы, после чего на него передается управление при помощи использования программных ошибок, таких как
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
или
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, или использования атак форматной строки. Пока не забыл: хорошая
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
на эту тему. Управление шелл-коду передается перезаписью
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
в стеке адресом внедренного шелл-кода, перезаписью адресов вызываемых функций или изменением обработчиков прерываний. Кстати, не припоминаешь ли чего из прошлого урока про инжекты в процессы?

Результатом всего этого и будет выполнение шелл-кода, который открывает командную строку для использования взломщиком

При эксплуатации удаленной уязвимости (то есть эксплоита) шелл-код может открывать на уязвимом компьютере заранее заданный порт TCP для дальнейшего удаленного доступа к командной оболочке. Такой код называется привязывающим к порту (англ. port binding shellcode). Если же шелл-код подключается к порту компьютера атакующего (с целью обхода брандмауэра или просачивания через NAT), то такой код называется обратной оболочкой(reverse shell shellcode).

Существуют два способа запуска шелл-кода в память на исполнение:
  • Метод position-independent code (PIC, позиционно независимый код) — это код, который использует жесткую привязку бинарного кода (то есть кода, который выполнится в памяти) к определенному адресу или данным. Шелл-код — это по сути PIC. Почему жесткая привязка так важна? Шелл не может знать, в каком именно месте оперативной памяти будет располагаться, поскольку во время выполнения различных версий скомпрометированной программы или малвари они могут загрузить шелл-код в разные ячейки памяти.
  • Метод Identifying Execution Location («Определяй свое место выполнения») заключается в том, что шелл-код должен разыменовать базовый указатель при доступе к данным в позиционно независимой структуре памяти. Добавление (ADD) или вычитание (Reduce) значений от базового указателя позволяет безопасно получить доступ к данным, которые входят в состав шелл-кода.
Хакеры, дорожащие своей свободой и репутацией, пишут шелл-коды, используя техники, скрывающие их атаку. Так, типичная
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
(англ. IDS) обычно просматривает весь входящий сетевой трафик в поисках структуры, специфичной для шелл-кода. Если IDS находит такую структуру, то пакет, содержащий эту сигнатуру, уничтожается до того, как он еще достигнет своей цели. Однако слабая позиция IDS состоит в данном случае в том, что если трафик закодирован, то распознать его не удастся. Теперь ты улавливаешь, почему так ценно шифрование? Будь осторожен при скачивании и распаковке архивов с образцами malware на компьютер. Все исследования выполняй только в изолированной виртуальной среде! Не выполняй действий, в которых на 100% не уверен! И не забывай делать регулярные snapshot системы для быстрого отката в случае поломки.
Инструменты:
  1. IDA Pro (with plugins).
  2. OllyDbg.
  3. PEiD (with Krypto ANALyzer).
Ну что же, начнем! Первым делом открываем PEiD и грузим туда наш семпл. Все как и ожидалось, никаких сюрпризов. Однако мы помним, что имеем дело с криптографией в коде малвари, поэтому попробуем запустить плагин Krypto ANALyzer (должен быть предварительно подгружен в PEiD). И вот что мы видим: сигнатуры обнаружены.


Результат анализа файла в программе PEiD
Идем дальше. Открываем IDA Pro и загружаем туда семпл, минуя множество окон и малоинформативных сведений, обращаем внимание на таблицу ресурсов… Да, и здесь тоже нет ничего бросающегося в глаза.


Отображение окна String в IDA Pro
Быть может, попытаем счастья в поиске сетевой активности? Хм… Запускаем Process Explorer, далее выделяем процесс, запущенный нашим вредоносом, переходим в «Свойства», жмем вкладку Strings и параллельно запускаем сетевую акулу Wireshark, в окне анализа пакетов можно обнаружить GET-запрос на веб-ресурс
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
. Данные на вкладке Strings утилиты Process Explorer и выдернутые из пакета Wireshark совпали.


Сравнение данных String в Process Explorer и Wireshark
Вернемся к дизассемблеру IDA Pro. На графической диаграмме замечаем любопытные строки: подпрограмма @0x00401300 загружает некий ресурс в двоичном виде и применяет операцию XOR для некоторого значения ';'. На следующем скриншоте это весьма явно заметно.


Данные из IDA Pro
Ниже скриншот окна из IDA Pro, где желтым подсвечены инструкции шифрования с помощью операции XOR.


Текст кода с инструкциями шифрования с помощью операции XOR
И у нас возникает закономерный вопрос: какой ключ (шифр) используется для кодирования и что конкретно он кодирует? Вспоминая то, что мы нашли раньше, можно сделать вывод, что ключ ';' призван декодировать строку, содержащую URL
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
.

Итак, мы определили, какой алгоритм шифрования используется и какие данные он шифрует. Пора подключать плагины, которые помогут нам в декодировании. Мы будем использовать инструменты поиска сигнатур FindCrypt2, Krypto ANALyzer и IDA Entropy Plugin, чтобы определить другие механизмы кодирования.


Окно с результатами парсинга семпла в Krypto ANALyzer
KANAL plugin обнаружил четыре адреса, использующих символы из строки ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/. Как думаешь, на что это похоже? Да-да, мой друг, ты правильно смекаешь, что этот набор символов представляет собой алфавит, из которого потом делаются перестановки. А что же с сетевым трафиком? Для его кодирования используется алгоритм Base64. Ниже представлен скриншот из отладчика OllyDbg, иллюстрирующий закодированные строки.


Закодированные строки Base64 в OllyDbg
А вот скриншот все из того же отладчика, содержащий инструкцию, которая отвечает за сам процесс кодирования.

Где-то в коде есть функция, отвечающая за декодирование информации по алгоритму Base64, и находится она по адресу 0x004010B1.


Функция, отвечающая за декодирование информации по алгоритму Base64
Посмотрим этот код на диаграмме из IDA Pro, желтым подсвечены ключевые характеристики кодирования, а именно: максимальная длина сообщения — 12 символов. В описании алгоритма максимальная длина в Base64 составляет 16 байт.


Просмотр кода в IDA Pro
А вот тут мы и подходим к главному вопросу: что же малварь делает после своего запуска? Код малвари сканирует имя компьютера, на котором он запустился, шифрует его и посылает на веб-ресурс (максимум 12 байт)
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
каждые 30 секунд, пока не получит строку со значением 0x6F в качестве первого символа в ответе. Так сказать, мини-реализация
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
, то есть управляющего сервера, посылающего команды, и зараженной машины, получающей и исполняющей эти команды.
Инструменты:
  1. IDA Pro.
  2. OllyDbg.
Наш семпл будет содержать шелл-код, который позволит после запуска на зараженной машине получить удаленное управление по TCP/IP и доступ к командной оболочке ОС. Ну, поехали! Грузим файл в IDA Pro и в строках кода видим, что некая функция в коде вызывается, чтобы создать новый процесс, а затем
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
(внедряет) в него необходимый для получения удаленного доступа шелл-код.


Окно IDA Pro c инструкциями по созданию нового процесса
Переходим к OllyDbg, чтобы увидеть аргументы, передаваемые в функцию создания процесса GetProcessID (см. 0x4013DE). Мы можем установить
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
на месте этой инструкции. На следующем скриншоте мы видим, что путь к запуску iexplore.exe передается в функцию, а она, в свою очередь, использует его для реализации CreateProcess, то есть создания процесса, в который внедряется шелл-код.


Окно OllyDbg c точкой останова на 0x4013DE
Это верное направление, продолжаем копать в эту сторону. Чтобы найти шелл-код, я бы сначала попробовал поискать вызов функции, ответственной за внедрение шелл-кода в удаленный процесс. Поиск WriteProcessMemory будет весьма хорошим направлением для этого.


Окно IDA Pro c функцией WriteProcessMemory
Как видим из скриншота, по адресу 0x00401230 вызывается функция с аргументом lpbuffer, который передается вместе с такими параметрами, как размер буфера и идентификатор процесса (PID). Нетрудно догадаться, что эта функция отвечает за открытие дескриптора удаленного процесса и в конечном счете позволяет записать в него какие-то данные. Чтобы разобраться с этим, мы просто должны проследить, кто вызвал эту функцию, и таким образом выяснить, где находится шелл-код.


Шелл-код, расположенный по адресу 0x407030
Идем дальше… Так-так-так, вот, кажется, мы и нашли шелл-код по адресу @0x407030. Смотрим на него (скриншот ниже), а затем нажимаем клавишу C, чтобы преобразовать данные в
Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
.


Содержимое шелл-кода после преобразования в байт-код в IDA Pro
Глядя на найденный шелл-код на следующем скриншоте из дизассемблера, мы видим, что автор малвари использует трюк с вызовом, как это было описано чуть ранее, чтобы получить адрес шелл-кода. Анализируя коды, мы можем предположить, что шелл-код, начиная с адреса 0x407048, декодируется с помощью операции XOR с 0xE7.


Шелл-код использует вызов инструкций и преобразования XOR
Для анализа шелл-кода мы можем извлечь его из процесса и запустить, используя sctest.

Для этого на функции WriteProcessMemory ставим первый брейк-пойнт. До того как этот код будет записан в удаленный процесс, мы меняем первый байт шелл-кода со значения 0x407030 на другое значение 0xCC (наша точка останова). Запускаем под отладчиком iexplore.exe, после его запуска сработает точка останова, и шелл-код не будет внедрен в процесс.

При анализе шелл-кода мы встретим функции, которые отвечают за ручное импортирование некой следующей функции. Ты можешь поставить брейк-пойнт на CALL-инструкции в шелл-коде, чтобы отслеживать, где (по какому адресу) в памяти он находится.


Просмотр импорта в OllyDbg
Теперь мы ставим брейк-пойнт @ при инициации удаленной связи с параметром SockAddr, который передается шелл-коду, то есть, грубо говоря, передается IP-адрес машины, которую нужно подцепить. Ниже на скриншоте показаны преобразования машинных данных в понятные человеку параметры (IP-адрес и TCP-порт).


Структура SockAddr в окне OllyDbg



Преобразование Hex to IP Address
В итоге мы видим, что reverse shell (cmd.exe) подключается на инфицированной машине по адресу 192.168.200.2:13330. Шелл-код создает процесс командной оболочки CreateProcessA после подключения к удаленному IP.

А вот так выглядит терминал Linux, с которого мы атаковали удаленную машину. В выводе терминала мы видим получение приглашения cmd.exe на инфицированной машине с адресом в сети 192.168.200.2:13330.


Вывод терминала Linux после эксплуатации малвари на машине жертвы


Заключение
Вот и прошли мы вместе с тобой, мой друг, тернистый путь по дебрям malware-кода. Ты молодец, если дочитал эту статью до конца, и очень крут, если теперь сможешь повторить все лабораторные работы, не подглядывая. Безусловно, мы рассмотрели только самые базовые и ключевые аспекты анализа малвари, и осталось очень много тем, о которых стоило бы рассказать. Можно продолжать эту тему до бесконечности и, наверное, написать даже целую книгу. Надеюсь, тебе было интересно, ты узнал хотя бы что-то новое для себя и теперь представляешь, что такое работа вирусного аналитика.
 

О нас

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

    Dark-Time 2015 - 2022

    При поддержке: XenForo.Info

Быстрая навигация

Меню пользователя