20199137 2019-2020-2 《网络攻防实践》第十次作业

本次作业属于那个课程 《网络攻防实践》
这个作业要求在哪里 第十次作业 软件安全攻防--缓冲区溢出和shellcode
作业正文 下述正文
其他参考文献 见文末

1.实践内容

软件安全漏洞威胁

美国国家标准技术研究院NIST将安全漏洞定义为:在系统安全流程、设计、实现或内部控制中所存在的缺陷或弱点,能够被攻击者所利用并导致安全侵害或对系统安全策略的违反。

三个基本元素:

1)系统的脆弱性或缺陷
2)攻击者对缺陷的可访问性
3)攻击者对缺陷的可利用性

软件安全困境:

1)复杂性
2)可扩展性
3)连通性

软件安全的漏洞威胁:

内存安全违规类:

在软件开发过程中在处理RAM内存访问时所引入的安全缺陷 缓冲区溢出漏洞是一种最基础的内存安全问题
输入验证类:输入验证类安全漏洞是指软件程序在对用户输入进行数据验证存在的错误,没有保证输入数据的正确性、合法性和安全性,从而导致可能被恶意攻击与利用。XSS、SQL注入、远程文件包含、HTTP Header注入等
竞争条件类:竞争条件类缺陷是系统或进程中一类比较特殊的错误,通常在涉及多进程或多线程处理的程序中出现,是指处理进程的输出或结果无法预测,并依赖于其他进程事件发生的次序或时间时,所导致的错误。
权限混淆与提升类:
权限混淆与提升漏洞是指计算机程序由于自身编程疏忽或被第三方欺骗,从而滥用其权限,或赋予第三方不该给予的权限。
跨站请求伪造、FTP反弹攻击、权限提升、“越狱"等

缓冲区溢出基础概念

缓存存区溢出是计算机程序中存在的一类内存安全违规类漏洞,在计算机程序向特定缓冲区内填充数据时,超出了缓冲区本身的容量,导致外溢数据覆盖了相邻内存空间的合法数据,从而改变程序执行流程破坏系统运行完整性。
缓冲区溢出攻击原理
缓冲区溢出漏洞根据缓冲区在进程内存空间中的位置不同,又分为栈溢出、堆溢出和内核溢出这三种具体技术形态。
栈溢出是指存储在栈上的一些缓冲区变量由于存在缺乏边界保护问题,能够被溢出并修改栈上的敏感信息(通常是返回地址),从而导致程序流程的改变。
堆溢出则是存储在堆上的缓冲区变量缺乏边界保护锁遭受溢出攻击的安全问题。
内核溢出漏洞存在于一些内核模块或程序中,是由于进程内存空间内核态中存储的缓冲区变量被溢出造成的。
缓冲区溢出的根本问题在于:用户输入可控制的缓冲区操作缺乏对目标缓冲区的边界安全保护。如果用户输入无法到达漏洞利用点,那么这类缓冲区溢出只能被称为安全缺陷,而不能被称为安全漏洞。

Linux平台上的栈溢出与Shellcode

Linux平台中的栈溢出攻击按照攻击数据的构造方式不同,主要有NSR,RNS和RS三种模式。

NSR模式

NSR模式主要适用于被溢出的缓冲区变量比较大,足以容纳Shellcode的情况,其攻击数据从低地址到高地址的构造方式是一堆Nop指令(即空操作指令)之后填充Shellcode,再加上一些覆盖RET返回地址的跳转地址,从而构成了NSR攻击数据缓冲区,如下图所示。

vulnerable1.c:

stackexploit1.c:

RNS模式

第二种栈溢出的模式为RNS模式,一般用于被溢出的变量比较小,不足以容纳Shellcode的情况,如下图所示。攻击数据从低地址到高地址的构造方式是首先填充一些期望覆盖RET返回地址的跳转地址,然后是一堆Nop指令填充出“着陆区”,最后再是Shellcode。

vulnerable2. c:

stackexploit2.c:

RS模式

在这种模式下能够精确地定位出Shellcode在目标漏洞程序进程空间中的起始地址,因此也就无须引入Nop空指令构建“着陆区”。这种模式是将Shellcode放置在目标漏洞程序执行时的环境变量中,由于环境变量是位于Linux进程空间中的栈底位置,因而不会受到各种变量内存分配与对齐因素的影响,其位置是固定的。

vulnerable2.c:

stackexploit3.c:

Linux系统中本地shellcode的产生过程

  • 先用高级编程语言,C,来编写shellcode程序
  • 编译并反汇编调试这个shellcode程序
  • 从汇编语言代码级别分析程序执行流程
  • 整理生成的汇编代码,尽量减少它的体积使他可注入,并可通过嵌入C语言进行运行测试和调试
  • 提取汇编代码所对应的opcode二进制指令,创建shellcode指令数组

Windows平台上的栈溢出与Shellcode

Windows操作系统平台在很多方面与Linux操作系统具有显著不同的实现机制,而在这些差异中,与成功攻击应用程序中栈溢出漏洞密切相关的主要有如下三点。
如何进行系统调用-shellcode方式不同
Win32: 通过调用系统DLL提供的接口函数
Linux: 通过中断进行系统调用
对废弃栈的处理-NSR模式不适用于Win32
Win32: 写入一些随机的数据
Linux: 不进行任何处理
进程内存空间的分布-NRS与R.S模式同样不适用于Win32
Win32: 栈在1G以下的用户空间,地址中有空字节
Linux: 栈在3G(0xc0000000)附近,地址中没有空字节

Windows平台shellcode实现技术

  • shellcode必须可以找到所需要的Windows32 API函数,并生成函数调用表
  • 为了能够使用API函数,shellcode必须找到目标程序已加载的函数地址
  • shellcode需考虑消除空字节,以免在字符串操作函数中被截断
  • shellcode需确保自己可以正常退出,并使原来的目标程序进程继续运行或终止
  • 在目标系统环境存在异常处理和安全防护机制时,shellcode需进一步考虑如何应对这些机制
    一句话概括: 由于程序的运行机制,假设利用strcpy()函数进行字符串赋值,因定义字符串长度及传入字符串长度不一致(过长),从而占用了ebp(栈底)和call(函数)返回地址的栈区。基于此可利用修改函数调用结束后的返回地址,从而使计算机毫不犹豫的执行由我们编写的代码(shellcode)
    调用前:

push eip

push ebp

mov ebp,esp

调用完:

mov esp,ebp

pop ebp

ret

#include<stdio.h>  //引入头文件
#include<string.h>
#include<windows.h>
char name[] = "XXXX";  //定义全局变量
 
int main()            //返回值 主函数main()
{
        LoadLibrary("user32.dll");        
        char buffer[8];   //开辟8个字节的空间用来存储变量name
        strcpy(buffer,name);  //内置函数(作用):将变量name内容赋值给buffer变量
        printf("%s
",buffer);  //输出在控制台
        getchar();               //方便观察 作用:等待用户输入按键
        return 0;                //返回值
}

缓冲区溢出攻击的防御技术

目前有四种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响:
1)强制写正确的代码的方法
编写正确的代码是一件非常有意义但耗时的工作,特别像编写C语言那种具有容易出错倾向的程序(如:字符串的零结尾),这种风格是由于追求性能而忽视正确性的传统引起的。尽管花了很长的时间使得人们知道了如何编写安全的程序,具有安全漏洞的程序依旧出现。因此人们开发了一些工具和技术来帮助经验不足的程序员编写安全正确的程序。虽然这些工具帮助程序员开发更安全的程序,但是由于C语言的特点,这些工具不可能找出所有的缓冲区溢出漏洞。所以,侦错技术只能用来减少缓冲区溢出的可能,并不能完全地消除它的存在。除非程序员能保证他的程序万无一失,否则还是要用到以下部分的内容来保证程序的可靠性能。
2)通过操作系统使得缓冲区不可执行,从而阻止攻击者殖入攻击代码
这种方法有效地阻止了很多缓冲区溢出的攻击,但是攻击者并不一定要殖入攻击代码来实现缓冲区溢出的攻击,所以这种方法还是存在很多弱点的。
3)利用编译器的边界检查来实现缓冲区的保护
这个方法使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁,但是相对而言代价比较大。
4)在程序指针失效前进行完整性检查
这样虽然这种方法不能使得所有的缓冲区溢出失效,但它的确确阻止了绝大多数的缓冲区溢出攻击,而能够逃脱这种方法保护的缓冲区溢出也很难实现。

尝试杜绝溢出的防御技术

解决缓冲区溢出攻击的最根本的办法是编写正确地、不存在缓冲区溢出安全漏洞的软件代码。但由于C/C++语言作为效率优先的语言,很容易就会出现缓冲区溢出。因此研究人员开发了一些工具和技术来帮助那些经验不足的程序员编写安全正确的程序,包括一些高级的查错程序,如fault injection等。

允许溢出但不让程序改变执行流程的防御技术

第二种防御技术允许溢出发生,但对可能影响到程序流程的关键数据结构实施严密的安全保护,不让程序改变其执行流程,从而阻断溢出攻击。

无法让攻击代码执行的防御技术

第三种防御技术尝试解决冯▪诺依曼体系的本质缺陷,通过堆栈不可执行限制来防御缓冲区溢出攻击。LA64、AMD64、Alpha等新的CPU硬件体系框架都引入对基于硬件NX保护机制,从硬件上支持对特定内存页设置成不可执行,如 Windows XP SP2、Linux内核2.6 及以后版本都支持硬件NX保护机制,与操作系统配合来提升系统的安全性。

参考资料缓冲区溢出漏洞攻击原理

原文地址:https://www.cnblogs.com/xiaoming319/p/12816794.html