攻击和防御技术发展史
DoS是Denial of Service的简称,即拒绝服务。造成DoS的攻击行为被称为DoS攻击,其目的是使计算机或网络无法正常提供服务。
最常见的DoS攻击就是单包攻击,一般都是以个人为单位的攻击者发动的,攻击报文也比较单一。这类攻击虽然破坏力强大,但是只要掌握了攻击的特征,防御起来还是比较容易的。
单包攻击分为以下三大类:
畸形报文攻击:通常指攻击者发送大量有缺陷的报文,从而造成被攻击的系统在处理这类报文时崩溃。
扫描类攻击:是一种潜在的攻击行为,并不造成直接的破坏结果,通常是攻击者发动真正攻击前的网络探测行为。
特殊控制类报文攻击:也是一种潜在的攻击行为,并不造成直接的破坏结果,攻击者通过发送特殊控制报文探测网络结构,为后续发动真正的攻击做准备。
防御单包攻击是防火墙具备的最基本的防范功能,华为全系列防火墙都支持对单包攻击的防御。
① Ping of Death 攻击及防御
Ping of Death攻击指的是攻击者不断的通过Ping命令向受害者发送超过65535字节的报文,导致受害者的系统崩溃。
防火墙是通过判定报文的大小是否大于65535字节来防御Ping of Death 攻击的,如果报文大于65535字节,则判定为攻击报文,防火墙直接丢弃该报文。
② Land 攻击及防御
Land 攻击是指攻击者向受害者发送伪造的TCP报文,此TCP报文的源地址和目的地址同为受害者的IP地址,这将导致受害者向它自己的地址发送回应报文,从而造成资源的消耗。
防火墙在防御Land攻击时,检查TCP报文的源地址和目的地址是否相同,或者TCP报文的源地址是否为环回地址,如果TCP报文的源地址和目的地址相同或者源地址为环回地址,则直接丢弃该报文。
③ IP地址扫描攻击
IP地址扫描攻击是指攻击者使用ICMP报文(如执行Ping和Tracert命令)探测目标地址,或者使用TCP/UDP报文对特定地址发起连接,通过判断是否有应答报文,确定目标地址是否连接在网络上。
IP地址扫描攻击并没有直接造成恶劣后果,它只是一种探测行为,通常是为了后续发动破坏性攻击做准备。
防火墙防御IP地址扫描攻击时,对收到的TCP、UDP、ICMP报文进行检测,某个源IP地址连续发送报文时,如果该IP发送的报文的目的IP地址与其发送的前一个报文的目的IP地址不同,则记为一次异常。当异常次数超过预定义的阈值,则认为该源IP正在进行IP地址扫描攻击,防火墙会将该源IP地址加入黑名单,后续收到来自该源IP地址的报文时,直接丢弃。
DDoS攻击是指攻击者通过控制大量的僵尸主机(俗称“肉鸡”),向被攻击目标发送大量精心构造的攻击报文,造成被攻击者所在网络的链路拥塞、系统资源耗尽,从而使被攻击者产生拒绝向正常用户的请求提供服务的效果。
SYN Flood 攻击就属于DDoS攻击的一种,属于技术含量很高的“高大上”,称霸DDoS攻击领域很久,它很难通过单个报文的特征或者简单的统计限流防御住它,因为它“太真实”“太常用”。
SYN Flood具有强大的变异能力,在攻击发展潮流中一直没有被湮没,有如下特点:
从字面上看,SYNFlood攻击与TCP协议中的SYN报文有关,我们先来回顾一下TCP三次握手的过程。
(1)第一次握手:客户端向服务器端发送一个SYN(Synchronize)报文。
(2)第二次握手:服务器收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,ACK即表示确认(Acknowledgment)。
(3)第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送ACK报文进行确认,ACK报文发送完毕,三次
握手建立成功。
SYN Flood攻击正是利用了TCP三次握手的这种机制。攻击者向目标服务器发送大量的SYN报文请求,这些SYN报文的源地址一般都是不存在或不可达的。当服务器回复SYN+ACK报文后,不会收到ACK回应报文,导致服务器上建立大量的半连接。这样,服务器的资源会被这些半连接耗尽,导致无法回应正常的请求。
防火墙防御SYN Flood攻击时,一般会采用TCP代理
和TCP源探测
两种方式。
①防御方法之TCP代理
TCP代理是指防火墙部署在客户端和服务器中间,当客户端向服务器发送的SYN报文经过防火墙时,防火墙代替服务器与客户端建立TCP三次握手,一般用于报文来回路径一致的场景。
(1)防火墙收到SYN报文,对SYN报文进行拦截,代替服务器回应SYN+ACK报文。
(2)如果客户端不能正常回应ACK报文,则判定此SYN报文为非正常报文,防火墙代替服务器保持半连接一定时间后,放弃此连接。
(3)如果客户端正常回应ACK报文,防火墙与客户端建立正常的三次握手,则判定此SYN报文为正常业务报文,非攻击报文。防火墙立即与服务器再建立三次握手,此连接的后续报文直接送到服务器。
整个TCP代理的过程对于客户端和服务器都是透明的。
TCP代理过程中,防火墙会对收到的每一个SYN报文进行代理和回应,并保持半连接,所以当SYN报文流量很大时,对防火墙的性能要求非常的高。
TCP代理的本质就是利用防火墙的高性能,代替服务器承受半连接带来的资源消耗,由于防火墙的性能一般比服务器高很多,所以可以有效防御这种消耗资源的攻击。
但是TCP代理只能应用在报文来回路径一致的场景中
,如果来回路径不一致,代理就会失败,那么就需要通过TCP源探测来防御SYN Flood攻击。
②防御方法之TCP源探测
TCP源探测是防火墙防御SYNFlood攻击的另一种方式,在报文来回路径不一致的场景中也能使用,应用更加普遍。
(1)当防火墙收到客户端发送的SYN报文时,对SYN报文进行拦截,并伪造一个带有错误序列号的的SYN+ACK报文回应给客户端。
(2)如果客户端是虚假源,则不会对错误的SYN+ACK报文进行回应。
(3)如果客户端是真实源发送的正常请求SYN报文,当收到错误的SYN+ACK报文时,会再发出一个RST报文,让防火墙重新发一个正确的SYN+ACK报文;防火墙收到这个RST报文后,判定客户端为真实源,则将这个源加入白名单,在白名单老化前,这个源发出的报文都认为是合法的报文,防火墙直接放行,不在做验证。
回头对比一下TCP代理和TCP源探测两种方式,会发现TCP源探测对客户端的真实性只进行一次验证,通过后就加入白名单,后续就不会每次都对这个客户端发出的
SYN报文进行验证,这样就大大提高了防御效率和性能,有效缓解防火墙的性能压力。
TCP代理和TCP源探测配置命令
TCP协议是一种面向连接的传输协议,而UDP协议是一个无连接的传输协议。使用UDP传输数据之前,客户端和服务器之间不建立连接,如果在从客户端到服务器端的传递过程中出现数据包的丢失,UDP协议本身并不能做出任何检测或提示。因此,把UDP称为不可靠的传输协议。
TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,使传输速度受到严重的影响。而UDP,由于排除了信息可靠传递机制,极大降低了执行时间,使传输速度得到了保证。
UDP Flood攻击属于带宽类攻击,攻击者通过僵尸主机向目标服务器发送大量UDP报文,这种UDP报文的字节数很大且速率非常快,通常会造成以下危害:
防火墙对UDP Flood攻击的防御并不能像SYN Flood一样进行源探测,因为它不建立连接。
①防御方法之限流
防火墙防御UDP Flood攻击最简单的方式就是限流,通过限流将链路中的UDP报文控制在合理的带宽范围之内。防火墙上针对UDP Flood攻击的限流有4种方式。
②防御方法之指纹学习
限流虽然可以有效缓解链路带宽的压力,但是这种方式简单粗暴,容易对正常业务造成误判。为了解决这个问题,防火墙又进一步推出了针对UDP Flood 攻击的指纹学习功能。
如下图所示,指纹学习是通过分析客户端向服务器发送的UDP报文载荷是否有大量的一致内容,来判定这个UDP报文是否异常。防火墙对去往目标服务器的UDP报文进行统计,当UDP报文达到告警阈值时,开始对UDP报文的指纹进行学习。如果相同的特征频繁出现,就会被学习成指纹。后续匹配指纹的UDP报文将被防火墙判定为攻击报文而丢弃,没有匹配指纹的UDP报文将被防火墙转发。
UDP Flood 攻击报文通常都拥有相同的特征字段,比如都包含某一个字符串,或整个UDP报文的内容一致。这是因为攻击者在发起UDPFlood攻击时,为了加大攻击频率,通常都会使用攻击工具构造相同内容的UDP报文,然后高频发送到攻击目标,所以攻击报文具有很高的相似性。而正常业务的UDP报文一般每个报文中的内容都是不一样的,所以通过指纹学习,防火墙就可以区分攻击报文和正常报文,减少误判。
从下面两张抓包截图中可以看出,到达相同目的IP地址的两个UDP报文的载荷是完全一样的,如果防火墙收到大量的类似这样的UDP报文,那么就可以判定发生了UDP Flood攻击。
防火墙防御UDP Flood攻击主要有两种方式:限流和指纹学习。两种方式各有利弊。限流方式属于暴力型,可以很快将UDP流量限制在一个合理的范围内,但是不分青红皂白,超过就丢,可能会丢弃正常报文;而指纹学习属于理智型,不会随意丢弃报文,但是发生攻击后需要有一个指纹学习的过程。目前,指纹学习功能是针对UDP Flood 攻击的主要手段。
在讲DNS Flood攻击之前,我们先了解一下DNS协议的工作原理,我们在上网访问网页的时候,输入的网址都是域名,由DNS服务器解析为对应的IP地址。如下图所示,我们访问news.huawei.com,首先会将DNS域名解析请求发送到本地DNS服务器。如果本地DNS服务器上有此域名和IP地址的对应关系,本地DNS服务器就会将查询到的IP地址返回给客户端。
如果本地DNS服务器查找不到该域名与IP地址对应关系时,它会向上一级DNS服务器发出域名查询请求,上一级DNS服务器将查询到的IP地址返回给本地DNS服务器,然后由本地DNS 服务器返回给客户端。为了减少Internet 上DNS报文的数量,本地DNS服务器会将该域名和IP地址对应关系存储在自己的缓存中,后续再有主机请求该域名
时,本地DNS服务器会直接用缓存区中记录的信息回应。
DNS Flood攻击指的是攻击者向DNS服务器发送大量的不存在的域名解析请求,导致DNS服务器瘫痪,无法处理正常的域名解析请求。
DNS服务器支持TCP协议和UDP协议两种解析方式,一般情况下,我们使用的都是UDP协议,因为UDP协议提供
无连接服务,传输速度快,可以降低DNS服务器的负载。也有特殊情况下需要通过TCP协议进行解析,例如,DNS服务器上就可以设置让客户端使用TCP协议来发起解析请求。当客户端向DNS服务器发起解析请求时,DNS服务器回应的报文中有一个TC标志位,如果TC标志位置1,就表示DNS服务器要求客户端使用TCP协议发起解析请求。
防火墙就是利用这一机制对DNS Flood攻击进行防御,探测发送DNS 请求报文的主机是否为真实存在的客户端。
如下图所示,防火墙先对DNS请求报文进行统计,如果发现连续一段时间内去往同一目的地址的DNS请求报文超过预先设置的阈值,则启动DNS源探测。
启动DNS源探测后,防火墙收到DNS请求,会代替DNS服务器回应DNS请求,并将DNS回应报文中的TC标志位置1,要求客户端使用TCP协议发送DNS请求。接下来如果防火墙没有收到客户端使用TCP协议发送的DNS请求,则判定此客户端为虚假源;如果防火墙收到了客户端使用TCP协议发送的DNS请求,则判定此客户端为真实源。防火墙将该客户端的IP地址加入白名单,在白名单老化前,这个客户端发出的DNS 请求报文都被认为是合法的报文。
我们来看一组真实客户端正常响应防火墙源探测的抓包信息:
①客户端使用UDP协议向DNS服务器发起解析请求;
②防火墙收到报文后,代替DNS服务器回应,将回应报文中的TC标志位置1,让客户端使用TCP协议发送解析请求;
③客户端收到回应报文后,按照要求,使用TCP协议发送解析请求;
DNS源探测方式可以很好地防御DNS Flood攻击,但是在实际环境中,并不是所有场景都适用。因为在源探测过程中,防火墙会要求客户端通过TCP协议发送DNS请求,但并不是所有的客户端都支持用TCP协议发送DNS请求,所以这种方式在使用过程中也有限制。如果真实的客户端不支持用TCP协议发送DNS请求,使用此功能时,就会影响正常业务。
HTTP Flood攻击指的是攻击者控制僵尸主机向目标服务器发送大量的HTTP请求文,这些请求报文中一般都包含涉及数据库操作的URI(Uniform Resource Identifier,统一资源标识符)或其他消耗系统资源的URI,目的是为了造成目标服务器资源耗尽,无法响应正常请求。
说明
:URI用来定义Web上的资源,而URL(Uniform Resource Locator,统一资源定位器)用来找到Web上的资源,例如,www.huawei.com/abc/12345.html是一个URL,/abc/12345.html是一个URI。
防御HTTP Flood攻击时用到了HTTP协议中的一个技术点:HTTP重定向。HTTP重定向指的是客户端向Web服务器请求www.huawei.com/1.html页面,Web 服务器返回一个命令,让客户端改为访问www.huawei.com/2.html页面,这样就把客户端的访问重定向到一个新的URI。
HTTP重定向相当于Web服务器的“自我修复”的过程,一般常用于Web 服务器上的URI已经过期,而客户端仍然访问这个URI的情况,此时Web服务器将客户端的访问请求重定向到新的URI,使客户端能够得到访问结果,如下图所示。
防火墙就是利用这一机制对HTTP Flood攻击进行防御,探测发送HTTP请求报文的主机是否为真实存在的客户端。
如下图所示,防火墙先对HTTP请求报文进行统计,如果发现连续一段时间内去往同一目的地址的HTTP请求报文超过预先设置的阈值,则启动HTTP源探测。
启动HTTP源探测后,防火墙收到HTTP请求,会代替HTTP服务器回应HTTP请求,将客户端的访问重定向到一个新的虚构的URI。接下来如果防火墙没有收到客户端访问该URI的请求,则判定此客户端为虚假源;如果防火墙收到客户端访问该URI的请求,则判定此客户端为真实源,防火墙将该客户端的IP地址加入白名单。然后防火墙会继续向客户端发送HTTP重定向命令,将客户端的访问重定向到原始的URI,即一开始客户端访问的那个URI。在白名单老化前,后续这个客户端发出的HTTP请求报文都被认为是合法的报文。