拒绝服务攻击课本143页——144页•凡是造成目标计算机拒绝服务的攻击都成为拒绝服务(DenialofService,DoS)攻击,其目的是使目标计算机或网络无法提供正常的服务。•最常见的DoS攻击是计算机网络带宽攻击和连通性攻击。带宽攻击是以极大的通信量冲击网络,使网络所有可用的带宽都被消耗掉,最后导致合法用户的请求无法通过。连通性攻击指用大量的连续请求计算机,最终导致计算机无法再处理合法用户的请求。一个最贴切的例子就是:成千上百的人给同一电话打电话,这样其他的用户就再也打不进电话了,这就是连通性DoS攻击。比较著名的拒绝服务攻击包括:SYN风暴,Smurf攻击和利用处理程序错误进行攻击。今天我为大家讲的是SYN风暴。SYN风暴(SYNflooding)TCP握手协议SYN攻击原理SYN攻击工具检测SYN攻击SYN攻击防范技术TCP握手协议•在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。•第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;•第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;•第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。•完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:•未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(SYN=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于SYN_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。Backlog参数:表示未连接队列的最大容纳数目。•SYN-ACK重传次数服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。•半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。SYN攻击原理•SYN攻击属于DDOS攻击中的一种,利用TCP/IP的缺陷进行网络攻击,可以使用很小的资源取得十分显著的效果。服务器收到客户端的SYN包,之后进入SYN_RECV状态,服务器的等待队列中增加一个条目,服务器未收到客户端的确认包,进行重传,一直到超时之后,该条目从未链接队列中删除。客户端不断地发送SYN包,而不响应来自服务器的SYN/ACK,等待队列的条目迅速增长,最后服务器的等待队列达到最大数目,之后就不能再接受新的连接,一直到链接超时才从队列中删除对应的条目。配合IP地址欺骗技术,该方法可以取得十分良好的效果,基本上在攻击期间,服务器将不能给正常的用户提供服务。这个攻击办法利用了TCP/IP协议的缺陷,攻击的目标不止于服务器,任何网络设备,只要开启了网络服务器,都可能会受到这种攻击,导致处理器资源被大量占用,内存被用完,大量队列等待处理,针对网络设备的攻击往往会导致整个网络瘫痪。SYN攻击工具•SYN攻击实现起来非常的简单,互联网上有大量现成的SYN攻击工具。•windows系统下的SYN工具•以synkill.exe为例,运行工具,选择随机的源地址和源端囗,并填写目标机器地址和TCP端囗,激活运行,很快就会发现目标系统运行缓慢。如果攻击效果不明显,可能是目标机器并未开启所填写的TCP端囗或者防火墙拒绝访问该端囗,此时可选择允许访问的TCP端囗,通常,windows系统开放TCP139端囗,UNIX系统开放TCP7、21、23等端囗。检测SYN攻击•检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。我们使用系统自带的netstat工具来检测SYN攻击。•下面是在LINUX系统中看到的,很多连接处于SYN_RECV状态(在WINDOWS系统中是SYN_RECEIVED状态),源IP地址都是随机的,表明这是一种带有IP欺骗的SYN攻击。•我们也可以通过下面的命令直接查看在LINUX环境下某个端囗的未连接队列的条目数:•#netstat-n-pTCPgrepSYN_RECVgrep:22wc-l324•显示TCP端囗22的未连接数有324个,虽然还远达不到系统极限,但应该引起管理员的注意。SYN攻击防范技术•关于SYN攻击防范技术,人们研究得比较早。归纳起来,主要有两大类,一类是通过防火墙、路由器等过滤网关防护,另一类是通过加固TCP/IP协议栈防范.但必须清楚的是,SYN攻击不能完全被阻止,我们所做的是尽可能的减轻SYN攻击的危害,除非将TCP协议重新设计。SYN风暴2、加固TCP/IP协议栈1、过滤网关防护1、过滤网关防护•这里,过滤网关主要指明防火墙,当然路由器也能成为过滤网关。防火墙部署在不同网络之间,防范外来非法攻击和防止保密信息外泄,它处于客户端和服务器之间,利用它来防护SYN攻击能起到很好的效果。过滤网关防护主要包括超时设置,SYN网关和SYN代理三种。•■网关超时设置:•防火墙设置SYN转发超时参数(状态检测的防火墙可在状态表里面设置),该参数远小于服务器的timeout时间。当客户端发送完SYN包,服务端发送确认包后(SYN+ACK),防火墙如果在计数器到期时还未收到客户端的确认包(ACK),则往服务器发送RST包,以使服务器从队列中删去该半连接。值得注意的是,网关超时参数设置不宜过小也不宜过大,超时参数设置过小会影响正常的通讯,设置太大,又会影响防范SYN攻击的效果,必须根据所处的网络应用环境来设置此参数。•■SYN网关:•SYN网关收到客户端的SYN包时,直接转发给服务器;SYN网关收到服务器的SYN/ACK包后,将该包转发给客户端,同时以客户端的名义给服务器发ACK确认包。此时服务器由半连接状态进入连接状态。当客户端确认包到达时,如果有数据则转发,否则丢弃。事实上,服务器除了维持半连接队列外,还要有一个连接队列,如果发生SYN攻击时,将使连接队列数目增加,但一般服务器所能承受的连接数量比半连接数量大得多,所以这种方法能有效地减轻对服务器的攻击。•■SYN代理:•当客户端SYN包到达过滤网关时,SYN代理并不转发SYN包,而是以服务器的名义主动回复SYN/ACK包给客户,如果收到客户的ACK包,表明这是正常的访问,此时防火墙向服务器发送ACK包并完成三次握手。SYN代理事实上代替了服务器去处理SYN攻击,此时要求过滤网关自身具有很强的防范SYN攻击能力。2、加固TCP/IP协议栈•防范SYN攻击的另一项主要技术是调整tcp/ip协议栈,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYNcookies技术、增加最大半连接和缩短超时时间等。tcp/ip协议栈的调整可能会引起某些功能的受限,管理员应该在进行充分了解和测试的前提下进行此项工作。•■SynAttackProtect机制•为防范SYN攻击,win2000系统的tcp/ip协议栈内嵌了SynAttackProtect机制,Win2003系统也采用此机制。SynAttackProtect机制是通过关闭某些socket选项,增加额外的连接指示和减少超时时间,使系统能处理更多的SYN连接,以达到防范SYN攻击的目的。默认情况下,Win2000操作系统并不支持SynAttackProtect保护机制,需要在注册表以下位置增加SynAttackProtect键值:•HKLMSYSTEMCurrentControlSetServicesTcpipParameters•当SynAttackProtect值为0或不设置时,系统不受SynAttackProtect保护。•当SynAttackProtect值为1时,系统通过减少重传次数和延迟未连接时路由缓冲项(routecacheentry)防范SYN攻击。•当SynAttackProtect值为2时(Microsoft推荐使用此值),系统不仅使用backlog队列,还使用附加的半连接指示,以此来处理更多的SYN连接,使用此键值时,tcp/ip的TCPInitialRTT、windowsize和可滑动窗囗将被禁止。•我们应该知道,平时,系统是不启用SynAttackProtect机制的,仅在检测到SYN攻击时,才启用,并调整tcp/ip协议栈。那么系统是如何检测SYN攻击发生的呢?事实上,系统根据TcpMaxHalfOpen,TcpMaxHalfOpenRetried和TcpMaxPortsExhausted三个参数判断是否遭受SYN攻击。•TcpMaxHalfOpen表示能同时处理的最大半连接数,如果超过此值,系统认为正处于SYN攻击中。Win2000server默认值为100,Win2000Advancedserver为500。•TcpMaxHalfOpenRetried定义了保存在backlog队列且重传过的半连接数,如果超过此值,系统自动启动SynAttackProtect机制。Win2000server默认值为80,Win2000Advancedserver为400。•TcpMaxPortsExhausted是指系统拒绝的SYN请求包的数量,默认是5。•如果想调整以上参数的默认值,可以在注册表里修改(位置与SynAttackProtect相同)•SYNcookies技术•我们知道,TCP协议开辟了一个比较大的内存空间backlog队列来存储半连接条目,当SYN请求不断增加,并这个空间,致使系统丢弃SYN连接。为使半连接队列被塞满的情况下,服务器仍能处理新到的SYN请求,SYNcookies技术被设计出来。•SYNcookies应用于linux、FreeBSD等操作系统,当半连接队列满时,SYNcookies并不丢弃SYN请求,而是通过加密技术来标识半连接状态。•在TCP实现中,当收到客户端的SYN请求时,服务器需要回复SYN+ACK包给客户端,客户端也要发送确认包给服务器。通常,服务器的初始序列号由服务器按照一定的规律计算得到或采用随机数,但在SYNcookies中,服务器的初始序列号是通过对客户端IP地址、客户端端囗、服务器IP地址和服务器端囗以及其他一些安全数值等要素进行hash运算,加密得到的,称之为cookie。当服务器遭受SYN攻击使得backlog队列满时,服务器并不拒绝新的SYN请求,而是回复cookie(回复包的SYN序列号)给客户端,如果收到客户端的ACK包,服务器将客户端的ACK序列号减去1得到cookie比较值,并将上述要素进行一次hash运算,看看是否等于此cookie。如果相等,直接完成三次握手(注意:此时并不用查看此连接是否属于backlog队列)。•在RedHatlinux中,启用SYNcookies是通过在启动环境中设置以下命令来完成:•#echo1??/proc/sys/net/ipv4/tcp_syncookies•■增加最大半连接数•大量的SYN请求导致未连接队列被塞满,使正常的TCP连接无法顺利完成三次握手,通过增大未连接队列空间可以缓解这种压力。当然backlog队列需要占用大量的内存资源,不能被无限的扩大。•WIN2000:除了上面介绍的TcpMaxHalfOpen,TcpMaxHalfOpenRetried参数外,WIN2000操作系统可以通过设置动态backlog(d