• Environment_Variable_and_SetUID


    准备

    User ID: seed, Password: dees
    User ID: root, Password: seedubuntu

    下载实验文件

    实验任务

    任务1

    控制环境变量

    env
    
    • 1


    按顺序执行下面命令

    env | grep PWD
    unset PWD
    env | grep PWD
    export PWD=sdajf
    env | grep PWD
    export MY_ENV=myenv
    env | grep MY_ENV
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    任务2

    编译程序

    gcc myprintenv.c
    
    • 1

    运行程序,并将结果输出到file里面

    a.out > file1
    
    • 1

    注释case 0里面的printenv(),取消注释下面的printenv()
    编译程序

    gcc myprintenv.c
    
    • 1

    运行程序,并将结果输出到file里面

    a.out > file2
    
    • 1

    用命令diff比较

    diff file1 file2
    
    • 1

    无输出,说明父进程和子进程环境变量一样

    任务3

    编译myenv.c,查看输出,发现没有

    execve()更改为下面内容

    execve("/usr/bin/env", argv, environ);
    
    • 1

    输出了环境变量

    新程序通过传参,得到环境变量并输出

    任务4

    创建verify.c文件

    #include 
    #include 
    int main()
    {
    	system("/usr/bin/env");
    	return 0 ;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    编译并输出

    任务5

    创建task5.c文件

    touch task5.c
    
    • 1

    写入内容如下

    #include 
    #include 
    extern char **environ;
    int main()
    {
    	int i = 0;
    	while (environ[i] != NULL) {
    		printf("%s\n", environ[i]);
    		i++;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    编译并设置权限

    gcc -o foo task5.c
    sudo chown root foo
    sudo chmod 4755 foo
    
    • 1
    • 2
    • 3

    修改环境变量

    查看程序的环境变量是否被修改
    发现LD_LIBRARY_PATH没有被修改,这个是因为动态链接器的保护

    有效ID和真实ID不一样时,动态链接器会忽略LD_LIBRARY_PATH的值

    任务6

    注意使用pwd获得当前路径
    再把当前路径加到PATH环境变量中
    链接到zsh后,获得root权限

    任务7

    完成准备工作

    用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,不相同

    任务8

    第一步

    利用漏洞删除没有权限删除的文件
    创建没权限删除的文件
    进行攻击,成功删除文件

    第二步

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

    攻击失败,因为把system()换成了execve(),前者会把数据当成命令执行,后者不会。execve()接收的数据就是参数,不会当成代码执行

    任务9

    创建漏洞程序需要打开的文件
    执行漏洞程序

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

  • 相关阅读:
    【无人机】基于Matlab的四旋翼无人机控制仿真
    计算机毕业设计小程序在线旅游信息管理+后台SSM
    【C语言】通讯录管理系统(保姆级教程+内含源码)
    XtraBackup 搭建从库的一般步骤及 XtraBackup 8.0 的注意事项
    241. 为运算表达式设计优先级(分治 +记忆化)
    新手选MT4老手选MT5,有道理吗?anzo capital昂首资本这样分析
    hashMap不同版本的区别
    Linux CentOS 8(HTTP综合案例-用户登录)
    Java内部类
    Ubuntu20.4部署Cuda12.4
  • 原文地址:https://blog.csdn.net/qq_46241655/article/details/126030312