Фатальная проверка Master-lame-master Хакер, номер #071, стр. 071-052-3 Скачав сплоит себе на винт (www.security.nnov.ru/files/mremap_pte.c), я открыл его для чтения и стал просматривать исходный код. К моему счастью, путь к шеллу был оформлен не в шеллкоде, а в отдельной переменной, что значительно упрощало мою работу. Мне понадобилось лишь видоизменить значение переменной launch на /tmp/cmd. Когда я этого добился, я создал во временном каталоге файл cmd со следующим содержанием: #!/bin/sh /bin/chown root:root /tmp/exec /bin/chmod 0755 /tmp/exec touch /owned Теперь я бережно залил два хакерских файла в каталог /tmp. Для этого мне пришлось воспользоваться командой curl, поскольку любимого wget’а на сервере не было. Я начал собирать эксплойт, но тут возникла неожиданная проблема - он почему-то не захотел компилироваться. Мне было влом разбираться, в чем дело, и я выполнил это нехитрое действие на другой машине, а затем просто портировал файл. После запуска злостного munremap'а в корне успешно создался файл /owned. Можно сказать, что все шаги моего злодейского коллеги уже были раскрыты, но азарт заставил меня доработать метод выполнения рутовых команд через WWW. Пишем свой интерпретатор Ты, наверное, не понял, почему в листинге скрипта /tmp/cmd промелькнул загадочный /tmp/exec. Дело в том, что мне захотелось написать собственный интерпретатор, при обращении к которому выполнялась любая команда от пользователя root. Для этого мне пришлось написать одну элементарную программу на си, а затем скомпилить ее в /tmp/exec. Прога должна обладать всеми функциями интерпретатора, а запрос читать из произвольного файла. Изучи исходник моего творения, быть может, ты сам не раз к нему обратишься :). Exec.c - рутовый интерпретатор #include <stdio.h> int main() { FILE *file; /* Файловая переменная */ char cmd[200]; /* 200 символов для команды должно хватить за глаза */ setuid(0); setgid(0); /* Изменяем уид на 0 */ file=fopen("/tmp/c","r"); fgets(cmd,sizeof(cmd),file); /* Вытаскиваем из файла /tmp/c рутовую команду */ system(cmd); /* И выполняем ее */ fclose(file); } Можно было поступить проще и оформить команду в виде аргумента к шеллу, но мне удобнее записывать запрос во временный файл. Оставалось залить мой интерпретатор в /tmp/exec.c и собрать самопал компилятором. Теперь, когда мне требовалось выполнить рутовую команду, я забивал ее в файл /tmp/c, а затем запускал /tmp/exec. Перед воплощением идеи в действительность я повторно стартанул эксплойт, для того чтобы он засуидил /tmp/exec. Ставим капканы Даже после проверки метода на практике я не остановился на достигнутом. Мне хотелось удивить приятеля и доказать ему, что даже через Web хакер может натворить ужасные вещи. Я вбил в качестве команды строку /etc/init.d/iptables stop, которая должна деактивировать брандмауэр. Переварив злую команду, скрипт радостно сообщил, что таблицы iptables стали пустыми :). Далее я прителнетился на 22 порт, и... сервис без проблем выдал свой баннер. Остальные действия я проводил на автомате: создал юзера с 0 уидом (простой дозаписью в /etc/passwd и /etc/shadow), а затем залез по SSH в систему. Надо отметить, что опция PermitRootLogin была почему-то включена и это позволило мне проникнуть на сервер под суперюзером. |