• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Сокрытие Reverse TCP shellcode в PE-файле | Часть 2

Приветствую, обыватель CODEBY.NET
Иноязычное описание данного метода является достаточно большим. В связи с этим, я решил разделить его на 2, более мелкие части. Приятного ознакомления со 2 частью.
Оригинал на английском: https://haiderm.com/fully-undetectable-backdooring-pe-file/

Предупреждение:
Обо всех очепятках и ошибках сообщайте в личные сообщения.
Убедительная просьба не засорять комментарии информацией, которая не относится к обсуждению.

На данный момент мы создали новый раздел заголовка, поместили в него наш шелл-код, перехватили поток выполнения и при этом достигли нормальной работы приложения. В этой части мы объединим два метода для сокрытия бэкдора от AV и постараемся устранить недостатки метода секции сумматора, описанного выше. Ниже приведены те методы, о которых сегодня пойдёт речь:​
  • Запуск шелл-кода на основе взаимодействия пользователя с определенной функцией.​
  • Поиск и использование пещер в коде (code cave).​
Пещеры в коде

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

Первым шагом является поиск пещеры в коде. Cave Miner - это оптимальная утилита на Python для их поиска. Вам необходимо указать размер в качестве параметра, и он покажет вам все пещеры, превышающие этот размер.​

1614506884058.png

У нас есть две пещеры в коде размером более 700 байт, в обеих достаточно места для нашего шелл-кода. Запишите виртуальный адрес обеих пещер. Виртуальный адрес - это начальный адрес пещеры. Позже мы перехватим поток выполнения, перейдя к виртуальным адресам.
Мы видим, что пещера кода доступна только для чтения. Чтобы она могла выполнять наш шелл-код воспользуемся .​

1614507029102.png



Запуск шеллкода при взаимодействии с пользователем

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

Откройте программу 7zip в Ollydbg> щелкните правой кнопкой мыши> найти> все строки справочного текста

1614507288465.png

В ссылочных строках мы обнаружили интересную строку - домен ( ). Доступ к этому адресу памяти осуществляется, когда пользователь щелкает about > domain.

1614507462798.png


В качестве примера я и дальше буду использовать кнопку домена на странице «О нас», при нажатии на которую открывается веб-сайт в браузере.

Наша цель - запускать шеллкод всякий раз, когда пользователь ее нажимает.
Теперь нам нужно добавить точку останова в адрес строки домена, чтобы затем мы могли изменить код ее операции и перейти к нашей пещере в коде. Мы копируем адрес строки домена 0044A8E5 и добавляем точку останова. Нажимаем кнопку домена в программе 7zip. Выполнение останавливается в точке останова, как показано на снимке экрана ниже:​

1614507783104.png

Теперь копируем пару инструкций после адреса 0044A8E5, поскольку они будут использоваться снова, когда мы захотим вернуть поток выполнения к нему после отработки шелл-кода, для обеспечения нормальной функциональности 7zip.​

1614507881627.png

После модификации jmp 00477857 мы сохраняем исполняемый файл как 7zFMUhijacked.exe. Обратите внимание, что адрес 00477857 - это начальный адрес первой пещеры в коде. Далее загружаем 7zFMUhijacked.exe в Ollydbg и даем ему поработать, после чего нажимаем кнопку веб-сайта. Нас перенаправляют в пустую пещеру кода.​

1614508035571.png

Отлично! Поток ввода перенаправлен. Дабы не мусолить, мы пропустим следующие шаги по добавлению и изменению шелл-кода, ведь они аналогичны уже описанным в предыдущей части действиям.​


Установка шелла

Мы добавляем шелл-код, модифицируем его, восстанавливаем поток выполнения до того места, где мы его захватили 0044A8E5, и сохраняем файл как 7zFMUhijackedShelled.exe. Я по прежнему использую reverse bind. Слушаем порт 8080, запускаем 7zFMUhijackedShelled.exe, нажимаем на кнопку сайта.​

1614508294413.png

Замечательно. Все работает как надо. Посмотрим, как у нас обстоят дела с обнаружением?​

1614508356869.png

Как видим, ситуация в разы улучшилась. Степень обнаружения 3/38 хороша, но недостаточно. Принимая во внимание наложенные на себя ограничения, единственный путь сделать файл полностью сокрытым от ав, похоже, заключается в пользовательском кодировании шелл-кода и его декодировании в памяти после выполнения.

Шелл-код пользовательской кодировки

Я предлагаю всего на всего воспользоваться XOR. Почему именно XOR? На это есть пара причин: во-первых, его довольно легко реализовать; во-вторых, нам не нужно писать для него декодер, ведь, если заксорить значение 2 раза, оно даст вам исходное. Мы закодируем шеллкод один раз с помощью XOR и сохраним его на диске. Затем мы снова выполним XOR закодированного значения в памяти во время выполнения, чтобы вернуть исходный шелл-код.
Для этого нам потребуется 2 пещеры в коде. Одина для шелл-кода и другая для (де)кодировки. В предыдущем пункте, «Обнаружение пещер в коде» мы выяснили, что места будет предостаточно. Ниже представлена блок-схема последовательности операций.​

1614508997728.png

Сначала мы перехватываем поток выполнения с адреса 0044A8E5 (нажав кнопку домена) на начальный адрес CC2 0047972e и сохраняем изменения на диске. Запускаем модифицированный файл 7zip в Ollydbg и начинаем процесс угона, нажав на кнопку домена.​

1614509509164.png

Теперь, когда мы находимся в CC2, прежде чем писать здесь наш кодировщик XOR, мы сначала перейдем к начальному адресу CC1 и внедрим шелл-код, чтобы получить точные адреса, которые мы должны использовать в кодировщике. Обратите внимание, что первый шаг перехвата на CC2 также может быть выполнен в конце, так как это не повлияет на общий поток выполнения, показанный на блок-схеме выше.
Мы переходим к CC1, внедряем, модифицируем шелл-код и восстанавливаем поток выполнения до 0044A8E5, откуда мы переходим на CC2, чтобы обеспечить плавное выполнение функций программы 7zip после отработки шелл-кода.​

1614509671704.png

На приведенном выше скрине показана нижняя часть шеллокода в CC1. Запишите адрес 0047799B, здесь заканчивается шеллкод. Следующие инструкции предназначены для восстановления потока выполнения. Таким образом, мы должны кодировать от начала шеллкода 00477859 до 0047799B.
Далее перемещаемся на 00477857 и пишем кодировщик XOR. Ниже приведены коды операций для реализации кодировщика XOR.​

Код:
PUSH ECX, 00477857
XOR BYTE PTR DS:[EAX],0B
INC ECX
CMP ECX,0047799B
JLE SHORT 00479733
JMP 7zFM2.00477857

Поскольку мы кодируем коды операций в CC1, мы должны убедиться, что раздел заголовка, в котором находится CC1, доступен для записи, иначе Ollydbg покажет ошибку нарушения доступа. Этот момент уже был описан в пункте Code Caves.
Мы добавляем точку останова в JMP 7zFM2.00477857 после того, как кодирование выполнено, возвращаемся к закодированному шеллкоду. Если мы вернемся к CC1, мы увидим, что наш шелл-код теперь закодирован.
1614510028751.png



Установка шелла

Снова слушаем порт 8080, запускаем 7zFMbackdoored.exe в Windows и нажимаем кнопку домена. Веб-сайт 7zip всплывает в браузере, и если мы обратим внимание на скрин ниже, то увидим, как хорошо отработал наш бэкдор, сокрытый в PE​

1614510170347.png


1614510189798.png



Таким образом, мы достигли первоначально поставленной цели!​

 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!