2015-10-07 144 views
1

因此,我正在通过Ubuntu虚拟机中的安全实验室工作,并且遇到了问题。这些说明有时可能有点模糊或不清楚。截至目前,我编写了一个运行ls的小型C程序。Bash和根权限问题

#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,我立即进入该外壳。如果我输入bash,即使sh是指向bash的链接,也不会有任何反应。它似乎可能实际上是打开一个shell,但它看起来完全一样,而当我运行sh时,我得到一个明显不同的shell来玩,显示sh-4.3#而不是通常的root @ ....有可能sh运行给我一个与运行bash不同的结果,当sh只是一个bash的链接?我错过了什么?

我的意思是,当我重新SH,我只需运行:LN -s庆典SH

我已经试过之类的东西./bash,庆典等什么我现在有一个是大部分相同程序在那里我做下面的系统调用:

system("bash"); 

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

因此,我显然在寻找我在这里失踪的任何东西。我假设我做了以前的问题,涉及ls,但我似乎无法弄清楚这里发生了什么。帮助表示赞赏。编辑:我现在已经在实验室中移动了,并且发现system()实际上调用了/ bin/sh,所以我的问题在这里似乎是,如果我要替换它并依靠系统调用,这里有一个问题。我目前不确定如何处理这些信息,但它给了我一些指导。我仍然很感激帮助,但我很快就会与这个新的信息一起玩。

+0

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

回答

2

下面是一些代码,这将有助于你看到的是一些苏格拉底的问题发生如下:

#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?最后,这段代码是否受到与您练习中的代码相同的攻击?

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

1

事实上,/ bin/sh不仅仅是在大多数系统上对bash的符号链接。注意:

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

即使这个片段报告变量$SHELL环境作为bash这的确不是我们使用的shell:(阅读:这可能会引起混淆)

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

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

您可能会发现下面的命令有益的,如果你想从bashsystem()使用:

bash -c "ls" 

或者例如:

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