ps:修改与2024-3-14
讲到拿shell,提权,其实这些跟linux的权限管理是分不开的(笑,虽然我现在才开始了解。
虽然对于普通用户来说,那么严格的权限划分是没有意义的(相信大家在使用linux系统时,大部分只用到了root和你自己创建的普通用户吧
1. 用户和用户组
linux系统中的每个file
文件,都有两个属性,即用户(创建改文件的用户是谁)
和用户组(这个文件属于用户的哪个组里)
1.1 uid和gid
每个用户都有一个uid(标明自己身份的)和一个gid(表明它所属的组)
毕竟用户名和组名,其实说白了,是方便我们人来理解的,计算机可不认这个。
2. linux文件管理
对于文件来说,使用它的人只有以下3种身份。
owner,group,other,即创建者,除了所有者,所有者所在的组的其他成员,剩余用户访问文件都是other类别
2.1 rwx
对于不同3种身份,正常情况下都有rwx来表示他们的权限
r为可读,w为可写,x为可执行
2.2 可执行文件管理
可执行文件执行时的权限,是继承自当前进程的权限的。(一般情况下,你是root执行这个程序,这个程序执行时就有root权限,普通用户执行,就是普通用户权限,但是有特例)
可执行文件比较特殊,它相比正常文件(拥有uid和gid,这个是你执行的用户的uid和gid)外,多了euid
和egid
(有效用户和有效group)
可执行文件在运行过程的实际权限是由euid和egid决定的。这跟特殊权限s
有关。
s权限和x权限是占据同一个位置的
仅针对可执行文件。此种权限通常称为 SetUID,简称 SUID 特殊权限。
SUID 特殊权限仅适用于可执行文件,所具有的功能是,只要用户对设有 SUID 的文件有执行权限,那么当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失(uid仍然是普通用户,但是euid为root)
换句话说,如果这个文件所有者是root,设置了suid,当你普通用户可以执行这个程序时,你运行这个程序获得的就是root权限。
注意,如果是fork一个进程的话,因为完全复制进程的内容,所以也有root权限,指euid,egid;执行system(“/bin/sh”)或者exec(“/bin/sh”)也是可以拿到root shell的,然而这件事情并不绝对,可以通过设置某些安全开关,让system/exec这些函数在执行目标程序时清除原有配置,转而使用目标程序自身配置的权限 以sh为例,在执行sh时,往往sh会自己检查权限并把euid改为uid的值,解决办法: sh -p ,这样就不会清除euid的值
还有一个有意思的事情是,Ubuntu 16.04以上版本,/bin/sh实际上是一个指向/bin/dash的链接文件,dash实现了 一个保护机制,当它发现自己在一个Set-UID的进程中运行时,会立刻把euid变成实际uid,主动放弃特权。安装一个zsh的shell程序来做这个实验,再建个链接过去
sudo apt install zsh
sudo ln -sf /bin/zsh /bin/sh)
2.3 特例root
原则上,其实只有文件的owner可以任意修改该文件的访问权限。但是也有例外
没错就是高贵的root!root是linux的超级管理员,想干啥就干啥,它可以对任何一个文件或目录进行修改。
3. linux 目录权限
linux目录权限如下
1 可执行权限(x): 如果目录没有可执行权限, 则无法cd到目录中。
2 可读权限(r): 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容。
3 可写权限(w): 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件。
3.1 linux目录权限和目录下文件权限的冲突
比如你是一个普通用户user。
abc是由root创建的任何用户都具有rwx权限的目录
abc目录下有一个文件 test.c test.c对普通用户是完全拒绝的,没有rwx。
此时你进入了abc目录下,执行删除命令
rm test.c
你把它删掉了。凭什么?
如果目录本身对others具有w权限,那么others可以删除掉任何目录下的文件。
如果目录本身对others没有w权限,那么others则不可以删除文件。
3.2 粘滞位t
那当我们有这么一种需求,others可以在特定的目录下创建自己的文件、写入自己文件、删除自己的文件,但是不想让他删除别人的文件。这时后这么办呢?
这时可以对目录添加一个粘滞位:【chmod +t 文件目录】,这个粘滞位只能对目录设置。一般是限制others的权限。对于设置了粘滞位的目录。在该目录下。只能文件的拥有者或root可以删除,其他人不能删除。
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
一、超级管理员删除
二、该目录的所有者删除
三、该文件的所有者删除
4. 针对+s安全问题的消解措施
SUID 虽然可以解决问题,却带来了安全隐患。当运行设置了 SUID 的命令时,通常只是需要很小一部分的特权,但是 SUID 给了它 root 具有的全部权限。因此一旦 被设置了 SUID 的命令出现漏洞,就很容易被利用。也就是说 SUID 机制在增大了系统的安全攻击面。
Linux 引入了 capabilities 机制对 root 权限进行细粒度的控制,实现按需授权,从而减小系统的安全攻击面。本文将介绍 capabilites 机制的基本概念和用法。
https://www.cnblogs.com/sparkdev/p/11417781.html
4.1 进程的capabilities
进程的capabilities
,指的是进程在运行时的权限,值得一提的是,linux不区分进程和线程,一般情况下,理论上每个线程都有独自的capabilities,实际上一个进程中的线程capabilities是一样的
1. Permitted:实际上是规定了进程的capabilities的上限
2. Effective:实际上进程拥有的capabilities
3. Inheritable:exec()系列调用后,新进程能被继承的集合
4. Bounding: Bounding提供了系统级别的限制,每个进程的bounding都是一样的,也规定了进程的上限(比permitted等级要高,比如permitted有的capability,如果Bound没有,想通过自行添加这个capability是不可行的)
5. Ambient:Ambient是Linux 4.3引入的,解决的是权限稳定传递的问题
4.2 可执行文件的capabilities
可执行文件,在未执行,作为文件时,有如下3个capabilities
1. Permitted: 在文件被执行时,会被添加到进程的permitted中
2. Inheritable:与进程的inheritable的交集会被添加到线程Permitted中
3. Effective:实际上是一个标志位,如果开启,在执行完exec后,会将进程permitted的capabilites添加到它的effective中
4.3 exec/fork的capalities继承关系
有一个公式可以说明:
规定P
代表EXEC前的进程,P'
代表EXEC后的进程,F
代表可执行文件
P'(ambient) = (file is privileged) ? 0 : P(ambient)
P'(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & P(bounding))) | P'(ambient)
P'(effective) = F(effective) ? P'(permitted) : P'(ambient)
P'(inheritable) = P(inheritable) [i.e., unchanged]
P'(bounding) = P(bounding) [i.e., unchanged]
4.4 getcap setcap capsh
getcap
和 setcap
两个命令来分别查看和设置文件的 capabilities,同时还提供了 capsh
来查看当前 shell 进程的 capabilities