【发布时间】: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的前一个实例和当前实例是不同的进程。