Откуда берутся шелл-коды

Степан Ильин (step@gameland.ru)

Хакер, номер #085, стр. 085-050-1

Учимся писать шелл-коды самостоятельно

Найти уязвимый сервис и правильно подобрать эксплоит нелегко. И все же значительно сложнее написать этот эксплойт самому, превратить тусклую новость из багтрака в реально работающую отмычку. Сегодня я не расскажу тебе о том, как нужно писать эксплойты, и даже не буду разбирать популярные уязвимости в софте. Но зато с удовольствием научу составлять шелл-код, неотъемлемую часть практически любого сплоита.

[как работает эксплойт]

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

char shellcode[] =

"\x33\xc9\x83\xe9\xeb\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x8a"

"\xd4\xf2\xe7\x83\xeb\xfc\xe2\xf4\xbb\x0f\xa1\xa4\xd9\xbe\xf0\x8d"

"\xec\x8c\x6b\x6e\x6b\x19\x72\x71\xc9\x86\x94\x8f\x9b\x88\x94\xb4"

"\x03\x35\x98\x81\xd2\x84\xa3\xb1\x03\x35\x3f\x67\x3a\xb2\x23\x04"

"\x47\x54\xa0\xb5\xdc\x97\x7b\x06\x3a\xb2\x3f\x67\x19\xbe\xf0\xbe"

"\x3a\xeb\x3f\x67\xc3\xad\x0b\x57\x81\x86\x9a\xc8\xa5\xa7\x9a\x8f"

"\xa5\xb6\x9b\x89\x03\x37\xa0\xb4\x03\x35\x3f\x67";

Это и есть тот самый шеллкод, о котором пойдет речь. Иногда его называют байт-кодом, так как он состоит из последовательности байтов, но суть от этого не меняется. Содержимое шелл-кода - отнюдь не хитрое заклинание и не символы, взятые от балды. Это набор самых обыкновенных машинных команд, точно таких же, как и в обычном исполняемом файле. Например, приведенный выше шелл-код (определенная последовательность машинных команд) открывает 4444 порт на локальной Linux-машине и привязывает к нему шелл. Эксплойт, которому удастся выполнить этот шеллкод, предоставит хакеру полный доступ в систему.

С помощью шелл-кода можно также перезагрузить систему, отключить IDS-сервисы и honeypot, отправить заданный файл на мыло и т.д. и т.п. Все зависит от того, что именно прописано в шелл-коде. Заставить компьютер выполнить шелл-код - задача эксплойта. Возьмем для примера распространенную ошибку Buffer Overflow. Разработчики очень часто допускают оплошность и не проверяют данные, которые передаются функциям в качестве параметров. Банальный пример: программист создает динамический массив и выделяет память для 100 элементов, при этом реальное количество элементов нигде не контролирует. Такое положение дел играет на руку взломщику, потому как все данные, которые оказались за пределами этого массива, попадают в стек, происходит так называемое переполнение буфера. Задача эксплойта заключается в том, чтобы переполнить буфер и таким образом подменить адрес возврата на тот, где находится шелл-код. Если шелл-код получит управление, то он будет выполнен. Все довольно просто.

[место действия]

Не стоит рассматривать этот материал как руководство к написанию эксплойтов. Цель этой статьи - на практике показать процесс создания шелл-кода, а также его оптимизации для использования в реальных сплоитах. Конечно, существует немало репозитариев (например, www.metasploit.com) с отличной подборкой шелл-кодов, однако их не всегда бывает достаточно. Ты с самого начала должен понимать, что шелл-код - это последовательность машинных команд (самый низкий и сложный уровень программирования), которые сильно привязаны к конкретной архитектуре процессора и операционной системы. Шелл-код, работающий в одном случае, будет совершенно неприменим в другом. Вот почему так важно понимать, что к чему, чтобы в случае необходимости суметь составить работающий шелл-код самому или модифицировать уже существующий.

Содержание  Вперед на стр. 085-050-2
Выпуски журнала "Xakep"
Журнал Хакер. Содержание номера #001Журнал Хакер. Содержание номера #002Журнал Хакер. Содержание номера #003Журнал Хакер. Содержание номера #004Журнал Хакер. Содержание номера #005Журнал Хакер. Содержание номера #006Журнал Хакер. Содержание номера #007Журнал Хакер. Содержание номера #008Журнал Хакер. Содержание номера #009Журнал Хакер. Содержание номера #010Журнал Хакер. Содержание номера #011Журнал Хакер. Содержание номера #012Журнал Хакер. Содержание номера #013Журнал Хакер. Содержание номера #014Журнал Хакер. Содержание номера #015Журнал Хакер. Содержание номера #016Журнал Хакер. Содержание номера #017Журнал Хакер. Содержание номера #018Журнал Хакер. Содержание номера #019Журнал Хакер. Содержание номера #020Журнал Хакер. Содержание номера #021Журнал Хакер. Содержание номера #022Журнал Хакер. Содержание номера #023Журнал Хакер. Содержание номера #024Журнал Хакер. Содержание номера #025Журнал Хакер. Содержание номера #026Журнал Хакер. Содержание номера #027Журнал Хакер. Содержание номера #028Журнал Хакер. Содержание номера #029Журнал Хакер. Содержание номера #030Журнал Хакер. Содержание номера #031Журнал Хакер. Содержание номера #032Журнал Хакер. Содержание номера #033Журнал Хакер. Содержание номера #034Журнал Хакер. Содержание номера #035Журнал Хакер. Содержание номера #036Журнал Хакер. Содержание номера #037Журнал Хакер. Содержание номера #038Журнал Хакер. Содержание номера #039Журнал Хакер. Содержание номера #040Журнал Хакер. Содержание номера #041Журнал Хакер. Содержание номера #042Журнал Хакер. Содержание номера #043Журнал Хакер. Содержание номера #044Журнал Хакер. Содержание номера #045Журнал Хакер. Содержание номера #046Журнал Хакер. Содержание номера #047Журнал Хакер. Содержание номера #048Журнал Хакер. Содержание номера #049Журнал Хакер. Содержание номера #050Журнал Хакер. Содержание номера #051Журнал Хакер. Содержание номера #052Журнал Хакер. Содержание номера #053Журнал Хакер. Содержание номера #054Журнал Хакер. Содержание номера #055Журнал Хакер. Содержание номера #056Журнал Хакер. Содержание номера #057Журнал Хакер. Содержание номера #058Журнал Хакер. Содержание номера #059Журнал Хакер. Содержание номера #060Журнал Хакер. Содержание номера #061Журнал Хакер. Содержание номера #062Журнал Хакер. Содержание номера #063Журнал Хакер. Содержание номера #064Журнал Хакер. Содержание номера #065Журнал Хакер. Содержание номера #066Журнал Хакер. Содержание номера #067Журнал Хакер. Содержание номера #068Журнал Хакер. Содержание номера #069Журнал Хакер. Содержание номера #070Журнал Хакер. Содержание номера #071Журнал Хакер. Содержание номера #072Журнал Хакер. Содержание номера #073Журнал Хакер. Содержание номера #074Журнал Хакер. Содержание номера #075Журнал Хакер. Содержание номера #076Журнал Хакер. Содержание номера #077Журнал Хакер. Содержание номера #078Журнал Хакер. Содержание номера #079Журнал Хакер. Содержание номера #080Журнал Хакер. Содержание номера #081Журнал Хакер. Содержание номера #082Журнал Хакер. Содержание номера #083Журнал Хакер. Содержание номера #084Журнал Хакер. Содержание номера #085Журнал Хакер. Содержание номера #086Журнал Хакер. Содержание номера #087Журнал Хакер. Содержание номера #088Журнал Хакер. Содержание номера #089Журнал Хакер. Содержание номера #090Журнал Хакер. Содержание номера #091Журнал Хакер. Содержание номера #092Журнал Хакер. Содержание номера #093Журнал Хакер. Содержание номера #094Журнал Хакер. Содержание номера #095Журнал Хакер. Содержание номера #096Журнал Хакер. Содержание номера #097Журнал Хакер. Содержание номера #098Журнал Хакер. Содержание номера #099Журнал Хакер. Содержание номера #100Журнал Хакер. Содержание номера #101Журнал Хакер. Содержание номера #102Журнал Хакер. Содержание номера #103Журнал Хакер. Содержание номера #104Журнал Хакер. Содержание номера #105Журнал Хакер. Содержание номера #106Журнал Хакер. Содержание номера #107Журнал Хакер. Содержание номера #108Журнал Хакер. Содержание номера #109Журнал Хакер. Содержание номера #110Журнал Хакер. Содержание номера #111Журнал Хакер. Содержание номера #112Журнал Хакер. Содержание номера #113Журнал Хакер. Содержание номера #114