20199131 2019-2020-2 《网络攻防实践》第10周作业

20199131 2019-2020-2 《网络攻防实践》第10周作业

1.实践内容

软件安全概述

导致软件安全困境的要素:复杂性、可扩展性、连通性
软件安全漏洞类型:

  • 内存安全违规类漏利是在软件开发过程中在处理RAM(random-access memory)内存 访问时所引入的命令缺陷
  • 输入验证类安全漏洞是指软件程序在对用户输入进行数据验证存在的错误,没有保证输入数据的正确性、合法性和安全性,从而导致可能被恶意攻击与利用
  • 竞争条件类通常在涉及多线程或多进程处理的程序中出现, 是指处理进程的输出或者结果无法预测, 并依赖千其他进程事件发牛的次序或时间时, 所导致的错误。
  • 权限混淆与提升类漏洞是指计算机程序由千自身编程疏忽或被第三力欺骗, 从而滥用其权限, 或赋予第三方不该给予的权限。

缓冲区溢出基础概念

缓冲区溢出是计算机程序中存在的一类内存安全违规类湍洞, 在计算机程序向特定缓冲区内填充数据时, 超出了缓冲区本身的容狱, 导致外溢数据覆盖了相邻内存空间的合法数据, 从而改变程序执行流程破坏系统运行先整性。

缓冲区溢出攻击原理:缓 冲区溢出女全湍洞的根本问题在于用户输入可控制的缓冲区操作缺乏对目标缓冲区的边界 安全保护,这其中包含两个耍素,首先是程序中存在着缺乏边界安全保护的缓冲区操作,其次是这个缓冲区操作必须是用户输入可以控制的

Linux平台的栈溢出与Shellcode

Linux平台栈溢出攻击技术

  • NSR 主要适用于被溢出的缓冲区变量比较大, 足以容纳Shellcode 的清空, 其攻击数据从低地址到高地址的构造方式是一堆Nop 指令(即空操作指令)之后填充Shellcode,再加上一些期望覆盖RET 返回地址的调转地址, 从而构成了NSR 攻击数据缓冲区
  • 第二种栈溢出的校式为RNS 模式, 一般用于被溢出的变量比较小, 不足以容纳shellcode的情况
  • 第三种Linux平台上的栈溢出攻击橾式是RS模式,这种模式Shellcode放置在目标淄洞程序执行时的环境变榄中,由千环境变噩是位于Linux进程空间的栈底位置, 因而不会受到各种变址内存分配与对齐因素的影响, 其位置是固定的

Linux平台的Shellcode实现技术

Linux本地Shellcode实现机制:Linux 系统中一个最简单的本地 Shellcode 的产生过程, 而这个过程事实上也体现了 Shellcode 的通用方法, 包括如下5个步骤:先用高级编程语言, 通常用C, 来编写 Shellcode 程序;
编译并反汇编调试这个 Shellcode 程序;
从汇编语言代码级别分析程序执行流程;
整理生成的汇编代码, 尽量减小它的体积并使它可注入, 并可通过嵌入C语言进行运行测试和调试;
提取汇编代码所对应的 opcode 二进制指令, 创建 Shellcode 指令数组。

Linux 远程 Shellcode 实现机制

Linux远片早Shellcode需要让攻击目标程序创建socket监听指定的端口等待客户端连接,启动个命令行Shell并将命令行的输入输出与socket绑定,这样攻击者就可以通过socket客户端连接目标程序所在主机的开放端口, 与服务端socket建立起通信通道, 并获得远程访问Shell。

Windows平台上的栈溢出与Shellcode
Windows平台栈溢出攻击技术
Windows 平台栈溢出攻击技术机理:Windows 操作系统平台在很多方面与linux 操作系统具们显诸小回的实现机制

对程序运行过程中废弃栈的处押方式差异
进程内存空间的布局差异
系统功能调用的实现方式差异

Windows平台Shellcode实现技术

Windows本地Shellcode:在Windows 上, 典型的本地Shellcode 同样也是启动一个命令行Shell, 即"command.com” 或'cmd.exe", Windows 32的系统API中捉供了system()函数调用, 可以用于启动指定程序或运行特定命令,在调用system ("command.com” )之后即可启动命令行程序。
Windows远程Shellcode:创建一个服务器端socket, 并在指定的端口上监听;通过accept()接受客户端的网络连接;创建子进程, 运行 “ cmd.exe", 启动命令行;创建两个管道, 命令符道将服务器端socket接收(recv)到的客户端通过网络输入的执行命令, 连接至cmd.exe的标准输入; 然后输出忤道将cmd. exe 的标准输出连按个 服务器端socket的发送(send), 通过网络将运行结果反馈给客户端。

堆溢出攻击

函数指针改写:需要被溢出的缓冲区临近令局函数指针存储地址, 且在其低地址方向。 在符合这种变量布局的条件下, 当向缓冲区填充数据时, 如果没有边界判断和控制的话, 那么缓冲区溢出之后就会自然地覆盖函数指针所在的内存区,从而改写函数指针的指向地址, 攻击者只要能够将该函数指针指向恶意构造的Shellcode入口地址,在程序使用函数指针调用原先期望的函数时, 就会转而执行Shellcode。
C++类对象虚函数表改写:对于使用了虚函数机制的C++类, 如果它的类成员变量中存在可被溢出的缓冲区, 那么就可以进行堆溢出攻击, 通过覆盖类对象的虚函数指针, 使只指向一个特殊构造的虚函数表, 从而转向执行攻击者恶意注入的指令。

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

尝试杜绝溢出的防御技术;允许溢出但不让程序改变执行流程的防御技术;无法让攻击代码执行的防御技术

2.实践过程

posted @ 2020-05-05 13:01  李磊20199131  阅读(150)  评论(0编辑  收藏  举报