setuid 程序似乎无法在 TinyCore Linux 中运行 setuid

setuid 程序似乎无法在 TinyCore Linux 中运行 setuid

我想setuid使用 TinyCore Linux live CD 演示程序的漏洞。也就是说,我制作了一个具有特殊权限的特殊程序,以便它作为文件所有者而不是执行用户运行。这是我的步骤:

  1. 创建一个带有安全漏洞的程序(见下文),在我的家庭系统(Ubuntu)中编译它

  2. 仍然在 Ubuntu 中创建程序setuid并设置文件的所有者

  3. 解压Tiny Core live CD,将其中存在漏洞的程序复制到chroot其中

问题是该程序似乎没有以setuid.无论是在chroot环境中,还是在完成的重制图像中。在 Ubuntu 中它可以工作,但我需要它在 Tiny Core 中工作。该程序在 Tiny Core 中运行,但不是作为所有者运行,尽管是setuid.

程序源码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
  printf("Current time: ");
  fflush(stdout);
  system("date");
  return 0;
}

构建命令:

gcc -o prog prog.c

使其设置为 setuid:

sudo chown 1200.1200 prog
sudo chmod 4755 prog

编写一个date脚本来演示该漏洞:

#!/bin/sh

echo hello > /tmp/test.txt
ls -l /tmp/test.txt

使精心设计的date脚本可执行并暴露漏洞:

chmod +x date
PATH=.:$PATH ./prog

在 Ubuntu 中,正如预期的那样,它创建的/tmp/test.txt所有者为 1200。但是当我chroot进入 live cd 环境时,它在那里不起作用,可执行文件运行但不作为文件所有者运行。如果我完成重新制作并创建 live cd 并启动它,它也不起作用,即使该文件具有正确的所有者、组和权限4755。我缺少什么?

如果您想创建chroot环境,请从以下位置下载 8MB live cdhttp://distro.ibiblio.org/tinycorelinux/downloads.html并按照以下步骤操作:

sudo mount Core-current.iso /mnt
mkdir /tmp/extract
cd /tmp/extract
zcat /mnt/boot/core.gz | sudo cpio -i -H newc -d

使用以下命令将易受攻击的程序复制到chroot环境中:

sudo cp -a /path/to/prog /tmp/extract/tmp
sudo cp /path/to/date /tmp/extract/tmp

chroot在那里并测试漏洞:

sudo chroot /tmp/extract /bin/sh
su - tc
cd /tmp
PATH=.:$PATH ./prog

我的最终目标当然是让它在现场 CD 上运行。如果它在 中不起作用也没关系chroot,这似乎只是一个合适的首次测试,而无需重新打包映像并启动到其中。

答案1

setuidTinyCore 中没有任何问题。然而,问题中的简单程序在 TinyCore 中利用起来并不那么简单。

system调用使用 调用指定的命令/bin/sh -c。在 TinyCore 中,/bin/sh是 的符号链接busybox ash,它会放弃setuid权限。因此,即使您编写了一个 shell 脚本,甚至是一个执行恶意操作的二进制文件,并将其命名date为欺骗易受攻击的程序来运行它,它也不会以setuid.原始程序将运行setuid,但不会运行system.

顺便说一句,自版本 2 起,标准在调用时bash也会删除特权。但是,问题中描述的漏洞可以在 Debian 及其衍生版本中得到证明,因为显然 Debian 的版本不会删除特权。 (显然这是有充分理由的,但我没有研究。)setuid/bin/shbash

最后,我可以通过将程序更改为来规避放弃特权的行为:

int main(int argc, char **argv)
{
  // circumvent busybox ash dropping privileges
  uid_t uid = geteuid();
  setreuid(uid, uid);

  printf("Current time: ");
  fflush(stdout);
  system("date");
  return 0;
}

答案2

也许某些安全策略(SELinux、AppArmor,...)正在生效,并且不允许 SUID 到非列出的可执行文件?或者只是(出于纯粹的理智)/tmp安装了nosuid?

相关内容