我一直在阅读有关 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() 漏洞)。任何人都可以向我确认这是否有效,以及我做错了什么?谢谢。
至于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 文件,这是有充分理由的。我被告知“你可以让它工作,但它很难”。想法?
在此先感谢,很抱歉提出这么长的问题。