• 《网络攻防技术与实践》第九周学习总结


    20159210 《网络攻防实践》第九周学习总结

    教材学习内容总结

    一、恶意代码分为:计算机病毒、蠕虫、恶意移动代码、后门、特洛伊木马、僵尸程序、内核套件(Rootkit)、融合型恶意代码。
    计算机病毒:一种能够自我复制的代码,通过将自身嵌入其他程序进行感染,而感染过程通常需要人工干预才能完成。蠕虫:是一类自主运行的恶意代码,并不需要将自身嵌入到其他宿主程序中。恶意移动代码:属于移动代码的范畴,移动代码是指可以从远程主机下载并在本地执行的轻量级程序。后门:一类能够绕开正常的安全控制机制,从而为攻击者提供访问途经的一类恶意代码。特洛伊木马:一类伪装成有用的软件,但隐藏其恶意目标的恶意代码。僵尸网络:攻击者出于恶意目的,传播僵尸程序控制大量主机,并通过一对多的命令与控制信道所组成的攻击网络。僵尸程序:用于构建僵尸网络以形成一对多控制攻击平台的恶意代码形态。内核套件:在用户态通过替换或修改系统关键可执行文件,或者在内核态通过控制操作系统内核,用以获取并保持最高控制权的一类恶意代码,又分为用户态Rootkit和内核态Rootkit两种。
    
    二、计算机病毒的基本特性:感染性、潜伏性、可触发性、破坏性、衍生性。
    感染及引导机制:计算机病毒需要将自身嵌入到一个宿主程序上才能运行,而感染的方式也决定了计算机病毒如何从宿主程序上被引导运行的方式,因此计算机病毒的感染和引导机制是紧密相关的。计算机病毒潜在的感染目标可分为可执行文件(三种对可执行文件的感染方式包括前缀感染机制、后缀感染机制和插入感染机制)、引导扇区和支持宏指令的数据文件三大类。
    传播机制:计算机病毒的传播渠道包括移动存储、电子邮件及下载、共享目录等。
    
    三、网络蠕虫:一种通过网络自主传播的恶意代码。从定义本质分析,网络蠕虫是一种可以自我复制的代码,并且通过网络传播,通常无须人为干预就能传播。蠕虫正是因为具有快速主动传播的定义特性,因而能够对整个互联网造成瘫痪性的危害后果,也被称为“互联网时代的瘟疫”。1988年11月的Morris蠕虫由于其广泛的知名度和影响力,被誉为“第一个互联网蠕虫”。SQL Slammer蠕虫是有史以来传播速度最快的网络蠕虫。
    基本特性:通过网络自主传播、
    组成结构:蠕虫的内部组件类似于导弹这种战争武器中的一些部件,弹头用来穿透目标,传播引擎驱动导弹飞向它的目标,目标选择算法和扫描引擎很像导弹中的小型回转仪,可以引导导弹发现和指向它的目标,有效载荷仓中则携带了执行真正破坏性攻击的恶性材料。
    
    
    四、后门与木马:后门是允许攻击者绕过系统常规安全控制机制的程序,能够按照攻击者自己的意图提供访问通道;而木马作为特洛伊木马的简称,是指一类看起来具有某个有用或者善意目的,但实际掩盖着一些隐藏恶意功能的程序。
    
    五、僵尸程序与僵尸网络:概念、演化过程、僵尸网络功能结构(网络控制器和僵尸程序,其中僵尸程序分为主体功能模块和辅助功能模块)、僵尸程序的命令与控制机制(基于IRC协议的命令与控制机制、基于HTTP协议的命令与控制机制、基于P2P协议的命令与控制机制)
    
    六、Rootkit:用户模式Rootkit和内核模式Rootkit。其中内核模式Rootkit包括Linux内核模式Rootkit和Windows内核模式Rootkit。
    
    
    七、在恶意代码分析网段中,包括了系统主要的四类恶意代码自动化分析组件,分别为静态分析机、动态分析机、网络分析机和综合分析机。
    静态分析:利用静态分析方法,能够对恶意代码的特性和目的有一个大体的了解,甚至能够识别出恶意代码的各个组成部分;然而利用动态分析,实际上是激活一个受控分析实验环境中的代码,当一个代码在实际系统中运行时,我们能够更加迅速地了解其行为。恶意代码静态分析的主要技术手段,具体包括反病毒软件扫描、文件格式识别、字符串提取分析、二进制结构分析、反汇编、反编译、代码结构与逻辑分析、加壳识别与代码脱壳等。进行恶意代码分析最直接的方法是使用现成的反病毒软件来扫描待分析的样本,以确定反病毒软件是否能够识别该样本,以及所识别的类型、家族、变种等信息。在面对一个未知的恶意代码样本文件时,第一步要做的工作就是对它的文件格式进行识别。在Windows平台上,二进制可执行文件EXE和DLL都是以PE文件格式组织的,而在Linux平台上,可执行文件格式则是ELF。在提取的字符串中,可能获得的用信息内容包括如下:恶意代码实例名、帮助或命令行选项、用户会话、后门口令、相关的URL信息E-mail地址、包含库文件和函数调用。在类UNIX平台上进行字符串提取的命令工具是strings。利用Strip工具来删除所有不可执行的标记性信息
    动态分析:恶意代码动态分析的主要技术手段具体包括快照比对、系统动态行为监控、网络协议栈监控、沙箱、动态调试等。快照比对是监控恶意代码动态运行行为最简单的方法,进行快照比对的工具软件包括RegSnap、完美卸载等。
    
    
    八、软件安全困境:复杂性、可扩展性、连通性
     
    九、软件安全漏洞类型:XSS、SQL注入、PHP远程文件包含、目录遍历、信息泄露、由畸形输入导致的拒绝服务、符号链接问题、格式化字符串、密码学缺陷。分为如下四类:内存安全规范类、输入验证类、竞争条件类、权限混淆与提升类。
    
    
    十、缓冲区溢出基本概念与发展过程:计算机程序中存在的一类内存安全违规类漏洞,在计算机程序向特定缓冲区内填充数据时,超出了缓冲区本身的容量,导致外溢数据覆盖了相邻内存空间的合法数据,从而改变了程序执行流程破坏系统运行完整性。
    
    十一、缓冲区溢出攻击原理:栈溢出、堆溢出、内核溢出。
    缓冲区溢出漏洞根据缓冲区在进程内存空间中的位置不同,又分为栈溢出、堆溢出和内核溢出这三种具体技术形态。Linux系统可能会采取对抗缓冲区溢出的防范措施,因此,我们需要把这些措施取消后,才能重现基础的缓冲区溢出过程:①取消“栈上数据不可执行”保护:echo 0 > /proc/sys/kerne/exec-shield②取消“地址空间随机化”保护:echo 0 > /proc/sys/kernel/randomize_va_space③编译时取消“/GS”保护:加上gcc编译选项 –fno-stack-protecto。缓冲区溢出安全漏洞的根本问题在于用户输入可控制的缓冲区操作缺乏对目标缓冲区的边界安全保护,这其中包含两个要素,首先是程序中存在着缺乏边界安全保护的缓冲区操作,其次是这个缓冲区操作必须是用户输入可以控制的,也就是说用户的输入可以直接或者间接地影响到这个不安全的缓冲区操作函数。
    
    十二、Linux平台中的栈溢出攻击按照攻击数据的构造方式不同,主要有NSR、RNS和RS三种模式。在Linux平台中,本地栈溢出攻击,即渗透攻击代码的攻击目标对象是本地的漏洞程序,可以用于特权提升
    
    十三、NSR模式主要适用于被溢出的缓冲区变量比较大,足以容纳Shellcode的情况,其攻击数据从低地址到高地址的构造方式是一堆Nop指令之后填充Shellcode,再加上一些期望覆盖RET返回地址的跳转地址,从而构成了NSR攻击数据缓冲区。
    
    十四、RNS模式一般用于被溢出的变量比较小,不足于容纳Shellcode的情况。攻击数据从低地址到高地址的构造方式是首先填充一些期望覆盖RET返回地址的跳转地址,然后是一堆Nop指令填充出“着陆区”,最后再是Shellcode。
    
    十五、RS模式:在这种模式下能够精确地定位出Shellcode在目标漏洞程序进程空间中的起始地址,因此也就无需引入Nop空指令构建“着陆区”。这种模式是将Shellcode放置在目标漏洞程序执行时的环境变量中,由于环境变量是位于Linux进程空间的栈底位置,因而不会受到各种变量内存分配与对齐因素的影响,其位置是固定的。可以通过如下公式进行计算:ret=0xc0000000-sizeof(void*)-sizeof(FILENAME)-sizeof(Shellcode)。
    
    十六、Linux平台上的远程栈溢出攻击的原理与本地栈溢出是一样的,区别在于用户输入传递的途径不同,以及Shellcode的编写方式不同。本地栈溢出的用户输入途径主要为argv命令行输入、文件输入等,而远程栈溢出攻击的用户输入传递途径则是通过网络,存在远程栈溢出漏洞往往是一些网络服务进程或网络应用程序。NSR和RNS模式也都适用于远程栈溢出,使用场景也主要取决于被溢出的目标缓冲区大小是否足够容纳Shellcode。
    
    十七、Shellcode是一段机器指令,对于我们通常接触的IA32构架平台,Shellcode就是符合Intel 32位指令规范的一串CPU指令,被用于溢出之后改变系统正常流程,转而执行Shellcode以完成渗透测试者的攻击目的,通常是为他提供一个访问系统的本地或远程命令行访问。在Linux操作系统中,程序通过“int 0x80”软中断来执行系统调用,而在Windows操作系统中,则通过核心DLL中提供的API接口来完成系统调用。
    
    十八、Linux系统本地Shellcode通常提供的功能就是为攻击者启动一个命令行Shell。在获得汇编语言实现的Shellcode之后,我们可以通过查找Intel opcode指令参考手册,即可获得opcode二进制指令形式的Shellcode。
    
    十九、Linux系统中一个最简单的本地Shellcode的产生过程,即Shellcode的通用方法
    先用高级编程语言,通常用C,来编写Shellcode程序
    编译并反汇编调试这个Shellcode程序
    从编译语言代码级别分析程序执行流程
    整理生成的汇编代码,尽量减小它的体积并使它可注入,并通过嵌入C语言进行运行测试和调试
    提取汇编代码所对应的opcode二进制指令,创建Shellcode指令数组。在Linux本地Shellcode中,往往还会在运行execve()启动shell之前,调用setreuid(0)将程序运行权限提升至Root用户,这样才能利用本地溢出攻击来提升权限,在执行execve()函数之后还需要执行exit()函数,从而在溢出攻击之后能够使程序正常退出。
    
    二十、Linux远程Shellcode实现机制:通过执行一系列的系统调用来完成指定的功能。实现方法步骤也是首先给出高级语言的功能代码实现,然后通过反汇编调试编译后的二进制程序,特权、优化和整理所获得的汇编代码,并最终产生opcode二进制指令代码。Linux远程Shellcode需要让攻击目标程序创建socket监听指定的端口等待客户端连接,启动一个命令行Shell,并将命令行的输入输出与socket绑定,这样攻击者就可以通过socket客户端连接目标程序所在初级的开放端口,与服务端socket建立起通信通道,并获得Shell。在Linux系统中,dup2()函数能够将标准输入输出与socket的网络通信通道进行绑定,使得socket的远程输入连接至命令行标准输入,将命令行标准输出连接至远程网络输出,因而完成远程Shell的功能。
    
    二十一、Windows操作系统平台在很多方面与Linux操作系统具有显著不同的实现机制与成功攻击应用程序中栈溢出漏洞密切相关的主要有如下三点
    1.对程序运行中废弃栈的处理方式差异
    2.进程内存空间的布局差异(Linux进程内存空间中栈指针在0x0000000之下,即一般栈中变量的位置都在0xbfff****地址附近,在这些地址中没有空字节。Windows平台的栈位置处于ox00FFFFFF以下的用户内存空间,一般为0x0012****地址附近,er这些内存地址的首字节均为0x00空字节)
    3.系统功能调用的实现方式差异(Linux系统中通过“int80”中断处理来调用系统功能,而Windows系统则是通过操作系统中更为复杂的API及内核处理例程调用链来完成系统功能调用,对应用程序直接可见的是应用层中如Kernel32.dll、User32.dll等系统动态链接库中导出的一些系统API接口函数)。
    
    二十二、Windows平台Shellcode实现技术:由于Windows操作系统并不提供直接的系统调用,而是提供一系列的API接口函数,因此Windows平台上的Shellcode实现较Linux系统具有一些差异,编写也更难一些。
    
    二十三、Windows本地Shellcode:在Windows平台上,典型的本地Shellcode同样也是启动一个命令行Shell,即“command.com”或Windows32的系统API中提供了system()函数调用,可以用于启动指定程序或运行特定命令,在调用system(“command.com”)之后即可启动命令行程序。编写Shellcode最简单的方式就是使用硬编码的函数地址,比如system()函数在Windows XP特定版本的目标程序内存空间中的加载地址为0x77bf93c7,那么我们就可以在Shellcode中使用“Call 0x77bf93c7”指令,让EIP指令寄存器跳转至硬编码的函数入口地址执行。System()函数是由msvcrt.dll动态链接库所导出的API函数,而攻击目标并不一定加载了该DLL,为了确保Shellcode能够正确地调用所需函数,一般需要将所需函数的动态链接库装载至目标程序内存中,然后再查询获得该函数的加载地址。
    
    二十四、Windows远程Shellcode:大致过程如下:
    1.创建一个服务器端socket,并在指定的端口上监听
    2.通过accept()接受客户端的网络连接
    3.创建子程序,运行“cmd.exe”,启动命令行
    4.创建两个管道,命令管道将服务器端socket接收(recv)到的客户端通过网络输入的执行命令,连接至cmd.exe的标准输入;然后输出管道将cmd.exe的标准输出连接至服务器端socket的发送(send),通过网络将运行结果反馈给客户端。
    
    二十五、堆溢出攻击:一个典型的Linux程序在其进程内存空间中通常有如下一些数据区:包含已初始化全局函数的.data段、包含未经初始化数据的.bss段、运行时刻动态分配内存的数据区heap等。而这些内存数据区有着共同的特点,即数据分配与增长方向是从低地址向高地址,而非栈从高地址向低地址的增长方向。因此,在.data、.bss和heap中缓冲区溢出的情形,都被称为堆溢出。堆溢出之所以较栈溢出具有更高的难度,更重要的原因在于堆中没有可以直接覆盖并修改指针寄存器指针的返回地址,因此往往需要利用在堆中一些会影响程序执行流程的关键变量,如函数指针、C++类对象中的虚函数表。或者挖掘出堆中进行数据操作时可能存在的向指定内存地址改写内容的漏洞机会。
    
    二十六、缓冲区溢出攻击的防御技术:
    1.尝试杜绝溢出的防御技术(解决缓冲区溢出攻击最根本的办法是编写正确的、不存在缓冲区溢出安全漏洞的软件代码)
    2.允许溢出但不让程序改变执行流程的防御技术
    3.无法让攻击代码执行的防御技术。
    

    视频学习总结

    主要学习了kali的最后三个视频。首先介绍了kali压力测试工具,压力测试(Stress Test),也称为强度测试、负载测试。
    压力测试是模拟实际应用的软硬件环境及用户使用过程的系统负荷,长时间或超大负荷地运行测试软件,来测试被测系统的性能、可靠性、稳定性等。kali下压力测试工具包含VoIP压力测试、WEB压力测试、网络压力测试和无线压力测试。
    kali数字取证工具:包括PDF取证工具集、反数字取证、密码取证工具集、内存取证工具集、取证分割工具集、取证分析工具集、取证哈希验证工具集、取证镜像工具集、杀毒取证工具集、数字取证、数字取证套件。
    kali报告工具与系统服务,介绍了几种不同的工具。
    

    学习进度条

    95%
    
    • 上周目标完成情况
      一般

    参考资料

  • 相关阅读:
    第五十天 how can I 坚持
    第四十九天 how can I 坚持
    第四十八天 how can I 坚持
    第四十七t天 how can i 坚持
    第四十六天 how can i 坚持
    第四十四天 hao can I 坚持
    第四十二天 how can I 坚持
    rails 中 create, new, build, save 的用法以及误区汇总
    Linux Shell脚本编程--sed命令详解
    【C#编程基础学习笔记】4---Convert类型转换
  • 原文地址:https://www.cnblogs.com/jinh/p/5451214.html
Copyright © 2020-2023  润新知