下面是我在實驗室中類比的一次Syn Flood攻擊的實際過程
這一個區域網路環境,只有一台攻擊機(PIII667/128/mandrake),被攻擊的是一台Solaris 8.0 (spark)的主機,網路裝置是Cisco的百兆交換器。這是在攻擊並未進行之前,在Solaris上進行snoop的記錄,snoop與tcpdump等網路監聽工具一樣,也是一個很好的網路抓包與分析的工具。可以看到攻擊之前,目標主機上接到的基本上都是一些普通的網路包。
…
…
? -> (broadcast) ETHER Type=886F (Unknown), size = 1510 bytes
? -> (broadcast) ETHER Type=886F (Unknown), size = 1510 bytes
? -> (multicast) ETHER Type=0000 (LLC/802.3), size = 52 bytes
? -> (broadcast) ETHER Type=886F (Unknown), size = 1510 bytes
192.168.0.66 -> 192.168.0.255 NBT Datagram Service Type=17 Source=GU[0]
192.168.0.210 -> 192.168.0.255 NBT Datagram Service Type=17 Source=ROOTDC[20]
192.168.0.247 -> 192.168.0.255 NBT Datagram Service Type=17 Source=TSC[0]
? -> (broadcast) ETHER Type=886F (Unknown), size = 1510 bytes
192.168.0.200 -> (broadcast) ARP C Who is 192.168.0.102, 192.168.0.102 ?
? -> (broadcast) ETHER Type=886F (Unknown), size = 1510 bytes
? -> (broadcast) ETHER Type=886F (Unknown), size = 1510 bytes
192.168.0.66 -> 192.168.0.255 NBT Datagram Service Type=17 Source=GU[0]
192.168.0.66 -> 192.168.0.255 NBT Datagram Service Type=17 Source=GU[0]
192.168.0.210 -> 192.168.0.255 NBT Datagram Service Type=17 Source=ROOTDC[20]
? -> (multicast) ETHER Type=0000 (LLC/802.3), size = 52 bytes
? -> (broadcast) ETHER Type=886F (Unknown), size = 1510 bytes
? -> (broadcast) ETHER Type=886F (Unknown), size = 1510 bytes……
接著,攻擊機開始發包,DDoS開始了…,突然間sun主機上的snoop視窗開始飛速地翻屏,顯示出接到數量巨大的Syn請求。這時的螢幕就好象是時速300公裡的列車上的一扇車窗。這是在Syn Flood攻擊時的snoop輸出結果:
…
127.0.0.178 -> lab183.lab.net AUTH C port=1352
127.0.0.178 -> lab183.lab.net TCP D=114 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=115 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net UUCP-PATH C port=1352
127.0.0.178 -> lab183.lab.net TCP D=118 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net NNTP C port=1352
127.0.0.178 -> lab183.lab.net TCP D=121 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=122 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=124 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=125 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=126 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=128 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=130 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=131 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=133 S=1352 Syn Seq=674711609 Len=0 Win=65535
127.0.0.178 -> lab183.lab.net TCP D=135 S=1352 Syn Seq=674711609 Len=0 Win=65535…
這時候內容完全不同了,再也收不到剛才那些正常的網路包,只有DDoS包。大家注意一下,這裡所有的Syn Flood攻擊包的源地址都是偽造的,給追查工作帶來很大困難。這時在被攻擊主機上積累了多少Syn的半串連呢?我們用netstat來看一下:
# netstat -an | grep SYN …
…
192.168.0.183.9 127.0.0.79.1801 0 0 24656 0 SYN_RCVD
192.168.0.183.13 127.0.0.79.1801 0 0 24656 0 SYN_RCVD
192.168.0.183.19 127.0.0.79.1801 0 0 24656 0 SYN_RCVD
192.168.0.183.21 127.0.0.79.1801 0 0 24656 0 SYN_RCVD
192.168.0.183.22 127.0.0.79.1801 0 0 24656 0 SYN_RCVD
192.168.0.183.23 127.0.0.79.1801 0 0 24656 0 SYN_RCVD
192.168.0.183.25 127.0.0.79.1801 0 0 24656 0 SYN_RCVD
192.168.0.183.37 127.0.0.79.1801 0 0 24656 0 SYN_RCVD
192.168.0.183.53 127.0.0.79.1801 0 0 24656 0 SYN_RCVD……
其中SYN_RCVD表示當前未完成的TCP SYN隊列,統計一下:
# netstat -an | grep SYN | wc -l
5273
# netstat -an | grep SYN | wc -l
5154
# netstat -an | grep SYN | wc -l
5267
…..
共有五千多個Syn的半串連儲存在記憶體中。這時候被攻擊機已經不能響應新的服務要求了,系統運行非常慢,也無法ping通。
這是在攻擊發起後僅僅70秒鐘左右時的情況。
DDoS的防範
到目前為止,進行DDoS攻擊的防禦還是比較困難的。首先,這種攻擊的特點是它利用了TCP/IP協議的漏洞,除非你不用TCP/IP,才有可能完全抵禦住DDoS攻擊。一位資深的安全專家給了個形象的比喻:DDoS就好象有1,000個人同時給你家裡打電話,這時候你的朋友還打得進來嗎?
不過即使它難於防範,也不是說我們就應該逆來順受,實際上防止DDoS並不是絕對不可行的事情。互連網的使用者是各種各樣的,與DDoS做鬥爭,不同的角色有不同的任務。我們以下面幾種角色為例:
- 企業網管理員
- ISP、ICP管理員
- 骨幹網路電訊廠商
企業網管理員
網管員做為一個企業內部網的管理者,往往也是安全員、守護神。在他維護的網路中有一些伺服器需要向外提供WWW服務,因而不可避免地成為DDoS的攻擊目標,他該如何做呢?可以從主機與網路裝置兩個角度去考慮。
主機上的設定
幾乎所有的主機平台都有抵禦DoS的設定,總結一下,基本的有幾種:
- 關閉不必要的服務
- 限制同時開啟的Syn半串連數目
- 縮短Syn半串連的time out 時間
- 及時更新系統補丁