我的目标是写入 /etc/passwd 以将权限提升到 root。
我为新的 root 用户生成了密码“test1”: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 中的文件描述符作为 stdout- 指示 sudo (setuid root)
echo
使用一些参数 运行命令- 指示 echo(以 root 身份运行,注意这可能类似于 /usr/bin/echo,而通常
echo
会调用 shell 内置命令),并从 sudo 继承 stdout)将一些文本输出到 stdout - 任务完成,echo 退出
- 指示 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,从 sudo 继承 root 权限)是打开文件进行写入的进程。
如果您想在这里使用 echo,则需要提升 bash 本身的权限。这可以通过在 sudo 中显式调用 bash(或任何其他 shell)然后告诉它要做什么来完成:
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