Генерация полезной нагрузки — неотъемлемая часть эксплуатации. При использовании модулей Metasploit пейлоад генерируется автоматически, достаточно выбрать тип и задать некоторые переменные. В этой статье мы попробуем разобраться с ролью энкодеров в бинарной эксплуатации и рассмотрим несколько реальных примеров энкодинга на боевых эксплоитах.
Обычно модули скрывают от пользователя детали реализации полезной нагрузки. Ситуация немного меняется, когда дело доходит до необходимости воспользоваться эксплоитом, для которого не существует модулей Metasploit, но есть, например, PoC на Python или любом другом языке.
В таких обстоятельствах очень полезным инструментом может оказаться утилита msfvenom, входящая в состав Metasploit Framework, которая умеет генерировать полезные нагрузки на основании заранее определенных шаблонов. Эта утилита настолько удобна, что сводит процесс генерации пейлоада к все тому же выбору типа и заданию необходимых переменных.
Одна из опций при генерации шелл-кода с msfvenom — это выбор энкодера. Шелл-кодинг — не самая простая для понимания тема, поэтому даже такая вспомогательная часть этого процесса, как энкодинг полезной нагрузки, порождает огромное количество мифов и заблуждений.
Поскольку тема шелл-кодинга неотделима от эксплуатации бинарных уязвимостей, давай рассмотрим небольшой фрагмент кода, содержащего в себе типичный Stack-based Buffer Overflow.
#include <stdio.h>
#include <string.h>
int main (int argc, char** argv) {
char buffer[100];
strcpy(buffer, argv[1]);
return 0;
}
Уязвимость этого кода происходит из функции strcpy(char *destination, const char *source)
. Вот так выглядит описание этой функции в официальной документации:
Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point). To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source (including the terminating null character), and should not overlap in memory with source.
В двух словах: если длина строки (то есть разница между адресом первого байта строки и адресом первого нулевого байта, именуемого NULL-терминатором), на которую указывает argv[1]
, больше размера буфера buffer
, то произойдет тот самый Stack-based Buffer Overflow.
Если рандомизация адреса стека отключена, атакующий может предсказать то место, куда будут записаны данные. Таким образом, манипуляциями с argv[1]
можно записать полезную нагрузку в стек, а также подменить адрес возврата так, чтобы передать ей управление.
Если защита от исполнения данных также отключена, то шелл-код будет исполнен.
Хорошим примером полезной нагрузки будет шелл-код, запускающий командную оболочку sh, который можно сгенерировать с помощью msfvenom.
Здесь и начинается все интересное.
Если передать нашей программе строку вида argv[1] = shellcode + "BBBB" + shellcode_address
, то переполнение не произойдет. Это связано с тем, что шестнадцатый байт шелл-кода равен x00
, так что копирование этого буфера в стек прекращается после 15 байт.
Материалы из последних выпусков можно покупать отдельно только через два месяца после публикации. Чтобы продолжить чтение, необходимо купить подписку.
Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке
1 год7190 р. Экономия 1400 рублей! |
1 месяц720 р. 25-30 статей в месяц |
Уже подписан?
Читайте также
Последние новости