2019-2020-1 20199318《Linux内核原理与分析》第十二周作业
《Linux内核原理与分析》 第十二周作业
一、预备知识
Set-UID 是 Unix 系统中的一个重要的安全机制。当一个 Set-UID 程序运行的时候,它被假设为具有拥有者的权限。例如,如果程序的拥有者是root,那么任何人运行这个程序时都会获得程序拥有者的权限。Set-UID允许我们做许多很有趣的事情,但不幸的是,它也是很多坏事情的罪魁祸首。
二、实验过程和分析
将 passwd 拷贝到 /tmp/ 下,权限发生了变化(在原目录下 suid位 被设置),复件没有了修改密码的权限。具体情况如下图所示:

将 passwd 拷贝到 /tmp/ 下,权限发生了变化(在原目录下 suid位 被设置),复件没有了修改密码的权限。
在linux环境下运行Set-UID 程序:
以root方式登录,拷贝/usr/bin/zsh 到/tmp, 同时设置拷贝到tmp目录下的zsh为set-uid root权限,然后以普通用户登录,运行/tmp/zsh。如下图所示:

从上图可以看出,普通用户运行tmp目录下的zsh获得了root权限。拷贝/bin/bash到/tmp目录,同时设置/tmp目录下的bash为Set-UID root权限,然后以普通用户登录,运行/tmp/bash。如下图所示:

可见,同样的操作,运行复制的zsh可以获得root权限,而bash不能。
从上面步骤可以看出,/bin/bash有某种内在的保护机制可以阻止Set-UID机制的滥用。为了能够体验这种内在的保护机制出现之前的情形,使用另外一种shell程序——/bin/zsh。在一些linux的发行版中(比如Fedora和Ubuntu中,/bin/sh实际上是/bin/bash的符号链接。为了使用zsh,需要把/bin/sh链接到/bin/zsh。如下图所示:

PATH环境变量的设置。
system(const char * cmd)系统调用函数被内嵌到一个程序中执行一个命令,system()调用/bin/sh来执行shell程序,然后shell程序去执行cmd命令。但是在一个Set-UID程序中system()函数调用shell是非常危险的,这是因为shell程序的行为可以被环境变量影响,比如PATH。而这些环境变量可以在用户的控制当中。通过控制这些变量,用心险恶的用户就可以控制Set-UID程序的行为。下面的Set-UID程序被用来执行/bin/ls命令;然后程序员可以为ls命令使用相对路径,而不是绝对路径。在 /tmp 目录下新建 test.c 文件:

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

先恢复环境变量 PATH ,然后修改/bin/sh使得其返回到/bin/bash,重复上面的攻击


可见修改sh连接回bash,运行test程序不能使普通用户获得 root 权限。
system()和execve()的不同。
首先确保/bin/sh指向zsh:

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

file文件只有root用户有读写权限,但普通用户通过运行该程序,阅读并重命名了file文件:

修改为q=1后,不会有效。前面步骤之所以有效,是因为system()函数调用/bin/sh链接至zsh具有root权限执行了cat file文件后,接着执行mv file file_new命令。而当令q=1, execve()函数会把file; mv file file_new 看成是一个文件名,系统会提示不存在这个文件:

LD_PRELOAD环境变量
建立一个动态链接库。把下面的程序命名为mylib.c放在/tmp目录下。在函数库libc中重载了sleep函数:

用下面的命令编译上面的程序:

把下面的程序命名为myprog.c放在/tmp目录下:




由以上四种情况可见:只有用户自己创建的程序自己去运行,才会使用LD_PRELOAD环境变量,重载sleep函数,否则的话忽略LD_PRELOAD环境变量,不会重载sleep函数。
消除和清理特权
为了更加安全,Set-UID程序通常会调用setuid()系统调用函数永久的清除它们的root权限。然而有些时候,这样做是远远不够的。在root用户下,在/tmp目录新建一个空文件zzz。在root用户下将下面代码命名为test2.c放在/tmp目录下,编译这个程序,给这个程序设置root权限。在一个普通的用户下,运行这个程序:


如图所示文件被修改了,原因在于设置uid前,zzz文件就已经被打开了。只要将语句setuid(getuid())移至调用open函数之前,就能避免这个问题。
2019-2020-1 20199318《Linux内核原理与分析》第十二周作业的更多相关文章
- 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业
<Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第十一周作业
<Linux内核原理与分析>第十一周作业 一.本周内容概述: 学习linux安全防护方面的知识 完成实验楼上的<ShellShock 攻击实验> 二.本周学习内容: 1.学习& ...
- 2019-2020-1 20199329《Linux内核原理与分析》第八周作业
<Linux内核原理与分析>第八周作业 一.本周内容概述: 理解编译链接的过程和ELF可执行文件格式 编程练习动态链接库的两种使用方式 使用gdb跟踪分析一个execve系统调用内核处理函 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第七周作业
<Linux内核原理与分析>第七周作业 一.本周内容概述: 对Linux系统如何创建一个新进程进行追踪 分析Linux内核创建一个新进程的过程 二.本周学习内容: 1.学习进程的描述 操作 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第六周作业
<Linux内核原理与分析>第六周作业 一.本周内容概述: 学习系统调用的相关理论知识,并使用库函数API和C代码中嵌入汇编代码两种方式使用getpid()系统调用 学习系统调用syste ...
- 2019-2020-1 20199329《Linux内核原理与分析》第五周作业
<Linux内核原理与分析>第五周作业 一.上周问题总结: 虚拟机将c文件汇编成汇编文件时忘记添加include<stdio.h> gdb跟踪汇编过程不熟练 二.本周学习内容: ...
- 2019-2020-1 20199329《Linux内核原理与分析》第三周作业
<Linux内核原理与分析>第三周作业 一.上周问题总结: 第二周头脑风暴完成较慢 虚拟机libc配置错误 书本知识使用不够熟练 二.本周学习内容: 1.实验楼环境虚拟一个x86的CPU硬 ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第八周作业
2018-2019-1 20189221 <Linux内核原理与分析>第八周作业 实验七 编译链接过程 gcc –e –o hello.cpp hello.c / gcc -x cpp-o ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第七周作业
2018-2019-1 20189221 <Linux内核原理与分析>第七周作业 实验六 分析Linux内核创建一个新进程的过程 代码分析 task_struct: struct task ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第六周作业
2018-2019-1 20189221 <Linux内核原理与分析>第六周作业 实验五 实验过程 将Fork函数移植到Linux的MenuOS fork()函数通过系统调用创建一个与原来 ...
随机推荐
- hive中对时间处理的函数总结
日期转为时间戳 unix_timestamp('2022-11-12 00:00:00.000') 结果:1668182400 from_unixtime(unix_timestamp('2022-1 ...
- centos安装Jenkins报错
[SKIPPED] jenkins-2.249.3-1.1.noarch.rpm: Already downloaded warning: /var/cache/dnf/jenkins-0919f06 ...
- xampp安装使用
xampp安装使用 安装 下载xampp bin文件 xampp-linux-x64-8.0.0-3-installer.run 安装 sudo ./xampp-linux-x64-8.0.0-3-i ...
- vue2实现tabs侧边导航栏点击内容跳转到对应位置,且内容滚动导航栏切换对应tab
vue2实现tabs侧边导航栏点击内容跳转到对应位置,且内容滚动导航栏切换对应tab 1.tabs使用了 element的插件tabs, 省的自己写滑动动画 2.左侧有用到了 element的插件 N ...
- Java中类似c语言的printf
System.out.printf("%4d",x); printf("%4d",x); 保留小数点后两位也可以用%.2f 相对来说很好记了 回车用\n
- KETTLE 首次连DB2报错,无驱动。
DB2 把相应数据库的jar包放入 data-integration\lib 或者data-integration\libswt\win64 重启kettle程序 连接成功 驱动包,我是用的aqua工 ...
- 解决命令行窗口执行godoc报错
在cmd命令行窗口执行godoc报错: 'godoc' is not recognized as an internal or external command,operable program or ...
- vscode中使用powershell显示分支名
https://blog.csdn.net/weixin_43932597/article/details/125000557 windows powershell(或windows terminal ...
- python图片转base64、base64转图片
#图片转base64 import base64 with open("./1.png","rb") as f:#转为二进制格式 base64_data = b ...
- jwt二次加密失败原因(Bad “options.expiresIn“ option the payload already has an “exp“ property.)
在写vue+nodejs项目的校验token时,出现了次错误 然后想了想问题所在: 第一次加密的时候使用jwt.sign(value,秘钥,{}),会返回一个字符串,然后当前端跳转别的发送请求时,会将 ...