替代准系统上的 su/sudo

l0b*_*0b0 6 bash su privileges

我想chroot在 Solaris 上的准系统监狱中运行一些单元测试。没有suorsudo,并且su(with libpam.so.1)的副本只返回退出代码 1,没有任何输出,带或不带参数。是否有一些简单的方法可以在这样的系统上以非 root 用户身份运行 Bash 脚本?也许 setuid 或包装脚本?

Gil*_*il' 4

如果我理解正确的话,您只需要从suroot 切换到其他用户即可。尝试复制一个su二进制文件(它不需要 setuid root),但我不知道这是否适用于 Solaris。或者编译一个小的 C 程序,删除权限并执行命令。

\n\n

这是一个小的 \xe2\x80\x9cdown-only\xe2\x80\x9d su。经过最低限度的测试。应该在 Solaris 和 *BSD 下按原样编译;-D_BDS_SOURCE在 Linux下,您需要#include <grp.h>注释掉对常见但非标准setgroups. 例如运行sugexec UID GID bash /path/to/script(您必须传递数字用户和组 ID,以避免依赖于 chroot 中可能不可用的任何形式的用户数据库)。

\n\n
#include <errno.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <sys/types.h>\n#include <unistd.h>\n\nvoid die(char *argv0, char *obj, char *msg) {\n    if (msg == NULL) msg = strerror(errno);\n    fprintf(stderr, "%s: %s: %s\\n", argv0, obj, msg);\n    exit(127);\n}\nint main(int argc, char *argv[]) {\n    uid_t uid;\n    gid_t gid;\n    char *endp;\n    /* Command line parsing */\n    if (argc <= 3) {\n        fprintf(stderr, "Usage: %s UID GID COMMAND [ARG...]\\n",\n                argv[0]==NULL ? "sugexec" : argv[0]);\n        exit(127);\n    }\n    uid = strtoul(argv[1], &endp, 0);\n    if (*endp) die(argv[0], argv[1], "Bad uid");\n    gid = strtoul(argv[2], &endp, 0);\n    if (*endp) die(argv[0], argv[2], "Bad gid");\n    /* Drop to specified user and group */\n    if (setgid(gid)) die(argv[0], "setgid", NULL);\n    if (setgroups(0, NULL)) die(argv[0], "setgroups", NULL);\n    if (setuid(uid)) die(argv[0], "setuid", NULL);\n    /* Execute the command */\n    execvp(argv[3], argv + 3);\n    die(argv[0], argv[3], NULL);\n}\n
Run Code Online (Sandbox Code Playgroud)\n