危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2306 浏览20614694

访问竞态条件漏洞

为了开阔大家对漏洞认识的视野,这次危险漫步讲述一种漏洞——访问竞态条件的漏洞,在看似严谨的代码后面,依旧存在一种攻击方法。访问竞态条件漏洞,也可称作为“TOCTOU漏洞“——time?of?check,time?of?use。这种类型的漏洞描述了这样一个问题:

在linux中,用来标示进程的对文件的权限标志有两个,一个是UID,另外一个是EUID。UID代表了当前用户的UID,该进程针对某个文件的操作,其是否有权限完全取决于UID。但是,有种特殊情况,我们知道/etc/shadow只有root才可以访问,而这个文件记录了所有用户加密后的密码,如果要修改密码,就必须针对这个文件进行修改,普通用户若是要修改,就必须有root权限,这明显存在矛盾。于是,SUID出现了,如果一个程序有SUID权限,那么运行这个文件的时候,该进程的EUID就是这个程序创建者的身份。比如passwd有SUID,创建者是root,那么普通用户运行的时候,passwd的EUID就是root的身份。

所以,如果一个程序有了SUID,那是有潜在的危险的。如果这个程序要操作文件,为了安全,一般来说,都会做权限的判断——用的是当前用户的身份去判断。先判断当前用户是否具有对该文件操作的权限,如果有,才可以继续。access函数就是拥有这样的功能,它用该进程的UID去对文件进行权限判断,而不是用EUID。这种思路流程如下:

代码中,首先用access函数判断当前用户是否有操作文件的权限,如果当前用户没有针对该文件的权限,则打印ERROR;有则open它。在早期的单处理操作系统中,这样的代码可能是严谨的,出发点也是好的。但是,在多任务的操作系统中,有这样两个问题;1、access和open所使用的参数都是文件路径的字符串,那么,这个文件可能是一个链接文件(类似Windows里的快捷方式);2、在用access检查文件后,这个程序可能受到其他程序的干扰或者发生进程切换。那么,如果在使用access函数检查后,进程因为很多原因,发生了进程切换,或者进程被暂停了,这个时候,目标文件被删除了,并且重新创建了一个与原文件名相同的链接文件,链接的目标是当前进程可以操作的文件——如果是root身份运行的,那么这个文件可以是passwd,之后,当该进程又恢复了执行,就可以操作我们修改过的文件了。例如:假设要access-个/tmp/lx文件,在access后、open2前,/tmp/lx被替换成了一个链接文件,指向了其他文件(如/etc/passwd)。

exploit-exercises是一个练习漏洞的平台,其中一关有这么一段代码,这段代码已经被编译成可执行文件了,同目录下有个叫token的文件,存储了密码,现在要求用这个可执行文件去读取密码:

注意,如果当前用户可以访问某个文件,access返回值是0,否则就无法操作文件了。一切操作必须通过这段if之后,才可以进行。这段代码建立了一个socket连接,连接到18211端口上,然后发送一个“banner”这段宏定义。之后再open参数中指定的文件,如果打开成功,就把内容发送到建立的通信连接里。

参考了mattandreko后。

1、在本地监听一个端口。

2、让这个可执行性程序去access一个当前用户有权限访问的文件(在/tmp中建立一个)。

3、在open函数调用之前,删除掉建立的那个文件,再建立一个指向token的链接文件。

首先,就在ttyl里用ne监听18211端口。

一定要用-k参数在连接结束之后强制保持连接状态,否则收到banner之后,连接就结束了。

之后,换到tty2(ctrl+alt+f2),到/tmp目录下建立一个文件:

touch?/tmp/tokenl0

再建立一个shell脚本,文件名xx:

加入可执行权限并执行。

然后切换蛰Jtty3,再在/tmp下建立yy:

加入可执行权限并执行。

nice?-n?19表示改变文件的执行优先级,范围是-20~19,数字越低,优先级越高,这里把flagl0这个程序的优先级变低,这样就可以在access函数执行后、open函数执行前,有机会可以改掉/tmp/tokenl0的指向了。

最后看nc的输出结果,就看得到token了。