Linux提权-04 capabilities
文章目录
- 前言
- 1. 为什么需要 Capabilities?
- 2. Capabilities 的常见类型
- 3. 配置
- 4. Capabilities 如何导致提权?
- 4.1 错误配置 Capabilities
- 4.2 滥用 CAP_SYS_PTRACE
- 4.3 滥用 CAP_SETUID
- 4.4 容器环境中的 Capabilities
- 5. 利用CAP_SETUID提权
- 6. 防御 Capabilities 滥用
- 7. 参考
前言
这年头,估计ai比博客有用多了,不会的东西追着deepseek问就行了,实在不行再来找文章看吧。
在 Linux 中,Capabilities(能力) 是一种细粒度的权限控制机制,用于将传统 root
用户的超级权限拆分为多个独立的权限单元。它的核心目标是减少程序对 root
权限的依赖,遵循最小权限原则,从而降低系统安全风险。
1. 为什么需要 Capabilities?
传统的 Linux 权限模型中,一个进程要么以普通用户权限运行,要么以 root
权限运行(通过 SUID
或 sudo
)。这种“全有或全无”的权限模型存在安全风险:
- 过度授权:即使程序只需要一个特权操作(如绑定低端口),也必须以
root
身份运行。 - 提权漏洞:一旦程序存在漏洞,攻击者可能通过它获得完整的
root
权限。
Capabilities 允许将 root
的特权拆分为多个独立的能力,仅赋予程序完成特定任务所需的最小权限。
2. Capabilities 的常见类型
Linux 定义了约 40 种能力,以下是部分关键能力:
能力名称 | 描述 |
---|---|
CAP_DAC_OVERRIDE | 绕过文件/目录的读、写、执行权限检查。 |
CAP_DAC_READ_SEARCH | 绕过文件的读权限检查和目录的搜索权限检查。 |
CAP_SYS_ADMIN | 执行系统管理操作(如挂载文件系统、修改网络配置等)。 |
CAP_SYS_PTRACE | 允许 ptrace 调试其他进程(可能用于注入代码)。 |
CAP_NET_BIND_SERVICE | 绑定到低于 1024 的端口(如 HTTP 的 80 端口)。 |
CAP_SETUID | 允许修改进程的 UID(用户身份切换)。 |
3. 配置
配置 Capabilities(能力) 主要通过 setcap 和 getcap 命令实现,允许为特定程序分配或移除细粒度的特权。以下是详细的配置方法和示例:
-
setcap:为文件(可执行程序)设置 Capabilities。
-
getcap:查看文件已配置的 Capabilities。
-
capsh:查看当前进程的 Capabilities(调试用)
1. 检查现有 Capabilities
查看系统中所有被赋予 Capabilities 的文件:
# 递归搜索所有文件的能力(忽略错误提示)
getcap -r / 2>/dev/null
# 查看指定文件的能力
getcap /path/to/program
2. 分配 Capabilities
语法:
sudo setcap <capability>+<flags> /path/to/program
<flags> 的取值:
e:Effective(能力是否生效)。
i:Inheritable(能力可被子进程继承)。
p:Permitted(允许进程使用该能力)。
示例 1:允许普通用户绑定低端口(如 80)
# 赋予程序 CAP_NET_BIND_SERVICE 能力
sudo setcap cap_net_bind_service+ep /path/to/webserver
程序无需以 root 身份运行即可绑定 80 端口。
示例 2:允许 ping 命令使用原始套接字
# 赋予 ping 命令 CAP_NET_RAW 能力(通常已默认配置)
sudo setcap cap_net_raw+ep /bin/ping
3. 移除 Capabilities
移除所有能力:
sudo setcap -r /path/to/program
4. Capabilities 如何导致提权?
如果程序被错误地赋予不必要的 Capabilities,攻击者可能利用这些能力进行提权。以下是常见场景:
4.1 错误配置 Capabilities
- 案例:普通用户拥有的程序被赋予
CAP_DAC_OVERRIDE
能力。# 错误地为程序赋予能力 sudo setcap cap_dac_override+ep /path/to/program
- 攻击:攻击者可以绕过文件权限限制,读取或修改
/etc/shadow
等敏感文件。
- 攻击:攻击者可以绕过文件权限限制,读取或修改
4.2 滥用 CAP_SYS_PTRACE
- 若程序拥有
CAP_SYS_PTRACE
,攻击者可通过调试高权限进程(如root
进程)注入恶意代码,获取完整root
权限。
4.3 滥用 CAP_SETUID
- 若程序拥有
CAP_SETUID
,攻击者可利用它修改进程的 UID 为0
(即root
):// 伪代码示例:将进程 UID 设置为 root setuid(0);
4.4 容器环境中的 Capabilities
- 在 Docker/Kubernetes 中,容器默认被赋予部分能力(如
CAP_SYS_ADMIN
)。若过度授权,攻击者可能利用这些能力逃逸到宿主机。
5. 利用CAP_SETUID提权
其他可以利用CAP_SETUID来提权的文件:
6. 防御 Capabilities 滥用
-
最小化授权:仅赋予程序必需的能力。
# 正确示例:仅允许程序绑定低端口 sudo setcap cap_net_bind_service+ep /path/to/program
-
定期审计:使用
getcap
检查系统中可疑的能力配置。 -
容器安全:在 Docker 中通过
--cap-drop=ALL
移除所有能力,再按需添加:docker run --cap-drop=ALL --cap-add=CAP_NET_BIND_SERVICE ...
-
避免 SUID 滥用:优先使用 Capabilities 替代
SUID
提权。
7. 参考
[1] deepseek
[2] 《权限提升技术-攻防实战与技巧-》
[3] tryhackme-jr peneration tester-privilege escalation-linuxprivesc