![如何使用 PATH 环境变量以普通用户身份读取 /etc/shadow 文件](https://linux22.com/image/1057811/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20PATH%20%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E4%BB%A5%E6%99%AE%E9%80%9A%E7%94%A8%E6%88%B7%E8%BA%AB%E4%BB%BD%E8%AF%BB%E5%8F%96%20%2Fetc%2Fshadow%20%E6%96%87%E4%BB%B6.png)
这是我接到的项目,但现在我陷入了半途。
在大多数 Linux 发行版(包括 Fedora 和 Ubuntu)中,
/bin/sh
实际上是 的符号链接/bin/bash
。要使用 zsh,我们需要链接/bin/sh
到/bin/zsh
。以下说明介绍了如何将默认 shell 更改为 zsh:
- 以 root 身份登录
cd /bin
rm sh
ln –s zsh sh
库
system(const char *cmd)
函数可用于在程序中执行命令。其system(cmd)
工作方式是调用/bin/sh
程序,然后让 shell 程序执行cmd
。由于调用了 shell 程序,system()
在 Set-UID 程序中调用是极其危险的。这是因为 shell 程序的实际行为可能受到环境变量的影响,例如PATH
;这些环境变量在用户的控制之下。通过更改这些变量,恶意用户可以控制 Set-UID 程序的行为。下面的 Set-UID 程序应该执行该
/bin/ls
命令;但是,程序员仅使用 ls 命令的相对路径,而不是绝对路径:int 主要() { 系统(“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
我已成功将默认 shell 更改为 zsh,创建了可执行文件bad_ls
,并将其复制到/tmp
权限 ID 为 4755。
PATH
描述普通用户可以操纵环境变量来读取文件的攻击/etc/shadow
。
这就是我陷入困境的地方。
运行文件后bad_ls
,我PATH
使用代码将环境变量更改为指向当前目录
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
。
bad_ls
因此,只要root 具有 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
)。