Буквально пару часов назад участвовал в совершенно случайно инициированном соревновании по повышению локальных привилегий до уровня Root на сервере с локальным доступом. Я подумал, и решил вынести некоторую информацию в блог под неявным заголовком «для новичков». Надеюсь, эти знания помогут расширить Вам свой кругозор.
Итак, представим, что у Вас есть локальный доступ к Linux-системе. Не столь важно как Вы его получили: с помощью SQL Инъекций, PHP Инъекций, File Inclusion, Directory traversal или просто подсмотрели пароль, внимательно держа в руках профессиональный бинокль.
Допустим, что гипотетически у Вас есть желание получить привилегии пользователя Root на этом сервере. Этого можно добиваться совершенно различными способами, и я опишу наиболее стандартный ход действий — через эксплойты. Естественно, если у Вас на руках нет 0-day уязвимости, то шансы взломать систему с последними обновлениями и заплатками — очень низки.
Шаг первый. Узнаем параметры системы.
Прежде чем приступить к дальнейшим действиям, мы должны точно знать с какой системой имеем дело. Для этого обычно хватает стандартной команды uname. В моем случае вывод команды был следующим:
[v673@localhost ~]$ uname --all Linux localhost 2.6.29.1-desktop586-4mnb #1 SMP Mon Apr 20 17:37:07 EDT 2009 i686 Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz GNU/Linux
Если Вы забыли параметры — легко можно обратиться к помощи, благодаря параметру --help:
[v673@localhost ~]$ uname --help Использование: uname [КЛЮЧ]... Печатает определенные сведения о системе. Если КЛЮЧ не задан, подразумевается -s. -a, --all напечатать всю информацию, в следующем порядке, кроме -p и -i, если они неизвестны: -s, --kernel-name напечатать имя ядра -n, --nodename напечатать имя машины в сети -r, --release напечатать номер выпуска операционной системы -v, --kernel-version напечатать версию ядра -m, --machine напечатать тип оборудования машины -p, --processor напечатать тип процессора или "неизвестно" -i, --hardware-platform напечатать тип аппаратной платформы или "неизвестно" -o, --operating-system напечатать имя операционной системы --help показать эту справку и выйти --version показать информацию о версии и выйти Report uname bugs to bug-coreutils@gnu.org GNU coreutils home page: <http://www.gnu.org/software/coreutils/> General help using GNU software: <http://www.gnu.org/gethelp/> Report uname translation bugs to <http://translationproject.org/team/>
Именно по этим параметрам мы и будем искать подходящий эксплойт. Эксплойты могут использовать уязвимости как в ядре, так и в каком-нибудь установленном приложении, обычно запущенном от имени root`а.
Шаг второй. Находим эксплойт.
Наша задача: работать как можно меньше и получить результат как можно быстрее. Эксплойты — это уже готовые, любезно написанные программы, скомпилировав и выполнив которые, можно успешно, и что самое главное быстро, скомпрометировать систему.
Сейчас я не собираюсь учить Вас поиску эксплойтов. Скажу лишь, что для этого никаких выдающихся навыков не требуется. В нашем случае подойдет поисковый запрос вроде «Local Root Exploit 2.6.29.1». Помните, что большинство публичных эксплойтов можно найти на milw0rm.com.
Теперь давайте создадим пустой файл, в котором и будет храниться программный код нашего эксплойта:
[v673@localhost ~]$ touch exploit.c
Шаг третий. Убираем защиту от скрипт-киддисов.
Ради защиты от детей(ну и взрослых), которые ничего не понимают в программировании, и слепо используют готовые эксплойты лишь ради наживы, пороча добрые имена компьютерных специалистов, некоторые разработчики начали вставлять в код явные ошибки. Ошибки, которые обычный программист распознает без проблем.
Поэтому если первая компиляция свалилась в ошибку — не переживайте, просто где-то в коде она допущена специально. Например, добавили лишние символы в объявлении функции:
... unsigned int uid, gid; void Cr0sSv673 kernel_code() { ... }
Теперь давайте откроем файл через редактор vi, нажмем кнопку Insert на клавиатуре, для начала редактирования, и скопируем код эксплойта:
[v673@localhost ~]$ vi exploit.c ...
После завершения процесса копирования и редактирования нажимаем Esc и вводим «:qw!» в vi-консоле. Чтобы vi-консоль появилась, нажмите двоеточие. Вот и все — данные успешно сохранились в файле.
Шаг четвертый. Компилируем!
Процесс компилирования можно осуществлять с различными параметрами. Если отдельно в комментариях к эксплойту не указаны другие рекомендации, используйте следующий способ по умолчанию:
[v673@localhost ~]$ gcc exploit.c -o exploit
Шаг пятый. Запускаем!
Если автор эксплойта отдельным образом не описал дополнительные параметры для запуска, то используйте способ по умолчанию:
[v673@localhost ~]$ ./exploit
Хочу также заметить, что некоторые создатели эксплойтов предусматривают получение Root-привилегий во время компилирования.
К черту шаги! Наслаждаемся результатом!


Если все прошло успешно, то в результате при вводе команды id. Вы должны увидить что-то вроде этого:
[root@localhost ~]# id uid=0(root) gid=0(root) группы=0(root)
Или, если процесс повышения привилегий не сработал, Вы должны увидеть себя:
[v673@localhost ~]$ id uid=500(v673) gid=500(v673) группы=75(apache),500(v673)
Если эксплойт не сработал — не расстраивайтесь, а смело переходите к другому, пока не исчерпаете все возможные варианты. Но, конечно же, лучше пишите сами(или покупайте?) эксплойты, никому не показывайте их(кроме меня, конечно) и легко поднимайте свои привилегии даже на полностью обновленной и актуальной системе.
Есть мысли на этот счет:
Ничего нового, но написано хорошо. Футболки понравились)
Спасибо за отзыв, mr.The! Все так и планировалось — руководство для новичков. Футболки случайно в Интернете нашел, тоже понравились, и захотел поделиться.
Переносы строк в объявлении функций не влияют на компиляцию :)
Вы же знаете Си?
Я думал, что влияют. Спасибо, что поправили. Но самое интересное заключается в том, что после этого эксплойты начинали компилироваться.
Это полный рут, чувак!
Тестирование email-доставки объявляю открытым!