Эксплоит под wu-ftpd kas1e Xakep, номер #052, стр. 052-054-4 1. Обработка введенного хоста. 2. Обработка user/pass (автоматически логинится на этот хост). 3. Обработка операционной системы (какой шеллкод и под какую систему использовать). Естественно, в эксплоите под каждую систему должен быть и свой шеллкод. В нашем случае это 3 шеллкода: char bsdcode[] = /* chroot() code rewritten for FreeBSD by venglin */ char bsd_code_d[]= /* you should call it directly (no jump/call)*/ char linuxcode[]= /* chroot() code */ 4. Обработка смещения на адрес возврата. 5. Обработка выравнивания. 6. Обработка входа в директорию. 7. Обработка нашей 'магической' строки, которую мы будем вводить вместе с SITE EXEC. 8. Сама посылка строки и интерпретация ответа. Разбор сорсов Весь код эксплоита здесь разобрать невозможно, я покажу только структуру, чтобы ты понял, как они пишутся. 'xxxx' - символы обозначения возможных вариантов. 1. Подключаешь различные заголовочные файлы, даешь определения, описываешь переменные, создаешь структуры: #include <xxxxxxx> #define xxxxx "xxxx" char xxx, int xxx, float xxx struct xxxx[]={xxxxx}; 2. Пишешь необходимое количество шеллкодов. Для нашей задачи хватит и одного: char shellcode[]="\xXX\xXX\xXX"; 3. Создаешь функции, которыми ты воспользуешься в главном модуле (функция main()). Это функции обработки аргументов эксплоита и любая другая автоматизация: void xxxx() {xxxxx}; void xxxx(xxxxx) {xxxxx}; 4. Самый главный модуль - main(). В нем используем все созданные тобой функции. Также здесь пишется основное тело эксплоита. a) Чекаешь аргументы при запуске: case 'аргумент 1': testmode=1; break; case 'аргумент 2': offset=atoi(optarg);break; case 'аргумент 3': pass_addr=strtoul(optarg, &optarg,16); break; и т.д. b) Соединяешься с целью (вызов готовой функции). c) Логинишься на ftp и заходишь в свою директорию (также готовая функция). d) Посылаешь свою супермощную строчку: SITE EXEC + адрес, по которому расположен шеллкод, и сам шеллкод. Все это в 'format string' виде. e) После посылки своей строки необходимо пропарсить полученный результат. В данном эксплоите ты делаешь 'uname' и в случае успешного выполнения - 'id'. Вот как это выглядит: char buff[1024], *cmd=getit.islinux?"/bin/uname -a; /usr/bin/id; exit\n" : "/usr/bin/uname -a; /usr/bin/id; exit\n"; И после всего этого посылаешь: send(sock, cmd, strlen(cmd), 0); f) Если в результате всех этих действий ты получил шелл – аллилуйя! Если нет – не расстраивайся, перечитай материал и попробуй еще раз. Сам урл эксплоита дан в блок-врезке. Заключение Надеюсь, эта статья поможет начинающим. Конечно, в ней есть несколько непростых моментов, но для этого и существуют доки. Так что дерзай, пробуй и читай доки, они – рулез. http://packetstormsecurity.org/0006-exploits/wuftpd2600.c - сам эксплоит. http://www.hert.org/papers/format.html - детальное описание format string уязвимости. |