三、威胁建模阶段
威胁建模阶段主要是针对已经获取的信息进行威胁建模与攻击规划,对目标系统进行建模,然后确定最优的攻击路线,后续的渗透攻击则由此展开。
四、漏洞分析阶段
漏洞分析可分为狭义和广义,狭义的漏洞分析的目的在于在确定最可行(最优解)的攻击后,考虑如何获取目标系统的访问控制权。其具体思路则为针对攻击通道上的一些关键系统与服务进行漏洞探测与挖掘,期望可以找出可被利用的未知的安全漏洞,并开发出渗透代码,从而打开攻击通道上的关键路径。而广义的漏洞分析,则贯穿着渗透测试的全部过程,从确定是否存在漏洞,到怎么进行漏洞利用,再到总结分析,无处不存在着对于漏洞的分析。
五、漏洞利用(渗透攻击/Exploit)阶段
结束了前期的信息收集和攻击路线确定之后,我们迎来了渗透测试中最为精彩的一个阶段,那就是渗透攻击,也可称为漏洞利用阶段(Exploit)。首先,我们认识一下常见的漏洞。
<一>常见漏洞
对于常见的漏洞,由很多分类方法。在此,我对于漏洞的分类方法是该漏洞的作用域,根据作用形式的不同,可分为作用于底层的内存漏洞和作用于攻击手段上的通信协议漏洞,其中通信协议漏洞以Web安全进行介绍。
1. 内存漏洞
内存漏洞大多数由于内存区分配和使用的不当,依据数据是否遭到破坏分为以下几类:
(1)原始数据遭到破坏
1.1整数溢出漏洞
整数溢出漏洞依据溢出的额原理不同可分为三个方面:第一类是存储溢出,即现有的物理/虚拟存储空间存不下的完整数据;第二类则为运算溢出,可归为第一类,但不同的是此类变量是运算之后的结果,此类漏洞大多由于程序员在编写代码的时候未对不同变量类型的取值边界和运算结果进行验证导致;第三类则为符号问题,无符号数和有符号数在安全检查时出现歧义导致的结果差错。
1.2缓存区溢出漏洞
缓存区溢出漏洞可分为栈溢出,堆溢出,和单字节溢出三种,其危害都可概括为溢出导致的原有正常的返回地址被覆盖,程序被恶意引导至病毒代码;其区别主要在于栈的内存不由程序员决定,堆的内存则由程序员自行分配(例如c语言中的malloc可以动态分配堆内存,若使用完之后忘记free释放内存,则会出现指针在内存中“乱飘”的现象)而单字节溢出则为仅能溢出一个字节,其利用难度较大。
(2)原始数据未遭到破坏
2.1格式化字符串漏洞
格式化字符串漏洞的主要危害在于攻击者可以通过格式化输出,读取高地址内存中的数据,从而发生数据泄露的问题,若高地址内存中的数据为返回地址(EIP)等关键的寄存器中的数据,则可被利用导致程序的崩溃等危害。
从原理上来说,缓存区溢出漏洞和格式化字符串漏洞虽为不同的内存问题,但都是利用用户提供的数据作为函数参数并加以利用。
2. 通信协议漏洞
此类漏洞出现在通信协议上,主要是由于协议的制定者考虑不完善导致,这里我们以基于HTTP、PHP等协议的Web安全进行介绍。
(1)Web安全威胁
由于Internet技术的高速发展,其给人么能带来便利的同时,各种恶意程序和黑客攻击也是史无前例的增多。随着各种服务向Web化方向迈进,Web安全面临的威胁也与日俱增。根据OWASP(开放式Web应用程序安全项目)发布的Web应用威胁排名,排名前十的分别是:注入、跨站脚本、遭破坏的身份认证和会话管理、不安全的直接对象引用、跨站请求伪造,安全配置错误,不安全的加密存储、没有限制的URL访问、传出层保护不足和未验证的重定向和转发。而常见的Web漏洞也出自其中。下面我们将对常见的Web漏洞进行介绍。
(2)常见Web漏洞
基于Web的C/S模型,我们将漏洞分为针对客户端攻击和针对服务端(服务器)攻击(漏洞),其具体类型如下:
1. 客户端漏洞
客户端主要是用于用户的界面加载,计算,参数传递等,客户端所存在的漏洞大多是由客户端的软件开发导致
1.1 文件上传漏洞
文件上传是一个正常的业务需求,但是如果应用对用户上传的文件没有进行恰当的检测,则可能导致攻击者上传一个恶意脚本文件,并通过该文件获取服务器段执行系统命令的能力;上传漏洞的利用往往使用WebShell的植入。
1.2 跨站脚本攻击
现在大多数网页经常使用JavaScript或者VBScript来执行计算、页面格式化、Cookis管理的等。该类脚本在客户机上运行,而跨站脚本攻击(XSS)则根据其特征和利用手法的不同,可分为反射式XSS和存储式XSS:反射式XSS也成为非持久型、参数型跨站脚本,主要用于将恶意脚本附加到URL地址的参数中;存储式XSS又称为持久型跨站脚本,其脚本并非来自Web应用程序请求,而是由Web应用程序存储,并将其内容展示给浏览用户,且存储式XSS不改变原有的URL结构,所以有时会逃过一些IDS安全检测,其危害性更强。二者虽然方法不同,但都会在Web应用的网页中显示未经编码的攻击者脚本。
1.3 本地文件包含漏洞
文件包含指的是开发Web应用时,开发人员将一些重复使用的代码写到单个文件之中,再通过文件包含,插入到其他需要用到的页面之中。而本地文件包含漏洞指的是被包含的文件从用户处获取,并引起文件泄露或恶意注入。
1.4 PHP反序列化漏洞
序列化指的是将对象、数组等数据结构转化为可以存储的格式的过程。序列化操作主要出现在程序运行结束之后操作系统对于程序内存的回收时,会进行序列化操作将数据存储至本地或进行网络传输。而PHP反序列化漏洞又称为PHP对象注入漏洞。攻击者通过传入一个精心构造的序列化字符串给应用程序,并利用PHP魔术方法控制对象内部的变量甚至是程序,达到攻击的目的。
2. 服务端漏洞
2.1 SQL注入漏洞
SQL注入的原理是数据库未对用户的输入项进行验证和处理便直接拼接到查询语句之中,常用的攻击方法中最重要的就是寻找注入点。寻找注入点的思路是在参数后面插入可能使查询结果发生变化的SQL代码,若该代码被执行。则说明此处存在漏洞,故可以通过此注入点进行漏洞利用;其方法主要包括单引号法(在URL参数后面添加一个单引号,若存在注入点则通常会返回一个错误)和永真永假法(“and 1=1“或”and 1=2”影响代码原有的逻辑)。
2.2 远程文件包含漏洞
与本地文件包含漏洞不同,远程文件包含漏洞指的是允许被包含的文件可以通过URL打开再利用,对远程服务器造成影响和攻击。
<二>漏洞利用的核心
Shellcode指的是被植入进程获取系统用户界面(Shell)的代码,而漏洞利用的核心就是利用程序的漏洞去执行Shellcode以便控制进程的控制权。
<三>常见软件防护技术
在介绍渗透攻击的具体技术手段之前,我们先来认识一下现有的常见的软件防护技术,了解软件防护技术,是为了更好的绕过防护进行渗透攻击。常见的软件防护技术有以下五类:
ASLR(地址空间分随机化),其思想与随机MAC地址相似,防止攻击者获取静态地址进行攻击。
GS Stack protection,缓存区溢出检测防护技术。
DEP(数据执行保护),限制内存堆栈区的代码为不可执行状态,防范溢出后代码的执行。
SafeSEH,保护SHE(Windows异常保护处理机制的数据结构链表)函数不被非法利用。
SEHOP,结构化异常处理覆盖保护。
其中SafeSEh和SEHOP都是防范SHE攻击,所谓SHE攻击,就是攻击者通过构造栈溢出或其他漏洞,使用构造数据覆盖SHE上面的多个函数,从而控制程序的执行流程。
<四>漏洞利用技术手段
在了解了常见的软件防护技术之后,我们来看一下常见的漏洞利用的技术手段。可分为地址利用技术和绕过DEP保护技术。
1.地址利用技术
地址利用技术可分为能精确定位Shellcode和不能精确定位Shellcode两类。
精确定位Shellcode可分为静态Shellcode和动态Shellcode地址的利用技术,这里的静态指的是存在溢出漏洞的应用程序每次运行时操作系统对其内存分配固定,故溢出后写入栈帧的Shellcode代码的内存地址也是静态不变的,所以可以直接将Shellcode代码在栈帧中的静态地址覆盖原有返回地址,函数返回时,通过新的返回地址指向Shellcode代码地址,从运行Shellcode代码,达到攻击效果;而动态变化则常见于动态链接库之中,动态链接库在使用的时候被动态加载,故其在内存中的栈帧地址时动态变化的,此外,引起动态变化的原因还有该操作系统使用ASLR技术。为解决地址动态变化的问题,我们可以使用ESP寄存器,ESP寄存器中的栈顶指针指向返回地址在内存高地址方向的相邻位置,故可以通过JMP ESP指令作为跳板,实现在栈帧动态分配的情况下,可以自动跳回Shellcode的地址并执行。
而有些特殊的软件漏洞,不支持或者不能精确丁文Shellcode。同时,存在漏洞的软件其加载地址动态变化,使用静态Shellcode难以实施。此时可以使用heap spray(堆喷射)技术,其思路是在Shellcode前面添加大量的Slide code(滑板指令),滑板指令由大量的NOP空指令和0x90填充组成序列,CPU在遇到滑板指令后会一个接着一个进行运行。大量的滑板指令申请了大量的内存,程序跳转后只要命中滑板指令中的任意一个,就可以保证滑板指令后面的Shellcode成功执行。Heap spray技术常用于针对浏览器漏洞的攻击,尤其是网页木马应用。
2.绕过DRP保护
支持硬件DEP的CPU会拒绝执行被标记为不可执行(NX)的内存页代码。而绕过DEP保护的攻击,其解决思路是ROP(返回导向编程),是一种新型的基于代码复用技术的攻击。ROP的基本思路是借助于已经存在的代码块,从已有的库或可执行文件中提取指令片段,构建恶意代码。ROP允许用户绕过DEP和ALSR,但是不能绕开GS缓冲区溢出的检测防护技术。其具体的攻击可总结为以下三点:通过ROP链(RETN)实现有序汇编指令的执行,ROP链由一个一个ROP小配件(结点)组成,ROP小配件由“目的执行指令+RETN指令”组成。
到此为止,我们完成了渗透攻击的整个过程,接下来,我们将进入后续的整理等环节。