我是根。 了解 Linux 操作系统权限提升

我花了 2020 年第一季度的时间准备 OSCP 考试。 在Google上搜索信息以及大量的“盲目”尝试占据了我所有的空闲时间。 理解增加特权的机制尤其困难。 PWK课程非常关注这个话题,但教材却永远不够。 互联网上有很多包含有用命令的手册,但我不喜欢在不了解其结果的情况下盲目遵循建议。

我想与您分享我在准备和成功通过考试期间学到的东西(包括定期尝试 Hack The Box)。 我对每一个帮助我更有意识地走“努力”之路的信息都怀有强烈的感激之情,现在是我回馈社区的时候了。

我想给你一本关于如何在 Linux 操作系统中升级权限的手册,其中包括对最常见向量和相关功能的分析,这对你肯定有用。 通常,增加特权的机制本身非常简单;但在构建和分析信息时就会出现困难。 因此,我决定从“观光旅游”开始,然后在单独的文章中考虑每个向量。 我希望我能为您节省一些研究该主题的时间。

我是根。 了解 Linux 操作系统权限提升

那么,如果这些方法已经众所周知很长时间了,为什么在 2020 年还可能出现特权升级呢? 事实上,如果用户正确操作系统,是根本不可能在系统中增加权限的。 产生这些机会的主要全球问题是 不安全的配置。 系统中存在包含漏洞的过时软件版本也是不安全配置的一种特殊情况。

通过不安全配置进行权限升级

首先,让我们处理不安全的配置。 让我们从 IT 专业人员经常使用手册和资源,例如 stackoverflow,其中许多包含不安全的命令和配置。 一个引人注目的例子—— 这个消息 从 stackoverflow 复制最多的代码包含错误。 经验丰富的管理员会看到门框,但这是一个理想的世界。 即使是有能力的专家 工作量增加 有能力犯错误。 想象一下,管理员正在准备和协调下一次招标的文档,同时深入研究下个季度将要实施的新技术,同时定期解决用户支持问题。 然后,他的任务是快速设置几个虚拟机并在其上推出服务。 您认为管理员根本没有注意到门框的概率是多少? 然后专家会更换,但拐杖仍然存在,而公司始终努力最大限度地降低成本,包括 IT 员工的成本。

伪shell与越狱

在利用阶段获得的系统 shell 通常是有限的,特别是如果您通过黑客攻击 Web 服务器的用户来获得它。 例如,shell 限制可能会阻止您运行 sudo 命令,从而产生错误:

sudo: no tty present and no askpass program specified

拥有 shell 后,我建议创建一个成熟的终端,例如使用 Python。

python -c 'import pty;pty.spawn("/bin/bash")'

您可能会问:“如果我可以使用一个命令(例如传输文件),为什么还需要一千个命令?” 事实上,系统的配置不​​同;给定的主机可能没有安装 Python,但可能安装了 Perl。 技能是能够在没有熟悉的工具的情况下在系统中做熟悉的事情。 可以找到完整的功能列表 这里.

可以使用以下命令获得低特权 shell 1 队 и 2 队 (令人惊讶的是,甚至是 GIMP)。

查看命令历史记录

Linux 收集文件中所有执行命令的历史记录 ~ / .bash_history。 如果服务器正在被积极使用并且其历史记录未被清除,则很有可能在此文件中找到凭据。 清除历史记录简直不方便。 如果管理员被迫通过 来选择十层命令,当然,他从历史记录中调用这个命令会比再次输入更方便。 另外,很多人不知道这个“黑客”。 如果系统中有像 Zsh 或 Fish 这样的替代 shell,它们就有自己的历史。 要在任何 shell 中显示命令历史记录,只需键入命令历史记录即可。

cat ~/.bash_history
cat ~/.mysql_history
cat ~/.nano_history
cat ~/.php_history
cat ~/.atftp_history

有共享托管,其中服务器用于托管多个网站。 通常,使用此配置,每个资源都有其自己的用户,具有单独的主目录和虚拟主机。 因此,如果配置不正确,您可以在Web资源的根目录中找到.bash_history文件。

在文件系统中搜索密码并对相邻系统进行攻击

您当前的用户可能可以读取各种服务的配置文件。 在其中,您可以找到明文的凭据 - 用于访问数据库或相关服务的密码。 可以使用相同的密码来访问数据库和授权 root 用户(凭证人员配置)。
碰巧发现的凭据属于其他主机上的服务。 通过受感染的主机对基础设施发起攻击并不比利用其他主机更糟糕。 还可以通过在文件系统中查找 IP 地址来找到相邻系统。

grep -lRi "password" /home /var/www /var/log 2>/dev/null | sort | uniq #Find string password (no cs) in those directories
grep -a -R -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' /var/log/ 2>/dev/null | sort -u | uniq #IPs inside logs

如果受感染的主机具有可通过 Internet 访问的 Web 应用程序,则最好将其日志从 IP 地址搜索中排除。 互联网上的资源用户地址不太可能对我们有用,但从日志来看,内部网络的地址(172.16.0.0/12、192.168.0.0/16、10.0.0.0/8)以及它们去了哪里,可能会感兴趣。

须藤

sudo 命令使用户能够使用自己的密码或根本不使用密码在根上下文中执行命令。 Linux 中的许多操作都需要 root 权限,但以 root 身份运行被认为是非常糟糕的做法。 相反,最好应用选择性权限来在根上下文中执行命令。 然而,许多 Linux 工具,包括像 vi 这样的标准工具,都可以用来以合法的方式升级权限。 要找到合适的方法,我建议寻找 这里.

获得系统访问权限后需要做的第一件事是运行 sudo -l 命令。 它将显示使用 sudo 命令的权限。 如果获得没有密码的用户(例如 apache 或 www-data),则不太可能通过 sudo 进行权限升级。 使用 sudo 时,系统会要求输入密码。 您也无法使用 passwd 命令设置密码;它会询问用户的当前密码。 但如果 sudo 仍然可用,那么本质上你需要寻找:

  • 任何解释器,任何人都可以生成 shell(PHP、Python、Perl);
  • 任何文本编辑器(vim、vi、nano);
  • 任何观众(更少、更多);
  • 任何使用文件系统的能力(cp、mv);
  • 以 bash、交互式或可执行命令形式输出的工具(awk、find、nmap、tcpdump、man、vi、vim、ansible)。

Suid/Sgid

互联网上有许多手册建议收集所有 suid/sgid 命令,但很少有一篇文章详细说明了如何处理这些程序。 可以找到不考虑利用漏洞的升级权限的选项 这里。 此外,许多可执行文件存在针对操作系统版本的特定漏洞, 例如.

在理想的情况下,您至少可以通过 searchsploit 运行所有已安装的软件包。 实际上,这应该使用最流行的程序(例如 sudo)来完成。 始终可以选择使用和支持自动化工具的开发,从权限升级的角度来看,这些工具将突出显示具有 suid/sgid 位设置的可执行文件。 我将在文章的相应部分提供此类工具的列表。

由 Cron 或 Init 在 Root 上下文中运行的可写脚本

Cron 作业可以在不同的用户上下文下运行,包括 root。 如果 cron 任务设置了可执行文件的链接,并且可供您编写,那么它很容易被恶意任务替换并导致权限升级。 但是,默认情况下,任何用户都可以读取带有 cron 任务的文件。

ls -la /etc/cron.d  # show cron jobs 

情况与init类似。 不同之处在于 cron 中的任务是定期执行的,而 init 中的任务是在系统启动时执行。 操作需要重新启动系统,并且某些服务可能无法启动(如果它们未在启动时注册)。

ls -la /etc/init.d/  # show init scripts 

您还可以搜索任何用户均可写入的文件。

find / -perm -2 -type f 2>/dev/null # find world writable files

该方法是众所周知的;经验丰富的系统管理员会小心地使用 chmod 命令。 然而,在互联网上,绝大多数手册都描述了设置最大权限。 缺乏经验的系统管理员的“让它发挥作用”的方法原则上为权限升级创造了机会。 如果可能,最好在命令历史记录中查找 chmod 的不安全使用。

chmod +w /path 
chmod 777 /path

获得其他用户的 shell 访问权限

我们查看 /etc/passwd 中的用户列表。 我们关注那些有壳的人。 您可以暴力破解这些用户 - 通过生成的用户最终可能会增加权限。

为了提高安全性,我建议您始终坚持最小权限原则。 花时间检查故障排除后可能残留的不安全配置也是有意义的 - 这是系统管理员的“技术职责”。

自写代码

值得仔细查看用户主目录和 Web 服务器(/var/www/,除非另有说明)中的可执行文件。 这些文件可能是一个完全不安全的解决方案,并且包含令人难以置信的拐杖。 当然,如果您的 Web 服务器目录中有某种框架,那么在渗透测试中寻找零日漏洞是没有意义的,但建议查找并研究自定义修改、插件和组件。

为了提高安全性,如果可能的话,最好避免在自己编写的脚本中使用凭据以及潜在危险的功能,例如读取 /etc/shadow 或操纵 id_rsa。

通过利用漏洞提升权限

在尝试通过利用来提升权限之前,了解这一点很重要 将文件传输到目标主机。 除了 ssh、ftp、http(wget、curl)等常用工具之外,还有一整套工具 可能性的“动物园”.

为了提高系统安全性,请定期更新至最新 稳定的 版本,并尝试使用为企业设计的发行版。 否则,很少有 apt 升级导致系统无法运行的情况。

利用在 root 用户上下文下运行的服务

某些 Linux 服务以 root 身份运行。 可以使用命令 ps aux | 找到它们。 grep 根。 在这种情况下,该服务可能不会在互联网上做广告并且在本地可用。 如果它具有公共漏洞,则可以安全地使用它们:发生故障时的服务崩溃远没有操作系统崩溃那么严重。

ps -aux | grep root # Linux

最成功的案例可以被认为是在 root 用户的上下文中操作被黑客攻击的服务。 SMB 服务的操作可提供 Windows 系统上的特权系统访问权限(例如,通过 ms17-010)。 然而,这在 Linux 系统上并不常见,因此您可能会花费大量时间来升级权限。

利用Linux内核漏洞

这是你应该最后走的路。 不成功的操作可能会导致系统崩溃,并且在重新启动时,某些服务(包括获取初始shell的服务)可能无法启动。 碰巧管理员只是忘记使用 systemctl enable 命令。 另外,如果没有达成一致的操作,将会导致你对工作的很多不满。
如果您决定使用exploitdb 的源代码,请务必阅读脚本开头的注释。 除此之外,它通常会说明如何正确编译给定的漏洞利用程序。 如果你太懒了或者由于截止日期而不得不在“昨天”完成,你可以寻找已经编译了漏洞的存储库, 例如。 然而,您应该明白,在这种情况下,您将陷入困境。 另一方面,如果一个程序员能够精确地理解计算机的工作原理及其使用的软件,那么他一生都不会编写任何代码。

cat /proc/version
uname -a
searchsploit "Linux Kernel" 

Metasploit的

为了捕获和处理连接,最好使用exploit/multi/handler 模块。 最主要的是设置正确的有效负载,例如 generic/shell/reverse_tcp 或 generic/shell/bind_tcp。 Metasploit 生成的 shell 可以使用 post/multi/manage/shell_to_meterpreter 模块升级到 Meterpreter。 使用 Meterpreter,您可以自动化后利用过程。 例如,post/multi/recon/local_exploit_suggester 模块会检查利用所需的平台、架构和实体,并建议 Metasploit 模块来提升目标系统上的权限。 感谢 Meterpreter,升级权限有时可以归结为启动所需的模块,但在不了解幕后情况的情况下进行黑客攻击并不是“真实的”(您仍然需要编写报告)。

工具

自动收集本地信息的工具将为您节省大量精力和时间,但它们本身无法完全识别权限升级的路径,特别是在利用内核漏洞的情况下。 自动化工具将执行所有必要的命令,以便您收集有关系统的信息,但能够 分析 收到数据。 我希望我的文章在这方面对您有用。 当然,还有比我下面列出的更多的工具,但它们都做大致相同的事情 - 这只是一个品味问题。

豌豆

Tula 是最近的一次提交,第一次提交可以追溯到 2019 年 XNUMX 月。 目前我最喜欢的工具。 重点是它突出了特权升级的最有趣的向量。 同意,在这个级别获得专家评估比解析整体原始数据更方便。

林枚举

我第二喜欢的工具,它还收集和组织通过本地枚举获得的数据。

Linux 漏洞利用建议 (1,2)

此漏洞将分析系统是否有合适的漏洞条件。 事实上,它将完成与 Metasploit 模块 local_exploit_suggester 相同的工作,但将提供exploit-db 源代码而不是 Metasploit 模块的链接。

Linux隐私检查器

该脚本将收集大量信息并将其组织成多个部分,这些信息可用于形成增加权限的向量。

下次我会详细介绍 通过 suid/sgid 在 Linux 操作系统中提升权限.

来源: habr.com

添加评论