控制文件和目录权限

优质
小牛编辑
129浏览
2023-12-01

CONTROLLING FILE AND DIRECTORY PERMISSIONS

并非操作系统的每个用户都应具有相同级别的文件和目录访问权限。与任何专业操作系统一样,Linux 具有保护文件和目录访问的方法。系统允许系统管理员(root 用户或文件所有者)通过赋予用户读取,写入或执行文件的权限来保护其文件免受不必要的访问或篡改。对于每个文件和目录,我们可以为文件所有者、特定用户组以及所有其他用户指定权限状态,这在多用户操作系统中是必要的。

在本章中,我将向您展示如何检查和更改选定用户的文件和目录的权限,如何设置默认文件和目录权限以及如何设置特殊权限。最后,您将看到黑客对权限的理解如何帮助他们攻击系统。

多类型用户

在 Linux 系统中,root 用户非常强大。root 用户基本上可以执行任何操作。系统上的其他用户拥有有限的权限,不可能具有 root 用户具有的所有访问权限。

这些其他用户通常被收集到通常共享相似的组功能。在商业实体中,这些组可能是财务、工程、销售等。在 IT 环境中,这些组可能包括开发人员、网络管理员和数据库管理员。我们的想法是将具有相似需求的人员放入被授予相关权限的组中,然后该组的每个成员都会继承组权限。这主要是为了便于管理权限,从而确保安全性。

默认情况下,root 用户是 root 组的一部分。必须将系统上的每个新用户添加到组中才能继承该组的权限。

赋予权限

必须为每个文件和目录分配使用它的不同身份的特定级别的权限。三个级别的许可如下:

r 读权限。赋予用户打开与查看权限

w 写权限。赋予用户查看与编辑写入权限

x 执行权限。赋予用户执行一个文件(但是没有必要查看或者编辑它)

通过这种方式,root 用户可以根据用户需要的权限向用户授予一定级别的权限。创建文件时,通常创建文件的用户是文件的所有者,用户组是用户的当前组。该文件的所有者可以授予它各种访问权限。让我们看看如何更改权限以将所有权赋予给单个用户和组。

赋予个人用户权限

将文件的所有权转移到其他用户以便他们能够控制权限,我们可以使用 chown(或更改文件所有者)命令:

kali >chown ➊bob ➋/tmp/bobsfile

在这里,我们给出命令,我们给予所有权的用户的名称,然后是相关文件的位置和名称。此命令授予 Bob➊ 对文件 bobsfile➋ 所有权的用户帐户。

赋予用户组权限

要将文件的所有权从一个组转移到另一个组,我们可以使用 chgrp(或更改组)命令。

黑客通常更有可能单独工作而不是团体工作,但对于一些黑客或测试者在项目上一起工作并不是闻所未闻,在这种情况下,使用组是必要的。例如,您可能有一组测试人员和一组安全团队成员在同一个项目上工作。此示例中的测试者是根组,这意味着他们具有所有权限和访问权限。root 组需要访问黑客工具,而安全人员只需要访问防御工具,如入侵检测系统(IDS)。假设根组下载并安装名为 newIDS 的程序,根组需要将所有权更改为安全组,以便安全组可以随意使用它。为此,根组只需输入以下命令:

kali >chgrp ➊security ➋newIDS

此命令改变安全组 ➊newIDS➋ 的所有权。

现在您需要知道如何检查这些分配是否有效。你可以通过检查文件的权限来做到这一点。

检查权限

如果要查找为文件或目录的哪些用户授予的权限,请使用带有-l(long)开关的ls命令来显示目录的内容。ls -l命令在文件/ usr / share / hashcat(我最喜欢的密码破解工具之一)上,以便查看我们可以在那里了解的文件。

kali >ls –l /usr/share/hashcat

total 32952

➊➋ ➌ ➍ ➎ ➏ ➐

drwxr­xr­x 5 root root 4096 Dec 5 10:47 charsets

­rw­r­­r­­ 1 root root 33685504 June 28 2018 hashcat.hcstat

­rw­r­­r­­ 1 root root 33685504 June 28 2018 hashcat.hctune

drwxr ­xr­x 2 root root 4096 Dec 5 10:47 masks

drwxr ­xr­x 2 root root 4096 Dec 5 10:47 OpenCL

drwxr ­xr­x 3 root root 4096 Dec 5 10:47 rules

清单 5­1:使用 ls -l 命令检查文件的权限

我们获取有关以下内容的信息:

➊ 文件类型

➋ 所有者,组和用户的文件权限

➌ 链接数量(本主题超出了本书的范围。)

➍ 文件所有者

➎ 文件的大小(以字节为单位)

➏ 文件创建或上次修改时间

➐ 文件名

现在,让我们关注每条线左边看似难以理解的字母和短划线。它们告诉我们一个项目是文件还是目录,以及它上面有哪些权限(如果有的话)。

第一个字符告诉您文件类型,其中d代表目录,短划线( - )表示文件。这是两种最常见的文件类型。

下一节定义文件的权限。有三组三个字符,由 read(r),write(w)和 execute(x)的某种组合按顺序组成。第一组代表所有者的权限,第二组代表用户所在组的权限以及最后一个,所有其他用户的权限。

无论您正在查看哪一组三个字母,如果您首先看到r,该用户或用户组都有权打开和读取该文件或目录。作为中间字母的w意味着它们可以写入(修改)文件或目录,并且最后的x意味着它们可以执行(或运行)文件或目录。如果用短划线(

)替换任何 r,w 或 x,则未给出相应的权限。请注意,用户只能执行二进制文件或脚本的权限。

让我们使用清单 5-1 中的第三行输出作为示例:

­rw­r­­r­­ 1 root root 33685504 June 28 2018 hashcat.hcstat

正如我们从行的右端hashcat.hcstat所知,调用该文件。初始化(表示它是一个文件)之后,权限 rw-告诉我们所有者具有读写权限但没有执行权限。

下一组权限(r--)表示该组的权限,并显示该组具有读取权限但不具有写入或执行权限。最后,我们看到其他用户也只有读取权限(r--)。

这些权限不是一成不变的。作为 root 用户或文件所有者,您可以更改它们。接下来,我们会做到这一点。

改变用户权限

我们可以使用 Linux 命令chmod来更改权限。 只有 root 用户或文件所有者才能更改权限。在本节中,我们使用chmod来更改 hashcat.hcstat 的权限两个不同的方法。首先,我们使用权限的数字表示,然后我们使用符号表示。

十进制权限改变法

我们可以使用快捷方式通过使用单个数字来表示一个 rwx 权限集来引用权限。与操作系统下的所有内容一样,权限以二进制表示,因此 ON 和 OFF 开关分别由 1 和 0 表示。您可以将 rwx 权限视为三个 ON/OFF 开关,因此当授予所有权限时,这相当于 111 的二进制。

这样的二进制集很容易通过将其转换为八进制来表示为一位数,八位数字系统以 0 开头并以 7 结尾。八进制数字表示一组三位二进制数字,这意味着我们可以表示整个 rwx 集用一位数。下表 5-1 包含所有可能的权限组合及其八进制和二进制代表。

表 5­1: 八进制和二进制权限表示

二进制十进制权限(rwx)
0000---
0011--x
0102-w-
0113-wx
1004r--
1015r-x
1106Rw-
1117rwx

通过这些信息,我们来看一些例子。首先,如果我们只想设置读权限,我们可以查询表 5-1 并找到 read 的值:

r w x

4 ­ ­

接下来,如果我们想要将权限设置为 wx,我们可以使用相同的方法并查找设置 w 的权限以及设置 x 的权限:

r w x

­ 2 1

请注意,在表 5-1 中,-wx 的八进制表示为 3,这恰好是我们在设置 w 和 x 时添加两个值时获得的值相同:2

  • 1 = 3。

最后,当所有三个权限都打开时,它看起来像这样:

r w x

4 2 1

并且 4 + 2 + 1 = 7。这里,我们看到在 Linux 中,当所有权限开关都打开时,它们由八进制等效值 7 表示。

因此,如果我们想要表示所有者,组和所有用户的所有权限,我们可以按如下方式编写它:

7 7 7

这是快捷方式的来源。通过传递chmod三个八进制数字(每个 rwx 一个)后跟文件名,我们可以为每种类型的用户更改该文件的权限。在命令行中输入以下内容:

kali >chmod 774 hashcat.hcstat

看表 5-1,我们可以看到这个语句给了所有者所有权限,分组所有权限,其他所有人(其他)只有读取权限。

现在我们可以通过在目录上运行ls -l并查看 hashcat.hcstat 行来查看这些权限是否已更改。导航到该目录并立即运行该命令:

kali >ls -l

total 32952

drwxr­xr­x 5 root root 4096 Dec 5 10:47 charsets

➊ ­rwxrwxr­­ 1 root root 33685504 June 28 2018 hashcat.hcstat

­rw­r­­r­­ 1 root root 33685504 June 28 2018 hashcat.hctune

drwxr ­xr­x 2 root root 4096 Dec 5 10:47 masks

drwxr ­xr­x 2 root root 4096 Dec 5 10:47 OpenCL

drwxr ­xr­x 3 root root 4096 Dec 5 10:47 rules

你应该在 hashcat.hcstat 行 ➊ 的左侧看到-rwxrwxr--。这确认 chmod 调用成功更改了文件的权限,以使所有者和组能够执行该文件。

UGO 权限改变法

虽然数值方法可能是在 Linux 中更改权限的最常用方法,但有些人发现 chmod 的符号方法更直观,两种方法同样有效,所以只需找到适合你的方法。符号方法是通常称为 UGO 语法,代表用户(或所有者),组和其他人。

UGO 语法非常简单。输入 chmod 命令,然后输入要更改权限的用户,为用户提供 u,为组提供 g,为其他用户提供 o,或者输入三个运算符之一:

- 移除一个权限

+ 添加一个权限

= 设置一个权限

在操作符之后,包括要添加或删除的权限(rwx),最后包含要应用它的文件的名称。

因此,如果要删除用户对 hashcat.hcstat 所属文件的写入权限,可以输入以下内容:

kali >chmod u-w hashcat.hcstat

此命令表示从用户(u)中删除( - )hashcat.hcstat 的 write(w)权限。

现在,当您再次使用 ls -l 检查权限时,您应该看到 hashcat.hcstat 文件不再具有该用户的写入权限:

kali >ls -l

total 32952

drwxr­xr­x 5 root root 4096 Dec 5 10:47 charsets

­r­xr­xr­­ 1 root root 33685504 June 28 2018 hashcat.hcstat

­rw­r­­r­­ 1 root root 33685504 June 28 2018 hashcat.hctune

drwxr ­xr­x 2 root root 4096 Dec 5 10:47 masks

drwxr ­xr­x 2 root root 4096 Dec 5 10:47 OpenCL

drwxr ­xr­x 3 root root 4096 Dec 5 10:47 rules

您还可以使用一个命令更改多个权限。如果要同时为用户和其他用户(不包括组)授予执行权限,可以输入以下内容:

chmod u+x, o+x hashcat.hcstat

此命令告诉 Linux 为 hashcat.hcstat 文件添加用户的执行权限以及其他用户的执行权限。

给新程序赋予 root 权限

作为黑客,您经常需要下载新的黑客工具,但 Linux 会自动分配所有文件和目录的默认权限 666 和 777。 这意味着,默认情况下,您下载文件将无法立即执行它。如果你尝试,你通常会得到一条消息,上面写着“Permission denied”。对于这些情况,你需要给自己一个 root 身份并执行,使用 chmod 执行文件的权限。

例如,假设我们下载了一个名为 newhackertool 的新黑客工具,并将其放入 root 用户的目录(/)中。

kali >ls -l

total 80

drwxr­xr­x 7 root root 4096 Dec 5 11.17 Desktop

drwxr­xr­x 7 root root 4096 Dec 5 11.17 Documents

drwxr­xr­x 7 root root 4096 Dec 5 11.17 Downloads

drwxr­xr­x 7 root root 4096 Dec 5 11.17 Music

­rw­r­­r­­ 1 root root 1072 Dec 5 11.17 newhackertool➊

drwxr­xr­x 7 root root 4096 Dec 5 11.17 Pictures

drwxr­xr­x 7 root root 4096 Dec 5 11.17 Public

drwxr­xr­x 7 root root 4096 Dec 5 11.17 Templates

drwxr­xr­x 7 root root 4096 Dec 5 11.17 Videos

我们可以在 ➊ 看到 newhackertool,以及根目录的其他内容。我们可以看到我们的 newhackertool 没有任何人的执行权限 这使得无法使用。可能看起来很奇怪,默认情况下,Linux 不允许您执行下载的文件,但总体而言,此设置使您的系统更安全。

我们可以通过输入以下内容来允许自己执行 newhackertool:

kali >chmod 766 newhackertool

现在,当我们在目录上执行 list 时,我们可以看到我们的 newhackertool 具有对所有者的执行权限:

kali \>chmod 766 newhackertool
kali \>ls -l
total 80
drwxr­xr­x 7 root root 4096 Dec 5 11.17 Music
­rwxrw­rw­ 1 root root 1072 Dec 5 11.17 newhackertool
drwxr­xr­x 7 root root 4096 Dec 5 11.17 Pictures

正如您现在所理解的,这将授予我们(作为所有者)所有权限,包括执行权限,并授予该组以及其他所有人只有读写权限(4 - 2 = 6)。

赋予默认的安全级别权限

如您所见,Linux 自动分配基本权限(通常为文件 666 和目录 777)。您可以使用 umask(或 unmask)方法更改分配给每个用户创建的文件和目录的默认权限。umask 方法表示要从文件或目录的基本权限中删除的权限,以使其更安全。

umask 是对应于三个权限数字的三位十进制数字,但是从权限编号中减去 umask 编号以提供新的权限状态。这意味着当创建新文件或目录时,它权限设置为默认值减去 umask 中的值,如图 5-1 所示。

图 5­1: umask 值 022 如何影响新文件和目录的权限

例如,如果 umask 设置为 022,则具有原始默认权限 666 的新文件现在将具有权限 644,这意味着所有者具有读取和写入权限,并且该组和所有其他用户仅具有读取权限。

在 Kali 中,与大多数 Debian 系统一样,umask 预先配置为 022,这意味着 Kali 默认值为 644,文件为 755,目录为 755。

umask 值对于系统上的所有用户都不是通用的。每个用户都可以为其个人.profile 文件中的文件和目录设置个人默认 umask 值。要以用户身份登录时查看当前值,只需输入命令 umask 并记下返回的内容。要更改用户的 umask 值,请编辑该文件/home/username/.profile,例如,添加 umask 007 进行设置,以便只有用户和用户组的成员才具有权限。

特别权限

除了三个通用权限 rwx,Linux 还有三个特殊权限,稍微复杂一些。这些特殊权限是设置用户 ID(或 SUID),设置组 ID(或 SGID)和粘滞位。我将在接下来的三个部分中依次讨论每个部分。

使用 SUID 授予临时 root 权限

正如您现在应该知道的那样,用户只有在有权执行该特定文件时才能执行该文件。如果用户只具有读取和(或)写入权限,则无法执行。这可能看起来很简单,但这条规则有例外。

你可能遇到过这样一种情况:文件在被所有用户(即使非 root 用户)执行期间都需要 root 用户的权限。例如,允许用户更改其密码的文件需要访问/etc/shadow(Linux 中保存用户密码的文件),该文件需要 root 用户权限才能执行。在这种情况下,通过在程序上设置 SUID 位,可以临时授予所有者执行文件所需的特权。

基本上,SUID 位表示任何用户都可以使用所有者的权限来执行该文件,但这些权限不会超出使用该文件的范围。

要设置 SUID 位,请在常规权限之前输入 4,因此当设置 SUID 位时,具有 644 的新结果权限的文件表示为 4644。

使用 SGID 授予 Root 用户组权限

SGID 授予临时权限,但它授予文件所有者组的权限,而不是文件所有者的权限。这意味着,设置 SGID 位,没有执行权限的人可以执行文件,如果所有者属于有权执行该文件的组。

应用于目录时,SGID 位的工作方式略有不同:当该位置位时在目录中,在该目录中创建的新文件的所有权将转到目录创建者的组,而不是文件创建者的组。当多个用户共享目录时,这非常有用。该组中的所有用户都可以执行文件,而不仅仅是单个用户。

SGID 位在常规权限之前表示为 2,因此当 SGID 位置位时,具有结果权限 644 的新文件将表示为 2644。 同样,您可以使用 chmod 命令(例如,chmod 2644 filename)。

过时的粘滞位

粘滞位是您可以在目录上设置的权限位,以允许用户删除或重命名该目录中的文件。然而,粘性位是旧 Unix 系统的遗留物,现代系统(如 Linux)忽略了它。因此,我不会在这里进一步讨论,但你应该熟悉这个术语,因为你可能会在 Linux 世界中听到它。

提权

作为黑客,这些特殊权限可用于通过权限提升来利用 Linux 系统,从而使普通用户获得 root 或 sysadmin 权限以及相关权限。使用 root 权限,您可以在系统上执行任何操作。

一种方法是利用 SUID 位。系统管理员或软件开发人员可以在程序上设置 SUID 位,以允许该程序访问具有 root 权限的文件。例如,需要更改密码的脚本通常具有 SUID 位设置。作为黑客,您可以使用该权限获取临时 root 权限并执行恶意操作,例如访问/etc/shadow 中的密码。

让我们在我们的 Kali 系统上查找设置了 SUID 位的文件来试试这个。回到第 1 章,我向你介绍了 find 命令。我们将使用它的功能来查找 SUID 位设置的文件。

你会记得,find 命令功能强大,但语法比其他一些定位命令要复杂一些,比如 locate 和 which。如果需要,请查看第 1 章中的 find 语法。

在这种情况下,我们希望在文件系统的任何位置查找文件,对于 root 用户或其他 sysadmin,具有权限 4000。为此,我们可以使用以下find命令:

kali \>find / -user root -perm -4000

使用此命令,我们要求 Kali 开始使用/语法查看文件系统的顶部。然后,它会在/下面找到由 root 拥有的文件,用户 root 指定的文件以及设置了 SUID 权限位的文件(-perm -4000)。

当我们运行此命令时,我们得到输出显示在清单 5-2 中。

/usr/bin/chsh
/usr/bin/gpasswd
/usr/bin/pkexec
/usr/bin/sudo
/usr/bin/passwd
/usr/bin/kismet_capture
­­snip­­

清单 5­2: 通过 SUID 位查找文件

输出显示了许多具有 SUID 位设置的文件。让我们进入/usr/bin 目录,其中包含许多这些文件,然后在其上运行一个长列表目录并向下滚动到 sudo 文件,如清单5-3 所示。

kali \>cd /usr/bin
kali \>ls -l
­rwxr­xr­x 1 root root 176272 Jul 18 2018 stunnel4
­rwxr­xr­x 1 root root 26696 Mar 17 2018 sucrack
➊­ rwsr­xr­x 1 root root 140944 Jul 5 2018 sudo

清单 5­3: 通过 SUID 识别文件

请注意 ➊,所有者的第一组权限(具有 s 代替 x)。这就是 Linux 表示 SUID 位已设置的方式。这意味着任何人跑 sudo 文件具有 root 用户的权限,这可能是系统管理员的安全问题,也可能是黑客的潜在攻击媒介。 例如,某些应用程序需要访问/etc/shadow 文件才能成功完成其任务。如果攻击者可以控制该应用程序,他们可以使用该应用程序访问 Linux 系统上的密码。

Linux 具有良好的安全系统,可保护文件和目录免受未经授权的访问。 有抱负的黑客需要对该系统有基本的了解,不仅要保护他们的文件,还要执行新的工具和文件。 在某些情况下,黑客可以利用 SUID 和 SGID 权限来升级来自普通用户的权限到 root 用户。

总结

Linux 使用权限来保护用户或组的文件和目录免受系统中其他用户的攻击,可用于攻击性和防御性目的。 您现在应该知道如何管理这些权限以及如何利用此弱点来攻击系统(特别是 SUID 和 SGID 位)。