文章目录
一、实验题目
本实验的学习目标是让学生将从课堂上学到的有关缓冲区溢出漏洞的知识进行实践,从而获得有关该漏洞的第一手经验。缓冲区溢出是指程序试图将数据写入预先分配的固定长度缓冲区边界之外的情况。恶意用户可利用此漏洞改变程序的流控制,甚至执行任意代码。此漏洞是由于数据存储(如缓冲区)和控件存储(如返回地址)的混合造成的:数据部分的溢出会影响程序的控制流,因为溢出会改变返回地址。
本实验将提供四台不同的服务器,每台服务器运行一个带有缓冲区溢出漏洞的程序。实验任务是开发一个利用漏洞的程序,并最终获得这些服务器上的root权限。除了进行这些攻击实验之外,还将试验几种针对缓冲区溢出攻击的对策。学生需要评估这些计划是否有效,并解释原因。
二、实验步骤
Task1: Get Familiar with the Shellcod
- 对 shellcode_32.py 进行修改,使其能够删除文件
- 新建 tmpfile 文件并运行 shellcode,此过程中需赋予shellcode_32.py和shellcode_64.py权限,过程和结果如下:
- 执行完后,tmpfile 也被删除了。
Task2: Level-1 Attack
- 进入 server-code 文件夹下,执行命令
$ make
$ makeinstall
- 然后返回其根目录,执行命令启动 docker
$ dcbuild
$ dcup
3. 进入 attack-code 文件夹,执行nc 10.9.0.5 9090
4. server显示
5. 修改exploit.py为下图并执行
6.得到
Task 3: Level-2 Attack
- 先用nc 10.9.0.4 9090建立连接
- 修改exploit.py,其中ret 应当大于等于 0xffffd708+308,但应当保证 shellcode 都在 payload 内,offset 为 100-300 之间的某个值
- 然后执行exploit.py,再执行nc 10.9.0.4 9090
Task 4: Level-3 Attack
- 进行连接
- 修改 exploit.py,其中, shellcode 即为 shellcode_64.py 中的 shellcode start 设定为一个较小的值,可以直接取0 ret = rbp + n \text{ret}=\text{rbp}+nret=rbp+n ebp 就是刚刚 echo hello 中得到的 rbp,因为关闭了地址随机化,所以每次都一样 n ∈ [ buffer , buffer + start ] n\in[\text{buffer},\text{buffer}+\text{start}]n∈[buffer,buffer+start]
- 执行exploit.py得到
Task 5: Level-4 Attack
- 进行连接
- 修改 exploit.py,其中,ret 取一个较大的值:1200 offset = \text{offset}=offset=0x00007fffffffe700− -−0x00007fffffffe6a0+8
- 执行exploit.py得到
查找域名并存入域名表
- 打开地址随机化
- 各执行两次如下命令:
- 可以看到,每次地址都不相同,导致攻击困难。使用 Task2 中 reverse shell 的 exploit.py 代码,执行命令并打开终端进行监听
$ ./exploit.py
$ ./brute-force.sh
4. 执行十多万次后也并未获得权限
Tasks 7: Experimenting with Other Countermeasures
- 进入 server-code 文件夹,去除 -fno-stack-protector 编译 stack.c,并将 badfile 作为输入,可以看到检测到了 stack smashing
- 进入 shellcode 文件夹,去除 -z execstack 编译 call_shellcode.c 并运行 可以看到,栈不再运行。
版权归原作者 whalien__52 所有, 如有侵权,请联系我们删除。