简介
NTP Reply Flood Attack (NTP射型Ddos 攻击)以下简称NTP_Flood是一种利用网络
中 NTP服务器的脆弱性(无认证,不等价数据交换,UDP协议),来进行DDos行为的攻击,
本文将就此种攻击的产生原因,利用方法等进行阐述,并使用编程语言(Python,C++)对
此攻击进行实现。
感谢 NSFOCUS的大牛同事们(SCZ,周大同学,SAI,冰雪风谷)在日常学习工作中的支
持。
NTP 服务器
NTP服务器【Network Time Protocol(NTP)】是用来使计算机时间同步化的一种协议,
它可以使计算机对其服务器或时钟源(如石英钟,GPS 等等)做同步化,它可以提供高精准
度的时间校正(LAN上与标准间差小于1 毫秒,WAN 上几十毫秒),且可介由加密确认的方式
来防止恶毒的协议攻击。
NTP 协议
NTP:Network Time Protocol
网络时间协议(NTP)是一种通过因特网服务于计算机时钟的同步时间协议。它提供了
一种同步时间机制,能在庞大而复杂多样因特网中用光速调整时间分配。它使用的是可返回
时间设计方案,其特点是:时间服务器是一种分布式子网,能自我组织操作、分层管理配置,
经过有线或无线方式同步逻辑时钟达到国家标准时间。此外,通过本地路由选择运算法则及
时间后台程序,服务器可以重新分配标准时间。
NTP 的设计带来了三种产品 — 时钟偏移、时间延迟及差量,所有这三种与指定参考时
钟都是相关联的。时钟偏移表示调整本地时钟与参考时钟相一致而产生的偏差数;时间延迟
表示在指定时间内发送消息与参考时钟间的延时时间;差量表示了相对于参考时钟本地时钟
的最大偏差错误。因为大多数主机时间服务器通过其它对等时间服务器达到同步,所以这三
种产品中的每一种都有两个组成部分:其一是由对等决定的部分,这部分是相对于原始标准
时间的参考来源而言;其二是由主机衡量的部分,这部分是相对于对等而言。每一部分在协
议中都是独立维持的,从而可以使错误控制和子网本身的管理操作变得容易。它们不仅提供
了偏移和延迟的精密测量,而且提供了明确的最大错误范围,这样用户接口不但可以决定时
间,而且可以决定时间的准确度。
NTP 源于时间协议和 ICMP 时间标志消息,但其设计更强调精确度和充足性两个方面,
即使是用于网络路径上包括多路网关、延迟差量及不可靠网络。当前使用的最新版是 NTPv3,
它與以前的版本兼容。
LI:跳跃指示器,警告在当月最后一天的最终时刻插入的迫近闺秒(闺秒)。
1. VN:版本号。
Mode:模式。该字段包括以下值:0-预留;1-对称行为;3-客户机;4-服务器;5-广
播;6-NTP 控制信息
2. Stratum:对本地时钟级别的整体识别。
3. Poll:有符号整数表示连续信息间的最大间隔。
4. Precision:有符号整数表示本地时钟精确度。
5. Root Delay:有符号固定点序号表示主要参考源的总延迟,很短时间内的位15 到 16
间的分段点。
6. Root Dispersion:无符号固定点序号表示相对于主要参考源的正常差错,很短时间内
的位 15 到16 间的分段点。
7. Reference Identifier:识别特殊参考源。
8. Originate Timestamp:这是向服务器请求分离客户机的时间,采用64位时标
(Timestamp)格式。
9. Receive Timestamp:这是向服务器请求到达客户机的时间,采用64位时标(Timestamp)
格式。
10. Transmit Timestamp:这是向客户机答复分离服务器的时间,采用64位时标(Timestamp)
格式。
11. Authenticator(Optional):当实现了 NTP 认证模式,主要标识符和信息数字域就包括
已定义的信息认证代码(MAC)信息。
NTP 协议指令集
在Linux 上我们可以使用ntpdc来进行 NTP 的操作,ntpdc支持很多命令:
# ntpdc -n -i time.org.za
ntpdc> ?
ntpdc commands:
addpeer controlkey fudge keytype quit timeout
addrefclock ctlstats help listpeers readkeys timerstats
addserver debug host loopinfo requestkey traps
addtrap delay hostnames memstats reset trustedkey
authinfo delrestrict ifreload monlist reslist unconfig
broadcast disable ifstats passwd restrict unrestrict
clkbug dmpeers iostats peers showpeer
untrustedkey
clockstat enable kerninfo preset sysinfo version
clrtrap exit keyid pstats sysstats
不等价交换的 DDos 利用
Listpeers指令与 monlist指令
Listpeers指令,列出目标NTP服务器的peers(NTP Servers )
Monlist 指令,可以获取与目标 NTP Server进行过同步的最后600 个客户机IP。这意味着,
一个很小的请求包,就能获取到大量的活动 IP 地址组成的连续 UDP 包,wireshark 抓包如
下图:
值得注意的是,截图显示的,仍然只是NTP服务器回包中很小的一部分,此次通信实际的回
包比为 1:73,而数据量大小比为 234 bytes:73×482 bytes,约等于 1:562,计算可得
到,10M 的通信流量可以得到 5620M的攻击流量,也就是5G。
正是由于此指令的不等价交换(1:562 的报酬),UDP 协议的通信模糊性(无三次握手
验证),以及NTP 服务器的无认证机制,使得反射型DDos攻击成为可能。
DDos 攻击程序编写
来自国外 Blog的 monlist测试例子:
这个 Python脚本的作用是,从指定的服务器使用monlist指令返回的IP地址列表,由
于 Linux的 ntpdc指令超时时间很短,因此不容易返回完整的列表。
使用 Python 进行攻击程序的开发
Python 的攻击代码由SAI编写,截图如下:
使用 Winpcap 进行攻击程序的开发
此代码由 linxinsnow编写。
说明:
由于网络上的大量NTP 服务器,客户端不一定有600 个,因此我们在攻击之前需要进行
“子弹填充”,也就是模拟NTP client向服务器发起NTP 请求,人为制造客户端,这样在使
用minlist指令的时候,就能返回一系列很大的UDP报文。
攻击流程图如下:
1.填充子弹: 2. 开始攻击:
此时 1.1.1.1会收到来自大量 NTP 服务器的monlist回包,阻塞带宽。
如何进行防范
只要网络上还有允许 NTP monlist 的服务器存在,这种基于流量放大的 DDos 攻击就无
法进行单机防护,除非在所有骨干网节点都部署上抗DDos 防护设备。
攻击程序暂时不放出来,不过大牛们根据此文完全可以自己编写,noblesse oblige,
希望大家不要用于非法用途。
(责任编辑:IT) |