Как использовать переменную 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
).