一、实验目的
竞态条件是指多个线程同时访问或者操作同一块数据,运行的结果依赖于不同线程访问数据的顺序。如果一个拥有root权限的程序存在竞态条件漏洞的话,攻击者可以通过运行一个平行线程与漏洞程序竞争,以此改变该程序的行为。
二、实验原理
利用竞态条件漏洞获得root权限。
学习如何制定保护方案抵御该类攻击。
三、实验环境
Ubuntu(32-bit)、Oracle VM Virtualbox
四、实验步骤
1.攻击过程
利用vulp.c中的竞态条件漏洞可以做很多事情。其中一种是利用漏洞在 /etc/passwd 和 /etc/shadow 后追加信息。这两个文件是unix做用户授权用的,攻击者有可能利用这点创建用户,甚至是超级用户。
竞态条件漏洞root权限的Set-UID程序;
程序vulp.c把从用户处得到的输入写入到一个叫做/tmp/XYZ的文件:
在用户打开这个文件写入数据之前,程序会检查真实用户ID是否有对这个文件有写权限,如果有,程序会用fopen()函数打开这个文件,fopen()函数实际调用了open()系统调用,它检查的是有效用户ID。 程序在access()函数和fopen()函数之间有竞态条件问题,一旦这个漏洞被攻击,程序可以修改受保护的文件,而且写入的内容通过scanf()函数提供,是可控的。
许多竞态条件攻击与/tmp目录中的符号链接文件有关,所以Ubuntu采用一种保护措施限制一个程序可以使用一个全局可写目录中的符号链接,如想要攻击成功,需要关闭该保护措施。
sudo sysctl -w fs.protected_symlinks=0

目标进程:target_process.sh,目标进程是bash脚本,代码如下:
不断运行存在漏洞的vulp程序,从文件passwd_input中获取输入,并且根据/etc/passwd文件是否已经被修改来判断攻击是否成功;passwd_input的内容是:test:U6aMy0wojraho:0:0:test:/root:/bin/bash
改变文件/tmp/XYZ指向,在/dev/null和/etc/passwd不停的转换:攻击进程代码如下,攻击进程需要和目标进程并行运行,这个进程不停的改变/tmp/XYZ的指向,为了改变一个符号链接,需要删除unlink已有来凝结,然后创建symlink一个新的链接。
先让/tmp/XYZ指向/dev/null,从而可以通过access()函数检查,文件/dev/null是一个特殊的设备,它对任何人都是可写的,写入其中的内容可能会被丢弃,之后让程序休眠一会,然后,让/tmp/XYZ指向目标文件/etc/passwd,不停的执行这两个操作来和目标进程竞争



执行attck_process,并转入后台,格式:程序名 &;
执行target_process.sh:程序是bash脚本,执行方式:bash 脚本名
攻击长时间不成功,可以调整usleep()时间,但不能注销usleep();如果注销usleep(),不明原因会导致/tmp/XYZ文件的拥有者为root,导致攻击永远不成功。
2.防御保护措施
基本原则:消除检查和使用之间的时间差;阻止在时间差内完成任何事;不能赢得竞争;防止赢得竞争后的破坏;

打开Ubuntu符号链接文件保护措施:Ubuntu 16.04的系统:sudo sysctl -w fs.protected_symlinks=1;此时攻击失败。

五、实验总结
操作系统进程调度的本质时时间片轮转,一个进程可能在任何时刻被调度,转而运行第二个程序。竞争条件漏洞就是因为这种调度出现的漏洞。当一个程序本应相连的两步被打断,切换到另一进程时,这个进程可能对原来进程需要的资源进行修改,导致原程序的执行发生错误。
本文介绍了竞态条件漏洞的概念及其在获取Root权限中的应用。实验通过一个存在漏洞的程序vulp.c,展示了如何利用符号链接和并发执行来改变程序行为,尝试在/etc/passwd中插入信息。防御措施包括消除检查与使用之间的延迟,以及开启Ubuntu的符号链接文件保护。实验总结强调了操作系统进程调度可能导致的竞态条件漏洞风险。

167

被折叠的 条评论
为什么被折叠?



