SYN Flood攻击的基本原理及防御
SYNFlood攻击

SYNFlood攻击什么是SYN Flood攻击?SYN泛洪(半开放式攻击)是⼀种,旨在通过消耗所有可⽤的服务器资源来使服务器⽆法⽤于合法流量。
通过重复发送初始连接请求(SYN)数据包,攻击者可以淹没⽬标服务器计算机上的所有可⽤端⼝,从⽽使⽬标设备对合法流量的响应缓慢或完全不响应。
SYN Flood攻击如何⼯作?SYN Flood攻击通过利⽤连接的握⼿过程来⼯作。
在正常情况下,TCP连接表现出三个不同的过程以进⾏连接。
1. ⾸先,客户端将SYN数据包发送到服务器以启动连接。
2. 然后,服务器使⽤SYN / ACK数据包响应该初始数据包,以便确认通信。
3. 最后,客户端返回⼀个ACK数据包,以确认已从服务器接收到该数据包。
完成发送和接收数据包的顺序之后,TCP连接将打开并能够发送和接收数据。
为了创建,攻击者利⽤以下事实:接收到初始SYN数据包后,服务器将以⼀个或多个SYN / ACK数据包进⾏响应,并等待握⼿的最后⼀步。
运作⽅式如下:1. 攻击者通常使⽤IP地址将⼤量SYN数据包发送到⽬标服务器。
2. 然后,服务器响应每个连接请求,并保留⼀个开放的端⼝以准备接收响应。
3. 当服务器等待永远不会到达的最终ACK数据包时,攻击者将继续发送更多SYN数据包。
每个新的SYN数据包的到来使服务器暂时维持新的开放端⼝连接⼀段时间,⼀旦所有可⽤端⼝都被利⽤,服务器将⽆法正常运⾏。
在⽹络中,当服务器使连接保持打开状态但连接另⼀端的计算机未打开时,该连接被视为半打开。
在这种DDoS攻击中,⽬标服务器会不断离开开放的连接,并等待每个连接超时,然后端⼝才能再次可⽤。
结果是,这种类型的攻击可以被视为“半开放式攻击”。
SYN泛滥可以通过三种不同的⽅式发⽣:1. 直接攻击:未被欺骗的SYN泛洪称为直接攻击。
在这种攻击中,攻击者根本不会掩盖其IP地址。
由于攻击者使⽤具有真实IP地址的单个源设备来发起攻击,因此攻击者极易受到发现和缓解的影响。
[原创]SYNflood攻击原理
![[原创]SYNflood攻击原理](https://img.taocdn.com/s3/m/afed2bfd647d27284a73513e.png)
[原创]SYNflood攻击原理剖析"拒绝服务"攻击-SYN拒绝服务一、洪水——大自然对人类的报复每一年,自然界都要用各种方式去报复人们对它做的一切,例如洪水。
每一年,人们都要为洪水后满地的狼籍和可能造成的人员伤亡和财产损失而发愁。
为了抵抗洪水,人们砍伐树木挖采岩石建造更高的堤坝;为了破坏这些堤坝,大自然发起更猛烈的洪水冲垮这些防护措施。
在大自然与人类抗衡的同时,网络上也有人与人之间的抗衡。
每一年,有些人总要不断试验各种令某些网站长时间无法访问的攻击方法。
每一年,投资者都要因为这些网站被恶意停止所造成的经济损失头痛。
为了抵抗这些人的攻击,技术人员研究各种方法让这些攻击造成的损失降低;为了各种目的,攻击者们研究更多的攻击方法让网站再次瘫痪。
这种攻击被称为“Denial of Service(DoS)”,臭名昭著的“拒绝服务”攻击。
它通常使用不只一台机器进行攻击,攻击者能同时控制这些机器,这种结构就是“Distributed”,分布式。
所以,我们要讨论的拒绝服务,默认都是指“Distributed Denialof Service(DDoS)”,分布式拒绝服务。
二、面对洪水……1.洪水以外的东西——被滥用的SYN拒绝服务(Synchronize Denial of Service)当一个地区即将发生洪水(或者已经发生)的时候,当地居民的表现很少有镇定的:东奔西跑的、收拾财物的、不知所措的……整个城镇乱成一锅粥,造成的后果就是街道交通混乱,谁也跑不了。
这个问题到了网络上,就变成了一堆数据包只能在服务器外面乱撞而不入。
为什么会这样,因为攻击者使用了SYN攻击。
要明白SYN攻击的原理,要从连接建立的过程开始说起。
从我们输入一个网址到我们能看到这个网页,机器在非常短的时间内为我们做了三件重要的事情:1.机器发送一个带有“ SYN”(同步)标志的数据包给服务器,请求连接;2.服务器返回一个带有SYN标志和ACK(确认)标志数据包给机器;3.机器也返回一个ACK确认标志数据包给服务器,数据传输建立。
SYN FlOOD攻击原理、检测及防御

关键 词 : S Y N F l o o务攻击和分布式拒绝服务攻击是网络攻击方式中危害极 3 S Y N F l o o d攻击 检测 大的攻击, 和其他的网络攻击不 同, 拒绝服务攻击不是对攻击 目标的 3 . 1传统 检测 方法 系统和数据进行危害, 而是对攻击 目标的网络进行耗尽 , 同时对系统 种是查看本地连接是否有大量的半开连接队列 ,但这个方法 的操 作面 临着 资 源不 断 减少 的情况 ,这 样 就会 导致 攻 击 目标 的 服务 不是 很 准确 。 另一 种是 给 每一 个请 求连 接 的 I P地 址分 配一 个 C o o k i e . 器系统出现崩溃的情况 , 使得用户无法使用网络服务。S N Y F L O O D 如 果短 时 间 内连 续 受 到某 个 I P的重 复 S Y N包 ,就认 定 是受 到 了攻 就 是 拒绝 服务 攻 击 和分 布式 拒 绝服 务攻 击 的 重要 方式 之 一 ,如果 攻 击 , 以后从 这 个 I P地址 来 的包会 被 丢弃 。由于 S Y N包 的源 I P地址 可 击 的目标是支持 T C P应用的,那么这种攻击方式就可以对攻击 目标 以随意伪 造 , S Y N F I o o d 攻 击 可 以很容 易规 避 S Y N C o o k i e 检测。 的所 有 网络 连 接进 行 攻 击 ,同时 使 用户 无 法 正 常 进行 网络 的访 问 , 3 . 2 牛顿 均差 插值 检测 法 S N Y F L O O D攻 击 的原 理就 是利 用 T C P协 议在 建 立 连接 的时候 三次 插值法利用函数 f ( x ) 在某区间中若干点的函数值 , 作出适当的特 握 手 的缺 陷 , 同 时利 用 I P的欺骗 技 术 。为 了更 好 的 解决 这 种攻 击 方 定函数 , 在这些点上取已知值 , 在 区间的其他点上用这特定函数 的值 式, 对S Y N F L O O D攻 击 进行 必要 的检测 是 非 常重 要 的 , 在 检测 方 面 作为 函数 f ( x ) 的近似值。如果这特定函数是多项式 , 就称它为插值多 人们已经在使用一些方法 的,同时在防御方法上人们也找到了一些 项式。利用插值基函数很容易得到拉格 朗日插值多项式 , 公式结构紧 措施 , 可以通过修改系统的配置 , 采用必要的防火墙或者 只允许合法 凑, 在理论分析中甚为方便 , 但当插值节点增减时全部插值基 函数均 的I P源在设备上进行使用 , 这样进行 网络连接 的时候才能避免 出现 要 随之 变化 ,整 个公 式 也将 发生 变 化 ,这在 实 际计算 中是很 不 方便 的, 为了克服这一缺点 , 提出了牛顿插值 。 I P欺骗 的情 况 。 1 T C P三次 握手 4攻 击 防御 只 要服 务器 提供 T C P 应用 , 攻 击 者就 可 以进行 S Y N F l o o d攻击 , T C P 是传输控制协议 的简称 , 它是一种传输层协议 , 在使用 的时 候 主要 是进 行 面 向连 接 。面 向连 接是 一 种数 据 在传 输 的时 候建 立起 而且 S Y N F l o o d 攻 击 一般很 难 以防 御和追 踪 , 现介绍 几 种防 御办 法 。 来 的虚 电路 连 接 ,在 进行 连接 的时候 主要 是 对 客户 端 和服 务器 之 间 4 . 1修改 系统 配 置 进行 连 接 。 这个 连 接 的过程 通常 被人 们称 作 为 T C P的 三次握 手 。 T C P 我们 可 以修 改系统 支持 的最 大 T C P 连 接数 以及 通过 负 载均衡 等 的第 一 次握 手 是客 户 端 向服 务器 发 送 S Y N包 , 并且 要 在 系统 缓 存 中 来 提 高 防御 S Y N F l o o d 攻击 能力 。 开辟~个空间来对服务器 的请求进行处理,这时候连接 的状态表现 4 . 2采用 防火 墙 为S Y N 的发送 状 态 。T C P的第二 次握 手是 服务 器 收到 S Y N包 之后 , 防火墙通常用于保护内部网络不受外部网络 的非授权访 问, 它 对 客户 发送 的 S Y N包 进行 确认 ,然后 向客户 端发 送 S Y N + A C K包 这 位于 客户 端 和服 务器 之 间 。 由于防火 墙 所能 处理 的半 开 连接 数 远大 时在系统的缓存区域同时也是要开辟一块空间对客户端 的请求进行 于服 务 器所 能 处 理 的半 开 连 接 数 以及 根 据 S Y N F l o o d攻击 特 性 , 因 D O S 攻击 有效 地保 护 内部 的服 务器 。 处理, 这 时 的连 接状 态 是 S Y N 的接 收状 态 。T C P的第 三 次握 手 是客 此 防火 墙 可 以用 来 阻止 D 户端 收 到服务 器 发送 的 S Y N + A C K包 ,然后 将 A C K包重 新 发送 给服 4 . 3边缘路由设备只允许合法源 I P进入网络 务器, 服务 器 收到 A C K包 以后 , 客户 端 和服 务器 的连接 就 完 成 了 , 三 通 过在 边 界 路 由设 备 上 配 置访 问控 制 列表 只 允 许合 法 源 I P地 这样会大大过滤掉 S Y N F l o o d 攻击流量. 即使部分利 次握手也就完成了, 这时客户端和服务器就可以进行数据 的传输了。 址才能访问网络. 2 S Y N F L O O D攻击 原理 用 合法 源 I P地址 进行 的攻 击 . 也 非 常容 易被 追踪 。 这是 目前解 决互 联 网S Y N F l o o d攻击 最有 效 的办法 。 2 . 1 T C P 握 手 缺陷 5结束 语 T C P的第二次握手时 ,服务器在收到客户端发送的 S Y N 包以 后, 要在系统的缓存中对客户的请求进行处理, 同时服务器要向客户 为了更好的对 S Y N F L O O D 攻击原理进行掌握 ,同时对传统 的 进 而 找 到更 加准 确 的检 测方 法 , 在检 测方 法 端发 送 S Y N + A C K包 , 在没 有 S Y N F L O O D 攻 击 的 情况 下 , 也 可 能会 攻 击检 测方 法 进行 分 析 , 出现 因为 网络 的原 因 导致 服务 器 在一 定 的 时间 内无 法 收 到 A C K包 , 进行分析的时候对防御 的方法也能进行必要的分析。S Y N F L O O D 在 收到 S Y N F L O O D 攻 击 以后 ,服 务 器会 不 断 的进 行 S Y N + A C K包 攻击方式是与其他攻击方式不 同的攻击 , 在进行攻击的时候 , 不需要 的传 输 , 这样 就 会 导致 缓存 不 断要 进行 空 间 的预 留 , 进 而 出 现系 统缓 使用木马等程序就能对攻击 目标进行攻击,只是需要攻击 目标在使 C P服务 即可 。现 在 , 网络应 用规 模越 来越 大 , 为 了更 好 的利用 网 存不 断 释放 的情 况 , 这时的 S Y N F L O O D 攻 击 就是 利用 的 T C P 握手 用 T 络, 一定要提高网络的使用安全 , 拒绝服务攻击 的危害越来越严重 , 时 出现 的缺 陷 。 需 要提 高全 网用户 的 网络 安全 防 护意 识 和技 术水 平 以及 需要 网络 服 2 . 2 I P欺 骗 在网络 中, 路由设备要根据数据包 的目标 I P地址进行数据包 的 务提供商和用户进行共 同防御 。拒绝服务攻击将仍是我们必须重点 传输 , 使数据包传输到 目的端 , 在这个过程 中, 对源 I P地址是不会进 防范和 研究 的 网络安 全 的威 胁 之 一 。 参 考文 献 行检查的, 这样也就为 S Y N F L O O D 的攻击提供了一个便利的条件。 S Y N F L O O D 进行 攻 击 的 时候 ,可 以对 源 I P 的地 址 进行 随意 的伪 [ 1 ] 胡伟栋, 汪为农. 分布式拒绝服务攻击及其防范叨. 计算机工程 , 2 0 0 0 造 ,使 源 I P地 址在 进行 追 踪 的时候 非常 难进 行 ,尽 管 S Y N F L O O D ( 1 0 ) . 可 以通过 这种 方 式来 进行 攻击 , 同 时也可 以找到 防御 的方 法 。 [ 2 1 - ¥卫. I n t e r n e t 网络层 安全 协议 理论 研 究 与 实现 叨. 计 算机 学报 , 1 9 9 9
syn-flood攻击实验报告

实验五分析SYN FLOOd攻击原理一、实验内容通过分小组实施SYN FLood攻击,掌握分布式拒绝服务攻击原理。
二、实验目的和要求1.实验目的本实验的教学目的是熟悉SYN flood的攻击原理与过程,及IPv4所存在的固有缺陷。
2.实验要求本实验的基本要求:学生在实验课前分小组准备,每组分角色确定实施攻击者和被攻击者,熟悉SYN flood的攻击原理与过程,观察攻击现象。
三、实验设备(软、硬件)硬件:性能较强的PC机软件:Windows NT操作系统四,实验设计方案;1两个人一组,其中一人为攻击方,一人为被攻击方,被攻击方有一台web服务器,攻击方攻击对方得web服务器,2,附syn-flood攻击得源码,注意攻击 ip地址要做改动五,实验原理在SYN Flood攻击中,黑客机器向受害主机发送大量伪造源地址的TCP SYN报文,受害主机分配必要的资源,然后向源地址返回SYN+ACK包,并等待源端返回ACK包。
由于源地址是伪造的,所以源端永远都不会返回ACK报文,受害主机继续发送SYN+ACK包,并将半连接放入端口的积压队列中,虽然一般的主机都有超时机制和默认的重传次数,但是由于端口的半连接队列的长度是有限的,如果不断的向受害主机发送大量的TCP SYN报文,半连接队列就会很快填满,服务器拒绝新的连接,将导致该端口无法响应其他机器进行的连接请求,最终使受害主机的资源耗尽。
六,实验方法及步骤1,被攻击方配置web服务器2,攻击方设置要攻击服务器的ip地址,然后编译源程序。
3,运行synflood,攻击web服务器4,被攻击方打开命令行提示窗口,运行netstat命令,观察响应,netstat命令显示了所有当前连接,可以注意到netstat所返回的记录5,试着打开对方web服务器的网页,观察结果;6,试着同时多台机器对同一web服务器发起攻击,然后用一台机器登陆web服务器,观察结果七,试验数据记录与处理此项可以不填八,试验结果及分析1、被攻击方配置Web服务器,打开的端口是802、被攻击方的IP地址为3、使用C语言编写synflood攻击工具其中c的攻击代码模拟了真实的谷歌浏览器发起tcp请求的情况,不仅仅是标准的ip头 + tcp 头还加上了tcp options字段,mss最大段大小、sack选择确认、window scale 窗口规模因子,大小总共66字节。
SYNFlood攻击的原理及防御

文章编号:2096-1472(2019)-03-29-03DOI:10.19644/ki.issn2096-1472.2019.03.009软件工程 SOFTWARE ENGINEERING 第22卷第3期2019年3月V ol.22 No.3Mar. 2019SYN Flood 攻击的原理及防御张文川(兰州石化职业技术学院,甘肃 兰州 730060)摘 要:SYN-Flood攻击是当前网络上最为常见的DDoS攻击,也是最为经典的拒绝服务攻击,它利用了TCP协议实现上的一个缺陷,通过向网络服务所在端口发送大量的伪造源地址的攻击报文,就可能造成目标服务器中的半开连接队列被占满,从而阻止其他合法用户进行访问。
为了有效防范这种攻击,在分析攻击原理的基础上,发现可以使用TCP代理防御及TCP源探测防御方法来解决这个问题,经过测试证明,该办法能够有效降低SYN Flood攻击造成的危害。
关键词:DDoS攻击;STN Flood攻击;TCP代理防御;TCP源探测防御中图分类号:TP399 文献标识码:AThe Principle and Defense of SYN Flood AttackZHANG Wenchuan(Lanzhou Petrochemical College of V ocational Technology ,Lanzhou 730060,China )Abstract:SYN-Flood attack is the most common DDoS attack and the most classic denial-of-service attack on the current network.It takes advantage of a flaw in TCP protocol implementation and sends a large number of attack packets of forged source addresses to the port where the network service is located,which may cause the semi-open connection queue in the target server to be occupied,thus preventing other legal users from accessing.In order to effectively prevent this attack,on the basis of analyzing the attack principle,it is found that TCP proxy defense and TCP source detection defense methods can be used to solve this problem.Testsprove that this method can effectively reduce the harm caused by SYN Flood attack.Keywords:DdoSattack;STN Flood attack;TCP proxy defense;TCP source detection defense基金项目:全国工业和信息化职业教育教学指导委员会工信行指委“基于校企合作人才培养模式的信息化教学的研究与实践”项目编号:【2018】20号.1 引言(Introduction)过去,攻击者所面临的主要问题是网络宽带不足,受限于较慢的网络速度,攻击者无法发出过多的请求。
SYN Flood攻击防御策略综述

SYN Flood攻击防御策略综述作者:丁彭父乐张宏莉来源:《智能计算机与应用》2014年第03期收稿日期:2014-01-08基金项目:国家“242”信息安全计划基金资助项目(2012D100)。
作者简介:丁彭父乐(1990-),女,湖南常德人,硕士研究生,主要研究方向: 网络与信息安全;张宏莉(1973-),女,吉林榆树人,博士,教授,博士生导师,主要研究方向: 网络安全与社会计算、并行计算、网络计算等。
摘要:随着互联网技术的迅速发展,越来越多网络安全问题日益突显出来。
研究表明DoS/DDoS攻击是目前最为严重的网络安全问题之一,SYN Flood攻击又是DoS/DDoS攻击中最为常见的攻击。
首先简要介绍了SYN Flood攻击的原理,然后通过研究近年来国内外学术界对SYN Flood攻击的研究成果,总结了针对SYN Flood攻击的三类防御策略:基于退让和负反馈的防御策略,基于TCP协议栈缺陷的防御策略和基于数据流的防御策略,并分别分析了各类型防御策略的主要防御方法。
关键词:SYN Flood攻击;退让和负反馈; 协议栈缺陷;数据流统计;网关侦听中图分类号:TP393 08文献标识码:A文章编号:2095-2163(2014)03-0028-04A Brief Review of SYN Flood Attacks Defense StrategyDING Pengfule,ZHANG Hongli(School of Computer Science and Technology, Harbin Institute of Technology, Harbin 150001, China)Abstract:With the rapid development of Internet technology, more and more network security issues are exposed increasingly. Studies have shown that DoS/DDoS attack is one of the most serious network security problems, and the most common one of DoS/DDoS attacks is SYN Flood attack. This paper first briefly introduces the principle of SYN Flood attack at first. And then after studying researches about SYN Flood at home and abroad in recent years, the paper finds that the common defense strategies are mainly about: defense strategy based on concession and negative feedback, defect of TCP protocol stack and the data traffic. Finally, the paper analyzes the main defense method of all types of defense strategies.Key words:SYN Flood Attack; Concession and Negative Feedback; Defect of TCP Protocol Stack; Statistic of Data Traffic; Gateway Interception0引言网络技术发展给人们带来了各种便利,但与此同时也应看到,各类新的安全问题也在不断产生。
防flood类攻击设置参数

防flood类攻击设置参数【原创实用版】目录1.防 flood 类攻击的重要性2.flood 类攻击的定义和种类3.如何设置防 flood 类攻击的参数4.设置防 flood 类攻击参数的实际应用5.总结正文【1.防 flood 类攻击的重要性】在网络世界中,安全一直是一个备受关注的话题。
随着网络技术的不断发展,网络攻击手段也日益翻新。
其中,flood 类攻击是一种常见的恶意攻击方式,对网络安全造成了严重威胁。
因此,防止 flood 类攻击显得尤为重要。
【2.flood 类攻击的定义和种类】flood 类攻击,顾名思义,是指攻击者通过向目标发送大量数据包,使得目标系统无法正常处理正常流量,从而造成拒绝服务(DoS)或拒绝访问(DoA)的攻击手段。
常见的 flood 类攻击包括:ICMP Flood、UDP Flood、TCP Flood、SYN Flood 等。
【3.如何设置防 flood 类攻击的参数】为了有效防止 flood 类攻击,我们需要设置一些相应的参数。
具体操作如下:(1)设置防火墙规则:通过防火墙,我们可以对进出网络的数据包进行控制。
针对 flood 类攻击,我们需要设置允许或拒绝某些特定类型的数据包。
例如,可以限制 ICMP、UDP 等特定协议的数据包进出网络。
(2)配置入侵检测系统(IDS):IDS 可以实时监控网络中的数据包,一旦发现异常流量,可以立即报警并采取措施进行处理。
因此,我们需要对 IDS 进行配置,以便它能够识别并防范 flood 类攻击。
(3)启用流量控制:通过流量控制,我们可以限制单位时间内通过网络的数据量。
这样一来,即使遭受 flood 类攻击,也能够保证网络中的正常流量不会受到影响。
(4)合理设置路由策略:针对 flood 类攻击,我们还可以通过设置路由策略来进行防范。
例如,可以设置路由器的出口接口的最大速率,限制数据包的发送速度。
【4.设置防 flood 类攻击参数的实际应用】在实际应用中,我们需要根据网络的实际情况和需求,灵活设置防flood 类攻击的参数。
syn_flood攻击原理

syn_flood攻击原理SYN flood攻击是一种常见的网络攻击手段,其原理是通过发送大量伪造的TCP连接请求(SYN包),占用服务器的资源,使其无法处理正常的连接请求,进而导致服务不可用。
下面将详细介绍SYN flood攻击的工作原理。
SYN flood攻击利用了TCP协议的三次握手过程。
在正常情况下,TCP连接的建立需要客户端发送一个SYN包给服务器,服务器收到后返回一个SYN+ACK包给客户端,最后客户端发送一个ACK包给服务器,即完成了三次握手,建立了正常的TCP连接。
而SYN flood攻击利用了这个过程的缺陷,即没有限制SYN请求的数量和源地址。
攻击者向目标服务器发送大量的伪造的源IP地址和端口的SYN包,服务器接收到这些SYN包后,会回复相应的SYN+ACK包,但攻击者并不回复ACK包,也就是第三次握手的ACK包。
正常情况下,服务器在指定的时间内没有收到ACK包会重新发送SYN+ACK包,等待客户端再次回复ACK包。
但是在SYN flood攻击中,攻击者发送大量的伪装的SYN请求,服务器不断地回复SYN+ACK包,并等待ACK包的回复,这使得服务器的资源被耗尽,无法处理其他的正常请求。
SYN flood攻击主要有两种方式:常规SYN flood和分片SYN flood。
常规SYN flood攻击使用普通的SYN包发送大量的请求,这些请求既可以是伪造的源IP地址和端口的请求,也可以是真实的请求,攻击的主要目标是让服务器的资源耗尽。
分片SYN flood攻击是对常规SYN flood攻击的改进。
由于IP包的长度有限,攻击者将一个SYN包分成多个片段发送给服务器。
在接收到第一个片段时,服务器会进行资源分配,并等待片段的其余部分。
但攻击者并不发送剩余的片段,导致服务器一直等待这个SYN请求,从而占用更多的资源。
为了对抗SYN flood攻击,通常有以下几个方法:1.加强服务器的防火墙和安全策略,限制并过滤恶意的IP地址和请求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SYN Flood攻击的基本原理及防御创建时间:2001-06-28文章属性:转载文章来源:/syn.htm文章提交:xundi (xundi_at_)Shotgun首发于天极网第一部分 SYN Flood的基本原理SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。
要明白这种攻击的基本原理,还是要从TCP连接建立的过程开始说起:大家都知道,TCP与UDP不同,它是基于连接的,也就是说:为了在服务端和客户端之间传送TCP数据,必须先建立一个虚拟电路,也就是TCP连接,建立TCP连接的标准过程是这样的:首先,请求端(客户端)发送一个包含SYN标志的TCP报文,SYN即同步(Synchronize),同步报文会指明客户端使用的端口以及TCP连接的初始序号;第二步,服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgement)。
第三步,客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。
以上的连接过程在TCP协议中被称为三次握手(Three-way Handshake)。
问题就出在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。
实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃---即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了SYN Flood 攻击(SYN洪水攻击)。
从防御角度来说,有几种简单的解决方法,第一种是缩短SYN Timeout时间,由于SYN Flood攻击的效果取决于服务器上保持的SYN半连接数,这个值=SYN攻击的频度 x SYN Timeout,所以通过缩短从接收到SYN报文到确定这个报文无效并丢弃改连接的时间,例如设置为20秒以下(过低的SYN Timeout设置可能会影响客户的正常访问),可以成倍的降低服务器的负荷。
第二种方法是设置SYN Cookie,就是给每一个请求连接的IP地址分配一个Cookie,如果短时间内连续受到某个IP的重复SYN报文,就认定是受到了攻击,以后从这个IP地址来的包会被一概丢弃。
可是上述的两种方法只能对付比较原始的SYN Flood攻击,缩短SYN Timeout时间仅在对方攻击频度不高的情况下生效,SYN Cookie更依赖于对方使用真实的IP地址,如果攻击者以数万/秒的速度发送SYN 报文,同时利用SOCK_RAW随机改写IP报文中的源地址,以上的方法将毫无用武之地。
第二部份 SYN Flooder源码解读下面我们来分析SYN Flooder的程序实现。
首先,我们来看一下TCP报文的格式:0 1 2 3 4 5 60 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| IP首部 | TCP首部 | TCP数据段 |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+图一 TCP报文结构如上图所示,一个TCP报文由三个部分构成:20字节的IP首部、20字节的TCP首部与不定长的数据段,(实际操作时可能会有可选的IP选项,这种情况下TCP首部向后顺延)由于我们只是发送一个SYN信号,并不传递任何数据,所以TCP数据段为空。
TCP首部的数据结构为:0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 十六位源端口号 | 十六位目标端口号 |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 三十二位序列号 |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 三十二位确认号 |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 四位 | |U|A|P|R|S|F| || 首部 |六位保留位 |R|C|S|S|Y|I| 十六位窗口大小 || 长度 | |G|K|H|T|N|N| |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 十六位校验和 | 十六位紧急指针 |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 选项(若有) |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 数据(若有) |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+图二 TCP首部结构根据TCP报文格式,我们定义一个结构TCP_HEADER用来存放TCP首部:typedef struct _tcphdr{USHORT th_sport; //16位源端口USHORT th_dport; //16位目的端口unsigned int th_seq; //32位序列号unsigned int th_ack; //32位确认号unsigned char th_lenres; //4位首部长度+6位保留字中的4位 unsigned char th_flag; //2位保留字+6位标志位USHORT th_win; //16位窗口大小USHORT th_sum; //16位校验和USHORT th_urp; //16位紧急数据偏移量}TCP_HEADER;通过以正确的数据填充这个结构并将TCP_HEADER.th_flag赋值为2(二进制的00000010)我们能制造一个SYN的TCP报文,通过大量发送这个报文可以实现SYN Flood的效果。
但是为了进行IP欺骗从而隐藏自己,也为了躲避服务器的SYN Cookie检查,还需要直接对IP首部进行操作:0 1 2 30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 版本 | 长度 | 八位服务类型 | 十六位总长度 |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 十六位标识 | 标志| 十三位片偏移 |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 八位生存时间 | 八位协议 | 十六位首部校验和 |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 三十二位源IP地址|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 三十二位目的IP地址 |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 选项(若有) |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 数据 |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+图三 IP首部结构同样定义一个IP_HEADER来存放IP首部typedef struct _iphdr{unsigned char h_verlen; //4位首部长度+4位IP版本号unsigned char tos; //8位服务类型TOSunsigned short total_len; //16位总长度(字节)unsigned short ident; //16位标识unsigned short frag_and_flags; //3位标志位unsigned char ttl; //8位生存时间 TTLunsigned char proto; //8位协议号(TCP, UDP 或其他)unsigned short checksum; //16位IP首部校验和unsigned int sourceIP; //32位源IP地址unsigned int destIP; //32位目的IP地址}IP_HEADER;然后通过SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED));建立一个原始套接口,由于我们的IP源地址是伪造的,所以不能指望系统帮我们计算IP校验和,我们得在在setsockopt中设置IP_HDRINCL告诉系统自己填充IP首部并自己计算校验和:flag=TRUE;setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));IP校验和的计算方法是:首先将IP首部的校验和字段设为0(IP_HEADER.checksum=0),然后计算整个IP 首部(包括选项)的二进制反码的和,一个标准的校验和函数如下所示:USHORT checksum(USHORT *buffer, int size){unsigned long cksum=0;while(size >1) {cksum+=*buffer++;size -=sizeof(USHORT);}if(size ) cksum += *(UCHAR*)buffer;cksum = (cksum >> 16) + (cksum & 0xffff);cksum += (cksum >>16);return (USHORT)(~cksum);}这个函数并没有经过任何的优化,由于校验和函数是TCP/IP协议中被调用最多函数之一,所以一般说来,在实现TCP/IP栈时,会根据操作系统对校验和函数进行优化。