利用LD_PRELOAD和IFS利用SUID文件

时间:2014-01-11 22:22:50

标签: c security ifs

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

提前致谢,对不起的问题感到抱歉。

1 个答案:

答案 0 :(得分:1)

  

我被告知“你可以让它上班,但这很难”。想法?

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

以下内容提供了更多阅读材料:

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

  • 关闭计算机
  • 安装硬盘
  • 重命名ls(或其他程序,如date
  • sudo复制到ls(或date等其他计划
  • 卸载并重新启动