Эксплойтный ликбез Олег Толстых aka NSD Xakep, номер #066, стр. 066-070-1 (www.nsd.ru) Все, что ты хотел знать о эксплойтах, но боялся спросить С каждым днем появляется все больше и больше публичных сплойтов. Любой человек может, не напрягаясь ни минуты, используя решение из багтрака, получить удаленные рутовые права на Unix-машине. Но ты ведь не из их числа, правда? Тебе ведь интересно разобраться с тем, как работают эксплойты, кто и как их пишет, откуда хакеры их берут, как компилируют и используют. Прочитав эту статью, ты получишь ответы на все свои вопросы. What Is? Специально для танкистов, по случаю прошедшего Дня Победы, поясню: эксплойт – это специальная программа, обычно небольшого размера, написанная на одном из языков программирования (обычно на C/C++), которая, используя определенную уязвимость в софте сервера (переполнение буфера, format-string баг и т.д.), выполняет некоторую деструктивную функцию: предоставляет злоумышленнику доступ к командной оболочке системы, DoS’ит сервер и т.п. Сплойты бывают двух видов: локальные и удаленные. Удаленные хакер может запускать на любой тачке, достаточно лишь указать exploit’у IP-адрес жертвы. Если эксплойт сработает успешно, хакер достигнет своей цели – например, получит рутшелл. Есть и локальные сплойты, запускать которые нужно непосредственно на ломаемой машине. Само собой, для этого нужно иметь шелл с возможностью компиляции и выполнения приложений, в результате такой атаки взломщик обычно добивается повышения собственных прав. Откуда они берутся Чтобы ты хорошо понимал, откуда вообще берутся exploit’ы (не на xploit-дереве же они растут!), давай рассмотрим пару примеров простеньких программ с багами. Взгляни на следующий фрагмент кода: int proс(char *str){ char buf[100]; ... strcpy(buf,str); ... return 0; } Этот кусок программы резервирует в стеке область памяти объемом в 100 байт для переменной buf, копирует туда строковую переменную str, после чего выполняет еще какие-то действия. На первый взгляд, ничего подозрительного тут нет: если, например, в переменной str будет находиться строка «Форбик, не жмотись, поделись приватным сплойтом к ProFTPD 1.2.9!», она будет скопирована в переменную buf, и при этом не произойдет ничего необычного. Но может возникнуть и нестандартная ситуация: если в переменной str будет находиться строка размером более 100 символов, функция strcpy скопирует из нее первые 100 байт в переменную buf, а оставшимися данными затрет информацию, находящуюся в стеке! Эту атаку обычно называют «переполнением буфера» или «технологией срыва стека». Что хакер может сделать с помощью этой атаки? Дело в том, что в стеке хранится адрес возврата функции – указатель на начало кода, который будет выполняться после завершения работы функции. А если strcpy() перезапишет его, то управление передастся по новому адресу. Хакер пишет на ассемблере специальный код, предназначенный для конкретной операционной системы, который запускает шелл (его называют “шелл-код”). Если сплойту удастся перезаписать адрес возврата так, чтобы он указывал на хакерский код, управление передастся этому коду, в результате чего запустится заветный cmd.exe (или /bin/sh) с привилегиями владельца этой дырявой программы. А вот пример другого бажного куска кода: |