实验环境:SEED-Ubuntu20.04虚拟机
A. 缓冲区溢出攻击实验准备
a) 缓冲区溢出原理
**缓冲区溢出攻击原理:**利用溢出的数据改变源程序的控制流,如覆盖返回地址
b) 分析生成badfile文件的exploit.py程序
Shellcode部分
字节数组末尾处填入shellcode
c) 编译目标服务器上具有缓冲区溢出漏洞的stack.c程序,并将其缓冲区大小设为“L1”,L1大小在makefile文件中
输入命令:gcc -DBUF_SIZE=$(L1) -o stack -z execstack -fno-stack-protector stack.c,结果显示函数bof中存在缓冲区溢出
d) 因为stack.c编译命令在makefile文件中因此需通过执行命令make完成编译,再通过命令make install 将编译成的二进制文件复制到文件夹bof-containers folder下,这样创建和开启的containers可以运行和利用
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
f) Shellcode代码解析
Shellcode是能够完成一定功能和由计算机执行的机器码,通常以十六进制的形式存在。Shellcode以数据形式发送给目标服务器,以攻击目标服务器上具有缓冲区漏洞的程序,并获得一定的权限
通用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”
输入命令:echo hello | nc 10.9.0.5 9090=>键入:Ctrl+C
未关闭随即地址之前,相同一个服务器输入hello得到的结果:ebp和偏移量的值会变化
执行命令:sudo /sbin/sysctl -w kernel.randomize_va_space=0 关闭随即地址
注意:若重新启动docker,则重新获得ebp和偏移量值(地址)与之前相比也会变化
ii. 输入具有shellcode代码的数据
使用exploit.py文件生成文件badfile—含shellcode代码,大小为517bytes;
直接发送exploit.py未修改前的输出结果的返回结果
修改exploit.py文件
填入shellcode代码段
Offset=缓冲区大小+4(调用者ebp占的空间)
该ret(返回地址)的值为shellcode代码在的入口位置处=ebp+8,offset(偏移量)-函数栈帧中栈顶到ret处的大小=ebp-buffer’s address+4
运行expliot.py生成badfile文件
将badfile传输到目标服务器,在container中查看结果:成功执行了shellcode代码
D. Task3:Level-2 Attack 目标服务器及端口:10.9.0.6 9090
a) 发送正常数据
服务器只给出缓冲区地址而没有给出ebp值,因此无法得出缓冲区大小
要求:缓冲区大小只能在[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文件
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代码
Exploit.py文件下的shellcode代码
b) 输入正常数据“hello”
地址为8bytes,而且最高两个字节恒为0
Buffer大小:208字节
Buffer_size=208bytes=》函数栈挺大,可以将shellcode放在缓冲区中
c) 修改exploit.py文件
解释图中标记为1,2,3的内容
- start在[0,84]范围内均可。Len(shellcode)=165<buffer_size+ebp段=208+8=216,将shellcode放进缓冲区,只要确保"/bin/ls -l; echo Hello 64; /bin/tail -n 4 /etc/passwd *"在ret段前即可,而该字符串之前(包含该字符串)的shellcode长为133bytes
=》offset(208+8)-start+1≥133=》0≤star≤84 - ret=buffer’address+[0,start]
- offset=buffer_size+8
d) 在目录/Labsetup/attack-code目录下运行exploit.py文件生成新的的badfile文件,将badfile传输到server-3并查看服务器端的输出
F. Task5:Level-4 Attack
a) 发送正常消息“hello”
Buffer_size=96bytes
Offset=Buffer_size+8=104bytes<len(shellcode)=165bytes
=》函数栈很小,不适于将shellcode放进缓冲区,而放在ret段后面又会被截断。但是badfile传进目标程序时已载入数据段,因此尽可能将ret设置大一点,跳转到数据段的shellcode代码部分执行shellcode
网上找到的资料:ret=rbp+n,n在1184与1424之间
b) 修改exploit.py文件
c) 在目录/Labsetup/attack-code目录下运行exploit.py文件生成新的的badfile文件,将badfile传输到server-3并查看服务器端的输出
G. Task6:针对缓冲区溢出攻击的对策之随即地址
a) 开启内存地址随机化保护, 并用server-1与server-2上的目标程序进行检验
输入命令:sudo /sbin/sysctl -w kernel.randomize_va_space=2
Server-3
Server-1
b) 设目标程序为server-1上的,并修改exploit.py文件中的shellcode,注:shellcode长度不能变
c) 在/Labsetup/attack-code目录下执行exploit.py程序,并另打开一窗口进行监听
d) 执行/Labsetup/attack-code目录下的brute-force.sh程序,该程序会一直执行exploit.py程序直到获得目标服务器shell
输入命令:./brute-force.sh
在第10106次成功获得server-1的shell
成功reverse shell
输入命令进行验证
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
b) 打开Non-executable Stack(栈堆不可执行)保护
只是不能运行堆栈上的shellcode代码,还是允许堆栈溢出
堆栈不能执行文章来源:https://www.toymoban.com/news/detail-734492.html
缺点:这个方法只是不能在堆栈上执行shellcode代码,而没有阻止缓冲区溢出,还有其他方法可进行攻击文章来源地址https://www.toymoban.com/news/detail-734492.html
到了这里,关于SEED-缓冲区溢出攻击的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!