SUID简称位,英文全称是Set owner User ID up on execution,它是一种特殊的文件权限,能够让用户(如Bob)用其他用户(如root用户)的权限运行一个程序,而不需要用sudo进行临时提权
同一类的还有SGID,就不详细说了,原理与SUID一样,就以SUID为例
在一个程序执行的时候会有三个ID状态,在深入学习SUID之前必须能够区分下面三种ID:
- Real User ID
- Effective User ID
- Saved User ID
Real User ID
是执行这个程序的用户的真实ID,是已用户login时候的ID为准
Effective User ID
是程序执行过程中使用权限时真正起作用的用户ID,操作系统在检查一个程序有没有某个权限的时候会看这个ID
Saved User ID
是程序临时提权时需要保存的先前的用户ID,等提权结束后需要回退到这个用户ID.
如果用户user2有另一个用户user1的程序的执行权限,并且user1给这个程序设置了SUID位,那么user2就可以用user1的权限来执行这个程序
简单来说,SUID能够让用户(如Bob)用其他用户(如root用户)的权限运行一个程序,而不需要用sudo进行临时提权
举个例子:
所有用户的密码保存在 /etc/shadow
文件中,但是这个文件只有root用户能够进行写操作
1
2
| root@kali:~# ls -l /etc/shadow
-rw-r----- 1 root shadow 1639 Jan 27 12:50 /etc/shadow
|
那如果普通用户想要修改自己的密码,是否需要让root用户帮着修改呢?
显然不需要,修改密码用到了 /usr/bin/passwd
这个程序,我们来看一下它的权限
1
2
| root@kali:~# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 63944 Dec 20 10:39 /usr/bin/passwd
|
可以看到,这个程序的所有者是root用户,但是所有用户都有执行权限,并且设置了s位(怎么看出来的后面会说)
这样SUID机制就会在程序执行的时候发生作用,让普通用户可以用root权限修改/etc/shadow
文件
SUID机制的存在使程序权限的控制更加方便,用户可以执行某个程序而不需要登录到程序拥有者的账号.
通过命令 ls -l
即可看到文件的详细信息,包括权限表 -rwxrwxrwx
1
2
3
4
5
6
7
8
9
10
11
| - rwx rwx rwx
第一位是文件类型,-就是普通文件,d代表目录,l代表链接文件,还有一些其他类型的文件不详细说了
后面的9位可以分成三组,分别表示所有者权限、同组内用户权限,组外其他用户权限
每一组都有三位,r 代表有读取权限,w 代表有写入权限,x 代表有执行权限,如果是 _ 就代表没有相应的权限
如果文件所有者权限的 x 换成 s 就代表设置了SUID
同理如果组内用户权限的 x 换成了 s 就代表设置了SGID
|
使用 chmod 4000 filename
可以设置SUID位
使用 chmod 2000 filename
可以设置SGID位
使用 chmod 6000 filename
可以同时设置SGID和SUID位
注意: 2000\4000\6000都是不完整的权限,正常使用应该将000替换为相应的权限,例如 4755
使用 chmod 755 filename
可以取消SGID和SUID位
或者 chmod u-s filename
or chmod g-s filename
也可以.
因为SUID位让程序在执行的时候有了所有者的权限,所以可以利用这点来提权
示例:
1
2
3
4
| # 进入nmap的交互模式
nmap --interactive
# 执行sh,提权成功
!sh
|
详细介绍见: https://www.leavesongs.com/PENETRATION/linux-suid-privilege-escalation.html
假如user1用 chmod 4777 /home/user1/script.sh
命令给script.sh
脚本设置SUID位,登录user2后执行这个脚本提示没有权限
这是因为SUID位只对编译过的可执行程序起作用,sh脚本的实际执行程序是sh或者bash之类,如果它们在执行的时候并不会检查脚本文件的SUID位,那就不会起作用了
Perl执行器会检查perl脚本的suid位,所以可以给pl脚本设置suid位
----------------------------------------
Linux下,修改文件的权限
文件权限对于一个系统的安全性非常重要,文件的权限和使用者与群组息息相关。那么如何修改文件权限,下面是几个常用于群组、拥有者、各种身份的权限修改指令:
chgrp :改变文件所属群组
chown :改变文件拥有者
chmod :改变文件的权限, SUID, SGID, SBIT等等的特性
改变所属群组, chgrp
顾名思义,就是将文件赋给其它群组。chgrp就是change group的缩写。改变这个文件的群组,要注意的是这个组名必须要在/etc/group文件内存在才行,否则就会显示错误。
[root@lmode ~]# chgrp [-R] dirname/filename ...
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件、目录都更新成为这个群组之意。常常用在改变某一目录内所有的文件这种情况。
范例:
[root@lmode~]# ll
total 20
drwx------ 2 psz psz 4096 Jul 1 15:52 ceshi
[root@lmode ~]# chgrp root ceshi //将ceshi群组由psz改为root
[root@lmode ~]# ls -ld
total 20
drwx------ 2 psz root 4096 Jul 1 15:52 ceshi
[root@lmode ~]# chgrp testing ceshi
chgrp: invalid group name `testing' <== 提示出错,因为找不到testing这个群组名~
改变文件拥有者, chown
顾名思义,它就是将一个文件的拥有者改成另一个拥有者。chown是change onwer的缩写。要改变文件拥有者,要注意的是, 用户必须是已经存在系统中的账号,也就是在/etc/passwd 这个文件中有记录的用户名称才有效。
此外,如果要连目录下的所有次目录或文件同时更改文件拥有者的话,要加上 -R 这个选项!
[root@lmode ~]# chown [-R] 账号名称 文件或目录
[root@lmode ~]# chown [-R] 账号名称:组名 文件或目录
选项与参数:
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都变更
范例:将ceshi的拥有者改为root这个账号:
[root@lmode ~]# chown root ceshi
[root@lmode ~]# ls -ld
drw-r--r-- 1 root root 68495 Jun 25 08:53 ceshi
范例:将ceshi的拥有者与群组改回为psz:
[root@lmode ~]# chown psz:psz ceshi
[root@lmode ~]# ls -ld
drwx------ 2 psz psz 4096 Jul 1 15:52 ceshi
事实上,chown也可以使用『chown user.group file』,亦即在拥有者与群组间加上小数点『.』也行!
不过建议使用冒号『:』来隔开拥有者与群组!这样比较清晰不容易犯错。
此外,chown也能单纯的修改所属群组。 例如『chown .root ceshi』就是修改群组~看到了吗?就是那个小数点的用途!
改变权限, chmod
这个命令可以增加会减少文件的权限。权限的设定方法有两种, 分别可以使用数字或者是符号来进行权限的变更。
数字类型改变文件权限
Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute权限。
文件的权限字符为:『-rwxrwxrwx』, 这九个权限是三个三个一组的,我们可以使用数字来代表各个权限,各权限的分数对照表如下:
r:4
w:2
x:1
每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx—] 分数则是: owner = rwx = 4+2+1 = 7,group = rwx = 4+2+1 = 7,others= — = 0+0+0 = 0
[root@lmode ~]# chmod [-R] xyz 文件或目录
选项与参数:
xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更
[root@lmode ~]# ls -ld ceshi/
drwx------ 2 psz psz 4096 Jul 1 15:52 ceshi/
[root@lmode ~]# chmod 777 ceshi
[root@lmode ~]# ls -ld ceshi/
drwxrwxrwx 2 psz psz 4096 Jul 1 15:52 ceshi/
那如果要将权限变成『 -rwxr-xr– 』呢?那么权限的分数就成为 [4+2+1][4+0+1][4+0+0]=754 !
所以你需要下达『 chmod 754 filename』。 另外,在实际的系统运作中最常发生的一个问题就是,常常我们以vim编辑一个shell的文字批处理文件后,他的权限通常是 -rw-rw-r– 也就是664, 如果要将该文件变成可执行文件,并且不要让其他人修改此一文件的话, 那么就需要-rwxr-xr-x这样的权限,此时就得要下达:『 chmod 755 test.sh 』的指令!
另外,如果有些文件你不希望被其他人看到,那么应该将文件的权限设定为例如:『-rwxr—-』,那就下达『 chmod 740 filename 』吧!
例题:
将刚刚你的ceshi这个文件的权限修改回-rw-r--r--的情况!
答:
-rw-r--r--的分数是644,所以指令为:
chmod 644 ceshi
符号类型改变文件权限
基本上就九个权限分别是(1)user (2)group (3)others三种身份啦!那么我们就可以借由u, g, o来代表三种身份的权限!
此外, a 则代表 all 亦即全部的身份!那么读写的权限就可以写成r, w, x.
假如我们要『设定』一个文件的权限成为『-rwxr-xr-x』时,基本上就是:
user (u):具有可读、可写、可执行的权限;
group 与 others (g/o):具有可读与执行的权限。
[root@lmode ~]# chmod u=rwx,go=rx ceshi
那个 u=rwx,go=rx 是连在一起的,中间并没有任何空格.
[root@lmode ~]# ls -dl ceshi
drwxr-xr-x 1 root root 395 Jul 4 15:55 ceshi
假如是『 -rwxr-xr– 』这样的权限呢?可以使用『 chmod u=rwx,g=rx,o=r filename 』来设定。此外,如果我不知道原先的文件属性,而我只想要增加ceshi这个文件的每个人均可写入的权限, 那么我就可以使用:
[root@lmode ~]# ls -dl ceshi
drwxr-xr-x 1 root root 395 Jul 4 15:55 ceshi
[root@lmode ~]# chmod a+w ceshi
[root@lmode ~]# ls -dl ceshi
drwxrwxrwx 1 root root 395 Jul 4 11:45 ceshi
而如果是要将权限去掉而不更动其他已存在的权限呢?例如要拿掉全部人的可执行权限,则:
[root@lmode ~]# chmod a-x ceshi
[root@lmode ~]# ls -dl ceshi
drw-rw-rw- 1 root root 395 Jul 4 11:45 ceshi
( Linux下,文件拥有者和群组
1.文件拥有者
Linux和window操作系统有很大的差异,其中一点明显的差异是Linux是个多人多任务的系统。因为多用户下,不同用户的权限可能会不同,而且有时候某些用户建立的文件并不想和其它用户共享,这和现实世界的隐私很像。所以,Linux下就有了文件拥有者的概念。
2.群组
群组,顾名思义就是组别,小组的概念。现实世界中,比如QQ群,讨论组,你只有是群成员或者是讨论组成员,才能在组群里面发言和查看其它成员的发言记录等。Linux下群组和现实世界中的概念很相像,群组下的不同用户在特定条件下有共同的权限,比如可以共同操作某一个文件,而其它群组的用户则没办法操作该文件,而同群组下的用户又是相对独立的,例如每个用户有自己特定的隐私。
3.其他人的概念
相对于群组,群外的人就是其它人了。其它人,就是Others。在Linux里面,任何一个文件都具有User(拥有者), Group(群组)及Others(其它人)三种身份的个别权限。举个例子,比如一个文件的拥有者对该文件有读,写,删的功能,但是和该用户相同组别下的用户可能只有文件读取权限。而该组别外其它人可能对该文件没有任何权限。Linux下有个超级用户,就是root用户,它拥有任何权限。
拥有者,与该使用者所支持的群组概念,在Linux的世界里面是相当的重要的, 他可以帮助你让你的多任务Linux环境变的更容易管理!
4.Linux用户与群组信息记录的文件
在Linux系统当中,默认的情况下,所有的系统上的账号还有那个root的相关信息,都是记录在/etc/passwd这个文件内的。至于用户密码则是记录在/etc/shadow这个文件下。 此外,Linux所有的组名都记录在/etc/group内!这三个文件记录了Linux系统里面账号、密码、群组信息!
任何情况下不要随便删除这三个文件。)