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

kas1e

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


void vreply([...], *fmt, [...]);

{

char buf[BUFSIG];

[...]

snprintf(buf, sizeof(buf), fmt);

[...]

Как видишь, в функцию snprintf передается указатель (fmt) на строку, передающуюся пользователем (строку пересылает пользователь через команду site exec, это расположено в site_exec() функции файла ftpcmd.c). И что здесь? А здесь пользователь может послать вместе с site exec нужные символы форматирования, которые соответствующим образом интерпретируются, и результатом этих действий будет получение рутшелла. К примеру, если злодей сделает такое: SITE EXEC %x %x %x %x, то получит из стека wu-ftpd - "31 bffff53c 1ee 6d". Все довольно просто. Передаем определенные символы форматирования и можем делать что хотим ;).

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

SITE EXEC AA@e[][]%277$s <-- мы посылаем

200-aa@e[][]user --> ответ

200 (end of 'aa@e[][]%277$s')

SITE EXEC AApj[][]%277$s <-- мы посылаем

200-aapj[][]$1$P3aRAfUA$ATCfz9G/KGUiKn9NZSV6M1

200 (end of 'aapj[][]%277$s') --> ответ

Вот что происходит. Мы залогинились под пользователем 'user', передали через site exec определенную строку формата и получили хэш своего пароля. Единственное, что здесь может быть неясно, это синтаксис строки форматирования. Давай рассмотрим его:

Первые два символа "AA" необходимы, поскольку смещение не кратно 4 (а оно должно быть кратно). Далее у нас в первом случае @е [][], а во втором pj[][] - это соответствующие символьные представления для указателей 0x08086a70 и 0x08086540 на поля pw_name и pw_passwd в структуре passwd wu-ftpd (struct passwd *pw). Т.е. это заранее известные значения. И заканчивается все %277$s. Это непосредственно сам форматный модификатор.

wu-ftpd remote root exploit

Вот что необходимо для написания полноценного эксплоита:

1. Шеллкод (о том, как пишется шеллкод, читай в предыдущих номерах). Проще работать сразу с шеллкодом, переведенным в 'format string' вид.

2. Адрес на этот шеллкод, который также переведен в 'format string'.

3. Непосредственно модификаторы. Им мы скажем: "Вот этот шеллкод записать по такому-то адресу".

Конечно, в полноценных эксплоитах все это делается автоматически. Добавляются всякие ключи, вывод гритсов/литсов и тому подобное. Например, в случае с remote root, ссылка на который есть в блок-врезке, эксплоит делает следующее:

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

Hosted by uCoz