Как использовать переменную PATH env для чтения файла /etc/shadow обычным пользователем
Так что это был проект, который я получил, и я застрял на полпути.
В большинстве дистрибутивов Linux (включая Fedora и Ubuntu)
/bin/shна самом деле символическая ссылка на/bin/bash, Чтобы использовать Zsh, нам нужно ссылку/bin/shв/bin/zsh, Следующие инструкции описывают, как изменить оболочку по умолчанию на zsh:
- войдите как root
cd /binrm shln –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).