簡介
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,它與以前的版本兼容。

l LI:跳躍指示器,警告在當月最后一天的最終時刻插入的迫近閨秒(閨秒)。
l VN:版本號。
l Mode:模式。該字段包括以下值:0-預留;1-對稱行為;3-客戶機;4-服務器;5-廣播;6-NTP 控制信息
l Stratum:對本地時鍾級別的整體識別。
l Poll:有符號整數表示連續信息間的最大間隔。
l Precision:有符號整數表示本地時鍾精確度。
l Root Delay:有符號固定點序號表示主要參考源的總延遲,很短時間內的位15到16間的分段點。
l Root Dispersion:無符號固定點序號表示相對於主要參考源的正常差錯,很短時間內的位15到16間的分段點。
l Reference Identifier:識別特殊參考源。
l Originate Timestamp:這是向服務器請求分離客戶機的時間,采用64位時標(Timestamp)格式。
l Receive Timestamp:這是向服務器請求到達客戶機的時間,采用64位時標(Timestamp)格式。
l Transmit Timestamp:這是向客戶機答復分離服務器的時間,采用64位時標(Timestamp)格式。
l 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
不等價交換的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編寫,截圖如下: