我想setuid
使用 TinyCore Linux live CD 演示程序的漏洞。也就是说,我制作了一个具有特殊权限的特殊程序,以便它作为文件所有者而不是执行用户运行。这是我的步骤:
创建一个带有安全漏洞的程序(见下文),在我的家庭系统(Ubuntu)中编译它
仍然在 Ubuntu 中创建程序
setuid
并设置文件的所有者解压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
setuid
TinyCore 中没有任何问题。然而,问题中的简单程序在 TinyCore 中利用起来并不那么简单。
该system
调用使用 调用指定的命令/bin/sh -c
。在 TinyCore 中,/bin/sh
是 的符号链接busybox ash
,它会放弃setuid
权限。因此,即使您编写了一个 shell 脚本,甚至是一个执行恶意操作的二进制文件,并将其命名date
为欺骗易受攻击的程序来运行它,它也不会以setuid
.原始程序将运行setuid
,但不会运行system
.
顺便说一句,自版本 2 起,标准在调用时bash
也会删除特权。但是,问题中描述的漏洞可以在 Debian 及其衍生版本中得到证明,因为显然 Debian 的版本不会删除特权。 (显然这是有充分理由的,但我没有研究。)setuid
/bin/sh
bash
最后,我可以通过将程序更改为来规避放弃特权的行为:
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?