问题一、解释“passwd”, “sudo” , “ping”等命令为什么需要 setuid位,去掉s位试运行,添加权能试运行。
1、为什么需要setuid位:
首先明确setuid的作用是:执行该设置后,文件执行时将以文件拥有者的身份执行,而非普通用户的身份。若没有该设置,普通用户无法执行root用户的文件和进程。
实验过程:
以普通用户的身份登录操作系统,通过whoami命令查看当前用户:
通过which命令查看passwd、sudo、ping文件所在位置:
通过ls -all查看这些文件的详细信息:
从上图可以看出passwd、sudo和ping的文件拥有者是root,即超级用户,所属用户组是root,并且都设置了SUID。
常规来讲,当其他的普通用户执行passwd、sudo和ping时,由于不是root,无法执行这些文件。但实际上,由于普通用户设置了SUID,便可以临时以文件拥有者root的身份执行这些文件。所以passwd、sudo和ping等命令需要setuid。
SUID设置方法
添加suid位:chmod u+s FILE…
删除suid位:chmod u-s FILE…
具体提权
SUID可以让程序调用者以文件拥有者的身份运行该文件,当我们以一个普通用户去运行一个root用户所有的SUID文件,那么运行该文件我们就可以获取到root权限
② 去掉suid位
通过chmod命令移除passwd、sudo和ping文件的setuid:
此时在执行发现普通用户无法执行sudo命令,并且系统提示要求设置suid位,同理,ping和passwd命令也一样无法继续正常使用。
在root权限下将三个命令的suid权限添加回来
![在这里插入图片描述](https://img-blog.csdnimg.cn/850c33f5eb634807ac190f959a3a2d1e.png
添加回来后再次查看对应的文件,发现suid位由x变为了s,说明添加成功。
此时在普通用户下再次执行sudo、ping和passwd命令,此时已经可以正常使用。
问题二、指出每个权能对应的系统调用,简要解释功能
通过man capabilities命令可以查看权能及简要功能
使用 sudo find / -name capability.h 查找到路径 /usr/src/linux-headers-5.15.0-46/include/uapi/linux/capability.h ,整理可得下表:
问题三、查找你Linux发行版系统(Ubuntu/centos等)中所有设置了setuid位的程序,指出其应该有的权能
首先,查看Linux的发行版,通过uname -a命令,可以看出内核版本为5.15.0-67-generic,Ubuntu发行版为18.04。
使用find / -perm /u=s命令
部分程序的权能:
问题四、实现一个程序其满足以下的功能:
(1)能够永久的删除其子进程的某个权能。
(2)能暂时性的删除其子进程的某个权能。
(3)能让上面被暂时性删除的权能重新获得。
Capabilities机制,是在Linux内核2.2之后引入的。它将root用户的权限细分为不同的领域,可以分别启用或禁用。从而,在实际进行特权操作时,如果euid不是root,便会检查是否具有该特权操作所对应的capabilities,并以此为依据,决定是否可以执行特权操作。
每个进程有三个和能力有关的位图:inheritable(I)、permitted§和effective(E),对应进程描述符 task_struct(include/linux/sched.h)里面的cap_effective, cap_inheritable, cap_permitted。每种能力由一位表示,1表示具有某种能力,0表示没有。
1)cap_effective 当一个进程要进行某个特权操作时,操作系统会检查 cap_effective的对应位是否有效,而不再是检查进程的有效UID是否为0。
例如,如果一个进程要设置系统的时钟,Linux的内核就会检查 cap_effective的CAP_SYS_TIME位(第25位)是否有效,
2)cap_permitted 表示进程能够使用的能力。在cap_permitted中可以包含cap_effective中没有的能力,这些能力是被进程自己临时放弃的,也可以说cap_effective是cap_permitted的一个子集。进程放弃没有必要的能力对于提高安全性大有助益。
例如,ping只需要CAP_NET_RAW,如果它放弃除这个能力之外的其它能力,即使存在安全缺陷,也不会对系统造成太大的损害。
3)cap_inheritable表示能够被当前进程执行的程序继承的能力。
永久删除子进程的权能就移除effective和inheritable、permitted的,暂时性删除就移除effective和inheritable的,恢复暂时性删除的就添加进effective和inheritable。
本程序以ping指令为例进行测试,首先运行程序,并查看当前的权能,此时包括cap_net_raw权能
之后移除掉该权能,查看此时的权能发现移除成功。
此时执行ping命令,已经没有权限。
恢复刚被暂时移除的权限,再查看相关权能,以及执行ping命令,发现恢复成功。
永久删除cap_net_raw权能后,发现少了cap_net_raw+p,表示移除成功,此时再通过3恢复权能发现不能成功,表示已经永久移除。