zoukankan      html  css  js  c++  java
  • 20169211 《Linux内核原理与分析》第十一周作业

    SET-UID程序漏洞实验

    一、实验简介

    Set-UID 是Unix系统中的一个重要的安全机制。当一个Set-UID程序运行的时候,它被假设为具有拥有者的权限。例如,如果程序的拥有者是root,那么任何人运行这个程序时都会获得程序拥有者的权限。 本次试验试图理解Set-UID运行机制的原理,并利用这一机制获取root权限。

    二、实验内容

    从上面的截图可以看出:将passwd拷贝到/tmp/下,权限发生了变化(在原目录下suid位被设置),复件没有了修改密码的权限。

    对于“su”等命令,把这些程序拷贝到用户目录下,同样不再具有root权限。

    接下来我们以root方式登录,拷贝/bin/zsh 到/tmp, 同时设置拷贝到tmp目录下的zsh为set-uid root权限,然后以普通用户登录,运行/tmp/zsh

    接下来拷贝/bin/bash到/tmp目录,同时设置/tmp目录下的bash为Set-UID root权限,然后以普通用户登录,运行/tmp/bash

    可见,同样的操作,运行复制的zsh可以获得root权限,而bash不能。

    从上面步骤可以看出,/bin/bash有某种内在的保护机制可以阻止Set-UID机制的滥用。为了能够体验这种内在的保护机制出现之前的情形,我们打 算使用另外一种shell程序——/bin/zsh。在一些linux的发行版中(比如Redora和Ubuntu),/bin/sh实际上是/bin /bash的符号链接。为了使用zsh,我们需要把/bin/sh链接到/bin/zsh。

    system(const char * cmd) 系统调用函数被内嵌到一个程序中执行一个命令, system() 调用 /bin/sh 来执行 shell 程序,然后 shell 程序区执行 cmd 命令。 但是在一个 Set-UID 程序中 system() 函数调用 shell 是非常危险的,这是因为 shell 程序的行为可以被环境变量影响,比如 PATH ;而这 些环境变量可以在用户的控制当中。通过控制这些变量,用心险恶的用户就可以控制 Set-UID 程序的行为。

    下面的 Set-UID 程序被用来执行 /bin/ls 命令;然后程序员可以为 ls 命令使用相对路径,而不是绝对路径。

    int main()
    {
       system("ls");
       return 0;
    }
    

    把 /bin/sh 拷贝到 /tmp 目录下面重命名为 ls (先要确保 /bin/ 目录下的 sh 符号链接到 zsh ,而不是 bash ),将环境变量 PATH 设置为当前目录 /tmp ,运行编译的程序 test 。就可以获得 root 权限:

    修改/bin/sh使得其返回到/bin/bash,重复上面的攻击,你仍然可以获得root权限吗?

    答案是不能的!

    sytem() 和execve()的不同

    首先确保/bin/sh指向zsh

    背景:Bob在为一家审计代理处工作,他正在调查一家公司是否存在诈骗行为。为了这个目的,他需要阅读这家公司在Unix系统中的所有文件;另一方 面,为了保护系统的可靠性,他不能修改任何一个文件。为了达到这个目的,Vince——系统的超级用户为他写了一个SET-ROOT-UID程序,并且给 了Bob可以执行它的权限。这个程序需要Bob在命令行中打出一个文件名,然后运行/bin/cat命令显示这个文件。既然这个程序是以root权限运行 的,它就可以显示Bob想看的任何一个文件。然而,既然这个程序没有写操作,Vince很确信Bob不能用这个程序修改任何文件。

    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    int main(int argc, char *argv[])
    {
    	char *v[3];
    	if(argc < 2)
    	{
    	printf("Please type a file name.
    ");
    	return 1;
    	}
    	v[0] = "/bin/cat"; v[1] = argv[1]; v[2] = 0;
      //Set q = 0 for Question a, and q = 1 for Question b
    	int q = 0;
    	if (q == 0)
    	{
    		char *command = malloc(strlen(v[0]) + strlen(v[1]) + 2);
    		sprintf(command, "%s %s", v[0], v[1]);
    		system(command);
      }
      else execve(v[0], v, 0);
      return 0 ;
    }
    

    2.5.1 程序中有 q=0。程序会使用system()调用命令行。这个命令安全码?如果你是Bob,你能对系统的完整性妥协吗?你能重新移动一个对你没有写权限的文件吗?

    这个命令不安全,Bob可能会出去好奇或者个人利益驱使会阅读或者修改只有root用户才可以运行的一些文件。比如截图中:file文件只有root用户有读写权限,但普通用户通过运行该程序,阅读并重命名了file文件:

    如果令q=1;刚才的攻击还会有效吗?

    修改为 q=1 后,不会有效。前面步骤之所以有效,是因为 system() 函数调用 /bin/sh ,链接至 zsh ,具有 root 权限执行了 cat file 文件后,接着执行 mv file file_new 命令。

    而当令 q=1, execve() 函数会把 file; mv file file_new 看成是一个文件名,系统会提示不存在这个文件:

  • 相关阅读:
    vue中连续点击3次且时间间隔不超过3秒,才显示div(刚开始隐藏的)
    (六) 6.2 Neurons Networks Backpropagation Algorithm
    (六) 6.1 Neurons Networks Representation
    本地工程提交github
    (五)用正则化(Regularization)来解决过拟合
    (三)用Normal Equation拟合Liner Regression模型
    (二)深入梯度下降(Gradient Descent)算法
    (一)线性回归与特征归一化(feature scaling)
    这篇博客的内容基本没见过,mark 一下以后可以学习
    (四)Logistic Regression
  • 原文地址:https://www.cnblogs.com/sharemi/p/6131996.html
Copyright © 2011-2022 走看看