黑客学习...

从本质上讲,权限升级通常涉及从权限较低的帐户转到权限较高的帐户。从技术上讲,它是利用操作系统或应用程序中的漏洞、设计缺陷或配置疏忽来未经授权访问通常限制用户的资源。

在执行实际渗透测试时,很少能够获得立足点(初始访问权限),从而为您提供直接管理访问权限。权限提升至关重要,因为它允许您获得系统管理员级别的访问权限,从而允许您执行以下操作:

  • 重置密码
  • 绕过访问控制以泄露受保护的数据
  • 编辑软件配置
  • 启用持久性
  • 更改现有(或新)用户的权限
  • 执行任何管理命令

1.自动枚举工具

常见的有PSPy4,linenum,linpeas等,可以展示计算机的所有数据,节省测试时间

目标系统的环境将影响您将能够使用的工具。例如,如果目标系统上未安装用 Python 编写的工具,您将无法运行该工具。这就是为什么最好熟悉一些而不是拥有单一的首选工具。

2.内核攻击

理想情况下,权限提升会导致根权限。有时只需利用现有漏洞,或者在某些情况下通过访问具有更多权限、信息或访问权限的另一个用户帐户,即可实现此目的。

除非单个漏洞导致根 shell,否则权限提升过程将依赖于错误配置和宽松权限。

内核漏洞利用方法很简单;

  1. 确定内核版本
  2. 搜索并查找目标系统内核版本的漏洞利用代码
  3. 运行漏洞利用

虽然看起来很简单,但请记住,内核漏洞利用失败会导致系统崩溃。在尝试内核漏洞利用之前,请确保此潜在结果在您的渗透测试参与范围内是可接受的。

  1. 根据您的调查结果,您可以使用 Google 搜索现有的漏洞利用代码。
  2. 诸如 https://www.linuxkernelcves.com/cves 之类的来源也很有用。
  3. 另一种选择是使用 LES(Linux 漏洞利用建议器)等脚本,但请记住,这些工具可能会产生误报(报告不影响目标系统的内核漏洞)或漏报(尽管内核易受攻击,但不报告任何内核漏洞)。

提示/注释:

  1. 在Google,Exploit-db或searchsploit上搜索漏洞时对内核版本过于具体
  2. 在启动漏洞利用代码之前,请确保您了解其工作原理。某些漏洞利用代码可能会对操作系统进行更改,使其在进一步使用时不安全,或者对系统进行不可逆的更改,从而在以后产生问题。当然,在实验室或CTF环境中,这些可能不是大问题,但在真正的渗透测试活动中,这些都是绝对的禁忌。
  3. 某些漏洞在运行后可能需要进一步交互。阅读漏洞利用代码提供的所有注释和说明。
  4. 您可以使用 SimpleHTTPServer Python 模块将 wget 漏洞利用代码从您的计算机传输到目标系统。

3.sudo

任何用户都可以使用该 sudo -l 命令检查其与 root 权限相关的当前情况。
在此上下文中,某些应用程序不会有已知的攻击。您可能会看到这样的应用程序是Apache2服务器。

在这种情况下,我们可以使用“黑客”来利用应用程序的功能来泄漏信息。正如你在下面看到的,Apache2有一个支持加载替代配置文件的选项( -f :指定一个备用的ServerConfigFile)。

使用此选项加载文件将导致包含 /etc/shadow /etc/shadow 文件第一行的错误消息。

杠杆LD_PRELOAD

在某些系统上,您可能会看到“LD_PRELOAD环境”选项。
LD_PRELOAD是一个允许任何程序使用共享库的函数。这篇博文将带您了解LD_PRELOAD的功能。如果启用了“env_keep”选项,我们可以生成一个共享库,该库将在程序运行之前加载和执行。请注意,如果真实用户 ID 与有效用户 ID 不同,则将忽略LD_PRELOAD选项。
此权限升级向量的步骤可以总结如下;

  1. 检查LD_PRELOAD(使用env_keep选项)
  2. 编写编译为共享对象(.so 扩展名)文件的简单 C 代码
  3. 使用 sudo 权限和指向我们的 .so 文件的LD_PRELOAD选项运行程序

C 代码将简单地生成一个根 shell,可以编写如下;

1
2
3
4
5
6
7
8
9
10
#include <stdio.h> #include < stdio.h>
\#include <sys/types.h> #include < sys/types.h>
\#include <stdlib.h> #include < stdlib.h>

void _init() { void _init() {
unsetenv("LD_PRELOAD"); unsetenv(“LD_PRELOAD”);
setgid(0); 塞吉德(0);
setuid(0); 塞图伊德(0);
system("/bin/bash"); system(“/bin/bash”);
}

我们可以将此代码保存为 shell.c,并使用以下参数使用 gcc 将其编译为共享对象文件;

1
gcc -fPIC -shared -o shell.so shell.c -nostartfiles

现在,我们可以在启动用户可以使用 sudo 运行的任何程序时使用此共享对象文件。在我们的例子中,可以使用 Apache2、find 或几乎所有我们可以用 sudo 运行的程序。

我们需要通过指定LD_PRELOAD选项来运行程序,如下所示;

1
sudo LD_PRELOAD=/home/user/ldpreload/shell.so find

这将导致具有根权限的 shell 生成。

4.SUID

许多 Linux 权限控制依赖于控制用户和文件交互。这是通过权限完成的。到目前为止,您知道文件可以具有读取、写入和执行权限。这些权限授予用户的权限级别。这随着 SUID(设置用户标识)和 SGID(设置组标识)而更改。它们允许分别以文件所有者或组所有者的权限级别执行文件。

您会注意到这些文件设置了一个“s”位,显示其特殊权限级别。

find / -type f -perm -04000 -ls 2>/dev/null will list files that have SUID or SGID bits set.

一个好的做法是将此列表中的可执行文件与 go awayBins (https://gtfobins.github.io) 进行比较。单击 SUID 按钮将过滤设置 SUID 位时已知可利用的二进制文件(您也可以将此链接用于预过滤列表 https://gtfobins.github.io/#+suid)。

上面的列表显示nano设置了SUID位。不幸的是,离开垃圾箱并不能为我们提供轻松的胜利。典型的现实生活中的特权升级场景,我们需要找到中间步骤,以帮助我们利用我们所拥有的任何微小发现。

image-20230830132409063

为nano文本编辑器设置的SUID位允许我们使用文件所有者的权限创建,编辑和读取文件。Nano 归 root 所有,这可能意味着我们可以以比当前用户更高的权限级别读取和编辑文件。在此阶段,我们有两个基本的权限提升选项:读取 /etc/shadow 文件或将我们的用户添加到 /etc/passwd .

读取 /etc/shadow 文件
我们看到 nano 文本编辑器通过运行 find / -type f -perm -04000 -ls 2>/dev/null 命令设置了 SUID 位。

nano /etc/shadow 将打印 /etc/shadow 文件的内容。我们现在可以使用 unshadow 工具创建一个可由开膛手约翰破解的文件。为此,取消阴影需要 /etc/shadow/etc/passwd 文件。

image-20230830133006291

有了正确的单词列表和一点运气,开膛手约翰可以以明文形式返回一个或多个密码.

我们将需要我们希望新用户拥有的密码的哈希值。这可以使用Kali Linux上的openssl工具快速完成。

image-20230830133201875

We will then add this password with a username to the /etc/passwd file.
然后,我们将使用此密码和用户名添加到 /etc/passwd 文件中。

image-20230830133249884

一旦我们的用户被添加(请注意如何使用 root:/bin/bash 来提供根外壳),我们将需要切换到这个用户,并希望应该具有root权限。

5.Privilege Escalation: Capabilities

系统管理员可以用来提高进程或二进制文件权限级别的另一种方法是“功能”。功能有助于在更精细的级别管理权限。例如,如果 SOC 分析师需要使用需要启动套接字连接的工具,则普通用户将无法执行此操作。如果系统管理员不想授予此用户更高的权限,他们可以更改二进制文件的功能。因此,二进制文件将完成其任务,而无需更高权限的用户。

我们可以使用 getcap 该工具列出已启用的功能。

image-20230830135037066

请注意,vim 及其副本都没有设置 SUID 位。因此,在枚举查找 SUID 的文件时,无法发现此权限升级向量。

Go Awaybins 有一个很好的二进制文件列表,如果我们找到任何设置的功能,可以利用这些二进制文件进行权限提升。

我们注意到 vim 可以与以下命令和有效负载一起使用:

image-20230830140017091

6.Privilege Escalation: Cron Jobs

Cron 作业用于在特定时间运行脚本或二进制文件。默认情况下,它们以其所有者而不是当前用户的权限运行。虽然正确配置的 cron 作业本身并不容易受到攻击,但在某些情况下它们可以提供权限升级向量。

这个想法很简单;如果有一个以 root 权限运行的计划任务,并且我们可以更改将要运行的脚本,那么我们的脚本将以 root 权限运行。

系统上的每个用户都有自己的 crontab 文件,无论他们是否登录,都可以运行特定任务。如您所料,我们的目标是找到一个由 root 设置的 cron 作业,并让它运行我们的脚本,最好是 shell。

任何用户都可以在以下情况下 /etc/crontab 读取保存系统范围的 cron 作业的文件

虽然 CTF 机器可以每分钟或每 5 分钟运行一次 cron 作业,但您更经常会在渗透测试活动中看到每天、每周或每月运行的任务。

您可以看到脚本 backup.sh 配置为每分钟运行一次。该文件的内容显示了一个简单的脚本,该脚本创建了价格.xls文件的备份。

该脚本将使用目标系统上可用的工具来启动反向 shell。
有两点需要注意;

  1. 命令语法因可用工具而异。(例如, nc 可能不支持 -e 您在其他情况下看到的选项)
  2. 我们应该始终倾向于启动反向外壳,因为我们不想在实际的渗透测试中损害系统完整性。

该文件应如下所示:

image-20230830141146678
我们现在将在攻击机器上运行侦听器以接收传入连接。

7.PATH

如果用户具有写入权限的文件夹位于路径中,则可能会劫持应用程序以运行脚本。Linux 中的 PATH 是一个环境变量,它告诉操作系统在哪里搜索可执行文件。对于任何未内置在 shell 中或未使用绝对路径定义的命令,Linux 将开始在 PATH 下定义的文件夹中搜索。(PATH 是我们在这里讨论的环境变量,path 是文件的位置)。

image-20230830141827282

劫取调用文件,进入shell