Как использовать переменную PATH env для чтения файла /etc/shadow обычным пользователем

Так что это был проект, который я получил, и я застрял на полпути.

В большинстве дистрибутивов Linux (включая Fedora и Ubuntu) /bin/sh на самом деле символическая ссылка на /bin/bash, Чтобы использовать Zsh, нам нужно ссылку /bin/sh в /bin/zsh, Следующие инструкции описывают, как изменить оболочку по умолчанию на zsh:

  • войдите как root
  • cd /bin
  • rm sh
  • ln –s zsh sh

system(const char *cmd) Функция библиотеки может использоваться для выполнения команды в программе. Путь system(cmd) работает призвать /bin/sh программа, а затем позволить программе оболочки для выполнения cmd, Из-за вызванной программы оболочки, вызывая system() в рамках программы Set-UID чрезвычайно опасно. Это связано с тем, что на реальное поведение программы оболочки могут влиять переменные среды, такие как PATH; эти переменные среды находятся под контролем пользователя. Изменяя эти переменные, злонамеренные пользователи могут контролировать поведение программы Set-UID.

Программа Set-UID ниже должна выполнить /bin/ls команда; однако программист использует только относительный путь для команды ls, а не абсолютный путь:

int main () 
{
    (система "LS"); вернуть 0;
}

Войдите в систему как root, запишите эту программу в файл с именем bad_ls.c, скомпилируйте это (используя gcc –o bad_ls bad_ls.c) и скопируйте исполняемый файл как программу Set-UID в /tmp с разрешениями 4755.

Это хорошая идея, чтобы позволить обычным пользователям выполнять /tmp/bad_ls программа (принадлежит root) вместо /bin/ls? Опишите атаку, с помощью которой обычный пользователь может манипулировать PATH переменная окружения для того, чтобы прочитать /etc/shadow файл.

Я успешно изменил оболочку по умолчанию на zsh, создал исполняемый файл bad_lsи скопировал его в /tmp с разрешения ID 4755.

Опишите атаку, с помощью которой обычный пользователь может манипулировать PATH переменная окружения для того, чтобы прочитать /etc/shadow файл.

Вот где я застрял.

После запуска bad_ls файл, я изменяю PATH Переменная env для указания на текущий каталог с помощью кода

export PATH =.:$PATH 

Если я бегу ls -a /etc/shadowвсе, что я получаю, это: /etc/shadow

Я был бы очень благодарен, если бы вы могли направить меня в этой проблеме.

1 ответ

Проблема в том, что этот случай system("ls") будет запускать любой исполняемый файл с именем ls он находит первым в наборе пользователя PATH,

это ls не обязательно перечислять содержимое каталога. Вместо этого это может быть такой скрипт:

#!/bin/sh
cat /etc/shadow

Допустим, вы разместили этот скрипт где-нибудь в каталоге, например, под вашим домашним каталогом. /home/datashark/bin и добавьте это к вашему PATH:

PATH="/home/datashark/bin:$PATH"

Если вы сейчас бежите ls, вы не получите список каталогов, вместо этого вы получите сообщение об ошибке:

cat: /etc/shadow: Permission denied

Но если вы бежите bad_ls, system("ls")-call там также будет искать исполняемый файл с именем ls в вашем PATH и найти и /home/datashark/bin/ls вместо /bin/ls, Как bad_ls запускается с повышенными правами root, скрипт с именем ls будет (на некоторых системах - см. ниже) также работать с повышенными правами доступа root и команда тоже cat /etc/shadow, который будет печатать содержимое /etc/shadow,

Так что для root плохая идея разрешать запускать обычным пользователям bad_ls до тех пор, пока у него есть привилегии SUID, потому что он будет запускать любую программу с именем ls что на первом месте у пользователя PATH,


Замечания:

Это не работает на каждой системе Linux. Например, не будет, согласно man 3 system, работать на системах, где /bin/sh является или ссылки на (не исправлено) bash версии 2 или новее (2.0 был выпущен в 1996 году). bash сбрасывает привилегии при запуске. Это не только влияет на ls сценарий, но и вызов system() до того, как system() передает команду /bin/sh,

Может работать на других дистрибутивах, которые не используют bash как /bin/sh, Вопреки информации, изложенной в проекте, Ubuntu (как и Debian и, вероятно, большинство производных от них) использует dash и не bash как /bin/sh и делает это с версии 6.10 (с 2006 года! Смотрите эту страницу в Ubuntu Wiki). Похоже, что с последними версиями Ubuntu (по крайней мере, 16.04) dash и поэтому /bin/sh пропатчены для автоматического удаления разрешений SUID (ищите "priv" в man dash).

Другие вопросы по тегам