(SEED-Lab) 密码技术应用实验
欢迎大家访问我的GitHub博客
https://lunan0320.cn
文章目录
- (SEED-Lab) 密码技术应用实验
- 一、实验目的
- 二、实验步骤与结果
-
- Lab Tasks
-
- Task 1:使用不同的密码算法和加密模式加密
- Task 2.A: Launching the Race Condition Attack
- Task 2.B: An Improved Attack Method
- Task 3: Countermeasure: Applying the Principle of Least Privilege
- Task 4: Countermeasure: Using Ubuntu’s Built-in Scheme
-
- (1)How does this protection scheme work?
- (2) What are the limitations of this scheme?
- 三、参考文献
一、实验目的
1.密钥加密与单向散列函数相关的概念
3.掌握加密算法、加密函数、单向散列函数
4.使用工具和编写程序来加解密消息
5.为指定的消息生成单向散列值
二、实验步骤与结果
Lab Tasks
Task 1:使用不同的密码算法和加密模式加密
在seed状态下,使用sudo vim /etc/passwd命令,添加test用户值
测试magic passwd是否生效,此处根据文档提示直接回车即可
实验证明,可以拿到root权限
最后,将此用户从passwd文件中删除。
Task 2.A: Launching the Race Condition Attack
Creating symbolic links
首先是写攻击程序,此处根据文档提示是写c代码
起初是因为在写攻击代码attack.c的时候,只是在while循环中使用了上述代码,但是参考了《计算机安全导论 深度实践》之后,才知道,这样做并没有通过代码中access()的审查。
因此需要先将文件指向“/dev/null”,因为这个文件是全局可写的,因此,access()必然是可以通过的。
在这之后,会使得程序休眠一会,此处是时间1000是根据参考书中给定的。
上述思路就是:
1)先取消了现有的对XYZ文件的链接
2)对XYZ创建一个指向全局可写内容的链接
3)程序休眠
4)取消XYZ文件的现有链接
5)使得程序指向/etc/passwd文件
6)程序休眠
7)如此循环
接着是写目标程序的脚本,因为不熟悉脚本语言的用法,也是参考了《深度实践》的教程。
此处TEST是需要执行的命令,需要试图修改的是/etc/passwd文件。
如果说执行对passwd的修改成功了,那么新的得到的new,也就是passwd的信息是改变了,那么此时orign和new就不同了,说明攻击成功,跳出循环
攻击过程是:
1)先执行攻击程序attack
2)再执行目标程序vulp.sh
在不多一会就能出来结果
此时,查看test用户是否写入了passwd文件中,可以看到,成功写入
此时,切换到test用户,可以看到,成为了root用户的权限,说明攻击成功!
此处需要注意的是,在一直执行不出来结果的时候,不妨去查看一下/tmp/XYZ文件是否已经写入了数据。起初我一直执行不出来正确的结果,就是因为在之前的测试中把XYZ文件给弄乱了,重新将其删除后执行就出来了正确的结果。
我刚开始执行的时候出现了这种问题,显示的是如下的情况,鼠标光标静止。
仔细查看文档之后,找到提示
需要以root权限删除
Task 2.B: An Improved Attack Method
此处主要是为了弥补实验Task2.A中的缺陷
原理分析:
在Tasks2.A中始终不能成功,这个地方是因为我们写的攻击代码中也存在了竞争窗口,就是在unlink()取消链接之后,但是在执行symlink()链接到下一个文件之前,这个短暂的窗口内上下文关闭,之前设置的SetUID程序就可能在这个间隔内fopen()到一个root文件,而tmp文件夹下的sticky bit使得这个文件只能被文件的所有者修改,即使指向的是全局可写的dev/null,也无法执行(因为所有者是变为了root)
解决方法:原子化unlink()以及symlink()语句
方法1:未添加usleep()函数的improved.c程序
然后先执行攻击程序,再执行脚本程序就能够在较短时间内得到实验的结果。
可以看到,显示攻击成功,程序停下,表示成功在passwd中添加了内容。
方法二:在末尾加usleep()函数
此时,能够在较短时间内,也可以攻击成功!
方法三:在函数调用之前加usleep()
最终也可以攻击成功,而且看上去速度更快了。
竟然攻击成功,就言这个一下,查看passwd中是否有test用户已经添加进来。
并测试一下,是否可以拿到root权限,发现是可以的。
个人心得:
此处需要注意的是要时刻保持关闭对链接的保护机制,我是因为在第二天开始做的Task2.B,在前一天顺利完成Task2.A之后就关闭了虚拟机,在第二天接着往下做的时候一上午一直在报如下的错误,始终得不到正确的结果。
后来与同学讨论后,经过实验才发现,需要再次关闭这个保护机制,这个保护机制应该是在系统重启的时候就自动生效了。(搞了一上午,没想到是这个问题!)
时刻记得,先关闭保护机制!
个人思考:这里我用了三种方法去测试是否可以攻击成功,根据是否执行usleep()函数,以及执行usleep()函数的位置都是值得关注的地方。
我发现:usleep()的存在并不会影响程序的正确性,这个函数的目的就是使得access()之后,创造更好的时间窗口而已。
Task 3: Countermeasure: Applying the Principle of Least Privilege
此程序存在的主要问题就是违背了最小权限原则,因此,需要限制其权限,具体方法是使用seteuid技术.
查阅资料后,了解到,在不需要root权限的时候,需要降低权限。
此处采用的是seteuid()的方式。
在程序进入执行access()之前,降低程序的特权到真实的用户,即seed
在程序执行结束后,重新回到有效用户id
这样做的目的是使得程序在不需要太高权限的时候,能够使用恰当的权限大小,完成所需要完成的任务。
这样改变之后,再次运行攻击程序和目标程序,可以得到如下的结果。
原因分析,此时是因为设置了seteuid()后,降低了程序的可执行权限,是由于权限不足导致的错误。
Task 4: Countermeasure: Using Ubuntu’s Built-in Scheme
首先打开保护机制
接着运行最初始的脚本目标程序以及攻击代码,得到如下结果。
可以看出,也是无法攻击成功的!
(1)How does this protection scheme work?
查阅资料后了解到fs.protected_symlinks=1是用于限制用户建立软链接的,但是当该值为0时,就不限制用户建立软链接 。
(2) What are the limitations of this scheme?
这个机制的局限性在于,即使值为1,也是有可能允许用户建立软链接的。比如说,此时软链接所在的目录是全局可读写的目录,或者说,软链接的uid和跟从者的uid相匹配,又或者说是所有者与软链接所有者匹配的时候。
三、参考文献
[1] Centos内核参数 fs.protected_symlinks (cnblogs.com)
https://www.cnblogs.com/oldxu/p/8626149.html
[2]实际用户和有效用户的区别
https://www.dazhuanlan.com/yangmls/topics/1013097
[3]setuid()与seteuid()的区别
https://blog.csdn.net/nyist327/article/details/38945797
[4]最小权限原则
https://www.cxyzjd.com/article/u011632676/118488494