为何setresuid无法切换权限,生成目标用户shell失败?
问题:SUID程序无法切换到目标用户身份执行shell
编写的代码
期望生成以目标用户身份运行的/bin/sh,代码如下:
#define _GNU_SOURCE #include <stdlib.h> #include <unistd.h> #include <stdio.h> int main(int argc, char **argv, char **envp) { setresgid(getegid(), getegid(), getegid()); setresuid(geteuid(), geteuid(), geteuid()); execve("/bin/sh", argv, envp); return 0; }
权限配置操作
将程序所有者改为目标用户并设置SUID权限:
chown usertarget:globalgroup ./shell chmod 777 ./shell chmod +s ./shell
程序权限显示为:-rwsrwsrwx 1 targetuser globalgroup 7.2K Aug 18 18:21 shell2
实际执行结果
执行程序后,shell仍以当前用户身份运行:
baseuser@machine:/tmp/tata$ id uid=1507(baseuser) gid=1314(globalgroup) groups=1314(globalgroup),100(users) baseuser@machine:/tmp/tata$ ./shell2 ====== WELCOME USER ====== baseuser@machine:/tmp/tata$ id -a uid=1507(baseuser) gid=1314(globalgroup) groups=1314(globalgroup),100(users)
排查方向
- 检查SUID挂载限制:执行
mount | grep /tmp,如果/tmp目录挂载时带有nosuid选项,SUID程序在该目录下不会生效,需将程序移到非nosuid目录测试。 - 验证SUID位有效性:用
stat shell2确认权限字段中的SUID位(-rwsrwsrwx的第一个s)真实有效,部分文件系统或安全配置会阻止SUID生效。 - 排除shell特权重置:/bin/bash等shell会在启动时自动放弃特权(当有效UID与真实UID不一致时),可以临时将代码中的
execve("/bin/sh", ...)替换为execve("/bin/id", (char*[]){"id", "-a", NULL}, envp);,直接验证程序是否成功切换身份。 - 检查硬编码UID的正确性:如果尝试硬编码目标UID无效,确认目标用户的UID是否正确,调用
setresuid时需将三个参数(ruid, euid, suid)都设置为目标用户的UID,例如setresuid(1234, 1234, 1234)(1234替换为targetuser的实际UID)。 - 排查编译链接限制:用
readelf -d shell2 | grep -i suid检查是否存在禁用SUID的链接选项,比如-z nosuid会导致SUID失效。
内容的提问来源于stack exchange,提问作者user19793459
相关产品推荐
相关产品推荐

