2

我正在使用 Ubuntu 12.04 (64bit) 做一些关于 Linux 权限的实验。

我创建了以下程序。

#include<stdio.h>
#include <unistd.h>    
main(){   
    printf("euid=%4d uid=%4d egid=%4d gid=%4d\n", geteuid(), getuid(),getegid(),getgid());
    system("id");
}

我将其可执行文件设置为 setuid/setgid 文件:

-rws--s--x 1 root  root   8638 Apr 28 02:00 pt*

当它从非特权用户运行时,我得到输出:

euid=   0 uid=1001 egid=   0 gid=1001
uid=1001(test1) gid=1001(test1) euid=0(root) egid=0(root) groups=0(root),1001(test1)

我希望在使用 system() 系统调用之后,root 权限会被删除(这就是 shellcode 通常使用 execv() 而不是 system() 的原因),但事实并非如此。

你能解释一下为什么吗?

谢谢你。

4

2 回答 2

1

system()不会删除(或添加或更改)任何特权。它没有记录这样做,并且不应该有任何关于它的实现或使用表明它这样做的信息。我不知道你为什么认为它会。

我假设“shellcodes”(恶意利用代码)更喜欢execv()以下两个原因:

  • system()的功能是派生一个新进程,使用给定的命令行生成一个 shell,然后等待它完成。shellcode 不需要 fork 一个进程并等待它,也不需要引入额外的 shell 来解析命令行。
  • execv(2)是系统调用,system(3)而是库函数。从外部引入的代码需要正确猜测库函数的实现所在的地址才能调用它。但是要调用系统调用,他们只需要系统调用号并调用正确的魔法(特定于平台)机器指令以捕获内核。
于 2013-04-28T02:45:53.083 回答
0

system(id)在内部执行为/bin/sh -c id.

如果从 setuid 二进制文件(对于 bash 版本 >=2 )执行,这将放弃提升的权限。

/bin/sh -c -p id带有额外权限的呼叫-p将维持提升的特权,但system()呼叫没有该标志。

那么,如何解决这个问题?使用execv()libc 中的调用(而不是 execv() 系统调用)-如果您对系统具有目录访问权限-您可以设法创建一个执行需要提升权限的任务的二进制文件,并使用 execv() 执行它

于 2021-05-28T07:21:57.500 回答