Эксплоит под 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, ссылка на который есть в блок-врезке, эксплоит делает следующее: |