Эксплоит под wu-ftpd

kas1e

Xakep, номер #052, стр. 052-054-2


Теперь вкратце о том, что мы имеем относительно %n 'форматера':

1. возможность записи данных по адресу, на который указывает второй аргумент.

2. a) подсчет символов в строке форматирования.

b) подсчет символов в строке с учетом предположительного размера строки форматирования.

Вот, собственно, те нюансы, которые необходимо знать относительно %n - символа форматирования. Осталось понять взаимодействие стека и printf, прежде чем разобрать написание эксплоита.

Объясню, для чего я буду рассматривать взаимодействие функции и стека. Нам нужна возможность двигаться по стеку в поисках информации, такой как адреса возвратов функций (надеюсь, из предыдущих статей ты помнишь, что такое адрес возврата). И вот что получается: ты можешь записывать данные как второй аргумент по адресу (т.е. в стек), ползать по самому стеку и находить адреса возвратов, перезаписываемые адресами наших шеллкодов (опять же, читай предыдущие статьи про переполнения буфера). В итоге получаешь: шеллы, руты и чруты. А теперь рассмотрим пример:

#include <stdio.h>

int main(int argc, char **argv) // берем данные с командной строки

{

int i = 1; // целая переменная i = 1

char buffer[64]; // символьный буфер в 64 байта

char tmp[] = "\x01\x02\x03"; // символьный буфер с 3 байтами

snprintf(buffer, sizeof buffer, argv[1]); // ограничиваем буфер 64 байтами

buffer[sizeof (buffer) - 1] = 0;

//печать размера буфера

printf("buffer : [%s] (%d)\n", buffer, strlen(buffer));

//печать переменной i.

printf ("i = %d (%p)\n", i, &i);

}

Пока что не пытаемся переполнить буфер или перезаписать какие-то данные в стеке, а просто копируем аргумент в символьный массив buffer. На основе этой программки легко понять, что происходит в стеке при использовании snprintf() функции. Откомпилим его и запустим:

# gcc test_stack.c -o test_stack

# ./test_stack haha

buffer : [haha] (4)

i = 1 (bffff674)

Работает, как и запланировано. На рисунке показано, что же происходит со стеком при вызове sprintf().

Я не буду мучить тебя объяснениями, а сразу скажу результат. Используя символы форматирования как аргументы в командной строке, ты можешь читать данные из стека :). За более детальной информацией лучше всего обратиться к соответствующим ссылкам внизу (в блок-врезке). Т.е. ты можешь искать важную информацию, такую как адрес возврата функции (на самом деле можно искать и другое, но об этом в другой раз).

wu-ftpd

Этот ftp демон, написанный в вашингтонском университете (Washington University's ftp server = wu-ftpd), имеет расширенные возможности по сравнению с обычным ftpd. Видимо в результате таких расширений он и приобрел славу одного из самых глючных демонов. Уязвимость, которая будет описана далее, связана с некачественной обработкой команды SITE EXEC. Проблемный участок кода находится в ftpd.c файле, в функции vreply(). Вот как он выглядит:

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

Hosted by uCoz