
Моя цель — прописать в /etc/passwd повышение привилегий до root.
Я сгенерировал пароль «test1» для нового пользователя root: openssl passwd test1
и использую echo для добавления новой записи в файл /etc/passwd:sudo echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd
Но когда я выполняю эту последнюю команду, мне сообщается, что у меня нет разрешения на это:bash: /etc/passwd: Permission denied
но когда я использую команду sudo nano /etc/passwd
и копирую root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash
в конец файла, это работает!
В чем проблема с echo
командой?
решение1
На этот вопрос уже ответили в комментариях, но немного подробнее:
sudo echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd
переводится как:
- Дайте команду bash (без повышенных прав) открыть файл /etc/passwd для записи
- Дайте указание bash (еще не повышенным привилегиям) запустить команду
sudo
с некоторыми аргументами и использовать дескриптор файла из шага 1 в качестве стандартного вывода- Дайте команду sudo (которая имеет setuid root) для запуска команды
echo
с некоторыми аргументами.- Дайте команду echo (запущенной от имени root, и обратите внимание, что это, скорее всего, будет что-то вроде /usr/bin/echo, хотя обычно
echo
будет вызываться встроенная команда оболочки) и унаследуйте stdout от sudo, чтобы вывести текст на stdout - Работа сделана, эхо уходит.
- Дайте команду echo (запущенной от имени root, и обратите внимание, что это, скорее всего, будет что-то вроде /usr/bin/echo, хотя обычно
- Работа сделана, sudo завершается; ничего не остается работающим от имени root.
- Дайте команду sudo (которая имеет setuid root) для запуска команды
- Bash (все еще не повышенные привилегии) закрывает файловый дескриптор в /etc/passwd (очищает очередь записи)
- Bash ждет следующую команду
За исключением, конечно, шага 1, который не выполняется! Bash, не будучи повышенным, не может открыть /etc/passwd для записи. Таким образом, bash: /etc/passwd: Permission denied
никакая часть шагов 2 или 3 не выполняется, включая любые подшаги шага 2.
sudo nano /etc/passwd
работает отлично, поскольку файл для записи открывается процессом с повышенными правами (nano, который наследует привилегии root от sudo).
Если вы хотите использовать echo здесь, вам нужно, чтобы сам bash был повышен. Это можно сделать, явно вызвав bash (или любую другую оболочку) в sudo и затем указав ему, что делать:
sudo bash -c 'echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd'
или эквивалентно в виде трех отдельных команд (последние две из которых даются повышенному экземпляру bash):
sudo bash
echo "root2:rmeF3kdnoRw/U:0:0:root:/root:/bin/bash" >> /etc/passwd
exit