Приветствую, обыватель CODEBY.NET
Иноязычное описание данного метода является достаточно большим. В связи с этим, я решил разделить его на 2, более мелкие части. Приятного ознакомления со 2 частью.
Оригинал на английском: https://haiderm.com/fully-undetectable-backdooring-pe-file/
Запуск шеллкода при взаимодействии с пользователем
В ссылочных строках мы обнаружили интересную строку - домен (
В качестве примера я и дальше буду использовать кнопку домена на странице «О нас», при нажатии на которую открывается веб-сайт
Наша цель - запускать шеллкод всякий раз, когда пользователь ее нажимает.
Теперь нам нужно добавить точку останова в адрес строки домена, чтобы затем мы могли изменить код ее операции и перейти к нашей пещере в коде. Мы копируем адрес строки домена 0044A8E5 и добавляем точку останова. Нажимаем кнопку домена в программе 7zip. Выполнение останавливается в точке останова, как показано на снимке экрана ниже:
Установка шелла
Таким образом, мы достигли первоначально поставленной цели!
Иноязычное описание данного метода является достаточно большим. В связи с этим, я решил разделить его на 2, более мелкие части. Приятного ознакомления со 2 частью.
Оригинал на английском: https://haiderm.com/fully-undetectable-backdooring-pe-file/
Предупреждение:
Обо всех очепятках и ошибках сообщайте в личные сообщения.
Убедительная просьба не засорять комментарии информацией, которая не относится к обсуждению.
Обо всех очепятках и ошибках сообщайте в личные сообщения.
Убедительная просьба не засорять комментарии информацией, которая не относится к обсуждению.
На данный момент мы создали новый раздел заголовка, поместили в него наш шелл-код, перехватили поток выполнения и при этом достигли нормальной работы приложения. В этой части мы объединим два метода для сокрытия бэкдора от AV и постараемся устранить недостатки метода секции сумматора, описанного выше. Ниже приведены те методы, о которых сегодня пойдёт речь:
- Запуск шелл-кода на основе взаимодействия пользователя с определенной функцией.
- Поиск и использование пещер в коде (code cave).
Пещеры в коде
Пещеры кода - это пустые блоки в памяти программы, которые можно использовать для внедрения нашего собственного кода. Вместо создания нового раздела мы могли бы использовать существующие пещеры для внедрения нашего шелл-кода. Мы можем найти пещеры в коде разного размера практически в любом PE. Необходимо, чтобы она была больше, чем наш шелл-код, чтобы мы могли нормально его внедрить, не разбивая на более мелкие куски.
Первым шагом является поиск пещеры в коде. Cave Miner - это оптимальная утилита на Python для их поиска. Вам необходимо указать размер в качестве параметра, и он покажет вам все пещеры, превышающие этот размер.
Первым шагом является поиск пещеры в коде. Cave Miner - это оптимальная утилита на Python для их поиска. Вам необходимо указать размер в качестве параметра, и он покажет вам все пещеры, превышающие этот размер.
У нас есть две пещеры в коде размером более 700 байт, в обеих достаточно места для нашего шелл-кода. Запишите виртуальный адрес обеих пещер. Виртуальный адрес - это начальный адрес пещеры. Позже мы перехватим поток выполнения, перейдя к виртуальным адресам.
Мы видим, что пещера кода доступна только для чтения. Чтобы она могла выполнять наш шелл-код воспользуемся
Мы видим, что пещера кода доступна только для чтения. Чтобы она могла выполнять наш шелл-код воспользуемся
Ссылка скрыта от гостей
.Запуск шеллкода при взаимодействии с пользователем
Теперь, когда у нас есть пещера в коде, которую мы можем использовать, нам нужно найти способ перенаправления потока выполнения на наш шеллкод. В отличие от предыдущего метода, мы не будем перехватывать поток выполнения сразу после запуска программы. Нужно, чтобы программа работала нормально и выполняла шелл-код при взаимодействии пользователя с определенной функцией, например, щелчком по определенной вкладке. Для этого нам нужно найти ссылочные строки в приложении. Затем мы можем перехватить адрес определенной ссылочной строки, изменить ее и направить к пещере в коде. Это означает, что всякий раз, когда в памяти осуществляется доступ к определенной строке, поток выполнения будет перенаправлен в нашу пещеру кода. Звучит отлично? Тогда, давайте сделаем это!
Откройте программу 7zip в Ollydbg> щелкните правой кнопкой мыши> найти> все строки справочного текста
Откройте программу 7zip в Ollydbg> щелкните правой кнопкой мыши> найти> все строки справочного текста
В ссылочных строках мы обнаружили интересную строку - домен (
Ссылка скрыта от гостей
). Доступ к этому адресу памяти осуществляется, когда пользователь щелкает about > domain.В качестве примера я и дальше буду использовать кнопку домена на странице «О нас», при нажатии на которую открывается веб-сайт
Ссылка скрыта от гостей
в браузере. Наша цель - запускать шеллкод всякий раз, когда пользователь ее нажимает.
Теперь нам нужно добавить точку останова в адрес строки домена, чтобы затем мы могли изменить код ее операции и перейти к нашей пещере в коде. Мы копируем адрес строки домена 0044A8E5 и добавляем точку останова. Нажимаем кнопку домена в программе 7zip. Выполнение останавливается в точке останова, как показано на снимке экрана ниже:
Теперь копируем пару инструкций после адреса 0044A8E5, поскольку они будут использоваться снова, когда мы захотим вернуть поток выполнения к нему после отработки шелл-кода, для обеспечения нормальной функциональности 7zip.
После модификации jmp 00477857 мы сохраняем исполняемый файл как 7zFMUhijacked.exe. Обратите внимание, что адрес 00477857 - это начальный адрес первой пещеры в коде. Далее загружаем 7zFMUhijacked.exe в Ollydbg и даем ему поработать, после чего нажимаем кнопку веб-сайта. Нас перенаправляют в пустую пещеру кода.
Отлично! Поток ввода перенаправлен. Дабы не мусолить, мы пропустим следующие шаги по добавлению и изменению шелл-кода, ведь они аналогичны уже описанным в предыдущей части действиям.
Установка шелла
Мы добавляем шелл-код, модифицируем его, восстанавливаем поток выполнения до того места, где мы его захватили 0044A8E5, и сохраняем файл как 7zFMUhijackedShelled.exe. Я по прежнему использую reverse bind. Слушаем порт 8080, запускаем 7zFMUhijackedShelled.exe, нажимаем на кнопку сайта.
Замечательно. Все работает как надо. Посмотрим, как у нас обстоят дела с обнаружением?
Как видим, ситуация в разы улучшилась. Степень обнаружения 3/38 хороша, но недостаточно. Принимая во внимание наложенные на себя ограничения, единственный путь сделать файл полностью сокрытым от ав, похоже, заключается в пользовательском кодировании шелл-кода и его декодировании в памяти после выполнения.
Шелл-код пользовательской кодировки
Я предлагаю всего на всего воспользоваться XOR. Почему именно XOR? На это есть пара причин: во-первых, его довольно легко реализовать; во-вторых, нам не нужно писать для него декодер, ведь, если заксорить значение 2 раза, оно даст вам исходное. Мы закодируем шеллкод один раз с помощью XOR и сохраним его на диске. Затем мы снова выполним XOR закодированного значения в памяти во время выполнения, чтобы вернуть исходный шелл-код.
Для этого нам потребуется 2 пещеры в коде. Одина для шелл-кода и другая для (де)кодировки. В предыдущем пункте, «Обнаружение пещер в коде» мы выяснили, что места будет предостаточно. Ниже представлена блок-схема последовательности операций.
Для этого нам потребуется 2 пещеры в коде. Одина для шелл-кода и другая для (де)кодировки. В предыдущем пункте, «Обнаружение пещер в коде» мы выяснили, что места будет предостаточно. Ниже представлена блок-схема последовательности операций.
Сначала мы перехватываем поток выполнения с адреса 0044A8E5 (нажав кнопку домена) на начальный адрес CC2 0047972e и сохраняем изменения на диске. Запускаем модифицированный файл 7zip в Ollydbg и начинаем процесс угона, нажав на кнопку домена.
Теперь, когда мы находимся в CC2, прежде чем писать здесь наш кодировщик XOR, мы сначала перейдем к начальному адресу CC1 и внедрим шелл-код, чтобы получить точные адреса, которые мы должны использовать в кодировщике. Обратите внимание, что первый шаг перехвата на CC2 также может быть выполнен в конце, так как это не повлияет на общий поток выполнения, показанный на блок-схеме выше.
Мы переходим к CC1, внедряем, модифицируем шелл-код и восстанавливаем поток выполнения до 0044A8E5, откуда мы переходим на CC2, чтобы обеспечить плавное выполнение функций программы 7zip после отработки шелл-кода.
Мы переходим к CC1, внедряем, модифицируем шелл-код и восстанавливаем поток выполнения до 0044A8E5, откуда мы переходим на CC2, чтобы обеспечить плавное выполнение функций программы 7zip после отработки шелл-кода.
На приведенном выше скрине показана нижняя часть шеллокода в CC1. Запишите адрес 0047799B, здесь заканчивается шеллкод. Следующие инструкции предназначены для восстановления потока выполнения. Таким образом, мы должны кодировать от начала шеллкода 00477859 до 0047799B.
Далее перемещаемся на 00477857 и пишем кодировщик XOR. Ниже приведены коды операций для реализации кодировщика XOR.
Далее перемещаемся на 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, мы увидим, что наш шелл-код теперь закодирован.
Мы добавляем точку останова в JMP 7zFM2.00477857 после того, как кодирование выполнено, возвращаемся к закодированному шеллкоду. Если мы вернемся к CC1, мы увидим, что наш шелл-код теперь закодирован.
Установка шелла
Снова слушаем порт 8080, запускаем 7zFMbackdoored.exe в Windows и нажимаем кнопку домена. Веб-сайт 7zip всплывает в браузере, и если мы обратим внимание на скрин ниже, то увидим, как хорошо отработал наш бэкдор, сокрытый в PE
Таким образом, мы достигли первоначально поставленной цели!