1.4 主要攻击方法
由于计算机网络体系结构的复杂性及应用的开放性,使得网络设备及数据的安全成为影响网络正常运行的重要问题。计算机网络的风险主要由网络系统存在的缺陷或漏洞、利用漏洞的攻击及外部环境对网络的威胁等因素构成。广义的攻击是指任何形式的非授权行为,目前的网络攻击主要利用网络通信协议本身存在的设计缺陷或因安全配置不当而产生的安全漏洞而实施。基于这一现实,本节重点介绍以下的攻击方法。
1.4.1 端口扫描
网络扫描就是对计算机系统或网络设备进行相关的安全检测,以便发现安全隐患和可利用的漏洞。攻击者利用网络扫描技术来寻找对系统发起攻击的途径。计算机网络通过端口对外提供服务,一个端口同时也是一个潜在的通信通道或入侵通道。通过对目标主机进行端口扫描,可以获得很多有用信息。
端口扫描是向目标主机的服务端口发送探测数据包,并记录目标主机的响应。通过分析响应的数据包来判断服务端口是否处于打开状态,从而得知端口提供的服务或信息。端口扫描也可以通过捕获本地主机或服务器的流入流出数据包来监视本地IP主机的运行情况,它能对接收到的数据进行分析,帮助人们发现目标主机的某些内在的弱点。端口扫描本身不会提供进入一个系统的详细方法,只是一项自动探测本地或者远程系统端口开放情况的技术。用户通过端口扫描可以了解本系统向外界提供了哪些服务,或者探测目标主机系统端口目前正在向外提供哪种服务。
端口扫描一般通过TCP连接的建立机制而实施。如图1-1所示,TCP是TCP/IP体系结构传输层提供的一个面向连接的通信协议,它通过“三次握手”过程建立可靠的连接。在网络攻击中,端口扫描的目的不是建立连接,而是利用TCP连接的建立机制来在非正常状态下获得目标主机的相关信息。在端口扫描过程中,目标主机端口可能出现下列4种状态,每一种状态下的应答数据包情况如下。
图1-1 TCP连接建立时的三次握手
(1)CLOSED状态:表示目标主机的端口处于关闭状态。这时,如果目标主机收到RST(复位)数据包便直接丢弃;如果收到其他类型的数据包,则返回一个RST数据包。
(2)LISTEN状态:表示目标主机的端口处于监听状态。这时,如果目标主机收到一个SYN(同步)数据包,则返回一个SYN或ACK(应答)数据包,并进入SYN-RCVD(同步收到)状态;如果收到一个ACK数据包,则返回一个RST数据包;如果收到其他的数据包,则将其直接丢弃。
(3)SYN-RCVD状态:表示目标主机的端口处于同步收到状态。如果目标主机接收一个RST数据包,则返回LISTEN状态;如果收到ACK数据包,则进入ESTAB-LISHED(连接建立)状态,并建立TCP连接;如果收到其他类型的数据包,则将其直接丢弃。
(4)ESTAB-LISHED状态:表示目标主机的端口处于连接已建立状态,即TCP连接已经建立。
TCP连接扫描(TCP connect scan)便是一种最基本的端口扫描技术。TCP连接扫描也称为“TCP全连接扫描”,它利用TCP协议的三次握手过程,直接连接到目标端口并完成一个完整的三次握手过程(SYN、SYN/ACK和ACK)。操作系统提供的connect()函数完成系统调用,用来与目标计算机的端口进行连接。如果端口处于监听状态,那么connect()函数就能成功完成连接;否则,这个端口是不能用的,即没有提供服务。TCP连接扫描的优点是不需要任何权限,系统中的任何用户都有权利使用这个调用,而且扫描速度快。TCP连接扫描的缺点是容易被目标系统发现并过滤。在目标计算机的日志文件中,会显示一连串的连接和连接出错的服务消息,目标计算机通过对本地系统日志的实时分析很容易发现这种扫描行为。
1.4.2 口令攻击
口令是使用最广泛的一种身份认证方式。目前,虽然基于图像、视觉和指纹等的认证方法已经开始大量应用于用户身份认证,但可记忆的文本口令认证方法以其便捷的应用和极低的成本仍被广泛应用于当前的各类系统中。早期,部分系统采用直接存储口令本身来进行比对认证,攻击者很容易通过攻击服务器上存储的口令文件来直接获取口令。2011年,CSDN和人人网等网站密码大量泄露的原因就是早期使用这种方式保存口令。
现在,大部分系统通过保存口令的Hash值来对用户认证信息进行管理。当用户登录时,系统通过一个单向函数来对输入的口令进行计算,将得到的Hash值与存储口令的Hash值进行比对,如果一致则通过认证,否则拒绝访问。这种认证方式是利用了单向函数的单向性(给定口令输入,计算Hash值是容易的;但给定Hash值,计算出口令输入值是困难的)保证口令的安全。这样即使攻击者获取到存储口令Hash值的文件,也很难得到口令。还有一些系统采用加权方法来进一步保证系统的安全性,系统以口令和权值作为输入参数来计算Hash值,这里的权值通常是一个随机值。
攻击者通过猜测口令,并且将计算出的Hash值进行比对的过程称为口令攻击。因此,口令攻击的核心是猜测出可能的候选口令。在互联网环境中,一般可以通过以下几种方式进行口令攻击。
1. 在线窃听
在线窃听是指攻击者利用一些网络协议传输信息时未进行加密处理这一机制,通过在线截获数据包并经协议分析便可获得用户名和密码等账户信息。目前,互联网上的Telnet、FTP、HTTP、SMTP等协议都采用明文方式来传输用户名和密码等账户信息,通过网络嗅探器(如Sniffer)在不影响正常通信的前提下就可以截获数据包并进行协议分析。
2. 获取口令文件
在Linux操作系统中,用户的账号(用户名)信息存放在“cat/etc/passwd”文件中,而对应的口令则经加密处理后存放在“cat/etc/shadow”文件中;在Windows操作系统中,用户名和密码经Hash处理后保存在“Winnt/System32/Config”目录下的SAM(Security Account Manager,安全账号管理)文件中。攻击者在窃取了这些文件后,通过破解便可以获取系统的账户信息。例如,Windows中的SAM文件一般是经LM-Hash或NTLM-Hash加密处理后的文件,该类型的文件很容易通过专门的工具进行破译。
3. 字典攻击
拿着一串钥匙鬼鬼祟祟地逐个试着去打开某一把锁属于小偷行为,而对照一个密码本中提供的密码一个个尝试着去登录某一系统则属于字典攻击。任何一个资源受限系统都需要对用户身份的合法性进行验证。当攻击者试图入侵一个受保护的目标系统时,像正常的用户登录一样,需要输入正确的用户名和密码。此时,攻击者会使用事先生成的口令字典库,依次向目标系统发起身份认证请求,直到某一个口令满足条件(攻击成功)或所有口令遍历后仍然无效(攻击失败)为止。一个字典攻击过程必须具备的两个条件如下。
(1)攻击者必须事先掌握目标系统的身份认证方式。就像小偷开锁之前需要知道锁的类型,然后才能准备钥匙一样,攻击者在入侵目标系统之前,也必须事先掌握该系统的身份认证方式(如虹膜认证、指纹认证、口令认证等)后,才能确定其认证协议、目标地址及端口等信息。
(2)字典库的准备。对于攻击者来说,字典库越大,成功入侵的可能性也就越大,但攻击过程的耗时也越长,攻击行为被检测和阻止的可能性也越大。攻击者在对一个目标系统实施攻击之前,一般会对其口令的可能组成进行一个评估(如系统的重要性、系统的注册用户数量、系统曾经是否出现过用户信息的泄露等),再根据评估结果生成相应的字典库。目前,针对不同系统的不同认证方式,存在专门的字典库生成工具。
1.4.3 彩虹表
彩虹表(Rainbow Table)是一种破解Hash函数的技术。例如,对于Windows操作系统中经过LM-Hash或NTLM-Hash加密处理后的SAM文件,即使是系统管理员(Administrator)也无法读取,但是通过相应的彩虹表工具都可以进行破解。彩虹表技术可以针对不同的Hash函数,利用其漏洞进行暴力破解。
1. Hash函数
Hash函数(Hash function,杂凑函数)是将任意长的数字串M映射成一个较短的定长输出数字串H的函数。一般以h表示,h(M)易于计算,称H=h(M)为M的杂凑值,杂凑值也称为Hash值,H也称为M的数字指纹(digital finger print)。
在Hash函数中,h是多对一的映射,即任意一个M经h(M)计算得到的H是唯一的,而一个H可能对应多个不同的M。因此,不能从H计算得出原来的M,但可以验证任意一个给定的序列M′是否与M有相同的杂凑值。Hash函数具有以下性质。
(1)混合变换(mixing transformation)。对于任意的输入x,输出的杂凑值h(x)应当与区间[0,2|h|]中均匀的二进制串在计算上是不可区分的。
(2)抗碰撞攻击(collision resistance)。存在两个输入x和y,且x≠y,使得h(x)=h(y),这在计算上应当是不可行的。为了使这个假设成立,要求h的输出空间应当足够大。|h|最小为128,典型的值为160。
(3)抗原象攻击(pre image resistance)。已知一个杂凑值h,找一个输入串x,使得h=h(x),这在计算上是不可行的。这个假设同样也要求h的输出空间足够大。
(4)实用有效性(practical efficiency)。给定一个输入串x,h(x)的计算可以在关于x的长度规模的低阶多项式(理想情况是线性的)时间内完成。
需要说明的是,由于Hash函数输出值是固定长度的,这必然会存在多个不同输入产生相同输出的情况。如果两个输入串的Hash函数的值一样,则称这两个串是一个碰撞(Collision)。在理论范围内,存在一个输出串(Hash函数值)对应无穷多个输入串,所以碰撞具有其必然性。如果找到碰撞,就意味着破坏了信息的一致性,搜寻指定输入的Hash碰撞值的过程被称为“Hash破解”。按照Hash函数性质的约定,Hash函数必须是不可逆的,所以不存在从杂凑值到原始输入串的破解。但是,如果使用彩虹表这种暴力破解方式,可以打破Hash函数的性质约定,不过仍然无法保证破解到的数据是原始数据。
2. 彩虹表的工作原理
由于Hash函数具有的特殊性质,目前Hash函数多用于密码的保存,用于防止明文密码的泄露,同时又可以验证输入的密码的正确性。常用的Hash算法有MD5、SHA-1、SHA-2等。
(1)彩虹表的建立。彩虹表技术的设计目的是对Hash函数进行暴力破解。在Hash函数中存在某个较大集合M(m0,m1,m2,…,mn)和一个较小集合Q(q1,q2,q3,…,qp),其中用于两个集合映射的Hash函数为H,即Q=H(M)。对于M中的任何一个值mi(i=0,1,2,…,n)都有唯一确定的qj(j=1,2,3,…,p)与之对应,但是一个qj可以对应多个mi。
对于Hash函数的破解,是给定一个具体的杂凑值q,求得其输入值m的过程。具体有两种方法:一种是暴力破解,把M中的每个mi都计算一次H(mi),直到结果等于q;另一种是查表法,预先设计一个给定结构的数据库,把每个mi和对应的qj都记录在数据库中,只要在该数据库依次查询q,直到找到对应的m为止。这两种方法虽然在理论上具有可行性,但在实际应用中却是不可取的,因为前一种所需要的时间是不能接受的[例如,一个由14位的大小写英文字母加数字组成的密码集合大小为(26×2+10)14=1.24×1025],而后一种产生的存储空间是海量的(如果杂凑值采用为128位,那么仅存储杂凑值就需要1011 PB,还没有考虑保存明文M所需要的存储空间)。彩虹表是对以上两种做法的合理组合,既结合了暴力破解和查表法的特点,又使处理时间和存储空间都能够在人们的可接受范围内。
彩虹表的具体做法是,对于Q=H(M),建立另一个可以将Hash值映射回明文密码mi的换算函数R,使得M=R(Q),然后对于一个给定的m,进行如下计算。
以上算法的基本思想是,把m用H和R依次迭代运算,最后得到m′。最后,将m和m′保存下来,其他的中间结果全部丢弃。从m到m′之间的运算称为哈希链,其中m和分别为该链中的起始点和终结点。为了能够生成查询表,从M中随机选择一组mi分别作为起始值,对每个起始点值采用相同的哈希链生成算法计算终结点值,将起始点值和终结点值保存下来(即对),中间过程产生的值全部丢弃。通过以上运算,一个仅保存起始点值和终结点值的数据库便形成,该数据库即生成的彩虹表。
(2)利用彩虹表破解Hash函数值。彩虹表的作用便是破解Hash函数值,即通过杂凑值找到明文输入数字串。下面具体介绍给定一个杂凑值q,求其输入值m的过程。具体方法是,先把q进行一次R运算,得到一个值c1,然后把c1与彩虹表中每一条记录(对)中的进行比对,如果有一条对应的记录,则该记录的(,…,)可能存在要找的m。此时,为了验证(,…,)存在m,将该记录再进行一次从m到m′的链式运算,看运算结果中的qj是否与q相同,如果相同说明就是m,因为。如果不是,继续查询下一条记录,直至遍历整个彩虹表中的m↔m′对为止。
如果通过c1没有得到对应的mn,再进行运算,并把c2与彩虹表中每一条记录中的m′进行比对,如果成功,根据其对应的起始点重新进行链式运算,若运算过程中存在qj与q相同,则即为要找的m;否则,再运算得到c3、c4,直到ck-1。
通过以上分析可知,如果给定一个杂凑值q,需要找到相对应的输入明文密码m,就可以通过换算函数R和Hash函数H运算哈希链,当其中任何一点与彩虹表中的终结点相同时,就能通过相应的起始点重建此哈希链。通过重建的完整哈希链,就有机会找到相应的密码值m。
3. 彩虹表应用举例
图1-2是由3条完整哈希链组成的表,表中的每一条记录(哈希链)都经过了3次换算,3次换算的换算函数分别为R1、R2和R3。其中,密码全部用6位小写字母表示,Hash值为32位。
图1-2 经3次换算的简单哈希链表
以图1-2中的哈希链表构成如图1-3所示的彩虹表。利用该彩虹表来破解Hash函数值为“00BB33DF”,破解的主要运算过程如下。
图1-3 对Hash值“00BB33DF”的破解过程
(1)对Hash函数值“00BB33DF”通过换算函数R3得到一个终结点的明文密码“hammer”,在彩虹表的终结点一列中未找到对应内容,转到(2)。
(2)通过换算函数R2、Hash函数H、换算函数R3得到终结点的明文密码“farmer”。
(3)在彩虹表中找到相对应的终结点明文密码“farmer”。
(4)利用对应的起始点“cccccc”重新构建哈希链,直至运算得到Hash值“00BB33DF”。这时,就获得了Hash值“00BB33DF”相对应的明文密码“summer”,破解成功。
对于Windows操作系统来说,只要得到SAM文件,就可以轻松地获取所有用户的明文密码。Windows操作系统的早期版本使用LM-Hash加密保存SAM文件,从Windows Vista开始系统默认禁用了LM-Hash(如图1-4所示为Windows 8操作系统中系统默认的设置),而改用安全性高的NTLM-Hash。然而,对于采用LM-Hash和NTLM-Hash加密处理的SAM文件,使用彩虹表都可以轻易破解。
图1-4 Windows 8操作系统默认禁用LM-Hash
1.4.4 漏洞攻击
互联网技术的飞速发展,其原始驱动是各类应用的不断丰富和完善。在这一过程中,软件是核心。然而,任何一款软件都不同程度地存在着漏洞,漏洞一旦被利用就会产生攻击。不断发生的重大网络安全事件,多是由黑客利用漏洞进行攻击所导致的。
1. 漏洞的概念
在计算机安全领域中,漏洞被认为是存在于一个系统内的弱点或缺陷,系统对一个特定的威胁攻击或危险事件的敏感性,或者进行攻击的威胁作用的可能性。漏洞通常是由软件错误(如未经检查的缓冲区或者竞争条件)引起的。在网络安全中,计算机系统是由若干描述实体配置的当前状态组成的,这些状态可分为授权状态、非授权状态、易受攻击状态和不易受攻击状态。易受攻击状态是指通过授权的状态转变成从非授权状态可以到达的授权状态。
受损状态是指已完成这种转变的状态,攻击是非受损状态到受损状态的状态转变过程。漏洞就是指区别于所有非受损状态的容易受攻击的状态特征。漏洞具有以下特点。
(1)软件编写过程中出现的逻辑错误,除专门设置的“后门”外,这些错误绝大多数都是由于疏忽造成的。
(2)漏洞和具体的系统环境密切相关。在不同种类的软、硬件设备中,同种设备的不同版本之间、由不同设备构成的不同系统之间,以及同种系统在不同的设置条件下,都会存在各自不同的安全漏洞问题。
(3)漏洞问题与时间紧密相关。随着时间的推移,旧的漏洞会不断得到修补或纠正,新的漏洞会不断出现,因而漏洞问题会长期存在。
漏洞的上述特点决定了在对漏洞进行研究时,除了需要掌握漏洞本身的特征属性,还要了解与漏洞密切相关的其他对象的特点。漏洞的基本属性有漏洞类型、造成后果、严重程度、利用需求、环境特征等。与漏洞相关的对象包括存在漏洞的软(硬)件、操作系统、相应的补丁程序和修补漏洞的方法等。图1-5是一个典型的漏洞库所包含的漏洞信息。
图1-5 漏洞的组成及描述
安全漏洞是信息技术、信息产品和信息系统在需求、设计、实现、配置、运行等过程中,有意或无意产生的脆弱性,这些脆弱性以不同形式存在于信息系统各个层次和环节之中,能够被恶意主体所利用,从而影响信息系统及其服务的正常运行。近几年来,由漏洞导致的网络安全事件层出不穷,典型案例包括:2010年6月发现的“震网”(Stuxnet)蠕虫,同时利用了7个最新漏洞进行攻击,导致伊朗布舍尔核电站推迟发电;2011年7月发生的韩国门户网站Nate和社交网站Cyworld被黑事件,成为至今发生的规模最大的网民信息被盗案件,约3500万用户的名字、电话号码、地址、身份证号码等信息被公布;2011年12月,黑客通过漏洞攻击导致CSDN等站点数亿账户信息被泄露,严重扰乱了互联网正常秩序。安全漏洞的大量出现和加速增长是目前网络安全问题趋于严峻的重要原因之一。
0day漏洞是一种特殊的安全漏洞。0day通常是指还没有公开过的尚未有补丁的漏洞,也称为“未公开漏洞”。而0day攻击则是指利用这种漏洞进行的攻击,即在安全补丁发布之前攻击者已经掌握了漏洞的存在,并对存在该漏洞的系统进行攻击。在安全补丁发布之前,所有的漏洞都可以称为0day漏洞。而从实际情况来看,漏洞的存在是普遍的,只是有些漏洞尚未发现或发现后没有公开而已。为此,利用0day漏洞的网络攻击,在互联网环境中产生的危害是崩塌式的。
2. 漏洞的分类
根据产生原因,可以将漏洞分为以下几类。
(1)设计方面的原因。主要是在系统设计时受某种先决条件的限制,或者考虑不够全面,从而导致设计上存在缺陷。一般来说,这类漏洞很难进行修补,特别是对于广泛应用的系统来说更是如此。例如,在最初TCP/IP协议的设计时,因当时只在小范围内使用,对于身份的确认、交互信息的确认都没有进行专门的考虑,从而导致假冒IP地址、利用TCP通信中三次握手等攻击行为很难防范。
(2)实现方面的原因。一般来说,主要体现在编码阶段,如忽略或缺乏编码安全方面的考虑、编程习惯不良及测试工作的不充分等,导致在一些特殊的条件下,程序无法按照预定的步骤执行,从而给攻击者以可乘之机。目前很多攻击都是针对编码漏洞来发起的,最为典型的就是缓冲区溢出攻击,如CodeRed、SQL Slammer、冲击波蠕虫、震荡波蠕虫等都是利用了缓冲区溢出的漏洞。一般来说,这种攻击通常会使攻击者的权限得到非法提升,对系统的安全性威胁很大。
(3)配置方面的原因。很多系统在正常工作前都需要进行一些配置,越是复杂的系统,其配置就越复杂。由于管理者缺乏相应的安全知识、对所使用的系统不了解、配置方法不专业等原因,经常为系统留下严重的安全隐患。例如,采用系统的默认配置,导致系统运行了本来不需要的服务,由此埋下了安全隐患。这个问题在操作系统服务的配置、应用服务的权限配置、口令配置等方面表现得更为突出。
3. 针对网络协议漏洞的攻击
网络漏洞是指存在于计算机网络系统中的,可能对系统中的组成和数据造成损害的一切因素。网络漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。由于网络漏洞涉及的内容较广,下面主要介绍网络协议漏洞。
TCP/IP协议是Internet中使用的一组通信协议的总称,最初由美国国防部高级研究计划署(DARPA)资助开发,于1983年在ARPANET(阿帕网)上使用。以TCP/IP协议为基础的Internet设计的初衷主要是考虑军事应用及提高抗干扰能力,这是以牺牲网络带宽为代价的,其网络结构及协议也存在一系列问题,提供的是一种面向非连接的尽力而为的不可靠服务,根本没有考虑到类似于今天移动互联网等新应用的需要。TCP/IP协议设计之前是由具有相同爱好的一些工程技术人员和研究者设计开发的,他们彼此信任、协同工作,网络中源、目的地址彼此信任,网络中传输的内容未考虑保密性,整个体系结构是一种开放、松散的架构。然而,当Internet进入大规模商用后,协议设计之初存在的局限性很快暴露出来,尤其是安全问题引起普遍关注,但一时又无法找到一种更好的可进行大规模改进的方案。因此,现实的做法则是集思广益,吸收各种新概念、新思路及新技术来对已有协议渐进性地进行完善,使之尽可能满足人们的应用要求。严格地讲,在目前的Internet应用环境中,TCP/IP中的主流协议(如TCP、UDP、ARP/RARP、SMTP、DNS等)都不同程度地存在着安全漏洞,这些安全漏洞都可能会被攻击者利用,作为入侵的窗口或跳板。
1.4.5 缓冲区溢出
缓冲区是指计算机中连续的一段存储空间。攻击者针对缓冲区工作过程中存在的漏洞,通过编写攻击程序,导致缓冲区出现溢出,进而实现对目标的攻击。
1. 缓冲区溢出的概念
缓冲区溢出是一种系统攻击手段,它通过向程序的缓冲区写入超出其长度要求的内容,造成缓冲区空间的溢出,溢出的数据将改写相邻存储单元上的数据,从而破坏程序的堆栈,使程序转去执行其他指令。如果这些指令是放在有系统管理员权限(如UNIX/Linux的Root、Windows NT的Administrator等)的内存里,那么一旦这些指令得到了运行,入侵者就以管理员权限实现了对系统的控制。
缓冲区溢出是一种典型的U2R(User to Root)攻击方式。造成缓冲区溢出攻击的主要原因是代码在操作缓冲区时,没有有效地对缓冲区边界进行检查。缓冲区溢出可以成为攻击者实现攻击目的的手段,但是单纯的缓冲区溢出并不能达到攻击的目的。在绝大多数情况下,一旦程序中发生缓冲区溢出,系统会立即中止程序运行,并报告“段错误”。只有对缓冲区溢出进行适当利用,攻击者才能实现攻击目的。
利用缓冲区溢出这一漏洞,攻击者可以使程序运行失败、系统崩溃或重新启动。更为严重的是,可以利用缓冲区溢出执行非授权指令,甚至取得系统特权,进而进行各种非法操作。如何防止和检测出利用缓冲区溢出漏洞进行的攻击,就成为网络入侵防御及入侵检测的重点之一。
2. 缓冲区溢出的原理
简单地讲,缓冲区溢出的原因是由于字符串在处理函数(gets、strcpy等)时没有对数组的越界操作加以检测和有效限制,结果覆盖了原有的堆栈数据。图1-6所示为程序在内存中的存储方式。从图中可以看出,输入的形参等数据存放在堆栈中,程序是从内存低端向内存高端按顺序执行的,由于堆栈的生长方向与内存的生长方向相反,所以在堆栈中压入的数据超过预先分配给堆栈的容量时,就会出现堆栈溢出,从而使得程序运行失败。
图1-6 程序在内存中的存储方式
下面是一段用C语言编写的对缓存区进行操作的简单程序:
# include < stdio.h > int main() char name[16]; gets(name); for(int i=0;i<16&&name[i];i++) print(,name[i]);}
编译上述代码,当输入“network attack”时,输出也为“network attack”。在此操作过程中,对堆栈的操作是先在栈底压入程序返回地址,接着将栈指针EBP入栈,此时EBP等于现在的ESP。然后,ESP减16,即向上增长16字节,用来存放name[]数组,此时堆栈的结构如图1-7(a)所示。在执行完gets(name)命令后,堆栈中的内容如图1-7(b)所示。最后,从main返回,弹出ret里的返回地址并赋值组EIP,CPU继续执行EIP所指向的命令。如果此时的输入字符串长度超过16字节,则当执行完gets(name)命令后,堆栈的效果如图1-7(c)所示。此时,由于输入的字符串长度超过了16字节,在name数组中无法容纳,只好向堆栈的底部方向继续写入,覆盖了堆栈中原有的内容。由图1-7(c)可以看出,EBP和ret已经被输入的字符“D”覆盖。这时,从main返回时,就必然会把“DDDD”的ASCII码看作是返回地址,CPU会试图执行该地址处的指令,结果出现难以预料的结果,便产生了一次堆栈溢出。
图1-7 缓冲区溢出操作示例
3. 缓冲区溢出攻击
根据实现目标的不同,缓冲区溢出攻击主要分为改变程序逻辑攻击和破坏敏感数据攻击两种类型。其中,破坏敏感数据攻击主要是对缓冲区中的数据进行篡改操作;而改变程序逻辑攻击不仅仅针对某个或某些数据,更是针对整个被攻击系统。改变程序逻辑攻击虽然破坏的不是敏感数据,但是攻击者可以通过改变这些数据来改变原有的程序逻辑,以此获取对本地或远程被攻击系统的控制权。
图1-8所示为实施缓冲区溢出攻击的一种方法,它属于改变程序逻辑攻击方式。如果是破坏敏感数据攻击,则只需要前面的两步操作。
图1-8 缓冲区溢出攻击过程
(1)注入恶意数据。恶意数据是指用于实现攻击的数据,它的内容将影响攻击模式中的后续活动能否顺利进行。恶意数据可以通过命令行参数、环境变量、输入文件或网络数据注入到被攻击系统。
(2)缓冲区溢出。实现缓冲区溢出的前提条件是发现系统中存在的可以被利用的缓冲区溢出漏洞。只有在发现了可被利用的漏洞后,才可以在特定外部输入条件的作用下,迫使缓冲区溢出的发生。
(3)控制流重定向。控制流重定向是将系统从正常的控制流程转向非正常流程的过程,传统做法是通过改写位于堆栈上的函数返回地址来改变指令流程,并借助指令(如NOP指令)提高重定向的成功率。除此之外,还可以通过改写被调用函数栈上保存的调用函数栈的栈地址、改写指针、改写跳转地址等方式实现。
(4)执行攻击程序。当控制流被成功地重定向到攻击程序的位置时,攻击程序得以运行。攻击程序专指真正实现攻击的代码部分,称为有效载荷(payload)。在攻击中,有效载荷可能以可执行的二进制代码形式放置在恶意数据中,这种有效载荷用于产生命令解释器(shellcode)。这是因为,攻击者为达到控制被攻击系统的目的,通常会利用缓冲区漏洞来获得被攻击系统的cmd shell,能为攻击者提供cmd shell的代码被称为Shellcode。此外,有效载荷也可能是已经存在于内存中的代码,相应的攻击技术称为注入攻击。
1.4.6 电子邮件攻击
电子邮件攻击是一种专门针对电子邮件系统的DoS攻击方式。由于电子邮件在互联网中的应用非常普遍,同时与电子邮件相关的SNMP、POP3和IMAP等协议在设计上都存在一定的安全漏洞,为攻击的实施提供了可被利用的资源。
1. 电子邮件攻击的概念
电子邮件攻击是利用电子邮件系统协议和工作系统机制存在的安全漏洞,通过利用或编写特殊的电子邮件软件,在短时间内向指定的电子邮件(被攻击对象)连续发送大容量的邮件,使电子邮件系统因带宽、CPU、存储空间等资源被耗尽而无法提供正常服务。为实现攻击而编写的特殊程序称为邮件炸弹(E-mail bomber),电子邮件攻击也称为电子邮件炸弹。
电子邮件攻击存在多种形式,主要有:通过监听网络中传输的电子邮件数据包或截获正在传输的电子邮件,窃取和篡改邮件数据;通过伪造的发送人电子邮件地址对指定的目标邮箱进行欺骗性攻击;通过发送大量的垃圾邮件产生拒绝服务攻击。
目前,电子邮件已经成为互联网上信息交换的主要方式,邮件收发过程的安全性和可靠性直接影响着邮件使用者之间的信息交流,尤其是Internet上的一些商务邮件更是如此。正是因为邮件的重要性,攻击者会收集一些重要的邮箱地址,出于种种目的向指定的邮箱发起攻击,轻则扰乱邮件的正常收发,重则导致邮件系统瘫痪。以攻击者频繁向指定的邮箱发送大容量邮件(一般为携带大附件的邮件)为例,因为每一个邮箱都有容量限制,如果短期内接收到的邮件大小超过了该邮箱的最大容量,该邮箱就会因没有存储空间而拒收正常的邮件。另外,即使是在邮箱的功能中设置了“当容量超过某一预设值时系统将自动删除前面的邮件”,但持续攻击行为在邮件服务器上产生的日志文件可能会迅速耗尽硬盘分配的存储空间,如果对日志文件的管理不当,则可能导致邮件服务器的崩溃。
2. 目录收割攻击
目录收割攻击(Directory Harvest Attack,DHA)是指攻击者通过编写脚本程序,对特定域名下所有可能存在的电子邮箱地址进行猜测,以获得该域名下所有邮箱地址的攻击方式。如图1-9所示,根据SMTP的工作原理,当邮件服务器接收到一个无效的邮件地址时,该邮件服务器会向邮件发送者(发送者的邮箱地址)返回一个标准的错误信息;否则,邮件服务器会返回一个表示邮件已成功接收的应答。基于这一工作原理,攻击者就能够根据回复的内容判断某一邮件地址是否有效,从而收割有效邮箱地址,加入到垃圾邮件制造者数据库或提供给地下黑色产业链进行牟利。
图1-9 DHA的工作原理
DHA猜测特定域名下邮箱地址的方式主要有两种:一种直接通过暴力方式穷尽所有的字母和数字组合;另一种是采用字典攻击,攻击者在根据人们的习惯构造了邮箱地址字典库后进行字典攻击。
在互联网快速发展的今天,用户的电子邮箱地址属于个人隐私,一般仅会在固定范围内使用,避免接收垃圾邮件或遭受攻击。为此,保护用户电子邮箱地址是互联网环境中保护个人隐私的一个方面。
需要说明的是,电子邮件攻击与垃圾邮件(spam)之间是有区别的,其中垃圾邮件被定义为不请自来的“大量”邮件,其特征是发送者在同一时间内将同一份电子邮件发给大量不同的用户,主要是一些公司用于对其产品的宣传或发送一些虚假广告信息,一般不会对收件人造成伤害;而电子邮件攻击是一种利用邮件协议漏洞的网络攻击行为。
1.4.7 高级持续威胁
近年来,网络攻击手段在实践中不断翻新,为安全防御提出了更高要求和新的挑战。原来单一的网络攻击方式已经无法适应当前复杂环境下的要求,所以综合技术和非技术因素的复合型攻击方式出现了。
1. 高级持续威胁(APT)的概念
高级持续威胁(Advanced Persistent Threat,APT)也称为针对特定目标的攻击,最初指某些组织和团体以挖掘安全数据为目的,长时间内访问某一网络的网络间谍活动,现在被定义为为了获取某个组织甚至是国家的重要信息,有针对性地进行的复杂且多方位的攻击方法。APT并非一种新的网络攻击方法和单一类型的网络威胁,而是一种持续、复杂的网络攻击活动。目前,APT不仅仅是国家和组织对抗过程中经常使用的攻击手段,民间专业黑客组织也会利用APT攻击手段发起危害较大的攻击,经常成为经济犯罪团伙(尤其是地下黑色产业链)使用的犯罪手段。
在信息安全领域中,APT曾一度以国家重要信息基础设施(如政府、金融、电信、电力、能源、军事等网络)和信息系统为目标,在全球大数据背景下,旨在破坏工业基础设施、窃取关于国家安全和国计民生的重要情报。例如,2011年曝光的美国信息安全厂商RSA令牌种子破解事件,众多用户个人信息被窃取;2013年曝光的国际黑客针对美国几大银行发起的APT攻击,篡改用户信用卡数据库的取款上限,在全球利用复制的卡同步信用卡取款套现,短期内就窃取了4500万美金;2013年3月美国曾利用“震网”蠕虫病毒攻击伊朗的铀浓缩设备,造成伊朗核电站推迟发电。除此之外,2013年曝光的美国棱镜事件、2015年曝光的乌克兰多家电厂遭攻击停电事件等,充分说明了APT对全球信息安全领域产生威胁的严重性。目前,随着移动互联网、物联网等技术的快速应用,APT已经成为黑客攻击的重要手段。
2. APT的特点
APT是一种复杂的网络攻击活动,它在受害者完全不知情或即使知道攻击已经发生,但不清楚原因而无法采取行动的状态下进行。传统安全检测技术采用的是基于已知知识的签名检测技术,假设前提是威胁已知并分析出特征(签名),针对已知的威胁进行检测。然而APT攻击大量使用多种高技术手段组合各类未知威胁来发起攻击,攻击者先收集攻击目标的环境和防御手段的信息,了解信息后再有针对性地发起攻击(如利用0day漏洞),可以绕过传统入侵检测系统(IDS)的检测,利用木马或已知木马的变形,可以绕过传统杀毒软件的检测,利用加密可以绕过审计检测,利用搜索引擎反射可以绕过可信链路检测,等等。隐蔽性和持续性是APT的两大特点。
(1)隐蔽性。隐蔽性也称为潜伏性,是指APT威胁可能在用户环境中存在较长的时间,而很难被传统的安全防御攻击检测到。在潜伏期间,攻击者通常利用目标主机上已有的工具或安装安全系统无法检测到的工具,通过常用网络端口和系统漏洞,不断收集各种信息,直到收集到重要情报。发动APT攻击的黑客,其目的往往不是为了在短时间内获利,而是将“被控主机”当成跳板,持续搜索,直到能彻底掌握所针对的目标人、事、物。这种攻击方式通常是隐蔽的,攻击者通常会通过各种措施来掩盖攻击行为,避免在日志中留下入侵证据。
(2)持续性。持续性体现在APT不是为了在短期内获利,攻击者经常会有针对性地进行为期数月甚至是数年的精心准备。从熟悉用户网络环境开始,先收集大量关于用户业务流程和目标系统使用情况的精确信息,搜集应用程序与业务流程中的安全隐患,定位关键信息的存储位置与通信方式。如果一个攻击手段无法达到目的,攻击者会不断尝试其他的攻击手段,以及渗透到网络内部后长期潜伏,不断收集各类信息,通过精心构造的命令,控制网络定期回送目标文件进行分析,直到收集到重要情报。
3. APT主要环节
APT攻击是一个复杂的活动,主要包括侦察、准备、锁定、进一步渗透、数据收集、维持等多个过程。APT攻击主要包括攻击准备、入侵实施和后续攻击3个环节,如图1-10所示。在具体的APT攻击过程中,这3个环节相互交织、相互影响,并没有严格的界线。为了从技术环节做更好的分析,下面分别具体介绍。
图1-10 APT攻击的3个环节
(1)攻击准备。在攻击准备环节,攻击者主要为实施入侵做前期的准备工作,主要包括以下几个方面。
①信息收集。通过收集被攻击目标的网络环境、安全保护体系、人际关系及可能的重要资产等信息,为制订入侵方案做前期的准备(如开发特定的攻击工具)。信息收集是贯穿全攻击生命过程的,攻击者在攻击计划中每获得一个新的控制点,就能掌握更多的信息,指导后续的攻击。
②技术准备。技术准备环节是指根据获取的信息,攻击者做出相应的技术性规划,常用的技术手段包括设计入侵路径并选定初始目标、发现可利用的漏洞并编写利用代码、木马准备、控制服务器和跳板等。
③周边渗透。攻击者会入侵一些外围目标,这些受害者本身不是攻击者攻击的目标,但因为可以被攻击者用来做跳板、DDoS服务器、获取相关信息等而被入侵。
(2)入侵实施。在入侵实施环节,攻击者针对实际的攻击目标逐步展开攻击,主要包括以下几个方面。
①常规手段。常规手段是指攻击者利用常规的网络攻击手段,将恶意代码植入到系统中。常见的方法有通过病毒传播感染目标、通过薄弱安全意识和薄弱的安全管理控制目标、通过社会工程学进行诱导、通过供应链植入等。
②缺陷和漏洞利用。缺陷是指信息系统中广泛存在且事实上已知的欠缺或不够完善的地方。系统中的缺陷主要包括默认密码、弱密码、默认配置和错误配置、计算机和网络的脆弱性等。这些缺陷在成本、时间和可替代等方面有时是无法按需修复的,在未修复之前就可能会被利用。利用漏洞入侵是专业黑客入侵重点目标常用的方式。当重点目标的安全防范意识和管理制度都比较健全时,单靠缺陷利用是不容易实现入侵的,这时攻击者会利用系统中存在的安全漏洞,特别是攻击者自己通过研究发现而其他人尚未知道的安全漏洞(0day漏洞)发起攻击。这类攻击从表面上看是对系统的合法操作,所以受害者很难会发现。主要的漏洞包括桌面文件处理类漏洞、浏览器类漏洞、桌面网络应用漏洞、网络服务类漏洞、系统逻辑类漏洞、对抗类漏洞、本地提权漏洞等。
③木马植入。在被攻击主机上植入事先准备的木马是ATP攻击过程中最为重要的一个环节。木马植入方式主要包括远程下载植入、绑定文档植入、绑定程序植入等。木马植入后,攻击者根据需要将会对木马进行激活和控制。
④渗透提取。当攻击者获得了对内网中一台主机的控制权后,为了实现对攻击目标的进一步控制,还需要在内网中进行渗透和提取,主要包括确定立足点、渗透和特权获取3项。其中,攻击者在获得了内网中某一台主机的控制权后,相当于获得了一个内网的立足点,而内网一旦进入则突破了网络已有的安全边界。之后,针对内网的安全防御就失去了作用,攻击者可以组合如社会工程学、文件共享服务器篡改程序、本地嗅探、漏洞等手段,通过借助立足点,对内网中的其他主机进行渗透,以获得更多主机的控制权。攻击者通过对更多主机的控制,逐步渗透到目标主机上并获得对该主机的特权。至此,攻击者成功完成了入侵。
(3)后续攻击。在后续攻击环节,攻击者将窃取所需要的信息或进行破坏,同时还会在内部进行深度渗透,以保证攻击行为被发现后还能够继续潜伏下来,不会前功尽弃。本环节主要包括以下几个方面。
①重要信息收集。攻击者利用获取到的权限和资源,分析和收集对攻击者有价值的信息。
②传送与控制。对于获取到的信息,攻击者需要将其传回到由自己控制的外部服务器上。为了逃避检测和审计,在信息传回时一般会模拟网络上一些常见的公开协议,并将数据进行加密。一些木马还会继续保存下来并被长期控制,实现与外部服务器之间的通信。另外,针对一些物理隔离的网络,攻击者一般使用移动介质摆渡的方式进行数据的传送。不过,一些破坏性木马不需要传送和控制就可以进行长期潜伏和等待,并按照事先确定的逻辑条件,触发破坏流程。例如,2013年美国针对伊朗核电站的“震网”蠕虫病毒,它在检测到所处的网络环境可能是伊朗核电站时,就修改离心机转速进行破坏。
③深度渗透。为了实现对已攻击目标的长期控制,确保在被受害者发现后还能复活,攻击者会渗透周边的一些机器,然后植入木马。但该木马可能处于非激活状态,检测和判断网络上是否有存活的木马,如果有则继续潜伏以避免被检测到,如果没有了,则启动工作。
④痕迹清除。为了避免攻击行为被发现,攻击者还需要做一些痕迹清除工作,主要清除一些日志信息,以躲避一些常规的检测手段。
1.4.8 社会工程学
近年来,随着移动互联网的广泛应用,各种移动智能终端在给人们的生活带来便捷的同时,也伴随着各类安全问题和隐患。攻击者利用人的弱点来实施网络攻击的现象越来越明显,并呈现上升趋势,目前近乎泛滥的电信诈骗就充分说明了这一点。
1. 社会工程学的概念
社会工程学(Social Engineering)是一种针对受害者心理弱点、本能反应、好奇心、信任、贪婪等心理陷阱采取诸如欺骗、伤害等危害手段,取得自身利益的攻击方法。准确地说,社会工程学不是一门科学,而是一门与人们日常活动相关的艺术和窍门。有人认为社会工程学不应该称为一门科学,因为它不是总能重复和成功,而且在信息容量足够大的情况下,会自动失效。社会工程学的窍门也蕴含了各式各样灵活的构思与变化因素。
社会工程学利用了人们的心理特征,通过骗取用户的信任,获取机密信息、系统设置等不公开资料,为网络攻击和病毒传播创造有利条件。社会工程学是入侵手段的最大化体现,不仅能够利用系统漏洞进行入侵,还能够通过人性的弱点进行入侵。当攻击者将恶意钓鱼网络攻击、网页挂马攻击、软件漏洞利用攻击等技术攻击手段与社会工程学融为一体时,传统的网络安全体系将会土崩瓦解。网络安全技术发展到一定程度后,起决定因素的不再是技术问题,而是人和管理。面对部署了防火墙、入侵检测系统、入侵防御系统等众多安全设备的内部网络,在利用技术一时无法奏效的情况下,攻击者可以借助社会工程学方法,从目标内部入手,对内部用户运用心理战术,通过搜集大量的目标外围信息甚至内部系统管理员的个人隐私,同时配合技术手段对目标展开攻击。
2. 社会工程学网络攻击方式
随着网络安全防护技术及安全防御产品应用的日益普及,很多常规的网络入侵手段实施起来越来越难。在这种情况下,更多的黑客将攻击手法转向了社会工程学,在不断应用过程中,社会工程学攻击手段不断成熟。黑客在实施社会工程学攻击之前必须掌握一定的心理学、人际关系、行为学等知识和技能,以便搜集和掌握实施社会工程学攻击行为所需要的信息。目前网络环境中,常见的社会工程学攻击方式主要有以下几种类型。
(1)网络钓鱼式攻击。网络钓鱼作为一种网络诈骗手段,主要利用人们的心理活动来实现诈骗。例如,攻击者利用欺骗性的电子邮件或伪造的Web站点来实施诈骗活动,受骗者往往会泄露个人的隐私信息,如在对方的诱导下泄露自己的信用卡号、账户和口令等。近几年,伪装成各大银行主页,通过恶意网站进行诈骗的事件频繁发生。网络钓鱼是基于人性贪婪及容易取信于人的心理因素来进行攻击的。常见的网络钓鱼攻击手段有利用虚假邮件进行攻击、利用虚假网站进行攻击、利用QQ及微信等即时通信工具进行攻击、利用黑客木马进行攻击、利用系统漏洞进行攻击、利用移动通信设备进行攻击等。
(2)密码心理学攻击。密码心理学是从人们心理入手,分析对方心理现状和变化,从而更快地得到所需要的密码。密码心理学采用的是心理战术,而非技术破解方法。常见的密码心理学攻击方式有:针对被攻击者生日或出生年月日的密码破解;针对用户移动电话号码或当地区号进行密码破解;针对用户身份证号码进行密码破解;针对用户姓名或其亲友及朋友姓名进行密码破解;针对一些网站服务器默认使用的密码进行破解;针对类似于“1234567”“abc123”等常用密码进行破解等。
(3)收集敏感信息攻击。攻击者可通过在QQ、微信、博客等通信平台上收集被攻击者的相关信息,经整理分析后作为实施攻击的参考和依据。常见的收集敏感信息攻击手段有:根据搜索引擎收集目标信息和资料;根据踩点和调查收集目标信息和资料;根据网络钓鱼收集目标信息和资料;根据企业人员管理中存在的缺陷收集目标信息和资料。
(4)恐吓被攻击者攻击。攻击者在实施社会工程学攻击过程中,常常会利用被攻击目标管理人员对安全、漏洞、病毒等内容的敏感性,以权威机构的身份出现,散布安全警告、系统风险之类的消息,使用危言耸听的伎俩恐吓、欺骗被攻击者,并声称不按照他们的方式去处理问题就会造成非常严重的危害和损失,进而借此方式实现对被攻击者敏感信息的获取。
(5)反向社会工程学攻击。反向社会工程学是指攻击者通过技术或非技术手段给网络或者计算机制造故障,使被攻击者深信问题的存在,诱使工作人员或者网络管理人员透漏或者泄露攻击者需要获取的信息。社会工程学陷阱就是通过交谈、欺骗、假冒等方式,从合法用户中套取相关的信息。这种攻击方式比较隐蔽,危害性较大,而且不容易防范。
3. 社会工程学攻击步骤
与技术性网络攻击方式不同,社会工程学攻击在实施前都要完成前期准备工作,收集和分析所需要的信息,再确定下一步的控制对象和范围。社会工程学攻击的主要步骤如下。
(1)信息收集。在社会工程学攻击的前期,需要针对具体攻击目标和攻击要求,收集被攻击者的相关信息。一方面,社会工程学攻击是一个较为复杂的过程,在攻击之前需要制订详尽的计划,在攻击过程中需要综合运用各方面的技巧,一些熟练的攻击者经常只需要通过简单的方法就可以达到既定目标;另一方面,一些人们平常不太在意的信息(如电话号码、生日、单位的工号等),对于攻击者来说都可能蕴含着一些可能被利用的有效攻击信息。在进行信息收集之前,需要做一些前期的准备工作,如当攻击者锁定的攻击目标是一个网络安全设备的管理人员时,攻击者在实施攻击之前至少需要学习和掌握有关网络安全的基础知识;否则无法与对方在同一语言体系内对话。
(2)心理学应用。对于收集到的信息,进行分类汇总和模拟测试,同时构造陷阱,以达到进一步获取信息并逐步实施攻击的目的。诱导、伪装和信任是社会工程学中心理学应用的重要手段。
(3)痕迹清除。痕迹清除是网络攻击过程中一个重要的环节。与实施技术攻击一样,社会工程学攻击过程中也需要采取相应的方式,避免将攻击痕迹呈现给被攻击者。
在社会工程学攻击中,人是整个安全体系中最为重要也是最可能出现问题的一个环节。