• 《网络攻防实践》11.0


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

    1.实践内容

    第十章是软件安全攻防——缓冲区溢出和Shellcode,属于第三部分系统安全攻防技术与实践。包括软件安全概述、缓冲区溢出基础概念、Linux平台上的栈溢出与Shellcode、Windows平台上的栈溢出与Shellcode、堆溢出攻击、缓冲区溢出攻击的防御技术六块内容。

    1.1 软件安全概述

    可以被攻击者利用并导致危害的安全缺陷(Security bug)被称为软件安全漏洞(Software Vulnerability),安全漏洞(Vulnerability)的范畴包括软件安全漏洞,还包括硬件、个人与组织管理中存在的、能够被攻击者利用来破坏安全策略的弱点。软件安全漏洞构成了目前安全漏洞最为主要的部分,也是计算机安全应急响应组织所关注的重点。

    软件安全“困境三要素”(The Trinity of Trouble):复杂性(Complexity)、可扩展性(Extensibility)和连通性(Connectivity)。

    软件安全漏洞类型从技术上主要包括:

    • 内存安全违规类(Memory Safety Violations),比如缓冲区溢出漏洞、不安全指针问题等;

    • 输入验证类(Input Validation Errors),比如格式化字符串、Web应用程序安全漏洞等;

    • 竞争条件类(Race Conditions Errors),比如Time-of-check-to-time-of-use(TOCTTOU)类漏洞、符号链接竞争问题(symlink race)等;

    • 权限混淆与提升类(Privilege confusion and escalation bugs),比如FTP反弹攻击、权限提升漏洞等。

    1.2 缓冲区溢出基础概念

    在计算机程序向特定缓冲区内填充数据时,超出了缓冲区本身的容量,导致外溢数据覆盖了相邻内存空间的合法数据,从而改变程序执行流程破坏系统运行完整性。

    为了理解缓冲区溢出攻击的原理和具体机制,我们需要掌握的知识有:编译器与调试器(GCC、GDB、Visual Studio)的使用、汇编语言基础知识、进程内存管理、函数调用过程(调用(call)、序言(prologue)、返回(return)三步骤)等。

    缓冲区溢出漏洞根据缓冲区在进程内存空间中的位置不同,分为栈溢出、堆溢出、内核溢出三种具体技术形态。

    • 栈溢出是指存储在栈上的一些缓冲区变量由于存在缺乏边界保护问题能够被溢出并修改栈上的敏感信息(通常是返回地址);

    • 堆溢出是存储在堆上的缓冲区变量缺乏边界保护所遭受溢出攻击的安全问题;

    • 内核溢出是由于进程内存空间内核态中存储的缓冲区变量被溢出造成的。

    1.3 Linux平台上的栈溢出与Shellcode

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

    • NSR模式主要适用于被溢出的缓冲区变量比较大;

    • RNS模式一般用于被溢出的变量比较小;

    • RS模式是将Shellcode放置在目标漏洞程序执行时的环境变量中。

    Linux操作系统系统中Shellcode的实现与编写机制根据使用场景的不同,可分为本地Shellcode和远程Shellcode。

    Linux系统本地Shellcode

    通常提供的功能就是为攻击者启动一个命令行Shell。Linux系统Shellcode通用方法五步骤:

    - (1)先用高级语言编写Shellcode程序;
    
    - (2)编译并反汇编调试Shellcode程序;
    
    - (3)从汇编语言代码级别分析程序执行流程;
    
    - (4)整理生成的汇编代码使其可注入且可通过嵌入C语言进行测试和调试;
    
    - (5)提取汇编代码所对应的opcode二进制指令并创建Shellcode指令数组。
    
    Linux系统远程Shellcode

    通过执行一系列的系统调用来完成指定的功能。实现方法步骤为:

    - (1)首先给出高级语言功能代码实现;
    
    - (2)通过反汇编调试编译后的二进制程序;
    
    - (3)提取、优化和整理所获得的汇编代码;
    
    - (4)产生opcode二进制指令代码。
    

    1.4 Windows平台上的栈溢出与Shellcode

    Windows和Linux系统与成功攻击应用程序中栈溢出漏洞密切相关的差异主要有:

    • 对程序运行过程中废弃栈的处理方式差异。Windows会写入随机数据,Linux不进行任何处理;

    • 进程内存空间的布局差异。Linux进程内存空间中栈底指针在0xc0000000之下,Windows的栈位置处于0x00FFFFFF以下的用户内存空间;

    • 系统功能调用的实现方式差异。Linux系统中通过“int80”中断处理来调用系统功能,Windows系统通过操作系统中更为复杂的API及内核处理例程调用链来完成系统功能调用。

    同时,书中给出了远程栈溢出攻击、野外Windows栈溢出两个实例。

    和Linux一样,Windows操作系统系统中Shellcode的实现与编写机制根据使用场景的不同,可分为本地Shellcode和远程Shellcode。

    Windows系统本地Shellcode

    启动一个命令行Shell(“command.com”或“cmd.exe”)。Windows32系统API提供了system()函数调用,可用于启动指定程序或运行特定命令。编写Shellcode最简单的方式就是使用硬编码的函数地址。

    Windows系统远程Shellcode

    在远程渗透攻击中给出Shell网络访问的远程Shellcode。Windows远程Shellcode实现大致过程为:

    - (1)创建服务器端socket并在指定端口监听;
    
    - (2)通过accept()接受客户端网络连接;
    
    - (3)创建子进程,运行“cmd.exe”,启动命令行;
    
    - (4)创建两个管道:
    
        - 命令管道(将服务器端socket接收(rev)到的客户端通过网络输入执行命令连接至cmd.exe标准输入);
    
        - 输出管道(将cmd.exe标注输出连接至服务器端socket发送(send)并通过网络将运行结果反馈给客户端)。
    

    1.5 堆溢出攻击

    堆溢出(Heap Overflow)是缓冲区溢出中第二种类型的攻击方式。堆溢出比栈溢出更难的原因在于堆中没有可以直接覆盖并修改指令寄存器指针的返回地址,因此往往需要利用堆中会影响程序执行流程的关键变量(函数指针、C++类对象中的虚函数表、挖掘出堆中进行数据操作时可能存在的向指定内存地址改写内容的漏洞机会)。

    堆溢出攻击形式有:函数指针改写、C++类对象虚函数表改写、Linux下堆管理glibc库free()函数本身漏洞攻击等。

    • 函数指针改写攻击需要被溢出的缓冲区临近全局函数指针存储地址且在其地地址方向;

    • C++类对象虚函数表改写攻击针对的是使用了虚函数机制的C++类(类成员变量中存在可被溢出的缓冲区);

    • Linux下堆管理glibc库free()函数本身漏洞攻击可以通过构造特殊内存块(unlike me)进行。

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

    在缓冲区溢出攻击过程中,攻击者通常先通过溢出植入攻击代码,然后通过修改关键数据结构改变程序执行流程,最后让攻击代码执行。

    针对缓冲区溢出攻击的防御技术有:

    • 尝试杜绝溢出的防御技术(编写正确的不存在缓冲区溢出安全漏洞的软件代码、在编译器上引入针对缓冲区的边界保护检查机制);

    • 允许溢出但不让程序改变执行流程的防御技术(StackGuard技术、SafeSEH技术);

    • 无法让攻击代码执行的防御技术(通过堆栈不可执行限制来防御缓冲区溢出攻击,比如基于硬件的NX 保护机制、操作系统内核补丁和内建机制)。

    2.实践过程(根据课程安排,本部分不做强制要求

    2.1 任务一

    实践作业一:SEED缓冲区溢出实验
    实践内容:Buffer_Overflow.pdf
    注:本实践作业由SEED Project提供,附送的DVD中包含了上述文档的中文翻译版,供参考。

    解答

    2.2 任务二

    实践作业二:分析一个实际的缓冲区溢出漏洞
    实践内容:RedHat 7.3中的/usr/sbin/chat存在本地缓冲区溢出漏洞,其攻击代码示例Files ≈ Packet Storm。针对 /usr/sbin/chat 源代码或可执行代码,对其中包含的缓冲区溢出湍洞进行分析和利用,编制溢出程序进行实验,并撰写实验报告回答如下问题。
    (1)从中分析查找缓冲区溢出漏洞位置,分析漏洞机制。
    (2)编写本地缓冲区溢出渗透攻击代码,并进行攻击。
    (3)确认是否可获得Root权限,如否,为什么,前提条件是什么?
    (4)针对发现的漏洞,给该程序编写一个补丁程序,使之修补所发现漏洞。
    注意:可在源码层次和二进制层次完成该作业,在可执行二进制代码层次完成(即在没有源码情况下分析漏洞位置和机制、编写渗透利用代码以及二进制补丁程序),可以得到额外加分。

    解答

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

    • 问题1:对于编程和汇编一块的知识仍有所欠缺,没有很好的理解一些课本内容。
    • 问题1解决方案:需要进行一个补充和完善,方便后续的理解。

    4.实践总结

    本次作业主要是理论知识的学习,课后实践根据课程安排没有强制要求。理论学习主要是通过《网络攻防技术与实践》一书完成,教材有较为详尽的解释,能够帮助我们更好的理解本章的内容。

    通过相关链接找的资料发现这次课后实践和编程有较大关联,对编程能力有一定的要求。

    参考资料

  • 相关阅读:
    作业
    剑指Offer:链表中倒数第k个节点
    剑指Offer:反转链表
    剑指Offer:数值的整数次方
    剑指Offer:剪绳子Ⅰ和剪绳子Ⅱ
    剑指Offer:机器人的运动范围
    Linux下进程与线程的区别
    剑指Offer:调整数组顺序使奇数位于偶数前面
    剑指Offer:删除链表的节点
    剑指Offer:打印从1到最大的n位数
  • 原文地址:https://www.cnblogs.com/y1150182239/p/12808346.html
Copyright © 2020-2023  润新知