整个实验主要是实施竞态攻击。先用下面的命令禁止使用全局可写目录的符号连接
// On Ubuntu 12.04, use the following:
$ sudo sysctl -w kernel.yama.protected_sticky_symlinks=0
// On Ubuntu 16.04, use the following:
$ sudo sysctl -w fs.protected_symlinks=0
有漏洞的示例代码如下:
/* vulp.c */
#include <stdio.h>
#include<unistd.h>
int main()
{
char * fn = "/tmp/XYZ";
char buffer[60];
FILE *fp;
/* get user input */
scanf("%50s", buffer );
if(!access(fn, W_OK)){
fp = fopen(fn, "a+");
fwrite("\n", sizeof(char), 1, fp);
fwrite(buffer, sizeof(char), strlen(buffer), fp);
fclose(fp);
}
else
printf("No permission \n");
return 0;
}
编译并设为root set-uid 程序
gcc -o vulp vulp.c
sudo chown root vulp
sudo chmod 4755 vulp
1. Task 1
由于后面要用竞态攻击来向系统添加新的拥有root权限的用户,这就涉及到到在/etc/passwd文件中新增内容,这个部分主要是确定添加的内容。
root用户对应的内容为,第一个字段为用户名,第二个字段为密码的哈希,如为x则表示密码在/etc/shadow文件中,其他就不细说了。
root:x:0:0:root:/root:/bin/bash
空密码的哈希值为 U6aMy0wojraho,所以要添加的一行如下,将其保存到passwd_input文件中
test:U6aMy0wojraho:0:0:test:/root:/bin/bash
同时将这一行添加到/etc/passwd文件的最后,尝试用test用户进行登录,可以发现可以无密码登录,且有root权限。