如何使用 PATH 环境变量以普通用户身份读取 /etc/shadow 文件

如何使用 PATH 环境变量以普通用户身份读取 /etc/shadow 文件

这是我接到的项目,但现在我陷入了半途。

在大多数 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")任何可执行文件。lsPATH

ls不一定非要列出目录的内容。相反,它可以是这样的脚本:

#!/bin/sh
cat /etc/shadow

假设您将此脚本放在主目录下的某个目录中,例如,/home/datashark/bin将其添加到您的PATH

PATH="/home/datashark/bin:$PATH"

如果您现在运行ls,您将不会获得目录列表,而是会收到一条错误消息:

cat: /etc/shadow: Permission denied

但是如果你运行bad_lssystem("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)。

相关内容