SEED-缓冲区溢出攻击

实验环境:SEED-Ubuntu20.04虚拟机

文章目录

    • A. 缓冲区溢出攻击实验准备
        • a) 缓冲区溢出原理
        • b) 分析生成badfile文件的exploit.py程序
        • c) 编译目标服务器上具有缓冲区溢出漏洞的stack.c程序,并将其缓冲区大小设为“L1”,L1大小在makefile文件中
        • d) 因为stack.c编译命令在makefile文件中因此需通过执行命令make完成编译,再通过命令make install 将编译成的二进制文件复制到文件夹bof-containers folder下,这样创建和开启的containers可以运行和利用
        • e) 建立container
        • f) Shellcode代码解析
    • B. Task1:熟悉Shellcode
        • a) 运行shellcode_32.py 和shellcode_64.py两个python文件,将shellcode代码分别写进文件codefile_32和 codefile_64
        • b) 编译call_shellcode.c文件,该文件用于运行上面生成的两个文件中的shellcode代码
        • c) 测试两个文件中的shellcode代码
    • C. Task2:Level-1 Attack 目标服务器及端口:10.9.0.5 9090
        • a) 在目录/Labsetup下打开一个终端,并在该终端开启containers
        • b) 在目录/Labsetup下打开一个终端,向目标服务器发送数据
            • i. 输入正常数据“hello”
            • ii. 输入具有shellcode代码的数据
    • D. Task3:Level-2 Attack 目标服务器及端口:10.9.0.6 9090
        • a) 发送正常数据
        • b) 修改exploit.py文件
        • c) 在目录/Labsetup/attack-code目录下运行exploit.py文件生成新的的badfile文件,将badfile传输到server-2并查看服务器端的输出
    • E. Task4:Level-3 Attack
        • a) 64位shellcode(在目录Labsetup/shellcode/下的文件shellcode_64.py中获得64位的shellcode代码)
        • b) 输入正常数据“hello”
        • c) 修改exploit.py文件
        • d) 在目录/Labsetup/attack-code目录下运行exploit.py文件生成新的的badfile文件,将badfile传输到server-3并查看服务器端的输出
    • F. Task5:Level-4 Attack
        • a) 发送正常消息“hello”
        • b) 修改exploit.py文件
        • c) 在目录/Labsetup/attack-code目录下运行exploit.py文件生成新的的badfile文件,将badfile传输到server-3并查看服务器端的输出
    • G. Task6:针对缓冲区溢出攻击的对策之随即地址
        • a) 开启内存地址随机化保护, 并用server-1与server-2上的目标程序进行检验
        • b) 设目标程序为server-1上的,并修改exploit.py文件中的shellcode,注:shellcode长度不能变
        • c) 在/Labsetup/attack-code目录下执行exploit.py程序,并另打开一窗口进行监听
        • d) 执行/Labsetup/attack-code目录下的brute-force.sh程序,该程序会一直执行exploit.py程序直到获得目标服务器shell
    • H. Task7:针对缓冲区溢出攻击的其他几个对策
        • a) 打开StackGuard保护,并将badfile文件传输到stack-L1文件中,在/Labsetup/serve-code目录下直接执行stack-L1文件
        • b) 打开Non-executable Stack(栈堆不可执行)保护

A. 缓冲区溢出攻击实验准备

a) 缓冲区溢出原理

SEED-缓冲区溢出攻击_第1张图片
**缓冲区溢出攻击原理:**利用溢出的数据改变源程序的控制流,如覆盖返回地址

b) 分析生成badfile文件的exploit.py程序

Shellcode部分
SEED-缓冲区溢出攻击_第2张图片

字节数组末尾处填入shellcode
SEED-缓冲区溢出攻击_第3张图片
SEED-缓冲区溢出攻击_第4张图片

c) 编译目标服务器上具有缓冲区溢出漏洞的stack.c程序,并将其缓冲区大小设为“L1”,L1大小在makefile文件中

输入命令:gcc -DBUF_SIZE=$(L1) -o stack -z execstack -fno-stack-protector stack.c,结果显示函数bof中存在缓冲区溢出
SEED-缓冲区溢出攻击_第5张图片

d) 因为stack.c编译命令在makefile文件中因此需通过执行命令make完成编译,再通过命令make install 将编译成的二进制文件复制到文件夹bof-containers folder下,这样创建和开启的containers可以运行和利用

SEED-缓冲区溢出攻击_第6张图片

e) 建立container

在这里插入图片描述

注意:

  • 若执行命令dcbuild无法建立container,那可能是Docker没有开启Docker,只用命令“systemctl restart docker.service”开启Docker,若还是没法开启那就需要更改mirrors配置文件了—多尝试(增加或恢复到初始镜像网站)。如果还是不行可以尝试重启虚拟机SEED Ubuntu20.04
  • 若执行dcup命令报错“WARNING: Found orphan containers (elgg-10.9.0.5, mysql-10.9.0.6) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
    ERROR: for bof-server-L2 Cannot start service bof-server-L2: Address already in use”
    =》说明IP地址被其他服务占用
    根据提示执行命令:docker-compose up -d --remove-orphans
    SEED-缓冲区溢出攻击_第7张图片

f) Shellcode代码解析

Shellcode是能够完成一定功能和由计算机执行的机器码,通常以十六进制的形式存在。Shellcode以数据形式发送给目标服务器,以攻击目标服务器上具有缓冲区漏洞的程序,并获得一定的权限

通用Shellcode代码
SEED-缓冲区溢出攻击_第8张图片

B. Task1:熟悉Shellcode

a) 运行shellcode_32.py 和shellcode_64.py两个python文件,将shellcode代码分别写进文件codefile_32和 codefile_64

在这里插入图片描述

b) 编译call_shellcode.c文件,该文件用于运行上面生成的两个文件中的shellcode代码

在这里插入图片描述

c) 测试两个文件中的shellcode代码

SEED-缓冲区溢出攻击_第9张图片

C. Task2:Level-1 Attack 目标服务器及端口:10.9.0.5 9090

a) 在目录/Labsetup下打开一个终端,并在该终端开启containers

SEED-缓冲区溢出攻击_第10张图片

b) 在目录/Labsetup下打开一个终端,向目标服务器发送数据

i. 输入正常数据“hello”

输入命令:echo hello | nc 10.9.0.5 9090=>键入:Ctrl+C
SEED-缓冲区溢出攻击_第11张图片

未关闭随即地址之前,相同一个服务器输入hello得到的结果:ebp和偏移量的值会变化

SEED-缓冲区溢出攻击_第12张图片

执行命令:sudo /sbin/sysctl -w kernel.randomize_va_space=0 关闭随即地址
SEED-缓冲区溢出攻击_第13张图片

注意:若重新启动docker,则重新获得ebp和偏移量值(地址)与之前相比也会变化
在这里插入图片描述

ii. 输入具有shellcode代码的数据

使用exploit.py文件生成文件badfile—含shellcode代码,大小为517bytes;
直接发送exploit.py未修改前的输出结果的返回结果
SEED-缓冲区溢出攻击_第14张图片

修改exploit.py文件
填入shellcode代码段
SEED-缓冲区溢出攻击_第15张图片

Offset=缓冲区大小+4(调用者ebp占的空间)
该ret(返回地址)的值为shellcode代码在的入口位置处=ebp+8,offset(偏移量)-函数栈帧中栈顶到ret处的大小=ebp-buffer’s address+4
在这里插入图片描述

运行expliot.py生成badfile文件
SEED-缓冲区溢出攻击_第16张图片
SEED-缓冲区溢出攻击_第17张图片

将badfile传输到目标服务器,在container中查看结果:成功执行了shellcode代码
SEED-缓冲区溢出攻击_第18张图片

D. Task3:Level-2 Attack 目标服务器及端口:10.9.0.6 9090

a) 发送正常数据

服务器只给出缓冲区地址而没有给出ebp值,因此无法得出缓冲区大小
SEED-缓冲区溢出攻击_第19张图片

要求:缓冲区大小只能在[100,300] 单位:bytes
分析:

  • bufferSize在[100,300]范围内,则offset在[100+4,300+4]范围内,且offset一定为4的倍数
  • offset最大为304,则ret后面—高地址方向都是NOP指令或shellcode代码,因此ret=buffer’s address + 304+4(ret部分占有空间大小)一定会指向NOP指令或shellcode指令入口处,而NOP指令会一直向下跳
  • 从offset=104开始一直填写上面一部确定好的ret值到offset=304结束,则ret部分一定会得到上面的ret值

b) 修改exploit.py文件

SEED-缓冲区溢出攻击_第20张图片

c) 在目录/Labsetup/attack-code目录下运行exploit.py文件生成新的的badfile文件,将badfile传输到server-2并查看服务器端的输出

在这里插入图片描述
结果显示成功在目标服务器上运行shellcode代码

E. Task4:Level-3 Attack

注:

  • 64位系统中,地址为8字节,其中最高的两个字节不用,因此64位系统中内存地址表示为0x0000XXXXXXXXXXXX
  • 在一些有关字符串操作的函数中将“0”识别为截断,如strcpy()函数,而在badfile文件中ret=0x0000XXXXXXXXXXXX,且stack.c程序中代码为“strcpy(buffer,str)
    =》执行strcpy()函数时ret段后面的内容会被截断
    =》64位系统中shellcode不放在ret后

a) 64位shellcode(在目录Labsetup/shellcode/下的文件shellcode_64.py中获得64位的shellcode代码)

Shellcode_64.py文件下的shellcode代码
SEED-缓冲区溢出攻击_第21张图片

Exploit.py文件下的shellcode代码
SEED-缓冲区溢出攻击_第22张图片

b) 输入正常数据“hello”

在这里插入图片描述
地址为8bytes,而且最高两个字节恒为0
Buffer大小:208字节
Buffer_size=208bytes=》函数栈挺大,可以将shellcode放在缓冲区中

c) 修改exploit.py文件

SEED-缓冲区溢出攻击_第23张图片
解释图中标记为1,2,3的内容

  1. start在[0,84]范围内均可。Len(shellcode)=165 =》offset(208+8)-start+1≥133=》0≤star≤84
  2. ret=buffer’address+[0,start]
  3. offset=buffer_size+8

d) 在目录/Labsetup/attack-code目录下运行exploit.py文件生成新的的badfile文件,将badfile传输到server-3并查看服务器端的输出

SEED-缓冲区溢出攻击_第24张图片

F. Task5:Level-4 Attack

a) 发送正常消息“hello”

SEED-缓冲区溢出攻击_第25张图片
Buffer_size=96bytes
Offset=Buffer_size+8=104bytes =》函数栈很小,不适于将shellcode放进缓冲区,而放在ret段后面又会被截断。但是badfile传进目标程序时已载入数据段,因此尽可能将ret设置大一点,跳转到数据段的shellcode代码部分执行shellcode
网上找到的资料:ret=rbp+n,n在1184与1424之间

b) 修改exploit.py文件

SEED-缓冲区溢出攻击_第26张图片

c) 在目录/Labsetup/attack-code目录下运行exploit.py文件生成新的的badfile文件,将badfile传输到server-3并查看服务器端的输出

SEED-缓冲区溢出攻击_第27张图片

G. Task6:针对缓冲区溢出攻击的对策之随即地址

a) 开启内存地址随机化保护, 并用server-1与server-2上的目标程序进行检验

输入命令:sudo /sbin/sysctl -w kernel.randomize_va_space=2
Server-3

SEED-缓冲区溢出攻击_第28张图片

Server-1
SEED-缓冲区溢出攻击_第29张图片

b) 设目标程序为server-1上的,并修改exploit.py文件中的shellcode,注:shellcode长度不能变

SEED-缓冲区溢出攻击_第30张图片

SEED-缓冲区溢出攻击_第31张图片

c) 在/Labsetup/attack-code目录下执行exploit.py程序,并另打开一窗口进行监听

在这里插入图片描述

d) 执行/Labsetup/attack-code目录下的brute-force.sh程序,该程序会一直执行exploit.py程序直到获得目标服务器shell

输入命令:./brute-force.sh
SEED-缓冲区溢出攻击_第32张图片
在第10106次成功获得server-1的shell
成功reverse shell

输入命令进行验证SEED-缓冲区溢出攻击_第33张图片

H. Task7:针对缓冲区溢出攻击的其他几个对策

a) 打开StackGuard保护,并将badfile文件传输到stack-L1文件中,在/Labsetup/serve-code目录下直接执行stack-L1文件

先将badfile文件复制到目录/Labsetup/serve-code下
打开StackGuard保护:编译stack.c时去掉“
将stack.c -fno-stack-protector”
将stack.c直接编译为stack-L1
SEED-缓冲区溢出攻击_第34张图片

b) 打开Non-executable Stack(栈堆不可执行)保护

只是不能运行堆栈上的shellcode代码,还是允许堆栈溢出
SEED-缓冲区溢出攻击_第35张图片
堆栈不能执行

缺点:这个方法只是不能在堆栈上执行shellcode代码,而没有阻止缓冲区溢出,还有其他方法可进行攻击

你可能感兴趣的:(网络安全)