4

我一直在阅读有关 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 文件,这是有充分理由的。我被告知“你可以让它工作,但它很难”。想法?

在此先感谢,很抱歉提出这么长的问题。

4

1 回答 1

2

我被告知“你可以让它工作,但它很难”。想法?

操作系统对这些技巧很明智,现在大多数都得到了补救。一般的想法是setuidsudo朋友不要使用非特权用户的环境。

以下提供更多阅读:

如果你想要的只是一个setuid二进制文件来闯入系统:

  • 关闭计算机
  • 挂载硬盘
  • 重命名ls(或其他程序,如date
  • 复制sudols(或其他类似的程序date
  • 卸载并重新启动
于 2014-01-12T00:21:07.637 回答