前言
并非操作系统的每个用户都应具有相同级别的文件和目录访问权限。与任何专业操作系统一样,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(我最喜欢的密码破解工具之一)上,以便查看我们可以在那里了解的文件。
我们获取有关以下内容的信息:
- 文件类型
- 所有者,组和用户的文件权限
- 链接数量(本主题超出了本书的范围。)
- 文件所有者
- 文件的大小(以字节为单位)
- 文件创建或上次修改时间
- 文件名
现在,让我们关注每条线左边看似难以理解的字母和短划线。它们告诉我们一个项目是文件还是目录,以及它上面有哪些权限(如果有的话)。第一个字符告诉您文件类型,其中 d 代表目录,短划线( - )表示文件。这是两种最常见的文件类型。下一节定义文件的权限。有三组三个字符,由 read( r ),write( w )和 execute( x )的某种组合按顺序组成。第一组代表所有者的权限,第二组代表用户所在组的权限以及最后一个,所有其他用户的权限。
无论您正在查看哪一组三个字母,如果您首先看到 r ,该用户或用户组都有权打开和读取该文件或目录。作为中间字母的 w 意味着它们可以写入(修改)文件或目录,并且最后的 x 意味着它们可以执行(或运行)文件或目录。如果用短划线( - )替换任何 r,w 或 x,则未给出相应的权限。例如:
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 集用一位数。下表 包含所有可能的权限组合及其八进制和二进制代表。
通过这些信息,我们来看一些例子。首先,如果我们只想设置读权限,我们可以查询表 并找到 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
我们可以看到这个语句给了所有者所有权限,分组所有权限,其他所有人(其他)只有读取权限。现在我们可以通过在目录上运行 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 所示。
例如,如果 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。
使用 SUID 授予 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--
输出显示了许多具有 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
请注意➊,所有者的第一组权限(具有 s 代替 x)。这就是 Linux 表示 SUID 位已设置的方式。这意味着任何人跑sudo文件具有root用户的权限,这可能是系统管理员的安全问题,也可能是黑客的潜在攻击媒介。例如,某些应用程序需要访问/etc/shadow 文件才能成功完成其任务。如果攻击者可以控制该应用程序,他们可以使用该应用程序访问 Linux 系统上的密码。Linux 具有良好的安全系统,可保护文件和目录免受未经授权的访问。 有抱负的黑客需要对该系统有基本的了解,不仅要保护他们的文件,还要执行新的工具和文件。 在某些情况下,黑客可以利用 SUID 和 SGID权限来升级来自普通用户的权限到 root 用户。
总结
Linux 使用权限来保护用户或组的文件和目录免受系统中其他用户的攻击,可用于攻击性和防御性目的。您现在应该知道如何管理这些权限以及如何利用此弱点来攻击系统(特别是 SUID 和 SGID 位)。