zoukankan      html  css  js  c++  java
  • 20199316 2019-2020-2 《网络攻防实践》第10周作业

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

    1.实践内容

    一、软件安全概述

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

    1.可以被攻击者利用并导致危害的安全缺陷被称为软件安全漏洞

    2.不限于软件安全漏洞,还包括硬件、个人与组织管理中存在的、能够被攻击者利用来破坏安全策略的弱点

    • 软件安全漏洞类型:
    1.内存安全违规类:是指在处理RAM内存访问时引入的缺陷,主要出现在C/C++等编程语言所编写的软件程序中
    
    (1)缓冲区溢出
    
    (2)不安全指针:指在计算机程序中存在的并没有指向适当类型对象的非法指针。对其进行引用时导致内存访问错误,包括堆内存释放例程缺陷、两次释放、释放内存被重现引用等
    
    2.输入验证类:是指没有保证用户输入的正确性、合法性和安全性造成的漏洞
    
    (1)XSS、SQL注入、远程文件包含、HTTPHeader注入、HTTP相应分割错误等Web应用程序安全漏洞
    
    (2)通过格式化字符串函数所提供的内存任意读/写能力,攻击者可以对栈中的函数返回地址、库函数地址等关键数据进行修改
    
    3.竞争条件类:是指处理进程的输出或结果无法预测,并依赖于其他进程导致的错误。常见于多进程、多线程程序
    
    4.限混淆与提升类:是指计算机程序由于自身编程疏忽或被第三方欺骗,从而滥用其权限,或赋予第三方不该给予的权限。权限混淆与提升类漏洞的具体技术形式主要有Web应用程序中的跨站请求伪造、Clickjacking、FTP反弹攻击、权限提升、越狱等
    

    二、缓冲区溢出基础概念

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

    • 缓冲区溢出攻击原理
      由于C/C++语言没有数组越界检查机制,当向局部数组缓冲区里写入的数据超过为其分配的大小时,就会发生缓冲区溢出。攻击者可利用缓冲区溢出来窜改进程运行时栈,从而改变程序正常流向,轻则导致程序崩溃,重则系统特权被窃取。

      若将长度为16字节的字符串赋给acArrBuf数组,则系统会从acArrBuf[0]开始向高地址填充栈空间,导致覆盖EBP值和函数返回地址。若攻击者用一个有意义的地址(否则会出现段错误)覆盖返回地址的内容,函数返回时就会去执行该地址处事先安排好的攻击代码
    • 其他知识
    1.汇编语言基础知识
    (1)一般我们无法得到被分析软件的源代码,因此只能在反汇编技术的支持下,通过阅读和理解汇编代码,来对软件安全漏洞的机理进行分析
    (2)从应用的角度一般将寄存器分为4类,即通用寄存器、段寄存器、控制寄存器和其他寄存器
    2.进程内存管理
    “栈”是一种后进先出的数据结构,其地址空间从高地址向低地址增长,程序运行的环境变量env、运行参数argv、运行参数数量argc都被放置在“栈”底,然后是主函数及调用“栈”中各个函数的临时保存信息,栈是一种运算受限的线性表,其限制是指只仅允许在表的一端进行插入和删除操作,这一端被称为栈顶(Top),相对地,把另一端称为栈底(Bottom)。把新元素放到栈顶元素的上面,使之成为新的栈顶元素称作进栈、入栈或压栈(Push);把栈顶元素删除,使其相邻的元素成为新的栈顶元素称作出栈或退栈(Pop)。这种受限的运算使栈拥有“先进后出”的特性
    3.函数调用过程
    (1)调用:将参数和下一条指令地址入栈并跳转到函数入口地址
    (2)序言:对调用函数的栈基址入栈保存,创建函数自身栈结构等
    (3)返回:恢复调用者栈顶栈底指针,执行下一条指令
    

    三、Linux平台的栈溢出与Shellcode

    • Linux平台栈溢出攻击技术
    1.NSR 主要适用于被溢出的缓冲区变量比较大, 足以容纳Shellcode 的清空, 其攻击数据从低地址到高地址的构造方式是一堆Nop 指令(即空操作指令)之后填充Shellcode,再加上一些期望覆盖RET 返回地址的调转地址, 从而构成了NSR 攻击数据缓冲区
    2.第二种栈溢出的校式为RNS 模式, 一般用于被溢出的变量比较小, 不足以容纳shellcode的情况
    3.第三种Linux平台上的栈溢出攻击橾式是RS模式,这种模式Shellcode放置在目标淄洞程序执行时的环境变榄中,由千环境变噩是位于Linux进程空间的栈底位置, 因而不会受到各种变址内存分配与对齐因素的影响, 其位置是固定的
    
    • Linux平台的Shellcode实现技术
      Linux本地Shellcode实现机制:Linux 系统中一个最简单的本地 Shellcode 的产生过程, 而这个过程事实上也体现了 Shellcode 的通用方法, 包括如下5个步骤:
    1.先用高级编程语言,通常用C,来编写Shellcode程序
    
    2.编译并反汇编调试这个Shellcode程序
    
    3.从汇编语言代码级别分析程序执行流程
    
    4。整理生成的汇编代码,尽量减小它的体积并使它可注入,并可通过嵌入C语言进行运行测试和调试
    
    5.提取汇编代码所对应的opcode二进制指令,创建Shellcode指令数组
    

    C语言实现的Linux系统本地shell(使用execve()函数启动/bin/sh命令)

    #include <stdio.h>
    int main ( int argc, char * argv[] )
    {
        char * name[2];
        name[0] = "/bin/sh";
        name[1] = NULL;
        execve( name[0], name, NULL );
    }
    

    C语言代码对应的汇编代码为

    int main()
    {
       _asm_
       (
          xor    %edx,%edx// 原语句为(mov    $0x0,%edx),防止字符串中出现0x0出现使得产生截断
          push   %edx
          push   $0x68732f6e
          push   $0x69622f2f
          mov    %esp,%ebx
          push   %edx
          push   %ebx
          mov    %esp,%ecx
          mov    $0xb,%eax
          int    $0x80
        )
    }
    
    • Linux 远程 Shellcode 实现机制
      Linux远片早Shellcode需要让攻击目标程序创建socket监听指定的端口等待客户端连接,启动个命令行Shell并将命令行的输入输出与socket绑定,这样攻击者就可以通过socket客户端连接目标程序所在主机的开放端口, 与服务端socket建立起通信通道, 并获得远程访问Shell。

    四、Windows平台上的栈溢出与Shellcode

    从技术上分析,由于Windows橾什系统与Linux操作系统在进程内存空间布局、系统对栈的处理方式、系统功能调用方式等方面的实现差异,虽然栈溢出的基础原理和大致流程是一致的,但在具体的攻击实施细节、Shellcode 编制等方面还是存在一些差别。

    • Windows平台栈溢出攻击技术
      Windows 平台栈溢出攻击技术机理:Windows 操作系统平台在很多方面与linux 操作系统具们显诸小回的实现机制
    1.对程序运行过程中废弃栈的处押方式差异:当一个函数调用完成返回至调用者,执行下一条指令之前,Windows平台会向废弃栈中写入一些随机的数据,而Linux则不进行任何的处理。
    
    2.进程内存空间的布局差异:Windows操作系统的进程内存空间布局与Linux存在着不同,Linux进程内存空间中栈底指针在0xc0000000之下,即一般栈中变量的位置都在0xbfff地址附近,在这些地址中没有空字节。Windows平台的栈位置处于0x00FFFFFF以下的用户内存空间,一般为0x0012地址附近,而这些内存地址的首字节均为0x00空字节。
    
    3.系统功能调用的实现方式差异:Windows平台上进行操作系统功能调用的实现方法较Linux更加复杂,Linux系统中通过int 80中断处理来调用系统功能,而Windows系统则是通过操作系统中更为复杂的API及内核处理例程调用链来完成系统功能调用,对应用程序直接可见的是应用层中如kernel32.dll、User32.dll等系统动态链接库中导出的一些系统API接口函数。
    
    • Windows平台Shellcode实现技术
      Windows本地Shellcode:在Windows 上, 典型的本地Shellcode 同样也是启动一个命令行Shell, 即"command.com” 或'cmd.exe", Windows 32的系统API中捉供了system()函数调用, 可以用于启动指定程序或运行特定命令,在调用system ("command.com” )之后即可启动命令行程序。

      1.在Windows平台上,典型的本地Shellcode同样也是启动一个命令行Shell, 即command.com或cmd.exe,Windows 32的系统 API 中提供了system()函数调用,可以用于启动指定程序或运行特定命令,在调用system(command.com)之后即可启动命令行程序。
      
      2.编写shellcode最简单的方式是使用硬编码的函数地址,比如system()函数在Windows XP特定版本的目标程序内存空间加载地址为0x77bf93c7,我们在shellcode中可以使用Call 0x77bf93c7指令来让EIP指令寄存器跳转至硬编码的函数入口地址执行,这种方法可以有效压缩编码长度。
      
      3.C语言版的Windows本地Shellcode程序,即使用LoadLibrary()函数加载msvert.dll动态链接库,通过GetProcAddress()函数获得system函数的加载入口地址,赋值给ProcAdd函数指针,然后通过函数指针调用system()函数,启动命令行Shell,最后还要调用exit()退出当前进程。
      

      4.再将其转化为汇编语言。
    

    • Windows远程Shellcode:创建一个服务器端socket, 并在指定的端口上监听;通过accept()接受客户端的网络连接;创建子进程, 运行 “ cmd.exe", 启动命令行;创建两个管道, 命令符道将服务器端socket接收(recv)到的客户端通过网络输入的执行命令, 连接至cmd.exe的标准输入; 然后输出忤道将cmd. exe 的标准输出连按个 服务器端socket的发送(send), 通过网络将运行结果反馈给客户端。

    五、堆溢出攻击

    堆溢出是缓冲区溢出中第二种类型的攻击方式,由于堆中的内存分配与管理机制较栈更复杂,不同操作系统平台的实现机制具有显著的差异。堆中没有可以直接覆盖的返回地址,因此堆溢出攻击比栈溢出更难。

    • 函数指针改写
      要求被溢出的缓冲区临近全局函数指针存储地址,且在其低地址方向上。此时向缓冲区填充数据,如果没有边界控制和判断,就可以覆盖函数指针所在的内存区,改写函数指针的指向地址,则程序在使用这个函数指针的时候就会执行shellcode。
    • C++类对象虚函数表改写
      使用了虚函数机制的C++类,如果它的类成员变量中存在可被溢出的缓冲区,那么就可以进行堆溢出攻击,通过覆盖类对象的虚函数指针,使其指向一个特殊构造的虚函数表,从而转向执行攻击者恶意注入的指令。
    • Linux下堆管理glibc库free()函数本身漏洞
      Linux操作系统的堆管理是通过glibc库来实现的,通过称为Bin的双向循环链表来保存内存空闲块的信息。glibc库中的free()函数在处理内存块回收时,会将被释放的空闲块和与之相邻的块合并,利用精心构造的块可以在合并时覆盖Bin前指针的内容。

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

    • 尝试杜绝溢出的防御技术
      采取如高级差错程序fault injection,通过Fuzz注入测试来寻找代码的安全漏洞,或者在编译器上引入针对缓冲区的便捷保护检查机制如Jone & Kelly针对gcc的数组边界检查、Compaq C对编译器进行改进杜绝溢出。

    • 允许溢出但不让程序改变执行流程的防御技术
      允许溢出发生,但对可能影响到程序流程的关键数据结构实施严密的安全保护,不让程序改变其执行流程,从而阻断溢出攻击。通过对编译器gcc加补丁,使得在函数入口处能够自动地在栈中返回地址的前面生成一个Canary检测标记,在函数调用结束检测该标记是否改变来阻止溢出改变返回地址,从而阻止缓冲区溢出攻击。

    • 无法让攻击代码执行的防御技术
      通过堆栈不可执行限制来防御缓冲区溢出攻击,通过CPU硬件和各种操作系统内核补丁来支持堆栈不可执行。

    2.实践过程

    无。

    3.学习中遇到的问题及解决

    • 问题1:汇编语言太难了- -
    • 问题1解决方案:查询语法

    4.实践总结

    五一假期太浪了没有写作业,所以假期一结束就赶紧补作业,花了大概一下午的时间,(还好不用做实践了)感觉学习内容还是很多的,不做实践还是轻松很多哒。

  • 相关阅读:
    SSRF——和远程文件包含的区别在于远程文件包含多是包含攻击者的主机文件,SSRF是内网主机的文件
    SSRF中的绕过手段——字节总结得比较好,如何绕过SSRF的保护机制,DNS欺骗,使用IPV6地址,十六进制编码、八进制编码、双字编码、URL编码和混合编码等
    SSRF——服务端请求伪造,根因是file_get_contents,fsockopen,curl_exec函数调用,类似远程文件包含,不过是内网机器
    文件包含——本地文件包含和远程文件包含
    文件包含和目录遍历区别——目标都是信息泄露,但手段一个是利用函数来包含web目录以外的文件,另外一个是对web路径访问权限设置不严格导致
    DFS——单词分割,原来还是要使用cached dp才能避免不超时
    模块module间引用和使用本地maven库的jar包
    机器学习西瓜书白话解读笔记---0401-0404、信息和熵的度量
    机器学习实战笔记---0、读大纲
    心得体悟帖---201129(【社会规律】)
  • 原文地址:https://www.cnblogs.com/destiny-love/p/12837717.html
Copyright © 2011-2022 走看看