天天看點

ns-3.25中基于tcp-syn半開狀态實作dos攻擊(一)

在ns-3實作基于tcp syn原理的dos攻擊,先了解攻擊的最基本原理,然後ns-3中看懂相關功能實作,最後可以在相應的地方添加自己的代碼實作攻擊了。寫本文的主要目的是将實驗過程記錄下來,以便以後可能會檢視。

要實作仿真先編寫合适的仿真場景腳本檔案,這裡我們直接拿現成的來修改,我覺得examples/tcp/tcp-large-transfer.cc就不錯。但是看到裡面有StartFlow和WriteUntilBufferFull這些函數,深感繁瑣(把它們注釋掉),是以我們将之前寫好的類MyApp(繼承自Application)直接拿來作為應用程式使用,這樣非常友善。網絡拓撲隻有三個節點:0--1--2,節點2作為伺服器,我們在其上安裝PacketSink應用程式用來接收用戶端的資料包。節點0和1作為用戶端,我們給它們添加socket,建立socket時使用的是TcpSocketBase類的CreateSocket方法(這個主要是為了設定我們在tcp-socket-base.cc和tcp-socket-base.h中添加的用來啟動syn攻擊的布爾型成員變量),通過socket的SetAttribute方法可以對這個布爾變量進行指派,進而決定哪些節點實作syn泛洪攻擊。這裡我們将節點0設定為攻擊節點,節點1為正常的用戶端節點。

在腳本攻擊設定完畢後,我們需要修改相關的源檔案,因為攻擊的原理是不停的發送syn标志的請求包,是以我們找到tcp-socket-base.cc檔案中的DoConnect函數(1000行左右),如果标記攻擊的布爾型變量為ture我們就使用循環多次發送syn包,每次發送的時候需要将源端口号和序列号加一,否則會出現錯誤的包(在wireshark錯誤的顯示重複發送)。正常情況下發完一個syn包需要将狀态CLOSED改為SYN_SENT,這裡我們為了實作攻擊效果,不改變狀态,也就是惡意的用戶端發送過syn包後狀态仍然是CLOSED。正常情況下,當伺服器發送syn|ack包給用戶端後,用戶端如果在CLOSED狀态,它會直接發送rst的資料包,這樣會直接複位伺服器儲存的半連接配接狀态,達不到攻擊的效果。是以我們在DoForwardUp函數中使用辨別攻擊的布爾變量不讓其發送rst資料包,這樣伺服器就會在很長一段時間内一直重複發送syn|ack應答包,嚴重影響伺服器的存儲和通信資源。

以上已經基本實作了基于tcp syn的dos攻擊,但是還有一些小問題,即我們在DoConnect函數中重複發送不同源端口和序列号的syn包時,忽略了一點,隻有第一個發出去的包是我們在仿真腳本檔案中進行綁定過的,也就是說重複發送的第2至n個syn包的端口沒有被netdevice進行綁定,是以當用戶端收到伺服器發送回來的syn|ack包時不能對這些資料包(第2至n個)對應的端口進行監聽,用戶端會直接發送rst資料包給伺服器。(這個問題的解決可以在tcp-l4-protocol.cc檔案中的NoEndPointsFound函數根據辨別攻擊的布爾型變量進行修改來決定其是否發送rst包)。

至此,我們基于ns-3中tcp syn dos攻擊的介紹到這裡就接近尾聲了,當然這裡重複發送源端口++和序列号++的syn包可能不是特别合适,下篇文章我們會在惡意用戶端加入ip欺騙,使dos攻擊仿真更加切合實際。