一 概述
常见的网络攻击,按照osi七层协议,可以分为:
1、物理层 线路侦听;
2、数据链路层 mac_flood ;
3、网络层 arp_poison,icmp_redirection;
4、传输层 tcp_flood(包含ack_flood和syn_flood),udp_flood(ntp,dns) ;
7、应用层 connection_flood,http_get等等;
按照攻击目的,可以分为:
中间人攻击(为了获得网络数据):mac_flood,arp_poison,icmp_redirection;
拒绝服务攻击:tcp_flood,udp_flood,connection_flood,http_get;
按照攻击者的位置,可以分为:
攻击者必须与攻击目标处于同一网段:mac_flood,arp_poison, icmp_redirection,线路侦听;
不必处于同一网段:其他;
1.1 TCP 三次握手与四次挥手
TCP 建立连接:三次握手
1.client: syn
2.server: syn+ack
3.client: ack
TCP 断开连接:四次挥手
1.client: fin
2.server: ack
3.server: fin
4.client: ack
1.2 UDP通信流程
udp 通信是无连接、不可靠的,数据是直接传输的,并没有协商的过程。
二 攻击防护原理
从 tcp/udp 协议栈原理介绍网络攻击防护原理:
2.1 Land (Land Attack)攻击
在 Land 攻击中,黑客利用一个特别打造的SYN 包–它的源地址和目标地址都被设置成某一个服务器地址进行攻击。此举将导致接受服务器向它自己的地址发送 SYN-ACK 消息,结果这个地址又发回 ACK 消息并创建一个空连接,每一个这样的连接都将保留直到超时,在 Land 攻击下,许多 UNIX将崩溃,NET变得极其缓慢(大约持续五分钟)。
LAND攻击利用了TCP连接建立的三次握手过程,通过向一个目标计算机发送一个TCP SYN报文(连接建立请求报文)而完成对目标计算机的攻击。与正常的TCP SYN报文不同的是,LAND攻击报文的源IP地址和目的IP地址是相同的,都是目标计算机的IP地址。这样目标计算机接收到这个SYN报文后,就会向该报文的源地址发送一个ACK报文,并建立一个TCP连接控制结构(TCB),而该报文的源地址就是自己,因此,这个ACK报文就发给了自己。这样如果攻击者发送了足够多的SYN报文,则目标计算机的TCB可能会耗尽,最终不能正常服务。这也是一种DOS攻击。
2.2 Ping of Death
Ping of Death 俗称“死亡之ping”,其攻击原理是攻击者A向受害者B发送一些尺寸超大(大于64K)的ICMP(Ping命令使用的是ICMP报文)报文对其进行攻击(对于有些路由器或系统,在接收到一个这样的报文后,由于处理不当,会造成系统崩溃、死机或重启)。
IP报文的最大长度是2^16-1=65535个字节,那么去除IP首部的20个字节和ICMP首部的8个字节,实际数据部分长度最大为:65535-20-8=65507个字节。所谓的尺寸超大的ICMP报文就是指数据部分长度超过65507个字节的ICMP报文。
最有效防御方式是禁止ICMP报文通过网络安全设备。
2.3 ICMPRedrt
ICMPRedrt,ICMP重定向信息是路由器向主机提供实时的路由信息,当一个主机收到ICMP重定向信息时,它就会根据这个信息来更新自己的路由表。由于缺乏必要的合法性检查,如果一个黑客想要被攻击的主机修改它的路由表,黑客就会发送ICMP重定向信息给被攻击的主机,让该主机按照黑客的要求来修改路由表。
ICMP重定向防御:
(1)网关端:
·关闭ICMP重定向(no ip redirects)。
·变长子网掩码划分网段。
·使用网络控制列表(ACL)和代理。
(2)主机端:
可以使用防火墙等过滤掉ICMP报文,或使用反间谍软件监控。
结合防ARP、IP欺骗等进行防御。
2.4 Smurf 攻击
Smurf是一种简单但有效的 DDoS 攻击技术,Smurf还是利用ping程序进行源IP假冒的直接广播进行攻击。(被攻击的机器为源IP,往局域网发送ping,大量reply之后瘫痪)在Internet上广播信息可以通过一定的手段(通过广播地址或其他机制)发送到整个网络中的机器。
当某台机器使用广播地址发送一个ICMP echo请求包时(例如Ping),一些系统会回应一个ICMP echo回应包,这样发送一个包会收到许多的响应包。Smurf攻击就是使用这个原理来进行的,同时它还需要一个假冒的源地址。也就是说Smurf在网络中发送的源地址为要攻击的主机地址,目的地址为广播地址的ICMP echo请求包,使许多的系统同时响应并发送大量的信息给被攻击主机(因为他的地址被攻击者假冒了)。
Smurf是用一个伪造的源地址连续ping一个或多个计算机网络,这就导致所有计算机响应的那个主机地址并不是实际发送这个信息包的攻击计算机。这个伪造的源地址,实际上就是攻击的目标,它将被极大数量的响应信息量所淹没。对这个伪造信息包做出响应的计算机网络就成为攻击的不知情的同谋。一个简单的 smurf 攻击最终导致网络阻塞和第三方崩溃,这种攻击方式要比 ping of death 洪水的流量高出一两个数量级。这种使用网络发送一个包而引出大量回应的方式也被叫做Smurf"放大"。
ICMP ECHO请求包用来对网络进行诊断,当一台计算机接收到这样一个报文后,会向报文的源地址回应一个ICMP ECHO REPLY。一般情况下,计算机是不检查该ECHO请求的源地址的,因此,如果一个恶意的攻击者把ECHO的源地址设置为一个广播地址,这样计算机在恢复REPLY的时候,就会以广播地址为目的地址,这样本地网络上所有的计算机都必须处理这些广播报文。如果攻击者发送的ECHO 请求报文足够多,产生的REPLY广播报文就可能把整个网络淹没。这就是所谓的smurf攻击。除了把ECHO报文的源地址设置为广播地址外,攻击者还可能把源地址设置为一个子网广播地址,这样,该子网所在的计算机就可能受影响。
Echo服务是一种非常有用的用于调试和检测的工具。这个协议的作用也十分简单,接收到什么原封发回就是了。 基于TCP协议的Echo服务有一种Echo服务被定义为在TCP协议上的面向连接的应用。服务器就在TCP端口7检测有无消息,如果有发送来的消息直接返回就是了。
原理:攻击者向网络广播地址发送ICMP包,并将回复地址设置成受害网络的广播地址,通过使用ICMP应答请求数据包来淹没受害主机的方式进行,最终导致该网络的所有主机都对次ICMP应答请求作出答复,导致网络阻塞。更加复杂的Smurf攻击攻击将源地址改为第三方受害者,最终导致第三方崩溃。
防范措施:
1、配置路由器禁止IP广播包进网 ;
2、配置网络上所有计算机的操作系统,禁止对目标地址为广播地址的ICMP包响应。
3、被攻击目标与ISP协商,有ISP暂时阻止这些流量。
4、对于从本网络向外部网络发送的数据包,本网络应该将其源地址为其他网络的这部分数据包过滤掉。
使用限制:
由于路由器等三层设备本身就不会转发目的地址是广播地址的报文,因此Smurf攻击在网络上很难形成攻击。在防火墙上体检Smurf攻击必须要求被攻击网络是之间连接到防火墙上。
2.5 winnuke攻击
winnuke是利用NetBIOS协议中一个OOB(Out of Band)的漏洞,也就是所谓的带外数据漏洞而进行的,它的原理是通过TCP/IP协议传递一个Urgent紧急数据包到计算机的137、138或139端口,当win95/NT收到这个数据包之后就会瞬间死机或蓝屏,不重新启动计算机就无法继续使用TCP/IP协议来访问网络。
带外数据OOB是指TCP连接中发送的一种特殊数据,它的优先级高于一般的数据,带外数据在报头中设置了URG标志,可以不按照通常的次序进入TCP缓冲区,而是进入另外一个缓冲区,立即可以被进程读取或根据进程设置使用SIGURG信号通知进程有带外数据到来。
后来的Winnuke系列工具已经从最初对单个IP的攻击发展到可以攻击一个IP区间范围的计算机,可以检测和选择端口,并且可以进行连续攻击,还能验证攻击的效果,所以使用它可以造成某个IP地址区间的计算机全部蓝屏死机。
此类攻击是由于利用软件开发过程中对某种特定类型的报文或请求没有处理,导致软件遇到这类型报文时运行出现异常,软件崩溃甚至系统崩溃。防范此类攻击的方法就是升级系统或给系统打补丁,也可以删除NetBIOS协议或关闭137、138、139端口。
在UDP连接建立后,每当服务器收到客户端的一个UDP 数据包,这个数据包中的内容将被丢弃,而服务器将发送一个数据包到客户端,其中包含长度为0~512字节之间随机值的任意字符。
NetBIOS作为一种基本的网络资源访问接口,广泛的应用于文件共享,打印共享,进程间通信(IPC),以及不同操作系统之间的数据交换。一般情况下,NetBIOS是运行在LLC2链路协议之上的,是一种基于组播的网络访问接口。为了在TCP/IP协议栈上实现NetBIOS,RFC规定了一系列交互标准,以及几个常用的TCP/UDP端口:
139:NetBIOS会话服务的TCP端口;
137:NetBIOS名字服务的UDP端口;
136:NetBIOS数据报服务的UDP端口。
Windows操作系统的早期版本(WIN95/98/NT)的网络服务(文件共享等)都是建立在NetBIOS之上的,因此,这些操作系统都开放了139端口(最新版本的WINDOWS 2000/XP/2003等,为了兼容,也实现了NetBIOS over TCP/IP功能,开放了139端口)。
WinNuke攻击就是利用了WINDOWS操作系统的一个漏洞,向这个139端口发送一些携带TCP带外(OOB)数据报文,但这些攻击报文与正常携带OOB数据报文不同的是,其指针字段与数据的实际位置不符,即存在重合,这样WINDOWS操作系统在处理这些数据的时候,就会崩溃。
2.6 SYN Flood
SYN Flood 伪造 SYN 报文向服务器发起连接,服务器在收到报文后用 SYN_ACK 应答,此应答发出去后,不会收到 ACK 报文,造成一个半连接。若攻击者发送大量这样的报文,会在被攻击主机上出现大量的半连接,耗尽其资源,使正常的用户无法访问,直到半连接超时。在一些创建连接不受限制的实现里,SYN Flood 具有类似的影响,它会消耗掉系统的内存等资源。
SYN Flood 攻击者发送大量的FIN包,服务器回应(SYN+ACK)包,但是攻击者不回应ACK包,这样的话,服务器不知道(SYN+ACK)是否发送成功,默认情况下会重试5次(tcp_syn_retries)。这样的话,对于服务器的内存,带宽都有很大的消耗。可以在收到客户端第三次握手 reset 、第二次握手发送错误的 ack,等 Client 回复 Reset,结合信任机制进行判断。
TCP SYN-flood拒绝服务攻击:
一般情况下,一个TCP连接的建立需要经过三次握手的过程,即:
1、 建立发起者向目标计算机发送一个TCP SYN报文;
2、 目标计算机收到这个SYN报文后,在内存中创建TCP连接控制块(TCB),然后向发起者回送一个TCP ACK报文,等待发起者的回应;
3、 发起者收到TCP ACK报文后,再回应一个ACK报文,这样TCP连接就建立起来了。
利用这个过程,一些恶意的攻击者可以进行所谓的TCP SYN拒绝服务攻击:
1、 攻击者向目标计算机发送一个TCP SYN报文;
2、 目标计算机收到这个报文后,建立TCP连接控制结构(TCB),并回应一个ACK,等待发起者的回应;
3、 而发起者则不向目标计算机回应ACK报文,这样导致目标计算机一致处于等待状态。
可以看出,目标计算机如果接收到大量的TCP SYN报文,而没有收到发起者的第三次ACK回应,会一直等待,处于这样尴尬状态的半连接如果很多,则会把目标计算机的资源(TCB控制结构,TCB,一般情况下是有限的)耗尽,而不能响应正常的TCP连接请求。
启用 SYN Flood 攻击检测功能时,要求设置一个连接速率阈值和半开连接数量阈值,一旦发现保护主机响应的 TCP 新建连接速率超过连接速度阈值或者半开连接数量超过半开连接数量阈值,防火墙会输出发生 SYN Flood 攻击的告警日志,并且可以根据用户的配置采取以下三种措施:
1、阻止发往该保护主机的后续连接请求;
2、切断保护主机上的最老半连接会话;
3、向 TCP Proxy 添加受保护 IP 地址。
2.7 ACK Flood
ACK Flood攻击是在TCP连接建立之后,所有的数据传输TCP报文都是带有ACK标志位的,主机在接收到一个带有ACK标志位的数据包的时候,需要检查该数据包所表示的连接四元组是否存在,如果存在则检查该数据包所表示的状态是否合法,然后再向应用层传递该数据包。如果在检查中发现该数据包不合法,例如该数据包所指向的目的端口在本机并未开放,则主机操作系统协议栈会回应RST包告诉对方此端口不存在。
防护:(1)利用对称性判断来分析出是否有攻击存在。所谓对称型判断,就是收包异常大于发包,因为攻击者通常会采用大量ACK包,并且为了提高攻击速度,一般采用内容基本一致的小包发送。这可以作为判断是否发生ACK Flood的依据,但是目前已知情况来看,很少有单纯使用ACK Flood攻击,都会和其他攻击方法混合使用,因此,很容易产生误判。
(2)建立一个hash表,用来存放TCP连接“状态”,相对于主机的TCP stack实现来说,状态检查的过程相对简化。例如,不作sequence number的检查,不作包乱序的处理,只是统计一定时间内是否有ACK包在该“连接”(即四元组)上通过,从而“大致”确定该“连接”是否是“活动的”。
(3)丢弃三次 ack,让对方重连:重发 syn 建立链接,后续是 syn flood 防护原理;学习正常 ack 的源,超过阈值后,该 ack 没有在正常源列表里面就丢弃 ack 三次,让对方重连:重发 syn 建立链接,后续是 syn flood 防护。
2.8 UDP Flood
短时间内向特定目标不断发送 UDP 报文,致使目标系统负担过重而不能处理合法的传输任务,就发生了 UDP Flood。
启用 UDP Flood 攻击检测功能时,要求设置一个连接速率阈值,一旦发现保护主机响应的 UDP 连接速率超过该值,防火墙会输出发生 UDP Flood 攻击的告警日志,并且根据用户的配置可以阻止发往该主机的后续连接请求。
原理与ICMP洪水类似,攻击者通过发送大量的UDP报文给目标计算机,导致目标计算机忙于处理这些UDP报文而无法继续处理正常的报文。
2.9 PortScan
攻击者运用扫描工具探测目标地址和端口,用来确定哪些目标系统连接在目标网络上以及主机开启哪些端口服务。
根据TCP协议规范,当一台计算机收到一个TCP连接建立请求报文(TCP SYN)的时候,做这样的处理:
1、 如果请求的TCP端口是开放的,则回应一个TCP ACK报文,并建立TCP连接控制结构(TCB);
2、 如果请求的TCP端口没有开放,则回应一个TCP RST(TCP头部中的RST标志设为1)报文,告诉发起计算机,该端口没有开放。
相应地,如果IP协议栈收到一个UDP报文,做如下处理:
1、 如果该报文的目标端口开放,则把该UDP报文送上层协议(UDP)处理,不回应任何报文(上层协议根据处理结果而回应的报文例外);
2、 如果该报文的目标端口没有开放,则向发起者回应一个ICMP不可达报文,告诉发起者计算机该UDP报文的端口不可达。
利用这个原理,攻击者计算机便可以通过发送合适的报文,判断目标计算机哪些TCP或UDP端口是开放的,过程如下:
1、 发出端口号从0开始依次递增的TCP SYN或UDP报文(端口号是一个16比特的数字,这样最大为65535,数量很有限);
2、 如果收到了针对这个TCP报文的RST报文,或针对这个UDP报文的ICMP不可达报文,则说明这个端口没有开放;
3、 相反,如果收到了针对这个TCP SYN报文的ACK报文,或者没有接收到任何针对该UDP报文的ICMP报文,则说明该TCP端口是开放的,UDP端口可能开放(因为有的实现中可能不回应ICMP不可达报文,即使该UDP端口没有开放)。这样继续下去,便可以很容易的判断出目标计算机开放了哪些TCP或UDP端口,然后针对端口的具体数字,进行下一步攻击,这就是所谓的端口扫描攻击。
启用扫描攻击保护功能时,要求设置一个扫描速率阈值,一旦存在 IP 主动发起的连接速率超过该值,则判定该 IP 正在进行扫描探测,防火墙会输出发生扫描攻击的告警日志,阻止扫描者发起的后续连接,并且可以根据用户配置将扫描者加入到黑名单。
2.10 ICMP Flood
ICMP泛洪(ICMP flood):利用ICMP报文 进行攻击的一种方法。短时间内向特定目标不断请求 ICMP 回应,致使目标系统负担过重而不能处理合法的传输任务,就发生了 ICMP Flood。如果攻击者向目标主机发 送大量的ICMP ECHO报文,将产生ICMP泛洪, 目标主机会将大量的时间和资源用于处理ICMP ECHO报文,而无法处理正常的请求或响应,从而实现对目标主机的攻击。
启用 ICMP Flood 攻击检测功能时,要求设置一个连接速率阈值,一旦发现保护主机 ICMP 连接速率超过该值,防火墙会输出发生 ICMP Flood 攻击的告警日志,并且根据用户的配置可以阻止发往该主机的后续连接请求。
参考资料
走近科学:揭秘在线 DDoS 攻击平台(上)
http://www.freebuf.com/special/107119.html
走近科学:揭秘在线 DDoS 攻击平台(下)
http://www.freebuf.com/news/107916.html
卡巴斯基 DDoS 调查报告
https://securelist.com/analysis/quarterly-malware-reports/76464/kaspersky-DDoS-intelligence-report-for-q3-2016/
DDoS 攻击报道
http://tech.huanqiu.com/cloud/2014-12/5288347.html
高效的 DDoS 攻击探测与分析工具 FastNetMon
http://www.freebuf.com/news/67204.html
腾讯宙斯盾系统构建之路
https://security.tencent.com/index.php/blog/msg/62
鲍旭华等《破坏之王:DDoS 攻击与防范深度剖析》
网易云《DDoS 攻击与防御:从原理到实践》https://blog.csdn.net/wangyiyungw/article/details/80537891
本文未经许可请勿转载。