Linux SUID提权还有哪些隐藏技巧?
权限提升实战:Windows 与 Linux 提权技巧
在实际渗透过程中,SUID 文件往往是权限提升的第一块敲门砖。公开的 find / -perm -4000 -type f 2>/dev/null 能快速列出候选,但真正的价值藏在文件属性的细节与系统配置的交叉点。
环境变量劫持与 LD_PRELOAD
如果目标 SUID 程序在执行时会读取可控的环境变量(如 PATH、LD_LIBRARY_PATH、LD_PRELOAD),攻击者可以构造恶意共享库并让程序在提升特权后加载它。例如,/usr/bin/sudoedit 在某些发行版中未对 LD_PRELOAD 做过滤,直接执行:
/* malicious.c */
void __attribute__((constructor)) inject() {
setuid(0);
setgid(0);
system("/bin/bash -p");
}
编译后放置在 $HOME/libevil.so,通过 LD_PRELOAD=~/libevil.so sudoedit /etc/passwd 即可获得根 shell。
可写的 SUID 可执行文件
系统管理员偶尔会误把脚本或二进制文件设为 SUID 并赋予写权限。只要文件不是严格的只读,利用 echo 'exec /bin/bash -p' > /tmp/payload; chmod +x /tmp/payload; /usr/local/bin/suidbinary /tmp/payload 即可让二进制在特权上下文中执行自定义代码。
/proc/self/exe 与软链接
/proc/self/exe 代表当前进程的可执行文件路径。若 SUID 程序在内部调用 execve("/proc/self/exe", …),攻击者可以在 /tmp 创建同名软链接指向任意可执行文件,然后利用 chmod u+s /tmp/mylink 触发特权执行。
Core Dump 与 ptrace
许多 linux 发行版默认开启 core dump,且对 SUID 程序不做限制。通过 ulimit -c unlimited 触发崩溃后,生成的 core 文件保留了进程的完整内存映像。使用 gdb -c core 可以直接在根权限上下文中修改寄存器或注入 shellcode,随后 kill -CONT <pid> 恢复执行。若系统禁用了 core,ptrace 仍可在拥有 CAP_SYS_PTRACE 的 SUID 程序上挂载调试器,实现同样的效果。
通过 cron 与 /etc/sudoers 的间接提升
有些机器把用户可写目录加入了 cron 的 * * * * * user /path/to/script,而该脚本本身是 SUID root。攻击者只需把恶意二进制放入该目录,cron 在每分钟触发时即以 root 权限执行。类似地,/etc/sudoers 中若出现 NOPASSWD: /usr/local/bin/backup,而 backup 调用了外部可控程序(如 tar),则可以在 tar 参数中注入 ; /bin/bash -p 达成提权。
结尾的思考
这些技巧并非凭空出现,往往是系统管理员在便利性与安全性之间的妥协留下的缝隙。细致审计 SUID 列表、环境变量、文件写权限以及系统服务的调用链,往往比盲目暴力更能捕获隐藏的提权窗口。只要保持对 linux 权限模型的深入理解,下一次的提权路径或许就在不经意的软链接或一次意外的 core dump 中悄然显现。

参与讨论
LD_PRELOAD 那个坑我踩过,sudoedit 确实能绕过去。