User ID: seed, Password: dees
User ID: root, Password: seedubuntu
下载实验文件
控制环境变量
env

按顺序执行下面命令
env | grep PWD
unset PWD
env | grep PWD
export PWD=sdajf
env | grep PWD
export MY_ENV=myenv
env | grep MY_ENV

编译程序
gcc myprintenv.c
运行程序,并将结果输出到file里面
a.out > file1
注释case 0里面的printenv(),取消注释下面的printenv()
编译程序
gcc myprintenv.c
运行程序,并将结果输出到file里面
a.out > file2
用命令diff比较
diff file1 file2

无输出,说明父进程和子进程环境变量一样
编译myenv.c,查看输出,发现没有

将execve()更改为下面内容
execve("/usr/bin/env", argv, environ);
输出了环境变量

新程序通过传参,得到环境变量并输出
创建verify.c文件
#include
#include
int main()
{
system("/usr/bin/env");
return 0 ;
}
编译并输出

创建task5.c文件
touch task5.c
写入内容如下
#include
#include
extern char **environ;
int main()
{
int i = 0;
while (environ[i] != NULL) {
printf("%s\n", environ[i]);
i++;
}
}
编译并设置权限
gcc -o foo task5.c
sudo chown root foo
sudo chmod 4755 foo
修改环境变量

查看程序的环境变量是否被修改
发现LD_LIBRARY_PATH没有被修改,这个是因为动态链接器的保护
有效ID和真实ID不一样时,动态链接器会忽略LD_LIBRARY_PATH的值
注意使用pwd获得当前路径
再把当前路径加到PATH环境变量中
链接到zsh后,获得root权限

完成准备工作

用seed用户执行,执行了我们写的sleep()

将其设置为Set-UID root程序,执行原本的sleep()
用root执行,执行了我们写的sleep()
root的密码应该是seedubuntu,但是不对,所以我用sudo su root获得root
将其设置为Set-UID user1程序,用seed用户执行,执行原本的sleep()

第一,euid和uid都为seed,LD_PRELOAD 环境变量没有被忽略,所以链接的是 libmylib.so.1.0.1,执行我们写的sleep()
第二个,euid为root,uid为seed,不相同,受动态链接器保护,执行正常的sleep()
第三个,euid 等于uid,均为 root
第四个,euid为uer1,uid为seed,不相同
利用漏洞删除没有权限删除的文件
创建没权限删除的文件
进行攻击,成功删除文件

按要求更改源代码
重复上一步

攻击失败,因为把system()换成了execve(),前者会把数据当成命令执行,后者不会。execve()接收的数据就是参数,不会当成代码执行
创建漏洞程序需要打开的文件
执行漏洞程序

因为漏洞程序打开文件后没有关闭,并且泄露了文件描述符。我们可以控制这个文件