目录
一、用户与组管理命令
1.1 用户分类与UID范围
1.2 用户管理命令
1.2.1 useradd
1.2.2 groupadd
1.2.3 usermod
1.2.4 userdel
1.3 组管理命令
1.3.1 groupdel
1.3.2 查看密码文件 /etc/shadow
1.3.4 passwd
1.4 Linux密码暴力破解
二、权限管理
2.1 文件与目录权限
2.2 目录管理命令
2.2.1 chown
2.2.2 chomd
2.3 特殊权限
2.3.1 SUID(Set User ID)
2.3.2 SGID(Set Group ID)
2.3.3 SBIT(Sticky Bit)
三、Linux提权
3.1 sudo
3.2 SUID
3.3 SGID提权
3.4 Sticky Bit
3.5 其他提权方法
3.5.1 内核漏洞
3.5.2 配置错误
3.5.3 文件权限滥用
一、用户与组管理命令
1.1 用户分类与UID范围
在 CentOS/RHEL 7 中,⽤户分为三类:
- 管理员⽤户 ( root ): UID 0 ,系统中权限最⾼的⽤户,能够管理系统的所有资源。
- 系统⽤户: UID 1-999 ,⽤于系统进程和服务的账户,不能直接⽤于⽤户登录。系统⽤户⽤于运⾏后台服务或守护进程,确保系统的各项服务隔离运⾏。
- 普通⽤户: UID 从 1000 开始 ,⽤于⽇常操作的普通⽤户,由系统管理员创建。普通⽤户可以登录系统,但权限有限,通常⽤于⾮系统管理任务。
1.2 用户管理命令
1.2.1 useradd
- 添加用户:使用useradd命令创建一个新用户:
常见参数:
- -u 指定UID
- -g 指定基本组
- -G 指定附加组 //⼀个⽤户⾄少有⼀个基本组,最多添加⼀个附加组
- -M 不需要家⽬录
- -s 指定登陆时的shell环境 /sbin/nologin 不能登陆
- -d 指定新⽤户每次登陆时 使⽤的家⽬录
- -e 指定⽤户中⽌时间 ,时间格式 YYY--MMM--DD
- -f ⽤户过期⼏天 后 永久停权 , 0 ⽤户到期后⽴刻停权 -1 关闭此功能
- -m ⾃动创建 ⽤户家⽬录
1.创建用户:
//创建新用户
[root@localhost bin]# useradd testuser1
//查看用户信息
[root@localhost bin]# cat /etc/passwd
root:x:0:0:root
//如果觉得上一种方式太杂乱,可以指定显示最后五个用户信息
[root@localhost bin]# tail -5 /etc/passwd
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
allen:x:1000:1000:allen:/home/allen:/bin/bash
saned:x:988:982:SANE scanner daemon user:/usr/share/sane:/sbin/nologin
testuser1:x:1001:1001::/home/testuser1:/bin/bash
2.指定用户UID
[root@localhost bin]# useradd -u 5200 testuser2
//查看创建的组
[root@localhost bin]# cat /etc/group
……
testuser1:x:1001:
testuser2:x:5200:
- 注意:系统默认创建和UID相同的组,如果未指定UID则从默认1000以上开始往后排
3.不创建家目录并且禁止登陆
[root@localhost bin]# useradd -M -s /sbin/nologin testuser3
//-M 选项告诉 useradd 不要创建用户的主目录。
//-s /sbin/nologin 选项指定用户的登录 shell 为 /sbin/nologin,这意味着用户不能通过密码登录系统。
[root@localhost bin]# tail -5 /etc/passwd
allen:x:1000:1000:allen:/home/allen:/bin/bash
saned:x:988:982:SANE scanner daemon user:/usr/share/sane:/sbin/nologin
testuser1:x:1001:1001::/home/testuser1:/bin/bash
testuser2:x:5200:5200::/home/testuser2:/bin/bash
testuser3:x:5201:5201::/home/testuser3:/sbin/nologin
[root@localhost home]# ls
allen testuser1 testuser2 //这里没有显示testuser3,禁止登陆
4.创建新用户并指定UID,指定组,shell类型为/bin/sh
[root@localhost home]# useradd -u 520 -s /bin/sh -G root testuser4
[root@localhost home]# tail -5 /etc/passwd
saned:x:988:982:SANE scanner daemon user:/usr/share/sane:/sbin/nologin
testuser1:x:1001:1001::/home/testuser1:/bin/bash
testuser2:x:5200:5200::/home/testuser2:/bin/bash
testuser3:x:5201:5201::/home/testuser3:/sbin/nologin
testuser4:x:520:5202::/home/testuser4:/bin/sh
5.创建新用户并设置用户过期时间,过2天后停权,指定家目录
[root@localhost home]# useradd -e 2024-09-06 -f 2 -d/tmp/testuser5 -m testuser5
[root@localhost home]# chage -l testuser5
Last password change : Sep 06, 2024
Password expires : never
Password inactive : never
Account expires : Sep 06, 2024
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
1.2.2 groupadd
- 添加组: 使⽤ groupadd 命令创建⼀个新的⽤户组:
- 组(Group):每个⽤户都可以属于⼀个或多个组。组有助于控制⽤户对⽂件和资源的访问权限。⽂件或⽬录的权限不仅受⽤户身份控制,还受组身份控制。
- GID(组标识符):每个组都有唯⼀的 GID(组标识符)。管理员⽤户组的 GID 是 0,系统⽤户组的 GID 范围为 1-999,普通⽤户组的 GID 从 1000 开始。
创建的⼯作组 实际上 写⼊到 /etc/group ⽂本⽂件中
常见参数:
- -g 指定新建的⼯作组
- -r 创建系统⼯作组 , 系统⼯作组 1-999
- -o 允许添加组ID 不唯⼀ 的⼯作组
- -G 指定扩展组
1.新增用户,UID为1111,GID为8888
[root@localhost home]# groupadd -g 8888 ceo //创建工作组
[root@localhost home]# useradd -u 1111 -g 8888 testuser6
[root@localhost home]# id testuser6 //查看用户信息UID GID扩展组
uid=1111(testuser6) gid=8888(ceo) groups=8888(ceo)
2.新增用户,基本组root,扩展组ceo
[root@localhost home]# useradd -g root -G ceo testuser7
[root@localhost home]# id testuser7
uid=5203(testuser7) gid=0(root) groups=0(root),8888(ceo)
1.2.3 usermod
usermod 命令⽤于修改⽤户账户信息及其相关设置。它是管理现有⽤户的关键命令之⼀,可以⽤于修改⽤户的组、密码、登录 shell 等多种信息。
常见参数:
- -d 登陆⽬录 ,修改⽤户登⼊时的⽬录
- -e 有效期限 , 修改账号的有效期
- -f 缓存期 , 修改密码过期后的多少天 关闭账号
- -g 群组 , 修改⽤户基本组
- -G 群组 修改⽤户附加组
- -L ,锁定⽤户密码 , 使密码失效,⽤户不能登陆
- -s 修改⽤户登陆的shell 环境
- -u 修改⽤户的UID
- -U 解除密码锁定
- -l 修改⽤户名
1.更改登录目录
[root@localhost home]# mkdir /tmp/testuser1 //创建了一个名为 testuser1 的新目录在 /tmp 下
[root@localhost home]# usermod -d /tmp/testuser1 testuser1 //更改了 testuser1 用户的主目录为 /tmp/testuser1
[root@localhost home]# tail /etc/passwd | grep testuser1
testuser1:x:1001:1001::/tmp/testuser1:/bin/bash
//现在,testuser1 用户的主目录是 /tmp/testuser1,而不是原来的 /home/testuser1。这意味着当 testuser1 用户登录系统时,他们的家目录将是 /tmp/testuser1。
2.更改UID
[root@localhost home]# usermod -u 12345 testuser6
[root@localhost home]# tail /etc/passwd | grep testuser6
testuser6:x:12345:8888::/home/testuser6:/bin/bash
3.更改用户名为abc
[root@localhost home]# usermod -l abc testuser6
[root@localhost home]# tail /etc/passwd | grep testuser6
abc:x:12345:8888::/home/testuser6:/bin/bash
[root@localhost home]# tail /etc/passwd | grep abc
abc:x:12345:8888::/home/testuser6:/bin/bash
4.锁定与解锁用户名密码
[root@localhost home]# usermod -L abc
[root@localhost home]# usermod -U abc
1.2.4 userdel
命令来删除指定的⽤户及其相关⽂件。这个命令会从系统中删除⽤户账户
删除的⽂件包括 /etc/passwd /etc/group /etc/shadow
并且可以选择删除与该⽤户相关的所有⽂件(如⽤户的家⽬录和邮件)。
注意事项:
- 进⾏中的进程:如果⽤户当前正在运⾏某些进程,系统会阻⽌删除⽤户账户。可以使⽤ -f 选项强制删除账户,但这种操作需要谨慎,因为强制删除可能会影响正在运⾏的进程。
- ⽂件删除:使⽤ -r 选项可以删除⽤户的家⽬录以及该⽤户拥有的所有⽂件。如果不使⽤此选项,系统只会删除⽤户账户,但不会删除⽤户的家⽬录和⽂件
1.删除用户,但是不会删除用户的家目录和文件
[root@localhost home]# userdel testuser4
[root@localhost home]# tail /etc/passwd | grep testuser4
[root@localhost home]# ls /home | grep testuser4
testuser4
2.删除用户以及家目录和文件
[root@localhost home]# userdel -f testuser5
[root@localhost home]# tail /etc/passwd | grep testuser5
3.删除家目录,但是可以登录
[root@localhost home]# rm -rf /home/testuser3
[root@localhost home]# ls /home | grep testuser3
[root@localhost home]# cat /etc/passwd | grep testuser3
testuser3:x:5201:5201::/home/testuser3:/sbin/nologin //禁止登陆
1.3 组管理命令
1.3.1 groupdel
groupdel 命令来删除⽤户组。 groupdel 命令将会从系统中删除指定的组,但不会删除该组内的⽤户或其⽂件
注意事项:
- 组内的⽤户: groupdel 不会删除属于该组的⽤户。如果某个⽤户的基本组是被删除的组,删除操作将会失败。因此,在删除组之前,确保该组不再是任何⽤户的基本组。
- ⽂件权限: groupdel 不会更改由该组拥有的⽂件的权限。删除组后,⽂件的权限中仍可能显示该组的 GID(组标识符),但该 GID 不会再映射到任何组名。
如果想要删除组,在删除之前可以先检查是否有用户仍然属于该组,可以使用以下命令来检查:
grep developers /etc/passwd
//这将列出所有属于 developers 组的⽤户
如果某个⽤户的基本组是 developers , 可以使⽤ usermod 修改该⽤户的基本组,然后再删除该组:
usermod -g newgroup ⽤户名
- 使⽤ groupdel 命令删除组,但确保没有⽤户的基本组是该组。
- 删除组不会影响组内⽤户的⽂件和权限,只会删除该组本身。
1.3.2 查看密码文件 /etc/shadow
密码文件默认只有root用户才能查看,所以在进行之前需要提升权限:
1. root :⽤户名,表示该条记录是 root ⽤户的密码信息。
2. $6$ :表示使⽤ SHA-512 哈希算法对密码进⾏加密。
- 1gq8PHf :这是盐值(Salt),⽤于增强密码哈希的安全性,防⽌彩虹表攻击。
- 后面的一串 :这是通过 SHA-512 算法加密后的密码哈希值。
总结:
- root ⽤户的密码是使⽤ SHA-512 算法加密的,带有盐值。
- 密码可以随时修改,最⻓有效期为 99999 天(⼏乎永不过期)。
- 在密码过期前 7 天,系统会提醒⽤户。
- 没有设置账户失效⽇期和密码的宽限期。
1.3.4 passwd
- 如果不指定⽤户名, passwd 默认会修改当前⽤户的密码。
- 只有 root ⽤户可以修改其他⽤户的密码
常用参数:
- -d 删除密码
- -l 锁定⽤户密码 , ⽆法被⽤户⾃⾏修改
- -u 解锁 允许⾃⾏修改
- -e 密码⽴刻过期 , 下次登陆时 强制修改密码
- -k 保留过期⽤户 可以继续使⽤
- -S 查询密码状态
1.修改当前登陆的用户的密码
[root@localhost ~]# passwd
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
2.锁定用户密码,不能自行修改(管理员除外)
[root@localhost ~]# passwd -l testuser2
Locking password for user testuser2.
passwd: Success
//测试:切换用户尝试修改密码,失败,无法修改
Locking password for user testuser2.
passwd: Success
[root@localhost ~]# ^C
[root@localhost ~]# su testuser2
[testuser2@localhost root]$ passwd
Changing password for user testuser2.
Changing password for testuser2.
(current) UNIX password:
passwd: Authentication token manipulation error
3.解锁
[root@localhost ~]# passwd -u testuser2
Unlocking password for user testuser2.
passwd: Warning: unlocked password would be empty.
passwd: Unsafe operation (use -f to force)
[root@localhost ~]# passwd -f testuser2
Changing password for user testuser2.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
4.下次登陆强制修改密码
[root@localhost ~]# passwd -e testuser3
Expiring password for user testuser3.
passwd: Success
5.清除登陆密码,清除之后登陆时不再需要密码,可直接登录(高风险)
[root@localhost ~]# passwd -d testuser3
Removing password for user testuser3.
passwd: Success
6.查看密码状态
[root@localhost ~]# passwd -S root
root PS 2024-09-06 0 99999 7 -1 (Password set, SHA512 crypt.)
1.4 Linux密码暴力破解
假设 拿到了shadow⽂件 , 查到 root ⽤户 的hash 值 (混合了盐值)
暴⼒破解思路: 依次测试每个密码 + 盐值 ------ sha 算法 ----- > 得出带有盐值的hash 值
将哈希值 和 之前 shadow ⽂件中的 哈希值 对⽐ ⼀样则说明 破解成功
这种方法说白就是靠“猜”
[root@localhost ~]# python
Python 2.7.5 (default, Oct 30 2018, 23:45:53)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import crypt
>>> crypt.crypt('123','$6$6i1X7QIf8B4zRGTs$')
'$6$6i1X7QIf8B4zRGTs$OT5SjkRsCewtqZna5HF5gl6eNG6wVkxvoolB7Tg8lqB7r9hm4/TjGfq1oyUJW9WmZFGutzHCmL7V5JGdKJHvL/'
>>> crypt.crypt('root','$6$6i1X7QIf8B4zRGTs$')
'$6$6i1X7QIf8B4zRGTs$sU5gtwRwEl8pgUFi8XPnJhFeWq7wHPupHK0xv5RXmGEPsyWUGKg7FVU8WlYEmogQaF1Glezu7MkTMmg4S2Vei/'
Hydra 是⼀个著名的⽹络服务暴⼒破解⼯具,⼴泛⽤于密码测试和⽹络服务的安全性评估。它⽀持对许多不同的协议(如 FTP、SSH、Telnet、SMTP 等)进⾏密码破解,并且具有很⾼的可扩展性,可以⽤于渗透测试中对远程服务进⾏密码攻击。
在 Kali Linux 中,Hydra 是预装的渗透测试⼯具之⼀。其强⼤的功能使其成为⽤于暴⼒破解⽹络服务的利器。
二、权限管理
2.1 文件与目录权限
权限符号:
- 读(r):表示可以读取文件内容或列出目录内容
- 写(w):表示可以修改文件内容或在目录中创建、删除文件
- 执行(x):表示可以执行文件(如果文件是可执行的程序或脚本),或者进入目录
在 Linux 中,文件和目录的权限通常用三组字符来表示,每组字符代表不同的用户类别:
- 所有者(Owner):文件的创建者,默认拥有对文件的控制权。
- 所属组(Group):文件的所属用户组。
- 其他人(Others):系统中除了文件所有者和所属组成员之外的所有用户
示例:
文件权限:
- rwx------:所有者可以读、写和执行,但其他人没有权限
- rw-r--r--:所有者可以读写,其他人只能读。
目录权限:
- rwxr-xr-x:所有者可以读、写、执行,其他人可以读和执行,但不能写入(不能在目录中创建或删除文件)
常用命令:
- ls:列出目录内容
- cat:查看文件内容
- vim:编辑文件
- touch:创建一个空文件
- cd:进入目录
注意:root用户的最高权限:即使文件的权限设置为---------(没有任何权限),root用户仍然可以读取、写入或执行文件。root用户在系统中拥有最高权限,不受普通权限限制
2.2 目录管理命令
2.2.1 chown
chown命令用于修改文件或目录的所有者和组
- 基本语法为 [所有者] : [所属组] 文件/目录
- 所有者:指文件的新拥有者用户
- 所属组:指文件的新用户组
- 如果 不想更改所属组,可以省略组信息
1.仅更改文件的所有者
[root@localhost Desktop]# chown allen file
将file的所有者更改为用户allen
2.更改目录的所有者和组
[root@localhost Desktop]# chown allen:developers file
//将file的所有者更改为allen,所属组更改为developers
3.递归更改目录的所有者和组
chown -R allen:developers /path/to/directory
//递归更改目录/path/to/directory及其所有子文件和子目录的所有者为allen,所属组为developers
4.只修改所有者
[root@localhost Desktop]# ll file
-rw-r--r--. 1 root root 0 Sep 4 17:54 file
[root@localhost Desktop]# chown allen file
[root@localhost Desktop]# ll file
-rw-r--r--. 1 allen root 0 Sep 4 17:54 file
5.只修改所有者和所属组
[root@localhost Desktop]# ll file
-rw-r--r--. 1 root root 0 Sep 4 17:54 file
[root@localhost Desktop]# chown allen:allen file
[root@localhost Desktop]# ll file
-rw-r--r--. 1 allen allen 0 Sep 4 17:54 file
6.只修改所属组
[root@localhost Desktop]# ll file
-rw-r--r--. 1 allen allen 0 Sep 4 17:54 file
[root@localhost Desktop]# chown :root file
[root@localhost Desktop]# ll file
-rw-r--r--. 1 allen root 0 Sep 4 17:54 file
7.将当前目录下所有内容所有者都修改为allen
chown -R allen *
2.2.2 chomd
chomd是Linux和Unix系统中用来修改文件和目录权限的命令。
1.添加权限:使用+来为所有者、组和其他人添加权限
chmod ugo + r 文件名
这个命令为文件的所有者(u)、组(g)、其他人(o)增加读取权限(r)
2.修改权限:可以同时对不同用户类别修改权限
chmod u-w,g+w,o+x 文件名
该命令:去掉所有者的写权限,正价所属组的写权限,增加其他用户的执行权限
//对于所有者,所属组和其他人都增加读权限
chmod ugo+r
chmod a+r
权限也可以用数字表示,将读、写、修改算作二进制中的三位,权限值为读4、写2、执行1,组合如下:
- rwx:111,即4+2+1=7
- rw-:6
- r-x:5
- 以此类推
将文件的权限 设置为所有者具有读写执行权限,组和其他人具有读取和执行权限
- chmod 755 文件名
将文件权限设置为所有者只读,组和其他人没有权限:
- chomd 400 文件名
2.3 特殊权限
2.3.1 SUID(Set User ID)
SUID是一种文件权限位,通常应用于可执行文件。当文件具有SUID位时,无论哪个用户执行这个文件,文件会以文件所有者(通常是root用户)的身份运行,而不是以当前执行用户的身份运行
对二进制程序设置的特殊权限,使二进制程序在执行的过程中临时拥有所属主的权限(仅对拥有执行权限的二进制有效,也就是说,只对可执行文件如.py等有效)
作用:
- 应用于可执行文件:SUID位只对可执行文件有意义,如果一个文件具有SUID位,那么当任何用户执行该文件时,文件将以文件拥有者的权限运行
- 常见示例:如/bin/passwd命令,密码文件需要超级用户权限才能修改,通过SUID,用户可以暂时以root权限执行
设置SUID:
- 使用命令chmod u+s filename 可以给文件添加SUID权限
- 使用命令chmod u-s filename可以移除权限
权限表示:
- 在文件的权限表中,设置SUID位出现在所有者(u)的执行位(x)的位置。如果SUID被设置,权限显示为s,如rwsr-xr-x
- 如果文件所有者没有执行权限但设置了SUID,权限显示为S,如rwSrw-r--
- 也就是说,如果本身有这个权限,则变成s,如果本身没有变成S
2.3.2 SGID(Set Group ID)
SGID是针对组权限的一种特殊位,应用于可执行文件和目录。他的作用取决于他是应用文件还是目录
作用:
- 在二进制文件上设置SGID:当某个二进制文件具有SGID权限时,普通用户执行该文件时,会临时获得该文件所属组的权限,而不是该用户自身的权限
- 在目录上设置SGID:SGID在目录上的作用与文件不同,设置SGID权限后,当用户在该目录中创建新文件或目录时,文件的所属组将继承该目录的所属组,而不是创建文件的用户的默认组
设置SGID:
- 使用chmod g+s filename 可以给文件或目录添加SGID权限
- 使用chmod g-s filename 可以移除SGID权限
权限表示:
- 在文件的权限列表中,SGID位出现在组执行位(x)的位置,如果SGID被设置,权限显示为s,如rwxr-sr-x
- 类似的,如果本来没有权限但设置了SGID,显示为S,如rw-r-Sr--
2.3.3 SBIT(Sticky Bit)
Sticky Bit是⼀种特殊权限,通常⽤于⽬录。它⽤于限制⽤户删除或修改其他⽤户在同⼀⽬录下的⽂件。在设置了Sticky Bit的⽬录中,只有⽂件的拥有者或root⽤户才能删除或重命名这些⽂件,⽽不是⽬录的其他⽤户。
作用:
- 应⽤于⽬录:Sticky Bit通常⽤于共享⽬录(如 /tmp ⽬录),确保⽤户不能删除或修改其他⽤户的⽂件。
- 常⻅示例: /tmp ⽬录具有Sticky Bit,因为这是⼀个所有⽤户都可以访问的临时⽬录,Sticky Bit防⽌⽤户删除其他⼈的临时⽂件。
设置SBIT:
- 使⽤命令 chmod +t directoryname 可以给⽬录设置Sticky Bit权限。
- 使⽤命令 chmod -t directoryname 可以移除Sticky Bit权限。
权限表示:
- Sticky Bit在权限列表的最后⼀个执⾏位(x)位置显示。如果Sticky Bit被设置,权限显示为 t ,如 rwxrwxrwt 。
- 如果其他⽤户没有执⾏权限但设置了Sticky Bit,权限显示为 T ,如 rw-rw-r-T
总结:
- SUID:⽂件以拥有者的权限运⾏,权限标识为 s 或 S 。
- SGID:⽂件以⽂件所属组的权限运⾏,或者新创建的⽂件继承⽗⽬录的组,权限标识为 s 或 S
- Sticky Bit:⽬录中⽂件只能由⽂件拥有者或root删除,权限标识为 t 或 T 。
可以通过命令 ls -l 来查看⽂件或⽬录的权限,并观察是否设置了这些特殊权限位。
三、Linux提权
Superuser Do,其作⽤是允许普通⽤户以超级⽤户(root)权限执⾏命令,⽽不需要直接登录到root 账号。 sudo 是提升权限的安全机制之⼀,通常⽤于系统管理任务,如安装软件、修改配置⽂件、管理服务等
3.1 sudo
1.sudo的基本功能
- 执⾏管理任务:普通⽤户可以通过 sudo 执⾏需要超级⽤户权限的命令,⽽⽆需直接以 root登录。
- 安全性:相⽐直接使⽤ root ⽤户, sudo 提供了更好的安全性。它只允许⽤户执⾏特定命令,并且每次执⾏需要进⾏身份验证(通常通过输⼊⽤户密码),这减少了系统被误操作或恶意操作的⻛险。
- ⽇志记录:系统会记录所有使⽤ sudo 的命令,⽅便审计和安全检查
2.sudo的使用方法
sudo [选项] [命令]
- 以root权限运行命令 : sudo apt update
- 查看系统日志文件 : sudo cat /var/log/syslog
- 编辑系统配置文件 : sudo nano /etc/ssh/sshd_config
- 切换到root用户 : sudo su
3.sudo配置文件(/etc/sudoers)
sudo 的⾏为通过 /etc/sudoers ⽂件进⾏配置。该⽂件决定了哪些⽤户或⽤户组可以使⽤ sudo ,以及哪些命令可以使⽤ sudo 执⾏
为了避免⼿动编辑 sudoers ⽂件时出现格式错误,通常使⽤以下命令来编辑:
sudo visudo
- visudo :这是⼀个专⽤命令,⽤于安全编辑 sudoers ⽂件,并确保⽂件语法正确。
4.sudo的优势
- 安全性更⾼:通过限制某些⽤户只能运⾏特定命令, sudo 提供了更好的访问控制,⽽不必将 root 权限完全暴露。
- 身份验证:每次执⾏ sudo 时都需要身份验证(输⼊⽤户密码),提⾼了安全性。
- 操作记录:所有 sudo 执⾏的命令都会记录到⽇志中(通常是 /var/log/auth.log ),⽅便追踪和审计。
- 权限分配灵活:管理员可以通过 sudoers ⽂件分配⾮常细粒度的权限,如允许某个⽤户只执⾏特定命令。
5.常见问题与解决方案
- sudo 权限不⾜:如果 尝试执⾏ sudo 命令时出现权限不⾜的提示,可能是 的⽤户没有被赋予 sudo 权限。确保 的⽤户名被添加到 sudoers ⽂件或相关的⽤户组中。
- sudo: command not found :这意味着系统中没有安装 sudo 。 需要以 root ⽤户身份登录并安装 sudo ,通常可以使⽤以下命令:
apt install sudo # 在 Debian/Ubuntu 系列系统中
yum install sudo # 在 CentOS/RHEL 系列系统中
- sudo 缓存清除:如果 想强制要求每次使⽤ sudo 都输⼊密码,⽽不缓存认证信息,可以使⽤以下命令清除缓存:
sudo -k
6.sudo与su的区别
- sudo :允许普通⽤户在需要时执⾏某些 root 权限的命令,⽤户必须在执⾏命令时输⼊⾃⼰的密码。 sudo 提供了精细的权限控制,并且⽇志化操作使得审计变得容易。
- su :⽤于切换⽤户,通常是切换到 root ⽤户,要求知道 root ⽤户的密码。与 sudo 不同, su 是持续性的权限提升,意味着⽤户在进⼊ su 环境后,所有命令都以 root 身份执⾏,直到退出该会话。
总结:
- sudo 是 Linux 系统中⽤来让普通⽤户执⾏需要超级⽤户权限的命令的⼯具。它具有安全性、灵活性和可审计性,是系统管理员在管理和保护系统时的有⼒⼯具。
- 通过 /etc/sudoers ⽂件,管理员可以为⽤户或⽤户组分配特定的权限。
- 使⽤ sudo 时,普通⽤户仍然使⽤⾃⼰的密码进⾏身份验证,⽽不需要知道 root 密码,这在提升权限的同时保持了系统安全性。
3.2 SUID
SUID 允许⽂件以⽂件拥有者(通常是root)的权限执⾏。SUID提权就是通过滥⽤设置了SUID的⽂件,获得更⾼权限(通常是root权限)
SUID提权:
- 攻击者寻找SUID设置不当的⼆进制⽂件。如果某个可执⾏⽂件意外地或错误地设置了SUID,并且这个⽂件允许执⾏⼀些危险的操作(例如:可以启动shell),攻击者可以利⽤这个⽂件执⾏系统命令,并获得root权限。
- 示例: 假设⼀个可执⾏⽂件(如 /usr/bin/vim )具有SUID权限,攻击者可能通过它以root身份打开并编辑系统关键配置⽂件,或者直接执⾏root权限的shell命令:
vim -c '!sh'
- 攻击者会搜索系统中SUID位设置错误的可执⾏⽂件,可以使⽤以下命令列出所有具有SUID权限的⽂件:
find / -perm -u=s -type f 2>/dev/null
- 在这些⽂件中,攻击者会寻找可以直接或间接执⾏系统命令的⽂件,进⾏提权。
3.3 SGID提权
SGID 在⽂件和⽬录上起不同的作⽤,但如果被错误配置,也可以被攻击者利⽤来进⾏提权。
SGID提权:
- 如果⼀个可执⾏⽂件设置了SGID,并且属于某个关键的系统组(例如 root 或 sudo 组),那么任何⽤户在运⾏这个⽂件时,都会以该组的权限运⾏。攻击者可以利⽤这⼀点来访问或修改他们通常⽆法访问的资源。
- 如果某个⽬录设置了SGID,并且⽤户可以在其中创建⽂件,那么攻击者可能通过创建⽂件并利⽤组权限进⾏进⼀步的攻击。
- 示例:某个SGID⽂件的执⾏权限设置不当,例如允许⽤户访问某些机密⽂件。攻击者可以尝试通过在组权限下运⾏该⽂件来读取或修改这些⽂件。
- 列出所有带有SGID权限的⽂件:
find / -perm -g=s -type f 2>/dev/null
3.4 Sticky Bit
Sticky Bit 主要⽤于防⽌⾮⽂件所有者删除共享⽬录中的⽂件。因此,Sticky Bit本身不直接⽤于提权,但它的错误配置可以产⽣安全漏洞。
SBIT提权:
- 如果Sticky Bit未正确配置或未启⽤,攻击者可以在共享⽬录(如 /tmp )中删除或重命名其他⽤户的⽂件,从⽽可能导致拒绝服务攻击,或⼲扰其他⽤户的⼯作,进⽽诱导系统管理员采取错误操作。
- 在⼀些情况下,攻击者可以通过这种⽅式获得对系统的间接控制,但Sticky Bit通常不是直接的提权⼯具。
3.5 其他提权方法
3.5.1 内核漏洞
- ⼀些内核漏洞可能被恶意⽤户利⽤进⾏提权。例如,利⽤某些内核模块的不安全函数调⽤来提升⽤户权限。攻击者可以通过编写特制的代码触发漏洞,最终获得root权限。
3.5.2 配置错误
- 系统管理员在配置⽤户权限时的疏忽,⽐如设置了过于宽松的sudo权限,可能让普通⽤户通过 sudo 命令执⾏root级别的操作,导致提权。
- 如果配置⽂件的权限设置不当(例如 /etc/passwd 或 /etc/shadow ⽂件),攻击者可能会利⽤这些⽂件执⾏恶意操作,改变系统账户的密码。
3.5.3 文件权限滥用
- 系统中某些关键⽂件(如⽤户密码⽂件、sudoers⽂件)如果权限配置不当,攻击者可能会通过直接修改这些⽂件获得超级⽤户权限。
总结:
SUID、SGID 和 Sticky Bit 都在Linux提权中扮演了重要⻆⾊。通常,Linux提权通过以下⽅式实现:
- 利⽤SUID:运⾏以root权限执⾏的⼆进制⽂件,从⽽获得root权限。
- 利⽤SGID:滥⽤组权限进⾏权限提升或访问系统资源。
- Sticky Bit:虽然不直接⽤于提权,但它的错误配置可能造成安全⻛险。
提权通常依赖于对系统漏洞的充分了解,恶意⽤户会通过探索系统中的误配置、漏洞和不当权限设置来尝试提升⾃⼰的权限。因此,系统管理员应当定期检查⽂件权限、修补已知漏洞并确保合理的系统配置,以防⽌此类攻击。