Linux Privilege Escalation/Linux 权限提升
什么是权限提升
“权限提升”是什么意思?
权限提升通常涉及从较低权限的帐户到较高权限的帐户。 从技术上讲,它是利用操作系统或应用程序中的漏洞、设计缺陷或配置疏忽来获得对通常限制用户访问的资源的未经授权的访问。
权限提升为什么重要?
在进行实际的渗透测试时,能够获得直接管理访问权限的立足点(初始访问)是很罕见的。提权至关重要,因为它让您获得系统管理员级别的访问权限,这允许您执行以下操作:
- 修改密码
- 绕过访问控制以破坏受保护数据
- 编辑软件配置
- 启用持久化
- 改变现有(或新)用户的权限
- 执行任何管理命令
枚举
枚举是在你获得任何系统访问权限后的第一步。你可能通过利用一个导致 root 级别访问的关键漏洞来访问系统,或者只是找到了使用低权限账户发送命令的方法。与 CTF 机器不同,渗透测试活动在你获得特定系统或用户权限级别后并不会结束。正如你将看到的,枚举在系统被破坏后的阶段与在系统被破坏前一样重要。
主机名
hostname
命令将返回目标机器的名称。尽管这个值可以很容易地更改或具有相对无意义的字符串(例如 Ubuntu-3487340239),但在某些情况下,它可以提供有关目标系统在企业网络中角色的信息(例如,对于生产 SQL 服务器,SQL-PROD-01)。
uname -a
将打印系统信息,提供有关系统所使用的内核的额外详细信息。这将在搜索可能导致权限提升的潜在内核漏洞时非常有用。
/proc/version
proc 文件系统(procfs)提供了有关目标系统进程的信息。您可以在许多不同的 Linux 发行版中找到 proc,使其成为您工具箱中的必备工具。
Looking at /proc/version
查看 /proc/version
可能为您提供内核版本以及是否安装了编译器(例如 GCC)等附加数据的信息。
/etc/issue
系统也可以通过查看 /etc/issue
文件来识别。此文件通常包含有关操作系统的某些信息,但可以轻松地进行自定义或更改。在此话题上,任何包含系统信息的文件都可以进行自定义或更改。为了更清楚地了解系统,查看所有这些内容总是好的。
ps 命令
ps
命令是查看 Linux 系统上运行进程的有效方法。在您的终端中输入 ps
将显示当前 shell 的进程。
ps
(进程状态)的输出将显示以下内容;
- PID:进程 ID(每个进程唯一)
- TTY:用户使用的终端类型
- 时间:进程使用的 CPU 时间量(这并非进程运行的时间)
- 命令:正在运行的命令或可执行文件(不会显示任何命令行参数)
“ps”命令提供了一些有用的选项。
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
Linux 中常用的命令之一可能是 ls
.
在寻找潜在的权限提升向量时,请始终记得使用带有 -la
参数的 ls
命令。以下示例显示了使用 ls
或 ls -l
命令如何轻易错过“secret.txt”文件。
id
id
命令将提供用户权限级别和组成员的一般概述。
值得注意的是, id
命令还可以用来获取如下所示的其他用户的相同信息。
/etc/passwd
读取 /etc/passwd
文件可以是一种发现系统上用户的方法。
尽管输出可能很长且有些令人畏惧,但它可以轻松地剪切并转换为用于暴力攻击的有用列表。
请记住,这将返回所有用户,其中一些是系统或服务用户,可能不太有用。另一种方法可以是使用 grep 搜索“home”,因为真实用户很可能会在“home”目录下拥有他们的文件夹。
history
通过查看使用 history
命令的早期命令,我们可以对目标系统有所了解,尽管很少,但可能存储了诸如密码或用户名等信息。
ifconfig
目标系统可能是一个跳板到另一个网络的节点。 ifconfig
命令将为我们提供有关系统网络接口的信息。以下示例显示目标系统有三个接口(eth0、tun0 和 tun1)。我们的攻击机器可以访问 eth0 接口,但不能直接访问另外两个网络。
这可以通过使用 ip route
命令来确认存在哪些网络路由。
netstat
在进行现有接口和网络路由的初始检查之后,值得调查现有通信。可以使用 netstat
命令配合多个选项来收集现有连接的信息。
netstat -a
:显示所有监听端口和建立的连接。netstat -at
或netstat -au
也可以用来分别列出 TCP 或 UDP 协议。netstat -l
: 列出“监听”模式的端口。这些端口已开启并准备好接受传入连接。可以使用“t”选项仅列出使用 TCP 协议(以下)监听的端口
netstat -s
: 按协议列出网络使用统计信息(以下)此功能也可与-t
或-u
选项结合使用,以限制输出到特定协议。
netstat -tp
: 列出具有服务名称和 PID 信息的连接。
这也可以与 -l
选项一起使用来列出监听端口(如下)
我们可以看到“PID/程序名称”列是空的,因为这个进程属于另一个用户。
下面是使用 root 权限运行的相同命令,并揭示了 2641/nc(netcat)这个信息。
``
- 显示接口统计信息。下面我们可以看到,“eth0”和“tun0”比“tun1”更活跃。
在博客文章、教程和课程中,您最可能看到的 netstat
使用方法是 netstat -ano
,可以分解如下;
-a
:显示所有套接字-n
:不解析名称-o
: 显示计时器
find 命令
在目标系统中搜索重要信息和潜在的权限提升向量可能很有成效。内置的“find”命令很有用,值得保留在你的工具箱中。
下面是一些“find”命令的有用示例。
查找文件:
find . -name flag1.txt
: 在当前目录下查找名为“flag1.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
: 查找用户“frank”在“/home”下的所有文件find / -mtime 10
: 查找过去 10 天内被修改的文件find / -atime 10
: 查找过去 10 天内被访问的文件find / -cmin -60
: 查找过去一小时(60 分钟)内更改的文件find / -amin -60
: 查找过去一小时(60 分钟)内访问的文件find / -size 50M
: 查找大小为 50 MB 的文件
此命令也可以与(+)和(-)符号一起使用,以指定大于或小于给定大小的文件。
上面的示例返回大于 100MB 的文件。需要注意的是,“find”命令往往会生成错误,有时使得输出难以阅读。这就是为什么建议使用“find”命令与“-type f 2>/dev/null”一起使用,将错误重定向到“/dev/null”,以获得更清晰的输出(如下所示)。
可以写入或从其执行文件夹和文件:
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 参数会影响“find”命令的工作方式。
find / -perm -o x -type d 2>/dev/null
: 查找可执行于全球的文件夹
查找开发工具和支持的语言:
find / -name perl*
find / -name python*
find / -name gcc*
查找特定文件的权限:
下面是一个用于查找设置了 SUID 位的文件的简短示例。SUID 位允许文件以拥有该文件的账户的权限级别运行,而不是以运行它的账户的权限级别运行。这允许一个有趣的权限提升路径,我们将在第 6 个任务中更详细地了解。下面的示例是为了完成“find”命令的主题。
find / -perm -u=s -type f 2>/dev/null
: 查找设置了 SUID 位的文件,这允许我们以比当前用户更高的权限级别运行文件。
通用 Linux 命令
由于我们处于 Linux 领域,熟悉 Linux 命令在一般情况下将非常有用。请花些时间熟悉 find
、 locate
、 grep
、 cut
、 sort
等命令。
自动化枚举工具
多种工具可以帮助您在枚举过程中节省时间。这些工具应仅用于节省时间,了解它们可能会错过一些提权向量。以下是流行的 Linux 枚举工具列表,附带它们各自的 GitHub 仓库链接。
目标系统的环境将影响您能够使用的工具。例如,如果目标系统上没有安装,您将无法运行用 Python 编写的工具。这就是为什么熟悉几个工具比只有一个首选工具更好的原因。
- LinPeas: https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS
- LinEnum: https://github.com/rebootuser/LinEnum
- LES (Linux Exploit Suggester): https://github.com/mzet-/linux-exploit-suggester
- Linux 智能枚举:https://github.com/diego-treitos/linux-smart-enumeration
- Linux 权限检查器:https://github.com/linted/linuxprivchecker
权限提升:内核漏洞
权限提升的目标是为了获取到一个root 权限。 这有时可以简单地通过利用现有漏洞来实现,或者在某些情况下通过访问另一个拥有更多特权、信息、访问权限的用户帐户来实现。
除非通过利用单个漏洞获得root shell,否则权限提升过程将主要依赖于目标系统的错误配置和不严谨的权限分配。
Linux 系统上的内核管理组件之间会进行通信,例如系统上的内存和应用程序存在通信过程。 这个关键功能的实现需要系统内核拥有特定的权限; 因此,成功的内核漏洞利用可能会导致攻击者直接获得一个root权限。
内核漏洞利用方法简单;
- 识别内核版本
- 搜索并找到目标系统内核版本的漏洞利用代码
- 运行漏洞利用程序
虽然看起来很简单,但请记住,失败的内核漏洞可能导致系统崩溃。在尝试内核漏洞之前,请确保这种潜在结果在您的渗透测试合作范围内是可以接受的。
exp来源:
- 根据您的发现,您可以使用谷歌搜索现有的漏洞代码。
- 例如 https://www.cvedetails.com/ 这样的资源也可能很有用。
- 另一个选择是使用像 LES(Linux Exploit Suggester)这样的脚本,但请记住,这些工具可能会产生误报(报告一个不会影响目标系统的内核漏洞)或漏报(尽管内核有漏洞,但没有报告任何内核漏洞)。
提示/备注:
- 在 Google、Exploit-db 或 searchsploit 上搜索漏洞时对内核版本的描述要尽量具体;
- 确保在启动之前理解漏洞利用代码的工作原理。某些漏洞利用代码可能会对操作系统进行更改,使其在进一步使用中不安全或对系统造成不可逆转的更改,从而在以后造成问题。当然,在实验室或 CTF 环境中,这些可能不是很大的担忧,但在实际的渗透测试活动中,这些绝对是禁止的。
- 一些漏洞在运行后可能需要进一步交互。阅读随漏洞代码提供的所有注释和说明。
- 您可以使用
SimpleHTTPServer
Python 模块和wget
将漏洞代码从您的机器传输到目标系统。
权限提升:Sudo
sudo 命令默认允许您以 root 权限运行程序。在某些情况下,系统管理员可能需要给普通用户一些权限上的灵活性。例如,一名初级 SOC 分析师可能需要定期使用 Nmap,但不会获得完整的 root 访问权限。在这种情况下,系统管理员可以允许此用户仅以 root 权限运行 Nmap,同时在整个系统中保持其常规权限级别。
任何用户都可以使用 sudo -l
命令检查其与 root 权限相关的当前情况。
https://gtfobins.github.io/ 是一个有价值的资源,它提供了有关如何使用任何程序的信息,该程序您可能拥有 sudo 权限。
利用应用程序功能
在此上下文中,某些应用程序可能没有已知的漏洞。您可能会看到的这样一个应用程序是 Apache2 服务器。
在这种情况下,我们可以使用一个“黑客”利用应用程序的功能来泄露信息。正如您下面所看到的,Apache2 有一个支持加载替代配置文件( -f
:指定替代 ServerConfigFile)的选项。
使用此选项加载 /etc/shadow
文件将导致包含 /etc/shadow
文件第一行的错误信息。
利用 LD_PRELOAD
在某些系统中,您可能会看到 LD_PRELOAD 环境选项。
LD_PRELOAD 是一个允许任何程序使用共享库的功能。本博客文章将为您介绍 LD_PRELOAD 的功能。如果启用“env_keep”选项,我们可以生成一个在程序运行之前加载和执行的共享库。请注意,如果实际用户 ID 与有效用户 ID 不同,LD_PRELOAD 选项将被忽略。
此提权攻击向量的步骤可以概括如下;
- 检查 LD_PRELOAD(使用 env_keep 选项)
- 编写一个简单的 C 代码,编译成共享对象文件(.so 扩展名)
- 使用 sudo 权限和指向我们.so 文件的 LD_PRELOAD 选项运行程序
C 代码将简单地启动 root shell,可以写成如下;
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
我们可以将此代码保存为 shell.c,并使用 gcc 编译成共享对象文件,以下参数:
gcc -fPIC -shared -o shell.so shell.c -nostartfiles
我们现在可以在启动用户可以使用 sudo 运行的任何程序时使用这个共享对象文件。在我们的情况下,Apache2、find 或几乎所有我们可以使用 sudo 运行的程序都可以使用。
需要通过指定 LD_PRELOAD 选项来运行程序,具体如下;
sudo LD_PRELOAD=/home/user/ldpreload/shell.so find
这将导致以 root 权限启动 shell 进程。
权限提升:SUID
Linux 的许多权限控制依赖于控制用户和文件交互。这是通过权限来实现的。到现在为止,你知道文件可以有读、写和执行权限。这些权限是在用户的权限级别内分配给用户的。这会随着 SUID(设置用户标识)和 SGID(设置组标识)而改变。这些允许文件以文件所有者或组所有者的权限级别执行。
你会注意到这些文件有一个“s”位被设置,表明它们具有特殊的权限级别。
find / -type f -perm -04000 -ls 2>/dev/null
会列出设置了 SUID 或 SGID 位的文件。
一个好的做法是将此列表中的可执行文件与 GTFOBins(https://gtfobins.github.io)进行比较。点击 SUID 按钮将过滤出已知在设置 SUID 位时易受利用的二进制文件(您也可以使用此链接获取预过滤列表 https://gtfobins.github.io/#+suid)。
上述列表显示 nano 设置了 SUID 位。不幸的是,GTFObins 没有为我们提供轻易的胜利。这符合现实生活中的提权场景,我们需要找到中间步骤,以帮助我们利用我们所发现的微不足道的发现。
注意:所附虚拟机中还有一个除 nano
之外的具有 SUID 的二进制文件。
SUID 位为 nano 文本编辑器设置,使我们能够使用文件所有者的权限创建、编辑和读取文件。Nano 属于 root 用户,这大概意味着我们可以以比当前用户更高的权限级别读取和编辑文件。在这个阶段,我们有两种基本的权限提升选项:读取 /etc/shadow
文件或将我们的用户添加到 /etc/passwd
。
以下是使用向量的简单步骤。
读取 /etc/shadow
文件
我们看到,通过运行 find / -type f -perm -04000 -ls 2>/dev/null
命令,nano 文本编辑器已设置了 SUID 位。
nano /etc/shadow
将打印 /etc/shadow
文件的内容。现在我们可以使用 unshadow 工具创建一个可以被 John the Ripper 破解的文件。要实现这一点,unshadow 需要 /etc/shadow
和 /etc/passwd
文件。
unshadow 工具的使用方法如下;
unshadow passwd.txt shadow.txt > passwords.txt
使用正确的单词列表和一点运气,John the Ripper 可以返回一个或多个明文密码。要详细了解 John the Ripper,您可以访问 https://tryhackme.com/room/johntheripper0
另一个选项是添加一个具有 root 权限的新用户。这将帮助我们绕过繁琐的密码破解过程。下面是一个简单的方法:
我们需要新用户所拥有的密码的哈希值。这可以在 Kali Linux 上使用 openssl 工具快速完成。
然后我们将此密码与用户名一起添加到 /etc/passwd
文件中。
一旦添加了我们的用户(请注意如何使用 root:/bin/bash
提供 root shell),我们就需要切换到这个用户,并希望拥有 root 权限。
权限提升:Capabilities
系统管理员可以使用“Capabilities”来提高进程或二进制文件的权限级别。Capabilities有助于在更精细的级别上管理权限。例如,如果 SOC 分析师需要使用需要发起套接字连接的工具,普通用户无法做到这一点。如果系统管理员不想给这个用户更高的权限,他们可以更改二进制文件的Capabilities。效果是:二进制文件将能够完成任务,而无需更高权限的用户。
Capabilities手册页提供了关于其用法和选项的详细信息。
我们可以使用 getcap
工具列出已启用的Capabilities(功能)。
以非特权用户身份运行时, getcap -r /
将生成大量错误,因此将错误消息重定向到/dev/null 是一种良好的做法。
请注意,vim 及其副本并没有设置 SUID 位,因此,在枚举并查找 SUID文件时,无法发现此权限提升向量。
如果我们找到已经设置了cap_setuid的命令或者文件,可以通过使用GTFObins 的二进制文件列表来查找信息并尝试提升权限。
我们注意到可以使用以下命令和有效载荷使用 vim:
这将启动一个如下所示的 root shell;
权限提升:Cron Jobs(定时任务)
Cron Jobs用于在特定时间运行脚本或二进制文件。默认情况下,它们以所有者的权限运行,而不是当前用户。虽然配置得当的Cron Jobs本身并不具有固有漏洞,但在某些条件下,它们可以提供权限提升的途径。
这个想法很简单;如果有一个具有 root 权限的预定任务,并且我们可以更改将要运行的脚本,那么我们的脚本将以 root 权限运行。
Cron Jobs配置存储为 crontabs(cron 表),以查看任务的下一次运行时间和日期。
系统上的每个用户都有自己的 crontab 文件,无论他们是否登录,都可以运行特定的任务。正如你所预期的,我们的目标将是找到由 root 设置的Cron Jobs,并让它运行我们的脚本,理想情况下是一个 shell 脚本。
任何用户都可以读取 保存在系统范围内的/etc/crontab
中的cron jobs文件
虽然 CTF 机器可以每分钟或每 5 分钟运行 cron 作业,但在渗透测试活动中,你更经常看到每天、每周或每月运行的任务
您可以看到 backup.sh
脚本被配置为每分钟运行一次。文件内容显示了一个简单的脚本,用于创建 prices.xls 文件的备份。
由于我们当前用户可以访问此脚本,我们可以轻松修改它以创建一个反向 shell,希望具有 root 权限。
该脚本将使用目标系统上的工具来启动反向 shell,有两点需要注意;
- 命令语法将根据可用的工具而有所不同。(例如目标系统上的 nc 可能不支持 -e 选项)
- 我们应该尽量使用反向 shell,因为我们不想在真正的渗透测试过程中损害系统的完整性。
该脚本内容应如下所示:
我们需要在攻击机上运行一个监听器来接收传入的连接:
Crontab 总是值得检查的,因为它有时可能导致简单的权限提升途径。以下场景在缺乏一定网络安全成熟度的公司中并不少见:
- 系统管理员需要定期运行脚本。
- 他们创建一个 cron 作业来完成这个任务
- 过了一段时间后,脚本变得无用,他们将其删除
- 但他们没有清理相关的 cron 作业
这些管理问题将会导致cron 任务成为潜在的可利用漏洞。
上述示例显示了一个类似的情况,其中 antivirus.sh 脚本已被删除,但 cron 任务仍然存在。
如果脚本的完整路径未定义(backup.sh 脚本有定义完整的路径),cron 将会参考 /etc/crontab 文件中 PATH 变量下的路径。在这种情况下,我们可以尝试在用户的主文件夹(home)下创建一个名为“antivirus.sh”的脚本,然后让它作为 cron 任务运行。
自定义创建的脚本内容如下:
最终传入的反向 shell 连接能够帮助我们成功获取 root 权限:
一旦你发现现有的脚本或任务被附加到cron jobs,那么就值得花时间去了解相关脚本的功能以及如何在上下文中使用工具对cron jobs进行利用。例如,tar、7z、rsync 等,可以利用它们的通配符功能进行利用。
权限提升:PATH
如果一个用户有写权限的文件夹位于路径中,你可能会劫持一个应用程序来运行脚本。Linux 中的 PATH 是一个环境变量,它告诉操作系统在哪里搜索可执行文件。对于不是内置于 shell 中或没有使用绝对路径定义的任何命令,Linux 将开始在 PATH 下定义的文件夹中搜索。(我们这里所说的 PATH 就是环境变量,path 是文件的位置)。
通常,PATH 看起来是这样的:
如果我们在命令行中输入“thm”,Linux 会查找名为 thm 的可执行文件的位置。以下场景将更好地说明如何利用这一点来提高我们的权限级别。正如你所看到的,这完全取决于目标系统的现有配置,所以在尝试之前,请确保你能回答以下问题。
- $PATH 下有哪些文件夹
- 您当前用户是否有对这些文件夹的写权限?
- 您能否修改$PATH?
- 您是否可以启动一个受此漏洞影响的脚本/应用程序?
为了演示目的,我们将使用以下脚本:
此脚本尝试启动名为“thm”的系统二进制文件,但示例可以轻松地用任何二进制文件复制。
我们将其编译成可执行文件并设置 SUID 位。
现在用户可以访问设置了 SUID 位的“path”脚本。
执行后,“path”将在 PATH 下列出的文件夹中查找名为“thm”的可执行文件。
查看在 PATH变量 下列出的可写文件夹,我们可以在对应目录下创建一个名为 thm 的二进制文件,这样我们在运行“path”脚本时,就会执行到名为thm的二进制文件。 由于设置了 SUID 位,此二进制文件将以 root 权限运行。
可以使用“ find / -writable 2>/dev/null
”命令简单地搜索可写文件夹。可以使用简单的 cut 和排序序列清理此命令的输出。
一些 CTF 场景可能会呈现不同的文件夹,但常规系统会输出类似上面的内容。将此与 PATH 进行比较,将帮助我们找到我们可以使用的文件夹。
我们在/usr 下看到了许多文件夹,因此我们可以再次运行我们的可写文件夹搜索,以覆盖子文件夹。
替代方法可以是下面的命令:
find / -writable 2>/dev/null | cut -d "/" -f 2,3 | grep -v proc | sort -u
我们可以添加“grep -v proc”选项来过滤一些/proc目录下的进程文件。
不幸的是,/usr 下的可写子文件夹并不在PATH环境变量中。
更容易写入的文件夹可能是 /tmp,但是因为 /tmp 不在 PATH环境变量中,所以我们需要添加它。 我们使用export PATH=/tmp:$PATH
来完成环境变量添加。
当“path”脚本执行时将在 /tmp 文件夹下查找名为“thm”的可执行文件。 我们可以在/tmp 文件夹下创建一个“thm”文件并将其内容设置为/bin/bash
。
我们已经给/bin/bash 副本也就是thm文件 赋予了可执行权限,请注意此时它将以我们当前用户的权限运行;利用该文件提权的原理是让之前定义的“path”脚本以 root 权限运行,由于“path”脚本已经被设置了SUID位,所以直接执行该脚本即可。
权限提升:NFS
提权向量不仅限于内部访问。共享文件夹和远程管理接口,如 SSH 和 Telnet,也可以帮助您在目标系统上获得 root 访问权限。某些情况还需要同时使用两个提权向量,例如在目标系统上找到 root SSH 私钥并通过 SSH 以 root 权限连接--从而获得目标系统的root权限,而不是基于当前用户的权限级别进行提权。
另一个更适用于 CTF 和考试的向量是配置错误的网络 shell,当目标上存在网络备份系统时,有时可以在渗透测试过程中看到此提权向量。
NFS(网络文件共享-Network File Sharing)配置保存在 /etc/exports
文件中;此文件是在 NFS 服务器安装期间创建的,通常可供用户读取。
此提权向量关键元素是您上面看到的“no_root_squash”选项。默认情况下,NFS 会将 root 用户更改为 nfsnobody,并从任何文件中移除使用 root 权限操作的能力。如果可写共享上存在“no_root_squash”选项,我们可以在目标系统上创建一个设置了 SUID 位的可执行文件并运行它。
我们将从我们的攻击机器中列举可挂载共享。
然后把一个设置了“no_root_squash”选项(来自目标机)的共享挂载到我们的攻击机上并开始在攻击机上构建可执行文件。
在攻击机上,进入到刚才所挂载的共享目录下。因为我们可以设置 SUID 位,所以在目标系统上运行内容为/bin/bash
的简单可执行文件将完成提权操作。
编译代码后,我们将设置 SUID 位。
你将在下面的目标机界面看到两个文件(因为我们已经处理了挂载的共享,所以nfs.c 和 nfs 两个文件会存在于目标系统上,无需再传输它们)。
请注意,nfs 可执行文件在目标系统上带有SUID 位,能以 root 权限运行。