【THM】 通用 Linux Privesc

发布时间 2023-12-09 03:02:54作者: trymonoly

了解 Privesc

“权限提升”是什么意思?

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

为什么它很重要?

在进行 CTF 或实际渗透测试时,您很少能够获得提供管理员访问权限的立足点(初始访问权限)。权限提升至关重要,因为它允许您获得系统管理员级别的访问权限。这使您可以执行许多操作,包括:

  • 重置密码
  • 绕过访问控制以泄露受保护的数据
  • 编辑软件配置
  • 启用持久性,以便以后可以再次访问计算机。
  • 更改用户的权限
  • 获取厚颜无耻的根标志;)

以及所需的任何其他管理员或超级用户命令。

权限提升方向

特权树:

 

有两种主要的权限提升变体:

水平权限提升:这是通过接管与您处于相同权限级别的其他用户来扩大对受感染系统的影响范围的地方。例如,一个普通用户劫持另一个普通用户(而不是提升为超级用户)。这允许您继承该用户拥有的任何文件和访问权限。例如,这可用于访问另一个普通特权用户,该用户恰好将 SUID 文件附加到其主目录(稍后会详细介绍),然后可以使用该文件来获取超级用户访问权限。[在树上侧身旅行]

 

垂直权限提升(权限提升):这是您尝试使用已泄露的现有帐户获得更高权限或访问权限的地方。 对于本地权限升级攻击,这可能意味着劫持具有管理员权限或 root 权限的帐户。[在树上旅行]

 

列举

 

什么 是LinEnum吗?

LinEnum 是一个简单的 bash 脚本,用于执行常用命令 与权限提升相关,节省时间并允许更多工作 要扎根。重要的是要了解什么 LinEnum 执行的命令,以便您可以手动枚举 privesc 漏洞在无法使用的情况下 LinEnum 或其他类似的脚本。在这个房间里,我们将解释什么 LinEnum 正在显示,以及可以使用哪些命令来复制它。

从哪里获得 LinEnum

 

您可以从以下位置下载 LinEnum 的本地副本:

https://github.com/rebootuser/LinEnum/blob/master/LinEnum.sh

值得把它放在你会记住的地方,因为 LinEnum 是一个非常宝贵的工具。

如何在目标计算机上获取 LinEnum?

有两种方法可以在目标计算机上获取 LinEnum。第一个 方式,就是转到您拥有本地副本的目录 LinEnum 存储在 Python Web 服务器中,并使用“python3 -m http.server 8000“ [1]。然后,在目标机器上使用“wget”和您的本地 IP,您可以从中获取文件 本地计算机 [2]。然后使用 命令“chmod +x FILENAME.sh”。

 

 

其他方法

如果您无法传输文件,如果您 有足够的权限,从 本地计算机 [1] 并将其粘贴到目标上的新文件中,使用 Vi 或 Nano [2]。完成此操作后,您可以使用“.sh”扩展名保存文件。然后使用使文件可执行 命令“chmod +x FILENAME.sh”。你现在拥有现在 在目标上创建了自己的 LinEnum 脚本的可执行副本 机器!

 

tips:liunx执行 *.sh 出现"目录或文件不存在"错误。

原因: 如果你在windows上编写*.sh的文件,然后再上传到liunx机器上就会发生此错误。因为windows的编码格式是docs,而liunx的编码格式是unix。

解决办法:vim *.sh 文件,通过 :set ff 你会发现该文件的格式fomat=docs,通过 :set ff=unix 修改,然后 :x或:wq 保存并退出即可

 

运行 LinEnum

LinEnum 可以像运行任何 bash 脚本一样运行,转到 LinEnum 所在的目录,然后运行命令 “./LinEnum.sh”。

理解 LinEnum 的输出结果

LinEnum 输出分为不同的部分,以下是我们将重点关注的主要部分:

Kernel :内核信息显示在这里,可以研究这台机器是否存在可用的内核漏洞exp。

Can we read/write sensitive files:全局可写文件会显示在这里,这些文件是任何经过身份验证的用户都可以读取和写入的文件。 通过查看这些敏感文件的权限,我们可以看到哪里存在错误配置,使通常不应该能够写入的用户能够写入敏感文件。

SUID Files:SUID 文件的输出会显示在此处,我们可以研究这里面的一些子项来尝试提升权限。 SUID(在执行时会设置所有者用户 ID)是赋予文件的一种特殊类型的权限,它能允许文件以所有者的权限运行,如果文件归属于 root,那么该文件将以 root 权限运行,我们可以尝试使用SUID文件进行提权。

Crontab Contents:此处会显示已经计划好的 cron 作业(jobs),Cron 用于在特定时间安排命令,这些预定的命令或任务被称为“cron jobs”,与此相关的是 crontab 命令,它会创建一个 crontab 文件,其中包含要执行的cron 守护进程的命令和指令。 此处有足够的信息让我们能够尝试利用 Cronjobs。

在这个扫描中还包含了很多其他有用的信息,你可以自行阅读。

目标的主机名

或者不使用LinEnum,在目标上执行命令:hostname

查看/etc/passwd 的输出结果,看一下目标系统上有多少个“user [x]”

或者不使用LinEnum,在目标上执行命令:cat /etc/passwd

查看目标系统上有多少个可用的 shell

或者不使用LinEnum,在目标上执行命令:cat /etc/shells

查看被 cron 设置为每5分钟运行一次的 bash 脚本的名称

或者不使用LinEnum,在目标上执行命令:cat /etc/crontab

查看哪个重要文件的权限发生了更改,以允许某些用户(属于root组的用户)对其进行写入

或者不使用LinEnum,在目标上执行命令:ls -la /etc/passwd

滥用 SUID/GUID 文件

查找和利用 SUID 文件

利用 Linux 权限升级的第一步是检查具有 SUID/GUID 位集。这意味着可以运行一个或多个文件 文件所有者/组的权限。在本例中,作为超级用户。我们可以利用这一点来获得具有这些特权的 shell!

 

什么是 SUID 二进制文件?

众所周知,在 Linux 中,一切都是 文件,包括有权允许的目录和设备 或限制三个操作,即读/写/执行。所以当你设置 任何文件的权限,您应该知道 Linux 用户 您可以允许或限制所有三个权限。看一看 以下演示了最大权限 (RWX-RWX-RWX) 的外观:

r = 读取

w = 写入

x = 执行

    用户 组 其他

    RWX RWX RWX

    421       421       421

可用于为每个用户设置权限的最大位数为 7,即读取 (4) 写入 (2) 和执行 (1) 操作的组合。例如,如果您使用“chmod”将权限设置为 755,则它将是:rwxr-xr-x。


但是,当向每个用户授予特殊权限时,它就变成了 SUID 或 SGID。当额外的位“4”设置为user(Owner)时,它变为SUID(设置用户ID),当位“2”设置为group时,它变为SGID(设置组ID)。

SUID权限中的s有大小写之分,如果强行给没有x权限的普通文件添加s权限,那么显示的是大写的S,
这样显示的suid其实没什么用,因为原文件并不是可执行文件,只有给文件添加了x权限后,suid才有效。
权限添加方法:chmod u+x+s (如果已有x权限则使用 chmod u+s)


同样SGID的s权限也是分大小写的,当g权限组没有x权限的时候,设置SGID后就会变成大写的S,这点跟SUID一样。
权限添加方法:chmod g+x+s (如果已有x权限则使用 chmod g+s)

因此,查找 SUID 时要查找的权限为:

SUID:

RWS-RWX-RWX

GUID:

RWX-RWS-RWX

查找 SUID 二进制文件

我们已经知道系统上有支持 SUID 的文件,这要归功于我们的 LinEnum 扫描。但是,如果我们想手动执行此操作,我们可以使用命令:“find / -perm -u=s -type f 2>/dev/null”在文件系统中搜索 SUID/GUID 文件。让我们分解一下这个命令。

- `find`:这是执行"find"命令的关键词。
- `/`:表示搜索的起始路径,这里是根目录。
- `-perm -u=s`:这是"find"命令的选项之一。"-perm"表示按照权限进行匹配,"-u"表示匹配用户权限,而"s"表示SUID权限。所以这个选项表示寻找那些设置了SUID权限的文件。
- `-type f`:这也是"find"命令的选项之一。"-type"表示按照文件类型进行匹配,"f"表示普通文件。因此,这个选项表示只搜索普通文件。
- `2>/dev/null`:这是将错误输出重定向到/dev/null设备文件,意味着将错误信息丢弃而不显示。

 

利用可写 /etc/passwd

利用可写的 /etc/passwd

继续枚举用户,我们发现 user7 是 gid 为 0 的根组的成员。 我们已经从 LinEnum 扫描中知道 /etc/passwd 文件对用户来说是可写的。因此,根据这一观察,我们得出结论,user7 可以编辑 /etc/passwd 文件。

了解 /etc/passwd

/etc/passwd 文件存储基本信息,即 登录时需要。换句话说,它存储用户帐户 信息。/etc/passwd 是一个纯文本文件。它包含一个列表 系统的帐户,为每个帐户提供一些有用的信息 例如用户 ID、组 ID、主目录、shell 等。

/etc/passwd 文件应具有许多命令实用程序使用的常规读取权限 它将用户 ID 映射到用户名。但是,对 /etc/passwd 必须只限制超级用户/root 帐户。如果没有,或者用户被错误地添加到允许写入的组中。我们有一个漏洞,该漏洞可能允许创建我们可以访问的 root 用户。

了解 /etc/passwd 格式

/etc/passwd 文件每行包含一个条目,用于系统的每个用户(用户帐户)。所有字段都用冒号分隔:符号。总共有七个字段,如下所示。通常,/etc/passwd 文件条目如下所示:

测试:x:0:0:root:/root:/bin/bash

[除以冒号(:)]

  1. 用户名:用户登录时使用。长度应介于 1 到 32 个字符之间。
  2. 密 码: x 字符表示加密的密码存储在 /etc/shadow 文件。请注意,您需要使用 passwd 命令来 计算在 CLI 中键入的密码的哈希值或存储/更新 /etc/shadow 文件中密码的哈希值,在这种情况下,密码哈希值存储为“x”。
  3. 用户 ID (UID): 必须为每个用户分配一个用户 ID (UID)。保留 UID 0(零) 对于 root 和 UID 1-99 保留给其他预定义帐户。 进一步的 UID 100-999 由系统保留,用于管理和系统 帐户/组。
  4. 组 ID (GID):主组 ID(存储在 /etc/group 文件中)
  5. 用户 ID 信息: 注释字段。它允许您添加有关 用户的全名、电话号码等。本字段使用 finger 命令。
  6. 主目录:绝对目录 用户登录时将位于的目录的路径。如果这 目录不存在,则用户目录变为 /
  7. 命令/shell: 命令或 shell 的绝对路径 (/bin/bash)。通常,这是 一个外壳。请注意,它不一定是外壳。

转义 Vi 编辑器

sudo -l

在 CTF 场景中,每次访问一个帐户时,都应该尝试使用“ sudo -l”命令来列出作为该帐户的超级用户(root)可以使用的命令。有时候,你会发现你能够以 root 用户的身份运行某些命令,而不需要 root 密码,那么此处就可以用来利用以便提权。

转义Vi编辑器命令

在“ user8”帐户上运行sudo -l,如果结果表明这个用户可以使用 root 权限运行 vi且不需要root密码,那么这将允许我们通过转义vim来提升权限,我们能够作为 root 权限用户获得一个shell界面(通过sudo vi,然后在编辑器界面输入" :!sh "实现转义)。

错误配置的二进制文件和 GTFOBins

如果你在枚举过程中发现一个配置错误的二进制文件,或者当你在检查已获取的用户帐户能访问哪些二进制文件时,你都可以通过GTFOBins来查找哪些二进制文件存在可利用的空间并查看如何进行利用。

GTFOBins 是一个由 Unix 二进制文件组成的列表,攻击者可以尝试利用这些列表中的二进制文件来绕过本地安全限制,GTFOBins 还会提供关于如何利用配置错误的二进制文件的分析讲解。

GTFOBins参考链接:https://gtfobins.github.io/

利用 Crontab

什么是Cron

Cron 守护进程是一个长时间运行的进程,它会在特定的日期和时间执行命令,你可以使用它来安排活动(按照规定的时间--执行多个命令),或者安排一次性事件(在某个时间点--执行一次命令),或者安排重复性任务(按照规定的时间--多次执行一个命令)。你可以创建一个 crontab 文件,其中会包含 Cron 守护进程要执行的命令和程序。

如何查看活动的 Cronjobs

我们可以用"cat /etc/crontab"命令来查看具体规划了哪些 cron jobs。只要有机会,就应该手动检查这一点(cronjob),尤其是在运行 LinEnum 或其他类似的脚本没有找到任何东西的情况下。

Cronjob 的格式

Cronjob 以某种格式存在,如果你想利用cron job,那么能够读懂该格式就非常有必要。

# = ID 任务编号

m = Minute 在某分钟运行

h = Hour 在某小时运行

dom = Day of the month 在每个月的某一天运行

mon = Month 在某个月运行

dow = Day of the week 在每个星期的某一天运行

user = 命令将作为什么用户运行

command = 应该运行什么命令

例子

#  m   h dom mon dow user  command
17 *   1  *   *   *  root  cd / && run-parts --report /etc/cron.hourly

我们如何利用这一点?

通过 LinEnum 扫描,我们知道 user4桌面上的文件 autoscript.sh 计划每五分钟会运行一次,这个文件由 root 所拥有,这意味着它将以 root 特权运行,但是同时我们也有这个文件的写入权限。

利用PATH 变量

什么是 PATH?

PATH 是 Linux 和类 Unix 操作系统中的一个环境变量,它指定保存可执行程序的目录。当用户在终端中运行任何命令时,系统会在 PATH 变量的帮助下搜索可执行文件,以响应用户执行的命令。

在" echo $PATH "命令的帮助下查看相关用户的 Path 非常简单。

这怎么能让我们提升特权呢?

假设我们有一个 SUID 二进制文件,运行它,我们可以看到它正在调用系统 shell 来执行一个基本的进程,比如带“ ps”的列表进程。与前面的 SUID 示例不同,在这种情况下,我们不能通过为命令注入提供参数来利用它,那么我们能做些什么来尝试和利用它呢?

我们可以将 PATH 变量重写到我们选择的位置,因此,当 SUID 二进制程序调用系统 shell 来运行一个可执行文件时,它会运行一个我们自己编写的可执行文件!

与任何 SUID 文件一样,它将使用与 SUID 文件所有者相同的权限运行此命令!如果该SUID文件的所有者是root,使用这个方法,我们就可以作为 root 来运行任何我们想要执行的命令!

接下来的任务是创建一个命令(弄一个反向shell的payload),该命令将返回一个 shell ,我们将其粘贴到该文件(autoscript.sh )中,当文件在五分钟后再次运行时,那么我们粘贴到文件中的命令也将以 root 用户身份运行,使用攻击机终端上的netcat监听器接收shell,这样我们就能得到一个root权限的shell界面。

 

扩展您的知识

以下是适用于 CTF 或渗透测试用例的良好清单列表。虽然我鼓励你使用CherryTree或任何你喜欢的笔记应用程序来制作自己的笔记。

谢谢