Эксплоит под 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 уязвимости.

Назад на стр. 052-054-3  Содержание

Hosted by uCoz