一.实验描述
Set-UID 是Unix系统中的一个重要的安全机制。当一个Set-UID程序运行的时候,它被假设为具有拥有者的权限。例如,如果程序的拥有者是root,那么任何人运行这个程序时都会获得程序拥有者的权限。Set-UID允许我们做许多很有趣的事情,但是不幸的是,它也是很多坏事情的罪魁祸首。
因此本次实验的目标有两点:
1.欣赏好的方面,理解为什么Set-UID是需要的,以及它是如何被执行的。
2.注意坏的方面,理解它潜在的安全性问题。
二.实验内容
2.1 测试passwd命令需set-uid机制。
发现复制会导致没有了权限。
同理,测试了sudo也是如此
2.2 以root方式登录,拷贝/bin/zsh 到/tmp, 同时设置拷贝到tmp目录下的zsh为set-uid root权限,然后以普通用户登录,运行/tmp/zsh。
普通用户登录则权限不够
2.3 使用另外一种shell程序——/bin/zsh。在一些linux的发行版中(比如Redora和Ubuntu),/bin/sh实际上是/bin/bash的符号链接。为了使用zsh,我们需要把/bin/sh链接到/bin/zsh。
2.4 PATH环境变量的设置
首先是创建一个文件 test.c
修改/bin/sh使得其返回到/bin/bash,重复上面的攻击,不可以获得root权限
2.5 sytem()和execve()的不同
file文件只有root用户有读写权限,但普通用户通过运行该程序,阅读并重命名了file文件:
2.6 LD_PRELOAD环境变量
把myprog编译成一个普通用户下的程序在普通用户下运行
可见,它会使用LD_PRELOAD环境变量,重载sleep函数:
在这种情况下,不会重载sleep函数:
2.7 消除和清理特权
此过程创建的是一个叫zzz的文件夹,我开始的我时候将其当成文件来创建,出现了错误。
显然我的运行结果出了问题
如图所示文件被修改了,原因在于设置uid前,zzz文件就已经被打开了。
只要将语句setuid(getuid())移至调用open函数之前,就能避免这个问题。(此为实验楼的结果)
多次尝试,未果。今天上了linux后,听了老师的分析,最终实现了结果。
,
三.实验中问题的解决
1. 在实验中出现了比如为zzz,file等文件,而实验环境中并没有提到到底是什么类型的文件,开始猜测是文件夹,所以使用了mkdir命令。后来发现是目录并不可以,所以调整为基本的文本文件,不加后缀名。并输入选号。方才可以。
2.命令行中一定要清楚当时所在的路径,以及权限,不然会导致严重的错误。
四.实验体会
本次实验是有关Set-UID的知识。Set-UID 是Unix系统中的一个重要的安全机制。当一个Set-UID程序运行的时候,它被假设为具有拥有者的权限。例如,如果程序的拥有者是root,那么任何人运行这个程序时都会获得程序拥有者的权限。Set-UID允许我们做许多很有趣的事情,但是不幸的是,它也是很多坏事情的罪魁祸首。
通过这次实验,我熟悉了linux命令行下的命令使用,同时发现了一个工具“linux命令大全”,这款百度应用非常实用。我还了解了unix的这种Set-UID安全机制是双刃剑,只有妥善使用才会尽可能安全。