【漏洞分析】DDOS攻防分析

0x00 UDP攻击实例

2013年12月30日,网游界发生了一起“追杀”事件。事件的主角是PhantmL0rd(这名字一看就是个玩家)和黑客组织DERP Trolling。

PhantomL0rd,人称“鬼王”,本名James Varga,某专业游戏小组的成员,同时是美国最大的在线游戏直播平台Twitch的知名和资深视频博主,经常一边参加游戏对战一边实况直播。

DERP Trolling,一个成立于2011年的黑客组织,本次事件中专门以“PhantomL0rd”实况直播的游戏为攻击目标,一旦成功弄倒目标,便会在推特上发布战果。

事情看上去很简单。这一天,PhantmL0rd连续在多场游戏对战中遭到DERP Trolling的“追杀”:凡是PhantmL0rd参加的网络游戏,都不同程度地遭到了DERP Trolling的DDoS攻击。英雄联盟、EA官网、暴雪战网、DOTA2官网、企鹅俱乐部等等知名游戏网站都因遭到DDoS攻击而瘫痪。哎,不过想要玩个游戏而已,怎么就这么难?

然而,随着事件的不断被挖掘和曝光,知道真相的玩家们哭了。调查发现,一直被认为是受害者的PhantomL0rd实际上恰恰是这次事件的幕后主使。这是什么原因呢?

原来,PhantomL0rd经常参加一些游戏对战比赛,既然是比赛就会有胜有负。但是PhantomL0rd为了保住自己“王”的地位,就偷偷地和DERP Trolling串通:一旦比赛过程中PhantomL0rd打不过对手,DERP Trolling就登场,向游戏服务器发动DDoS攻击,让比赛异常终止,这样PhantomL0rd就有翻盘的机会。

这次事件的曝光不仅让PhantomL0rd颜面尽失,还让DERP Trolling使用的这个DDoS攻击手段“火”了一把。那么DERP Trolling到底使用了什么手段呢?

DERP Trolling在这次“追杀”事件中,采用的是NTP反射放大攻击。从记载来看,DERP Trolling应该是第一个利用NTP服务器进行大规模反射放大攻击的黑客组织。这次“追杀”事件之后,NTP反射放大攻击一夜之间变得非常火热。2014新年的第一周,NTP反射放大攻击占到了DDoS攻击流量的69%。

什么是NTP反射放大攻击?

我们先来看看什么是NTP。NTP,全称是Network Time Protocol,网络时间协议。顾名思义,NTP是一种用于保证网络中的计算机时间同步的协议。在网络中,计算机的时间同步非常的重要。比如发射火箭,如果每台计算机时间都不同,那么发射的时候应该以哪台计算机为准呢?

NTP协议采用服务器-客户端模型,提供了高精准度的时间校正机制。在网络中,NTP客户端不以自己的时间为准,而是每隔一段时间从NTP服务器同步更新自身时间。NTP协议定义了NTP服务器的层次结构,通过逐层传播,实现时间同步。因为上游NTP服务器通常是高精度而可靠的时钟源,如原子钟、卫星、天文台等,时间同步的精度得到了保证。

20161101142049665.png

NTP协议中有一个监控(Monlist)功能,用于监控NTP服务器。NTP服务器会记录与自己进行过时间同步的客户端IP地址的信息,而且客户端可以通过一些命令索要这些记录。每个NTP服务器可以记录进行过时间同步的最后600个客户端的IP地址,当有客户端索要这个记录时,NTP服务器会返回这600个客户端IP地址,响应包按照每6个IP地址进行分割,最多可以返回100个响应包。

20161101142103507.png

 

理解了NTP协议,NTP反射放大攻击就容易理解了。NTP反射放大攻击有两个关键点:反射和放大。

反射

反射,就是把源IP地址伪造成被攻击IP地址,进行“传瞎话”的无耻行为。谎言之所以可以传播,就是因为听者轻信。缺少源认证机制的协议最容易被利用,所以反射攻击均为基于UDP的无状态连接协议。NTP正是基于UDP协议进行传输的。

在UDP协议中,正常情况下,客户端发送请求包到服务器,服务器返回响应包给客户端,这就完成了一次交互,中间没有校验过程。由于UDP协议是面向无连接的,所以客户端发送请求包的源IP地址很容易被篡改。一些低版本的NTP服务器没有针对源IP地址的校验机制,所以如果把请求包的源IP地址篡改为攻击目标的IP地址,最终服务器返回的响应包就会被送到攻击目标,这就是“反射”攻击。

20161101142116560.png

 

放大

放大,顾名思义,就是我假冒你的名义打他一拳,他会打你100拳。黑客通常是利用互联网的基础架构来进行放大攻击,效果更强,毕竟网络基础架构的能力是超级强大的,而且,完全免费。——这让我想起《三体》中叶文洁利用太阳来放大电磁波信号,把太阳作为放大器,大刘的脑洞够大。网络中开放的NTP服务器非常多,如果黑客利用僵尸主机,同时向NTP服务器发起大量的Monlist请求,1个Monlist请求包可以引发100个响应包。通常,1个NTP请求包只有90字节的大小,而1个回应报文通常为482字节,100个回应报文就是48200字节,回应报文是请求报文的500倍左右,这样就可以达到四两拨千斤的“放大”效果。

20161101142008179.png

(author Zhaoxuepeng https://www.cnblogs.com/Shepherdzhao/)

0x01 UDP协议基础知识

UDP协议全称“用户数据报协议”,User Datagram Protocol,是一种传输层协议。UDP协议是一种无连接的协议,不提供数据报的分组、组装,不对数据包的传输进行确认,当报文发送出去后,发送端不关心报文是否完整的到达对端。这个听起来像是缺点的特点,却是UDP协议最大的优点。这种报文处理方式决定了UDP协议资源消耗小,处理速度快,所以通常音频、视频和普通数据传送时使用UDP比较多。就比如音频或视频吧,大家在看视频或者听音乐的时候,都是追求数据传输更快一些,而在传输过程中,偶尔丢一两个数据包,对整体效果并不会产生太大的影响。

相比于之前介绍的DNS和HTTP协议,UDP协议需要关注的点要简单很多。我们来看看UDP报文结构。

20161108111340314.png

我们再来看一个现网真实UDP报文的抓包。

20161108111450166.png

每个UDP报文由UDP报文头部和UDP数据字段两部分组成。其中头部字段由8个字节,4个字段组成,分别是:源端口号、目的端口号、报文长度和校验和。

l  UDP协议使用端口号为不同的应用保留其各自的数据传输通道。比如DNS协议目的端口号是53;TFTP协议目的端口号是69。

l  数据报的长度是指包括报头和数据载荷部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据载荷部分。数据载荷的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报文的最大长度为65535字节。不过,一些实际应用往往会限制报文的大小。

l  UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方人为篡改或者因其他原因遭到了损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测报文传输过程中是否出错。虽然UDP提供有错误检测,但检测到错误时,UDP不做错误校正,只是简单地把损坏的报文丢弃,或者给应用程序提供警告信息。

0x02 UDP DDOS攻击防御

UDP协议与TCP协议不同,是无连接状态的协议,并且UDP应用协议五花八门,差异极大,因此针对UDP Flood的防护其实非常困难。我们也不能像TCP攻击那样进行源认证,所以只能找特征了。

一般传统的UDP攻击都是由攻击工具打出来的,通常会具有一定的特征,尤其在数据段会有一些相同或者有规律变化的字段。而对于我们前一节介绍的UDP反射放大攻击,虽然并不是攻击工具伪造的UDP报文,而是真实网络设备发出的UDP报文,在数据段不具备相同的特征,但是目的端口却是固定的,所以也可以作为一种特征。

确定攻击报文的特征后,就可以根据特征进行过滤了。特征过滤也就是常说的指纹过滤,根据攻击报文的特征,自定义过滤属性。

指纹过滤有两种方法:

l  静态指纹过滤

对于已知的攻击特征,可以直接配置到过滤器的参数中。Anti-DDoS系统不仅具有TCP、UDP等传输层协议的报文解析能力,还具有应用层报文解析能力,可针对应用层头部信息字段做过滤。配置了静态指纹过滤后,Anti-DDoS会对收到的报文进行特征匹配,对匹配到攻击特征的报文,再进行丢弃、限流等下一步操作。

20161108111503177.png

那么,如何获知攻击特征呢?一种方法是抓包分析,人为识别出攻击特征,然后配置到过滤器中。UDP报文的数据段、源IP地址、源端口,目的IP地址、目的端口都可能隐藏着攻击报文的特征。比如,UDP反射放大攻击一般都是基于特定的UDP端口,比如现在比较常见的NTP、DNS、SSDP反射放大攻击,分别对应的UDP端口是123、53、1900。

下面一般有14种常见UDP反射放大攻击的过滤器模板。这些攻击都属于已知攻击特征,抗D设备可以配置已经预先定义好了攻击特征的参数,直接应用即可。

20161108111519770.png

如果抗D设备预置的过滤器模板不够用,个人也无法抓包分析配置攻击特征,那么有的抗D设备可以配置动态学习:

l  动态指纹学习

在攻击特征未知的情况下,Anti-DDoS系统具有指纹自动学习功能。对于一些攻击工具发起的UDP攻击,攻击报文通常都拥有相同的特征字段,比如都包含某一个字符串,或整个报文内容一致。指纹学习就是对一些有规律的UDP攻击报文负载特征进行识别,并且自动提取出指纹特征,然后就把这个提取的特征作为过滤条件,自动应用并进行过滤。

Anti-DDoS系统默认情况下,学习UDP载荷的最后8个字节,当然这个学习的偏移量和学习长度都是可以手动配置的。偏移量是从UDP报文头结束处开始计算,取值从0字节到1500字节可灵活配置;学习长度从1个字节开始配置,最多可以学习8个字节。

20161108111533644.png

传统的UDP flood攻击是一种消耗对方资源,也消耗自己资源的攻击方式,你攻击了一个服务器,其实也在消耗你的系统资源,说白了就是拼资源而已,看谁的带宽大,看谁能坚持到最后。这种攻击方式没有技术含量,现在已经越来越少的黑客使用这种方式了。

取而代之的是UDP反射放大攻击,近几年越来越多的被黑客所使用。像前面提到的几种做成过滤器模板的UDP反射放大攻击,都是比较常见的。后续对于UDP flood攻击的防御重点也应该聚焦在反射放大攻击上。

0x01 UDP协议基础知识

UDP协议全称“用户数据报协议”,User Datagram Protocol,是一种传输层协议。UDP协议是一种无连接的协议,不提供数据报的分组、组装,不对数据包的传输进行确认,当报文发送出去后,发送端不关心报文是否完整的到达对端。这个听起来像是缺点的特点,却是UDP协议最大的优点。这种报文处理方式决定了UDP协议资源消耗小,处理速度快,所以通常音频、视频和普通数据传送时使用UDP比较多。就比如音频或视频吧,大家在看视频或者听音乐的时候,都是追求数据传输更快一些,而在传输过程中,偶尔丢一两个数据包,对整体效果并不会产生太大的影响。

相比于之前介绍的DNS和HTTP协议,UDP协议需要关注的点要简单很多。我们来看看UDP报文结构。

20161108111340314.png

我们再来看一个现网真实UDP报文的抓包。

20161108111450166.png

每个UDP报文由UDP报文头部和UDP数据字段两部分组成。其中头部字段由8个字节,4个字段组成,分别是:源端口号、目的端口号、报文长度和校验和。

l  UDP协议使用端口号为不同的应用保留其各自的数据传输通道。比如DNS协议目的端口号是53;TFTP协议目的端口号是69。

l  数据报的长度是指包括报头和数据载荷部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据载荷部分。数据载荷的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报文的最大长度为65535字节。不过,一些实际应用往往会限制报文的大小。

l  UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方人为篡改或者因其他原因遭到了损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测报文传输过程中是否出错。虽然UDP提供有错误检测,但检测到错误时,UDP不做错误校正,只是简单地把损坏的报文丢弃,或者给应用程序提供警告信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/2382.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

低代码独特架构带来的编译难点及多线程解决方案

前言 在当今软件开发领域,低代码平台以其快速构建应用的能力,吸引了众多开发者与企业的目光。然而,低代码平台独特的架构在带来便捷的同时,也给编译过程带来了一系列棘手的难点。 一,低代码编译的难点 (1…

Android BitmapShader更简易的实现刮刮乐功能,Kotlin

Android BitmapShader更简易的实现刮刮乐功能,Kotlin 比这种方式 Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现“刮刮乐”效果,Kotlin(2)-CSDN博客 更简单实现刮刮乐效果。 import android.content.Cont…

【DB-GPT】开启数据库交互新篇章的技术探索与实践

一、引言:AI原生数据应用开发的挑战与机遇 在数字化转型的浪潮中,企业对于智能化应用的需求日益增长。然而,传统的数据应用开发方式面临着诸多挑战,如技术栈复杂、开发周期长、成本高昂、难以维护等。这些问题限制了智能化应用的…

客户案例:某家居制造企业跨境电商,解决业务端(亚马逊平台)、易仓ERP与财务端(金蝶ERP)系统间的业务财务数据对账互通

一、系统定义 1、系统定位: 数据中台系统是一种战略选择和组织形式,通过有型的产品支撑和实施方法论,解决企业面临的数据孤岛、数据维护混乱、数据价值利用低的问题,依据企业特有的业务和架构,构建一套从数据汇聚、开…

springboot程序快速入门

1.新建springboot项目 一上来输入项目名字语言选javaType选Mavenjdk 1.8java选8packaging选jar 选择对应的springboot版本2.6.13Web里面勾上Spring Web 点击创建即可。 2.手工编辑一个控制器 手动创建一个Controller类: package com.example.springbootgate.con…

【Linux】常见指令(一)

Linux常见指令 01.whoami02.pwd03.ls04.mkdir05.cd 本文LInux环境为,使用XShell远程登陆到Linux。 具体如何环境搭建,大家可以查看其他博客。 01.whoami whoami 指令用来查看当前账户是谁。 如上图所示,使用whoami指令,查看到现在…

鸿蒙UI开发——键盘弹出避让模式设置

1、概 述 我们在鸿蒙开发时,不免会遇到用户输入场景,当用户准备输入时,会涉及到输入法的弹出,我们的界面针对输入法的弹出有两种避让模式:上抬模式、压缩模式。 下面针对输入法的两种避让模式的设置做简单介绍。 2、…

【零基础入门unity游戏开发——unity3D篇】地形Terrain的使用介绍

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、…

微服务之松耦合

参考:https://microservices.io/post/architecture/2023/03/28/microservice-architecture-essentials-loose-coupling.html There’s actually two different types of coupling: runtime coupling - influences availability design-time coupling - influences…

数据结构之双链表(C语言)

​ 数据结构之双链表(C语言) 1 链表的分类2 双向链表的结构3 双向链表的节点创建与初始化3.1 节点创建函数3.2 初始化函数 4 双向链表插入节点与删除节点的前序分析5 双向链表尾插法与头插法5.1 尾插函数5.2 头插函数 6 双向链表的尾删法与头删法6.1尾删…

Banana Pi BPI-RV2 RISC-V路由开发板采用矽昌通信SF2H8898芯片

Banana Pi BPI-RV2 开源网关是⼀款基于矽昌SF2H8898 SoC的设备,1 2.5 G WAN⽹络接⼝、5 个千兆LAN ⽹络接⼝、板载 512MB DDR3 内存 、128 MiB NAND、16 MiB NOR、M.2接⼝,MINI PCIE和USB 2.0接⼝等。 Banana Pi BPI-RV2 开源网关是矽昌和⾹蕉派开源社…

C语言:数据的存储

本文重点: 1. 数据类型详细介绍 2. 整形在内存中的存储:原码、反码、补码 3. 大小端字节序介绍及判断 4. 浮点型在内存中的存储解析 数据类型结构的介绍: 类型的基本归类: 整型家族 浮点家族 构造类型: 指针类型&…

从代码层面熟悉UniAD,开始学习了解端到端整体架构

0. 简介 最近端到端已经是越来越火了,以UniAD为代表的很多工作不断地在不断刷新端到端的指标,比如最近SparseDrive又重新刷新了所有任务的指标。在端到端火热起来之前,成熟的模块化自动驾驶系统被分解为不同的独立任务,例如感知、…

Go-Zero整合Goose实现MySQL数据库版本管理

推荐阅读 【系列好文】go-zero从入门到精通(看了就会) 教程地址:https://blog.csdn.net/u011019141/article/details/139619172 Go-Zero整合Goose实现MySQL数据库版本管理的教程 在开发中,数据库迁移和版本管理是必不可少的工作。…

day 27 日志文件(枚举,时间函数),目录io,多文件管理

0## 1.获得当前时间 # include <stdio.h> #include <stdlib.h> #include <time.h>int main() {struct tm* ptm;time_t sec time(NULL);ptm localtime(&sec);printf("%d-%d-%d %d:%d:%d\n",ptm->tm_year1900,ptm->tm_mon1,ptm->tm_…

使用Flink-JDBC将数据同步到Doris

在现代数据分析和处理环境中&#xff0c;数据同步是一个至关重要的环节。Apache Flink和Doris是两个强大的工具&#xff0c;分别用于实时数据处理和大规模并行处理&#xff08;MPP&#xff09;SQL数据库。本文将介绍如何使用Flink-JDBC连接器将数据同步到Doris。 一、背景介绍…

【python】OpenCV—Local Translation Warps

文章目录 1、功能描述2、原理分析3、代码实现4、效果展示5、完整代码6、参考 1、功能描述 利用液化效果实现瘦脸美颜 交互式的液化效果原理来自 Gustafsson A. Interactive image warping[D]. , 1993. 2、原理分析 上面描述很清晰了&#xff0c;鼠标初始在 C&#xff0c;也即…

灵活妙想学数学

灵活妙想学数学 题1&#xff1a;海星有几只&#xff1f; 一共有12只海洋生物&#xff0c;分别是5只脚的海星&#xff0c;8只脚的章鱼和10只脚的鱿鱼&#xff0c;这些海洋动物的脚一共有87只&#xff0c;每种生物至少有1只&#xff0c;问海星有几只&#xff1f; 解&#xff1a…

STM32-笔记40-BKP(备份寄存器)

一、什么是BKP&#xff08;备份寄存器&#xff09;&#xff1f; 备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份域里&#xff0c;当VDD电源被切断&#xff0c;他们仍然由VBAT维持供电。当系统在待机模式下被唤醒&#xff0c;或…

Sprint Boot教程之五十八:动态启动/停止 Kafka 监听器

Spring Boot – 动态启动/停止 Kafka 监听器 当 Spring Boot 应用程序启动时&#xff0c;Kafka Listener 的默认行为是开始监听某个主题。但是&#xff0c;有些情况下我们不想在应用程序启动后立即启动它。 要动态启动或停止 Kafka Listener&#xff0c;我们需要三种主要方法…