用C语言设置SUID是不够的
出于教学目的,我想在C中设置一个基本命令注入。我有以下代码:用C语言设置SUID是不够的,c,security,debian,code-injection,C,Security,Debian,Code Injection,出于教学目的,我想在C中设置一个基本命令注入。我有以下代码: #include <stdio.h> #include <unistd.h> int main(int argc, char **argv) { char cat[] = "cat "; char *command; size_t commandLength; commandLength = strlen(cat) + strlen(argv[1]) +
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv) {
char cat[] = "cat ";
char *command;
size_t commandLength;
commandLength = strlen(cat) + strlen(argv[1]) + 1;
command = (char *) malloc(commandLength);
strncpy(command, cat, commandLength);
strncat(command, argv[1], (commandLength - strlen(cat)) );
system(command);
return (0);
}
我得到以下结果:
ls -la
total 40
drwxr-xr-x 2 olive olive 4096 Jan 6 13:17 .
drwxr-xr-x 3 olive olive 4096 Jan 6 12:15 ..
-rwsr-sr-x 1 root root 16824 Jan 6 13:17 injectionos
-rw-r--r-- 1 olive olive 415 Jan 6 13:17 injectionos.c
-rwx------ 1 root root 9 Jan 6 12:43 titi.txt
-rw-r--r-- 1 olive olive 9 Jan 6 12:16 toto.txt`
因此,基本上,当SUID设置为1时,我应该能够通过执行以下注入来打开toto.txt和titi.txt文件:
./injectionos "toto.txt;cat titi.txt"
但是执行这个命令时,我在访问titi.txt时获得了一个被拒绝的权限。最后,当我添加一个setuid(geteuid())时代码>在我的代码中,注入正在工作,我可以访问titi.txt文件
考虑到injectionos是以root运行的,titi.txt属于root,我认为这已经足够了,但显然不是。我这里缺少什么?特权被/bin/sh
删除,作为系统()
调用的一部分执行。请参阅bash的手册页和-p
选项
如果外壳启动时有效用户(组)id不相等
对于实际用户(组)id,并且未提供-p选项,则否
启动文件是读取的,shell函数不是从
环境、SHELLOPTS、BASHOPTS、CDPATH和GLOBIGNORE
变量(如果它们出现在环境中)将被忽略,并且
有效用户id设置为实际用户id。如果-p选项为
在调用时提供,启动行为是相同的,但是
未重置有效用户id
从技术上讲,debian默认使用dash
,但它也做同样的事情
因此,shell的默认行为已被调整,以至少在某种程度上减轻这种注入。特权正在被/bin/sh
作为system()
调用的一部分执行。请参阅bash的手册页和-p
选项
如果外壳启动时有效用户(组)id不相等
对于实际用户(组)id,并且未提供-p选项,则否
启动文件是读取的,shell函数不是从
环境、SHELLOPTS、BASHOPTS、CDPATH和GLOBIGNORE
变量(如果它们出现在环境中)将被忽略,并且
有效用户id设置为实际用户id。如果-p选项为
在调用时提供,启动行为是相同的,但是
未重置有效用户id
从技术上讲,debian默认使用dash
,但它也做同样的事情
因此,shell的默认行为已经进行了调整,以至少在某种程度上减轻这种注入。注意:您可以自己看到,它是shell通过在strace下运行整个过程来完成的(以root开始,strace-f su-olive
…)注意:您可以通过在strace下运行整个过程(以root开始,strace-f su-olive
..)自己看到这是shell在做的
./injectionos "toto.txt;cat titi.txt"