【发布时间】:2014-01-11 22:22:49
【问题描述】:
我一直在阅读有关 IFS 漏洞利用和 LD_PRELOAD 通过覆盖函数提升权限的信息。尽管这是两个完全不同的问题,但我决定将它们一起发布并希望这不是问题。虽然这两个都很老,但我被告知它们仍然可以用于特权升级,我很想研究一下。但是,我遇到了一些问题。
所以,让我们从创建 SUID 文件开始,/tmp/suid。
#include <unistd.h>
int main() {
system("/bin/date");
}
这调用/bin/date。这个想法是我们可以更改内部字段分隔符并欺骗文件以它当前拥有的权限运行其他东西。这可以通过使名为 bin 的新文件包含攻击者放置在自定义位置的恶意代码来完成(或者可以吗?)。然后我们更改$PATH 变量并使其首先在我们的自定义路径中搜索位置,即我们的恶意伪造二进制文件所在的位置。然后通过将内部字段分隔符更改为“/”,而不是运行 /bin/date,程序将运行带有参数日期的 /tmp/fakepath/bin,这可能会触发权限提升。
当我尝试使用 dankalia.com 描述的方法时,它失败了。 /bin/date 被执行。如果我只是在控制台中输入bin date,恶意二进制文件确实会启动,但在通过/tmp/suid 调用它时不会启动。
我认为该漏洞已被修补并且它只是忽略了 IFS 变量,但随后关于 stackoverflow 的帖子让我感兴趣。 (C: IFS System() Vulnerability)。任何人都可以向我确认这是否有效,以及我做错了什么?谢谢。
至于LD_PRELOAD,我会保持简单。
define _GNU_SOURCE
#include <stdio.h>
int puts(const char *str) {
printf("lel");
}
使用如下命令行编译:
gcc –Wall –fPIC –shared –o puts.so puts.c –ldl
然后,用预加载技巧覆盖函数puts:
LD_PRELOAD=./puts.so ./vuln_program_that_uses_puts
这很好用。但是,在处理 SUID 文件时以及当我们谈论权限提升时,这不会发生。 LD_PRELOAD 不适用于 SUID 文件,这是有充分理由的。我被告知“你可以让它工作,但它很难”。想法?
在此先感谢,对于冗长的问题,我们深表歉意。
【问题讨论】:
-
很有趣,但 OP 只是希望将 LD_PRELOAD 与 SUID 二进制文件一起使用。这是权限提升,因此更改恶意库的权限不是一种选择,正如那里的一些答案所暗示的那样。 IFS 呢?
-
IFS远没有人们想象的那么强大。在某些情况下,非默认值可能会产生安全后果,但这并不像您期望的那么简单。我将从阅读IFS上的 POSIX 文档开始。