一、Kali视频学习总结
(一)压力测试工具
压力测试通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能提供的最大的服务级别的测试。通俗地讲,压力测试是为了发现在什么条件下你的应用程序的性能会变得不可接受。
Kali下压力测试工具包括VoIP压力测试工具、WEB压力测试、网络压力测试及无线压力测试四个分类。
1.VoIP压力测试工具
包括iaxflood和inviteflood。
2.THC-SSL-DOS
借助WEB压力测试下的THC-SSL-DOS攻击工具,任何人都可以把提供SSL安全连接的网站攻击下线,这种攻击方法被称为SSL拒绝服务攻击。德国黑客组织“The Hacker’s Choice”发布THC SSL DOS,利用SSL中的已知弱点,迅速消耗服务器资源,与传统DDos工具不同的是,它不需要任何带宽,只需要一台执行单一攻击的电脑。
漏洞存在于协议的renegotiation过程中,renegotiation被用于浏览器到服务器之间的验证。
3.dhcpig
耗尽DHCP资源池的压力测试。
4.IPv6攻击工具包
由THC发布的IPv6攻击工具包包括:
5.Inundator
IDS/IPS/WAF压力测试工具,通过耗尽对方的认证资源来实现压力测试攻击。
6.Macof
可做泛洪攻击。
7.Siege
Siege是一个压力测试和评测工具,设计用于WEB开发者评估应用在压力下的承受能力:可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。Siege功能比较强大,进行攻击的同时还可以进行数据分析。
8.T50压力测试
T50 Sukhoi PAK FA Mixed Packet Injector是一个压力测试工具,它功能强大且具有独特的数据包注入工具。T50支持*nix系统可进行多种协议的数据包注入,实际上支持15种协议。T50的主要特点:
- Flooding.
- CIDR support.
- TCP, UDP, ICMP, IGMPv2, IGMPv3, EGP, DCCP, RSVP, RIPv2, GRE, ESP, AH, EIGRP and OSPF support.
- TCP Options.
- High performance.
- Can hit about 1000000 packets per second.
9.无线压力测试
包括介绍过的MDK3和Reaver。
(二)数字取证工具
数字取证技术将计算机调查和分析技术应用于对潜在的、有法律效力的电子证据的确定与获取,同样它们都是针对黑客和入侵的,目的都是保障网络安全。Kali Linux下有丰富的数字取证工具:
1.PDF取证工具集
包括peepdf、pdf-parser和pdfid。
其中,peepdf是一个使用Python编写的PDF文件分析工具,它可以检测恶意的PDF文件。其设计目标是为安全研究人员提供PDF分析中可能用到的所有组件,无需使用3或4种工具完成同一件任务。
2.反数字取证chkrootkit
chkrootkit是一个Linux系统下的查找检测rootkit后门的工具,是判断系统是否被植入rootkit的利器。
3.内存取证工具集
包括Volatility和Volafox。
其中,Volatility是开源的Windows,Linux,MaC,Android的内存取证分析工具,由Python编写而成,命令行操作,支持各种操作系统。Volatility功能比较强大,可以直接分析抓取的内存状态。
4.取证分割工具binwalk
binwalk是一个固件的分析工具,旨在协助研究人员对固件分析、提取及逆向工程用处。简单易用,完全自动化脚本,并通过自定义签名,提取规则和插件模块,更重要的一点是可以轻松地扩展。
借助binwalk有个很强大的功能是提取文件(压缩包)中存在的隐藏文件(或内容文件),亦可分析文件格式。
5.取证哈希验证工具集
包括md5deep和rahash2。
其中,md5deep是一套跨平台的方案,可以计算和比较MD5等哈希加密信息的摘要MD5、SHA-1、SHA-256、Tiger、Whirlpool。
6.取证镜像工具集
针对镜像文件的取证工具,如mmsstat
与mmls
等命令。
7.数字取证套件
数字取证目录较为精简,对应有数字取证套件,包括DFF、autopsy等工具。DFF和autopsy均具有图形化界面。
其中,DFF(Digital Forensics Framework)是一个简单但强大的数字取证工作辅助工具,它具有一个灵活的模块系统,具有多种功能,包括:恢复错误或崩溃导致的文件丢失,证据的研究和分析等。DFF提供了一个强大的体系结构和一些有用的模块。
而autopsy提供了一个浏览器控制台 。
点击如上图所示的链接,打开autopsy的浏览器页面:
(三)报告工具与系统服务
一次完整的渗透测试,最后总要完成一份优雅的报告作为一个小结。相应地,Kali Linux为安全工程师准备了报告工具集,包括Documentation、媒体捕捉和证据管理三个部分。其中,Documentation包括Dradis和Keepnote两个工具,媒体捕捉包括Cutycapt和Recordmydesktop两个工具,证据管理包括Maltego、Casefile等工具。
同时,对于Kali Linux下的各项系统服务,整理如下:
1.Dradis:基于浏览器的在线笔记
Dradis是一个用于提高安全检测效率的信息共享框架(协作平台)。它提供了一个集中的信息仓库,用于标记我们目前已经做的工作和下一步计划。
2.Keepnote
一个很精简的笔记软件,具有如下特点:
- 富文本格式:彩色字体,内置图片,超链接(即:能保存整个网页的图品文字等完整信息)。
- 树形分层组织内容:分门别类,一目了然(很重要)。
- 全文搜索。
- 综合截图:屏幕截图后,可以在笔记中直接插入截图。
- 文件附件。
- 集成的备份和恢复。
- 拼写检查(通过gtkspell)。
- 自动保存。
- 内置的备份和恢复(zip文件存档)。
3.Cutycapt
将网页内容截成图片保存。
4.Recordmydesktop
屏幕录像工具,用来录制桌面。
5.Maltego Casefile
属于报告工具集中的证据管理。
6.MagicTree
是一个面向渗透测试人员的工具,可以帮助我们轻松直接地进行数据合并、查询、外部命令执行和报告生成。所有的数据都会以树形结构存储,非常方便。
7.Truecrypt
一款免费开源的加密软件,同时支持Windows Vista、7/XP、Mac OS X、Linux等操作系统。
8.系统服务介绍
- BeEF:对应XSS测试框架BeEF的启动与关闭。
- Dradis:对应笔记本分享服务Dradis的启动与关闭。
- HTTP:对应Kali本机WEB服务的启动与关闭。
- Metasploit:对应Metasploit服务的启动与关闭。
- Mysql:对应Mysql服务的启动与关闭。
- OpenVas:对应扫描器Openvas服务的启动与关闭。
- SSH:对应SSH服务的启动与关闭。
二、教材学习总结
(一)恶意代码基础知识
1.恶意代码定义与分类
(1)恶意代码定义
恶意代码指的是使计算机按照攻击者的意图执行以达到恶意目标的指令集。
(2)恶意代码类型
恶意代码可以根据其执行方式、传播方式和对攻击目标的影响分为计算机病毒、蠕虫、恶意移动代码、特洛伊木马、后门、僵尸程序、内核套件等。需要注意的是,一些恶意代码会综合使用多种技术,所以具有多种分类的特性,可以归为融合型恶意代码。
2.计算机病毒
(1)计算机病毒的定义
①Fred Cohen首次提出计算机病毒的概念:计算机病毒是一个能感染其他程序的程序,它靠篡改其他程序,并把自身的拷贝嵌入其他程序而实现病毒的感染。随后他进一步将计算机病毒定义为:病毒程序通过修改其他程序的方法将自己的精确复制或可能演化的形式放入其他程序中,从而感染它们。
②Ed Skoudis为了给出计算机病毒和蠕虫的区别,给出了以下定义:计算机病毒是一种能够自我复制的代码,通过将自身嵌入其他程序进行感染,而感染过程通常需要人工干预才能完成。
③1994年《中华人民共和国计算机安全保护条例》给出了我国对计算机病毒的具有法规效力的定义:计算机病毒是指编制或者在计算机程序中插入的,破坏计算机功能或数据、影响计算机使用,并能自我复制的一组计算机指令或者程序代码。
(2)计算机病毒的基本特性:感染性、潜伏性、可触发性、破坏性和衍生性。
(3)计算机病毒潜在的感染目标可分为:可执行文件、引导扇区和支持宏指令的数据文件三大类。
(4)计算机病毒的传播机制
一旦病毒在计算机系统中被触发,它就会寻找可供感染的宿主程序位置,并复制自身并寄生在宿主上,病毒可能依附在移动存储或硬盘的引导扇区,或者可以嵌入代码的文档、可执行文件或者脚本文件。然而在通常意义下,病毒不会像蠕虫一样能够自主地跨越网络传播,而是需要借助人类的帮助从一台计算机传播到另一台计算机。
计算机病毒的传播渠道包括移动存储、电子邮件及下载、共享目录等。
3.网络蠕虫
(1)网络蠕虫的定义
网络蠕虫是一种可以自我复制的代码,并且通过网络传播,通常无须人为干预就能传播。
(2)网络蠕虫的基本特性
网络蠕虫的定义特性在于通过网络的自主传播。而计算机病毒的定义特性在于感染宿主,包括可执行文件、数据文档或磁盘引导扇区,而蠕虫则没有必要感染宿主。
(3)网络蠕虫的组成结构
典型的蠕虫内部组成结构包括:“弹头”、传播引擎、目标选择算法和扫描引擎、有效载荷。
4.后门与木马
(1)后门的定义
从定义特性上进行分析,后门是允许攻击者绕过系统常规安全控制机制的程序,能够按照攻击者自己的意图提供访问通道。
(2)木马的定义
作为特洛伊木马的简称,木马是指一类看起来具有某个有用或善意目的的,但实际掩盖着一些隐藏恶意功能的程序。
(3)后门工具能够为攻击者提供多种不同类型的访问通道,包括:
- 本地权限提升和本地账号:使得攻击者能够将其权限等级提升为系统管理员,或者新增一个本地账户,有了这些用户权限。攻击者可以任意访问系统及其文件。
- 单个命令的远程执行:攻击者可以通过此类后门单独执行一个命令,并获得命令运行结果。
- 远程命令行解释器访问:即远程Shell,这类后门允许攻击者通过网络快速直接地输入能够在目标系统上运行的Shell命令,并获得运行结果。
- 远程控制GUI:能够以图形化界面的方式来访问目标系统,并提供较远程Shell功能更多、更简单易用的访问接口。
- 无端口后门:可以无须打开TCP或者UDP监听端口的无端口后门。
5.僵尸程序与僵尸网络
(1)僵尸网络的定义
僵尸网络是指攻击者出于恶意目的,传播僵尸程序控制大量主机,并通过一对多的命令与控制信道所组成的网络。
(2)僵尸网络的基本特性
僵尸网络区别于其他攻击方式的基本特性是使用一对多的命令与控制机制。另外,僵尸网络还具有恶意性和网络传播性。
(3)僵尸网络的功能结构
僵尸网络可以分为主体功能模块和辅助功能模块,主体功能模块包括实现僵尸网络定义特性的命令与控制模块和实现网络传播特性的传播模块,而包含辅助功能模块的僵尸程序则具有更强大的攻击功能和更好的生存能力。
(4)僵尸程序的命令与控制机制
当前主流使用的僵尸网络命令与控制机制包括:基于IRC协议的命令与控制机制、基于HTTP协议的命令与控制机制和基于P2P协议的命令与控制机制这三大类。
(二)恶意代码分析方法
1.恶意代码分析技术概述
(1)代码分析的定义
代码分析,或称程序分析,是按需求使用一定的规则、方法和工具对计算机程序进行分析,以推导出其程序结构、数据流程和程序行为的处理过程。
(2)恶意代码分析的定义
恶意代码分析就是利用一系列的程序分析技术方法、流程和工具,来识别恶意代码关键程序结构和行为特征的过程。
(3)恶意代码分析的技术方法分类
恶意代码分析的技术方法主要包括静态分析和动态分析两大类。
2.恶意代码分析环境
对于恶意代码分析实践而言,一个能够完全受控、易于构建与恢复的分析环境是必需的。
恶意代码分析环境分为:恶意代码发烧友的分析环境、基于虚拟化构建恶意代码分析环境和用于研究的恶意代码自动分析环境。
3.恶意代码静态分析技术
(1)恶意代码静态分析的定义
静态代码分析方法在不实际执行软件代码情况下对恶意代码进行自动化或辅助分析,通过包括使用反病毒引擎扫描识别已知的恶意代码家族和变种,逆向分析获取恶意代码的关键程序信息、模块构成、内部数据结构和关键控制流程,理解恶意代码的机理,并提取特征码用于检测。
(2)恶意代码静态分析的主要技术手段
恶意代码静态分析的主要技术手段具体包括:反病毒软件扫描、文件格式识别、字符串提取分析、二进制结构分析、反汇编、反编译、代码结构与逻辑分析、加壳识别与代码脱壳等。
4.恶意代码动态分析技术
(1)恶意代码动态分析的定义
动态代码分析方法是通过在受控环境中执行待分析的目标恶意代码,并利用系统、网络、甚至指令层次上的监控技术手段,来获取目标代码的行为机理和运行结果。
(2)恶意代码动态分析的主要技术手段
恶意代码动态分析的主要技术手段具体包括:快照比对、系统动态行为监控、网络协议栈监控、沙箱、动态调试等。
(三)软件安全概述
1.软件安全漏洞威胁
可以被攻击者利用并导致危害的安全缺陷被称为软件安全漏洞。安全漏洞的范畴不限于软件安全漏洞,还包括硬件、个人与组织管理中存在的、能够被攻击者利用来破坏安全策略的弱点,但是软件安全漏洞是目前最常见,也是影响范围最大的安全漏洞类型。
软件安全漏洞构成了目前安全漏洞最为主要的部分,也是计算机安全应急响应组织所关注的重点。
2.软件安全困境
著名信息安全专家G. Hoglund和G. McGraw提出了软件安全“困境三要素”:复杂性、可扩展性和连通性。软件的这三个要素共同作用,使得软件的安全风险管理成为一个巨大的挑战,从而很难根除安全漏洞。
3.软件安全漏洞类型
从技术上主要包括如下几类:
(1)内存安全违规类
内存安全违规类漏洞是在软件开发过程中在处理RAM内存访问时所引入的安全缺陷。缓冲区溢出漏洞是一种最基础的内存安全问题。
(2)输入验证类漏洞
输入验证类安全漏洞是指软件程序在对用户输入进行数据验证存在的错误,没有保证输入数据的正确性、合法性和安全性,从而导致可能被恶意攻击与利用。
(3)竞争条件类
竞争条件类缺陷是系统或进程中一类比较特殊的错误,通常在涉及多进程或多线程处理的程序中出现,是指处理进程的输出或者结果无法预测,并依赖于其他进程事件发生的次序或时间时,所导致的错误。
(4)权限混淆与提升类
权限混淆与提升类漏洞是指计算机程序由于自身编程疏忽或被第三方欺骗,从而滥用其权限,或赋予第三方不该给予的权限。
(四)缓冲区溢出基础概念
1.缓冲区溢出的基本概念
缓冲区溢出是计算机程序中存在的一类内存安全违规类漏洞,在计算机程序向特定缓冲区内填充数据时,超出了缓冲区本身的容量,导致外溢数据覆盖了相邻内存空间的合法数据,从而改变程序执行流程破坏系统运行完整性。
缓冲区溢出攻击发生的根本原因:现代计算机系统的基础架构——冯·诺依曼体系存在本质的安全缺陷,即采用了“存储程序”的原理,计算机程序的数据和指令都在同一内存中进行存储,而没有严格的分离。这一缺陷使得攻击者可以将输入的数据,通过利用缓冲区溢出漏洞,覆盖修改程序在内存空间中与数据区相邻存储的关键指令,从而达到使程序执行恶意注入指令的攻击目的。
2.缓冲区溢出漏洞的分类
缓冲区溢出漏洞根据缓冲区在进程内存空间中的位置不同,又分为栈溢出、堆溢出和内核溢出这三种具体技术形态。
(1)栈溢出是指存储在栈上的一些缓冲区变量由于存在缺乏边界保护问题,能够被溢出并修改栈上的敏感信息(通常是返回地址),从而导致程序流程的改变。
(2)堆溢出是指存储在堆上的缓冲区变量缺乏边界保护所遭受溢出攻击的安全问题。
(3)内核溢出漏洞存在于一些内核模块或程序中,是由于进程内存空间内核态中存储的缓冲区变量被溢出造成的。
(五)Linux平台上的栈溢出与Shellcode
1.Linux平台栈溢出攻击技术
Linux平台中的栈溢出攻击按照攻击数据的构造方式不同,主要有NSR、RNS和RS三种模式。
2.Linux平台的Shellcode实现技术
Shellcode是一段机器指令,对于我们通常接触的IA32架构平台,Shellcode就是符合Intel 32位指令规范的一串CPU指令,被用于溢出之后改变系统正常流程,转而执行Shellcode以完成渗透测试者的攻击目的,通常是为他提供一个访问系统的本地或远程命令行访问(即Shell)。
按照在本地溢出攻击和远程溢出攻击使用场景的不同,分为本地Shellcode和远程Shellcode。
(1)Linux本地Shellcode实现机制
Linux系统本地Shellcode通常提供的功能就是为攻击者启动一个命令行Shell。
Shellcode的通用方法:
①先用高级编程语言,通常用C,来编写Shellcode程序;
②编译并反汇编调试这个Shellcode程序;
③从汇编语言代码级别分析程序执行流程;
④整理生成的汇编代码,尽量减小它的体积并使它可注入,并可通过嵌入C语言进行运行测试和调试;
⑤提取汇编代码所对应的opcode二进制指令,创建Shellcode指令数组。
(2)Linux远程Shellcode实现机制
Linux系统上的远程Shellcode的实现原理与本地Shellcode完全一致,也是通过执行一系列的系统调用来完成指定的功能。实现方法步骤也是首先给出高级语言的功能代码实现,然后通过反汇编调试编译后的二进制程序,提取、优化和整理所获得的汇编代码,并最终产生opcode二进制指令代码。
(六)Windows平台上的栈溢出与Shellcode
1.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接口函数。
2.Windows平台的Shellcode实现技术
按照在本地溢出攻击和远程溢出攻击使用场景的不同,分为本地Shellcode和远程Shellcode。
(1)Windows本地Shellcode实现机制
在Windows平台上,典型的本地Shellcode同样也是启动一个命令行Shell,即“command.com”或“cmd.exe”。
(2)Windows远程Shellcode实现机制
与Linux系统类似,更为常用的Shellcode是可以在远程渗透攻击中使用的,能够给出shell网络访问的远程Shellcode。
Windows远程Shellcode的C语言实现示例代码,其大致过程如下:
①创建一个服务器端socket,并在指定的端口上监听;
②通过accept()接受客户端的网络连接;
③创建子进程,运行“cmd.exe”,启动命令行;
④创建两个管道,命令管道将服务器端socket接收(recv)到的客户端通过网络输入的执行命令,连接至cmd.exe的标准输入;然后输出管道将cmd.exe的标准输出连接至服务器端socket的发送(send),通过网络将运行结果反馈给客户端。
(七)堆溢出攻击
堆溢出攻击是缓冲区溢出中第二种类型的攻击方式,由于堆中的内存分配与管理机制较栈更为复杂,不同操作系统平台的实现机制都具有显著的差异,同时通过堆中的缓冲区溢出控制目标程序执行流程需要更精妙的构造,因此堆溢出攻击的难度较栈溢出要复杂很多,真正掌握、理解并运用堆溢出攻击也更为困难一些。
(八)缓冲区溢出攻击的防御技术
通过以上对缓冲区溢出攻击技术的介绍,我们知道攻击者通常先通过溢出植入攻击代码,然后通过修改关键数据结构改变程序执行流程,最后让攻击代码执行。所以,自然而然地,针对缓冲区溢出攻击的防御技术围绕着如何组织这三步中任何一步失效,来达到抵御缓冲区溢出攻击的能力。
1.尝试杜绝溢出的防御技术
解决缓冲区溢出攻击最根本的方法是编写正确的、不存在缓冲区溢出安全漏洞的软件代码,但由于C/C++语言作为效率优先的语言,很容易就会出现缓冲区溢出。
2.允许溢出但不让程序改变执行流程的防御技术
这种防御技术允许溢出发生,但对可能影响到程序流程的关键数据结构实施严密的安全保护,不让程序改变其执行流程,从而阻断溢出攻击。
3.无法让攻击代码执行的防御技术
这种防御技术尝试解决冯·诺依曼体系的本质缺陷,通过堆栈不可执行限制来防御缓冲区溢出攻击。