c - 使用 LD_PRELOAD 和 IFS 利用 SUID 文件

标签 c security ifs

我一直在阅读有关 IFS 开发和 LD_PRELOAD 通过重写函数提升权限的信息。虽然这是两个完全不同的问题,但我决定将它们放在一起,希望这不是问题。尽管这两个都非常古老,但有人告诉我它们仍然可以用于特权升级,我很乐意对此进行调查。但是,我遇到了一些问题。

那么,让我们开始制作 SUID 文件/tmp/suid。

#include <unistd.h>

int main() {
  system("/bin/date");
}

这会调用 /bin/date。这个想法是我们可以更改内部字段分隔符并欺骗文件以它当前拥有的权限运行其他东西。这可以(或者可以吗?)通过创建一个名为 bin 的新文件来完成,该文件包含攻击者放置在自定义位置的恶意代码。然后我们更改 $PATH 变量并使其首先在我们的自定义路径内搜索位置,我们的恶意伪造二进制文件所在的位置。然后通过将内部字段分隔符更改为“/”,而不是运行 /bin/date 程序将运行带有参数 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 文件,这是有充分理由的。有人告诉我“你可以让它工作,但它很难”。想法?

在此先感谢您,对于这么长的问题,我们深表歉意。

最佳答案

I've been told that "you can get it to work but that it's hard". Ideas?

操作系统对这些技巧很明智,现在大多数都已修复。一般的想法是 setuidsudo friend 们不要使用非特权用户的环境。

以下提供更多阅读:

如果您只需要一个 setuid 二进制文件来侵入系统:

  • 关闭电脑
  • 挂载硬盘
  • 重命名 ls(或其他程序,如 date)
  • sudo 复制到 ls(或其他程序,如 date)
  • 卸载并重启

关于c - 使用 LD_PRELOAD 和 IFS 利用 SUID 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21068650/

相关文章:

c - 如果数据库包含数据,为什么 sqlite3_data_count() 返回 0?

java - 将 Sasl.createSaslClient 与 kerberos 一起使用时,是否可以修改 kerberose 配置选项?

bash - 可以在 Bash 函数中本地更改 IFS 吗?

c - 引用和取消引用指针

将原始加速度计值转换为 12 位数字

c - 从文件数据中读取 short 的值

php - 如何防止PHP文件被下载?有人可以通过哪些方式下载它们?

security - 自动上传和解压存档(zip、rar、targz、tarbz) - 安全问题?

linux - IFS 变量是否发生以下变化?

google-sheets - 错误: IFS expects all arguments after position 0 to come in pairs