【问题标题】:Bash and Root Privilege IssuesBash 和 Root 权限问题
【发布时间】:2015-10-07 06:41:14
【问题描述】:

所以,我目前正在通过 Ubuntu 虚拟机中的安全实验室工作,但遇到了一个问题。这些说明有时可能有点模糊或不清楚。到目前为止,我写了一个运行 ls 的小 C 程序。

#include <stdio.h>
int main()
{
    system("lsBAK -la");
    return 0;
}

然后我以 lsBAK 的名义备份了 /bin/ls 并删除了原始文件。我在名称 ls 下创建了一个指向我已编译程序的链接,这样当我键入 ls 时,该程序将运行。它最终允许我在我不应该有权运行它的文件夹上运行 ls,因为它具有 root 访问权限。最终促使我这样做的问题是这样写的:“你能让这个 Set-UID 程序(由 root 拥有)运行你的代码而不是 /bin/ls 吗?如果可以,你的代码是否以 root 权限运行? 描述并解释您的观察结果。”

这一切都很好。现在我应该对 bin/sh 或 /bin/bash 做同样的事情。

指令字面意思是:“现在,更改 /bin/sh 使其指向 /bin/bash,然后重复上述攻击”

我在同一个程序上尝试了很多变体。我似乎不明白如何运行 bash。如果我在终端中输入 sh,我会立即进入那个 shell。如果我输入 bash,即使 sh 是指向 bash 的链接,也不会发生任何事情。看起来它实际上可能正在打开一个 shell,但它看起来完全一样,而当我运行 sh 时,我得到一个明显不同的 shell 来显示 sh-4.3# 而不是通常的 root@....当 sh 只是到 bash 的链接时,运行 sh 可能会给我带来与运行 bash 不同的结果?我错过了什么?

我的意思是,当我重新创建 sh 时,我只是在运行:ln -s bash sh

我尝试过 ./bash、bash 等。我目前拥有的是一个几乎相同的程序,我正在执行以下系统调用:

system("bash");

我删除了 sh 并创建了一个指向我的新程序 shUID 的链接,名称为 sh。所以,我想应该发生的是,当我运行 sh 时,它运行我的程序 shUID,它执行系统调用。每当我运行 sh 时,终端都会锁定,直到我按下 ctrl+C。

所以我显然在寻找我在这里缺少的东西。我假设我正确地回答了涉及 ls 的上一个问题,但我似乎无法弄清楚这里发生了什么。感谢您的帮助。

编辑:我现在已经在实验室继续工作,发现 system() 实际上调用 /bin/sh,所以我的问题似乎是,如果我要替换它并依赖系统调用,这里有问题。我目前不确定如何处理这些信息,但它给了我一些方向。我仍然很感激帮助,但我很快就会使用这些新信息。

【问题讨论】:

  • 如果您正在运行bash,然后再次运行bash,它看起来相同,因为两个实例使用相同的初始化来配置,例如提示.运行echo $$,然后运行bash,然后再次运行echo $$:您应该会看到不同的输出,因为bash 的前一个实例和当前实例是不同的进程。

标签: bash sh root


【解决方案1】:

这里有一些代码可以帮助您了解以下苏格拉底式问题的情况:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

int
main(int argc, char **argv)
{
    int i;
    printf("uid %d gid %d euid %d egid %d\n", getuid(), getgid(),
        geteuid(), getegid());

    printf("argc %d\n", argc);
    for(i = 0; i < argc; i++)
        printf("%d: %s\n", i, argv[i]);

    if (argc >= 2 && (argv[1][0] != '/')) {
        fprintf(stderr, "missing initial slash\n");
        return 2;
    }

    if (execv(argv[1], argv+1)) {
        perror("execve");
        return 1;
    } 
    return 0;
}

什么是 UID,什么是 EUID?为什么要检查要运行的文件的绝对路径名?为什么我使用execv 而不是systembash-p 选项有什么作用?

为什么会有这种说法:

if (running_setuid && privileged_mode == 0)
    disable_priv_mode ();

startup code of bash around line 496?最后,此代码是否与您练习中的代码受到相同的攻击?

我没有展示这段代码的编译步骤,因为如果你不知道它是做什么的,你就不应该构建它。

【讨论】:

    【解决方案2】:

    事实上 /bin/sh 在大多数系统上不仅仅是一个 bash 的符号链接。观察:

    #include <stdio.h>
    int main()
    {
        /* if we were using bash this would not fail */
        system("type history");
        return 0;
    }
    

    尽管这个 sn-p 将环境变量 $SHELL 报告为 bash 它确实不是我们正在使用的 shell:(阅读:这可能会引起混淆)

    #include <stdio.h>
    int main()
    {
        system("echo $SHELL");
        return 0;
    }
    

    在 Debian、FreeBSD、NetBSD 和 Ubuntu 上,这将成立。事实上,只有少数操作系统使用 bash 作为默认系统 shell,其中许多正在恢复为 POSIX sh 的 almquist shell 衍生产品。

    如果您想使用来自system()bash,您可能会发现以下命令很有帮助:

    bash -c "ls"
    

    或者例如:

    #include <stdio.h>
    int main()
    {
        system("bash -c 'type history'");
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 2011-05-09
      • 1970-01-01
      • 2013-06-29
      • 1970-01-01
      相关资源
      最近更新 更多