seedlabs_网络攻防技术_lab4

lab4 缓冲区溢出实验

一、实验要求

​ 本实验的学习目标是让学生将从课堂上学到的有关缓冲区溢出漏洞的知识进行实践,从而获得有关该漏洞的第一手经验。缓冲区溢出是指程序试图将数据写入预先分配的固定长度缓冲区边界之外的情况。恶意用户可利用此漏洞改变程序的流控制,甚至执行任意代码。此漏洞是由于数据存储(如缓冲区)和控件存储(如返回地址)的混合造成的:数据部分的溢出会影响程序的控制流,因为溢出会改变返回地址。
​ 本实验将提供四台不同的服务器,每台服务器运行一个带有缓冲区溢出漏洞的程序。实验任务是开发一个利用漏洞的程序,并最终获得这些服务器上的root权限。除了进行这些攻击实验之外,还将试验几种针对缓冲区溢出攻击的对策。学生需要评估这些计划是否有效,并解释原因。

二、实验步骤及结果

task1: Get Familiar with the Shellcode

  1. 进入shellcode文件夹,修改shellcode_32.py ,使其能够删除文件

在这里插入图片描述

  1. 编译运行(需要先行创建一个tmpfile)

在这里插入图片描述

task2: Level-1 Attack

  1. 进入server-code文件夹,执行下列命令

make
make install

在这里插入图片描述

  1. 回到labsetup文件夹下,执行下列命令

dcbuild

dcup

在这里插入图片描述
在这里插入图片描述

  1. 保持上述终端窗口,另开一个终端到attack-code文件夹下执行下述命令

nc 10.9.0.5 9090

  1. ctrl+C终止后,可以看到server显示

在这里插入图片描述

  1. 修改exploit.py为下图

在这里插入图片描述
6. 注意要关闭ASLR(地址空间随机化),不然后面运行会失败

sysctl -w kernel.randomize_va_space=0
在这里插入图片描述

​ 像这样两次输出一致且都是0xffffxxxx的形式就成功了
在这里插入图片描述

  1. 再根据ebp和buffer address计算ret和offset

ret = ebp + 8

offset = ebp - buffer address + 4 # 需要注意统一进制

在这里插入图片描述

  1. 运行exploit.py后,传输badfile,查看输出,得知成功运行

在这里插入图片描述

task3: Level-2 Attack

  1. 输入echo hello | nc 10.9.0.6 9090,连接2号服务器

​ 可以看到只提供了buffer address
在这里插入图片描述

  1. 根据文档可知offset范围为100~300
    在这里插入图片描述
  2. 新建一个exploit2.py,修改代码如下由于不知offset,所以用循环进行尝试

在这里插入图片描述
4. 运行并传输文件,攻击成功
在这里插入图片描述

task4: Level-3 Attack

  1. 输入echo hello | nc 10.9.0.7 9090,连接3号服务器

​ 可以看到3号服务器使用64位系统,rbp就是上面的ebp
在这里插入图片描述

  1. 修改exploit3.py,注意shellcode部分使用shellcode_64.py中的代码

ret = buffer address

offset = rbp - buffer address + 8 # 注意进制 32位系统+4,64位系统+8 十进制

在这里插入图片描述
在这里插入图片描述

  1. 运行并传输文件,攻击成功

在这里插入图片描述

task5: Level-4 Attack

  1. 连接服务器

​ 4号服务器与3号服务器相同,但是buffer size更小
在这里插入图片描述
2. 与task4原理相同,修改exploit4.py文件如下

在这里插入图片描述

  1. 运行后传输文件,成功

在这里插入图片描述

task6: Experimenting with the Address Randomization

  1. 开启ASLR,观察它是如何影响攻击的

sudo /sbin/sysctl -w kernel.randomize_va_space=2

在这里插入图片描述

  1. 向1号服务器和3号服务器发送hello信息,多发送几次,进行观察

在这里插入图片描述
在这里插入图片描述

为什么ASLR使缓冲区溢出攻击更加困难

地址空间随机化(Address Space Layout Randomization)(ASLR)是一种操作系统用来抵御缓冲区溢出攻击的内存保护机制。ASLR通过对攻击者在进行缓冲区溢出攻击时所要用到的内存布局中的偏移做了随机化,加大了攻击成功的难度,从而增强了系统的控制流完整性。这种技术使得系统上运行的进程的内存地址无法被预测,使得与这些进程有关的漏洞变得更加难以利用。

通常认为ASLR在64位系统上效果更好,因为64位系统有更大的可随机的地址范围。

克服32位系统的ASLR

​ 根据pdf给出的shell脚本进行循环攻击

在这里插入图片描述

​ 攻击成功就会停下,理论上十分钟内能得到结果

​ 但是我这里运行了16分钟、11万次都没有成功

在这里插入图片描述

task7: Experimenting with Other Countermeasures

a. Turn on the StackGuard Protection

进入server-code文件夹,移除gcc的栈溢出保护机制-fno-stack-protector。编译stack.c,并将badfile作为输入

在这里插入图片描述

​ 可以看到检测到了 stack smashing

b. Turn on the Non-executable Stack Protection

​ 进入 shellcode 文件夹,去除 -z execstack 编译 call_shellcode.c 并运行

在这里插入图片描述
可以看到,发生了segmentation fault,栈不可再用

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值