syn非同步序列號
SYN攻擊是黑客攻擊的手段。SYN洪泛攻擊的基礎是依靠TCP建立連線時三次握手的設計。第三個資料包驗證連線發起人在第一次請求中使用的源IP地址上具有接受資料包的能力,即其返回是可達的。
SYN攻擊概述
編輯
據統計,在所有黑客攻擊事件中,SYN攻擊是最常見又最容易被利用的一種攻擊手法。相信很多人還記得2000年YAHOO網站遭受的攻擊事例,當時黑客利用的就是簡單而有效的SYN攻擊,有些網路蠕蟲病毒配合SYN攻擊造成更大的破壞。本文介紹SYN攻擊的基本原理、工具及檢測方法,並全面探討SYN攻擊防範技術。
一、TCP握手協議
在TCP/IP協議中,TCP協議提供可靠的連線服務,採用三次握手建立一個連線。
第一次握手:建立連線時,客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
完成三次握手,客戶端與伺服器開始傳送資料,在上述過程中,還有一些重要的概念:
未連線佇列:在三次握手協議中,伺服器維護一個未連線佇列,該佇列為每個客戶端的SYN包(syn=j)開設一個條目,該條目表明伺服器已收到SYN包,並向客戶發出確認,正在等待客戶的確認包。這些條目所標識的連線在伺服器處於Syn_RECV狀態,當伺服器收到客戶的確認包時,刪除該條目,伺服器進入ESTABLISHED狀態。 backlog引數:表示未連線佇列的最大容納數目。
SYN-ACK 重傳次數 伺服器傳送完SYN-ACK包,如果未收到客戶確認包,伺服器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數超過系統規定的最大重傳次數,系統將該連線資訊從半連線佇列中刪除。注意,每次重傳等待的時間不一定相同。
半連線存活時間:是指半連線佇列的條目存活的最長時間,也即服務從收到SYN包到確認這個報文無效的最長時間,該時間值是所有重傳請求包的最長等待時間總和。有時我們也稱半連線存活時間為Timeout時間、SYN_RECV存活時間。[1]
二、SYN攻擊原理
SYN攻擊屬於DOS攻擊的一種,它利用TCP協議缺陷,通過傳送大量的半連線請求,耗費CPU和記憶體資源。SYN攻擊除了能影響主機外,還可以危害路由器、防火牆等網路系統,事實上SYN攻擊並不管目標是什麼系統,只要這些系統開啟TCP服務就可以實施。從上圖可看到,伺服器接收到連線請求(syn=j),將此資訊加入未連線佇列,併發送請求包給客戶(syn=k,ack=j+1),此時進入SYN_RECV狀態。當伺服器未收到客戶端的確認包時,重發請求包,一直到超時,才將此條目從未連線佇列刪除。配合IP欺騙,SYN攻擊能達到很好的效果,通常,客戶端在短時間內偽造大量不存在的IP地址,向伺服器不斷地傳送syn包,伺服器回覆確認包,並等待客戶的確認,由於源地址是不存在的,伺服器需要不斷的重發直至超時,這些偽造的SYN包將長時間佔用未連線佇列,正常的SYN請求被丟棄,目標系統執行緩慢,嚴重者引起網路堵塞甚至系統癱瘓。 三、SYN攻擊工具
SYN攻擊實現起來非常的簡單,網際網路上有大量現成的SYN攻擊工具。[1]
三、windows系統下的SYN工具
以synkill.exe為例,執行工具,選擇隨機的源地址和源端囗,並填寫目標機器地址和TCP端囗,啟用執行,很快就會發現目標系統執行緩慢。如果攻擊效果不明顯,可能是目標機器並未開啟所填寫的TCP端囗或者防火牆拒絕訪問該端囗,此時可選擇允許訪問的TCP端囗,通常,windows系統開放tcp139端囗,UNIX系統開放tcp7、21、23等端囗。[1]
四、檢測SYN攻擊
檢測SYN攻擊非常的方便,當你在伺服器上看到大量的半連線狀態時,特別是源IP地址是隨機的,基本上可以斷定這是一次SYN攻擊。我們使用系統自帶的netstat 工具來檢測SYN攻擊:
netstat -n -p TCP tcp 0 0 10.11.11.11:23 124.173.152.8:25882 SYN_RECV - tcp 0 0 10.11.11.11:23 236.15.133.204:2577 SYN_RECV - tcp 0 0 10.11.11.11:23 127.160.6.129:51748 SYN_RECV - tcp 0 0 10.11.11.11:23 222.220.13.25:47393 SYN_RECV - tcp 0 0 10.11.11.11:23 212.200.204.182:60427 SYN_RECV - tcp 0 0 10.11.11.11:23 232.115.18.38:278 SYN_RECV - tcp 0 0 10.11.11.11:23 239.116.95.96:5122 SYN_RECV - tcp 0 0 10.11.11.11:23 236.219.139.207:49162 SYN_RECV - …
上面是在LINUX系統中看到的,很多連線處於SYN_RECV狀態(在WINDOWS系統中是SYN_RECEIVED狀態),源IP地址都是隨機的,表明這是一種帶有IP欺騙的SYN攻擊。
我們也可以通過下面的命令直接檢視在LINUX環境下某個端囗的未連線佇列的條目數:
#netstat -n -p TCP GREP SYN_RECV grep :22 wc -l 324
顯示TCP端囗22的未連線數有324個,雖然還遠達不到系統極限,但應該引起管理員的注意。
五、SYN攻擊防範技術
關於SYN攻擊防範技術,人們研究得比較早。歸納起來,主要有兩大類,一類是通過防火牆、路由器等過濾閘道器防護,另一類是通過加固TCP/IP協議棧防範.但必須清楚的是,SYN攻擊不能完全被阻止,我們所做的是儘可能的減輕SYN攻擊的危害,除非將TCP協議重新設計。
1、過濾閘道器防護
這裡,過濾閘道器主要指明防火牆,當然路由器也能成為過濾閘道器。防火牆部署在不同網路之間,防範外來非法攻擊和防止保密資訊外洩,它處於客戶端和伺服器之間,利用它來防護SYN攻擊能起到很好的效果。過濾閘道器防護主要包括超時設定,SYN閘道器和SYN代理三種。
■閘道器超時設定:防火牆設定SYN轉發超時引數(狀態檢測的防火牆可在狀態表裡面設定),該引數遠小於伺服器的timeout時間。當客戶端傳送完SYN包,服務端傳送確認包後(SYN+ACK),防火牆如果在計數器到期時還未收到客戶端的確認包(ACK),則往伺服器傳送RST包,以使伺服器從佇列中刪去該半連線。值得注意的是,閘道器超時引數設定不宜過小也不宜過大,超時引數設定過小會影響正常的通訊,設定太大,又會影響防範SYN攻擊的效果,必須根據所處的網路應用環境來設定此引數。
■SYN閘道器:SYN閘道器收到客戶端的SYN包時,直接轉發給伺服器;SYN閘道器收到伺服器的SYN/ACK包後,將該包轉發給客戶端,同時以客戶端的名義給伺服器發ACK確認包。此時伺服器由半連線狀態進入連線狀態。當客戶端確認包到達時,如果有資料則轉發,否則丟棄。事實上,伺服器除了維持半連線佇列外,還要有一個連線佇列,如果發生SYN攻擊時,將使連線佇列數目增加,但一般伺服器所能承受的連線數量比半連線數量大得多,所以這種方法能有效地減輕對伺服器的攻擊。
■SYN代理:當客戶端SYN包到達過濾閘道器時,SYN代理並不轉發SYN包,而是以伺服器的名義主動回覆SYN/ACK包給客戶,如果收到客戶的ACK包,表明這是正常的訪問,此時防火牆向伺服器傳送ACK包並完成三次握手。SYN代理事實上代替了伺服器去處理SYN攻擊,此時要求過濾閘道器自身具有很強的防範SYN攻擊能力。 2、加固tcp/ip協議棧
防範SYN攻擊的另一項主要技術是調整tcp/ip協議棧,修改tcp協議實現。主要方法有SynAttackProtect保護機制、SYN cookies技術、增加最大半連線和縮短超時時間等。tcp/ip協議棧的調整可能會引起某些功能的受限,管理員應該在進行充分了解和測試的前提下進行此項工作。
■SynAttackProtect機制
為防範SYN攻擊,win2000系統的tcp/ip協議棧內嵌了SynAttackProtect機制,Win2003系統也採用此機制。SynAttackProtect機制是通過關閉某些socket選項,增加額外的連線指示和減少超時時間,使系統能處理更多的SYN連線,以達到防範SYN攻擊的目的。預設情況下,Win2000作業系統並不支援SynAttackProtect保護機制,需要在登錄檔以下位置增加SynAttackProtect鍵值:
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
當SynAttackProtect值(如無特別說明,本文提到的登錄檔鍵值都為十六進位制)為0或不設定時,系統不受SynAttackProtect保護。
當SynAttackProtect值為1時,系統通過減少重傳次數和延遲未連線時路由緩衝項(route cache entry)防範SYN攻擊。
當SynAttackProtect值為2時(Microsoft推薦使用此值),系統不僅使用backlog佇列,還使用附加的半連線指示,以此來處理更多的SYN連線,使用此鍵值時,tcp/ip的TCPInitialRTT、window size和可滑動窗囗將被禁止。
我們應該知道,平時,系統是不啟用SynAttackProtect機制的,僅在檢測到SYN攻擊時,才啟用,並調整tcp/ip協議棧。那麼系統是如何檢測SYN攻擊發生的呢?事實上,系統根據TcpMaxHalfOpen,TcpMaxHalfOpenRetried 和TcpMaxPortsExhausted三個引數判斷是否遭受SYN攻擊。
TcpMaxHalfOpen 表示能同時處理的最大半連線數,如果超過此值,系統認為正處於SYN攻擊中。Win2000 server預設值為100,Win2000 Advanced server為500。
TcpMaxHalfOpenRetried定義了儲存在backlog佇列且重傳過的半連線數,如果超過此值,系統自動啟動SynAttackProtect機制。Win2000 server預設值為80,Win2000 Advanced server為400。
TcpMaxPortsExhausted 是指系統拒絕的SYN請求包的數量,預設是5。
如果想調整以上引數的預設值,可以在登錄檔裡修改(位置與SynAttackProtect相同)
■ SYN cookies技術
我們知道,TCP協議開闢了一個比較大的記憶體空間backlog佇列來儲存半連線條目,當SYN請求不斷增加,並這個空間,致使系統丟棄SYN連線。為使半連線佇列被塞滿的情況下,伺服器仍能處理新到的SYN請求,SYN cookies技術被設計出來。
SYN cookies應用於linux、FreeBSD等作業系統,當半連線佇列滿時,SYN cookies並不丟棄SYN請求,而是通過加密技術來標識半連線狀態。
在TCP實現中,當收到客戶端的SYN請求時,伺服器需要回復SYN+ACK包給客戶端,客戶端也要傳送確認包給伺服器。通常,伺服器的初始序列號由伺服器按照一定的規律計算得到或採用隨機數,但在SYN cookies中,伺服器的初始序列號是通過對客戶端IP地址、客戶端端囗、伺服器IP地址和伺服器端囗以及其他一些安全數值等要素進行hash運算,加密得到的,稱之為cookie。當伺服器遭受SYN攻擊使得backlog佇列滿時,伺服器並不拒絕新的SYN請求,而是回覆cookie(回覆包的SYN序列號)給客戶端, 如果收到客戶端的ACK包,伺服器將客戶端的ACK序列號減去1得到cookie比較值,並將上述要素進行一次hash運算,看看是否等於此cookie。如果相等,直接完成三次握手(注意:此時並不用檢視此連線是否屬於backlog佇列)。
在RedHat linux中,啟用SYN cookies是通過在啟動環境中設定以下命令來完成:
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
■ 增加最大半連線數
大量的SYN請求導致未連線佇列被塞滿,使正常的TCP連線無法順利完成三次握手,通過增大未連線佇列空間可以緩解這種壓力。當然backlog佇列需要佔用大量的記憶體資源,不能被無限的擴大。
WIN2000:除了上面介紹的TcpMaxHalfOpen, TcpMaxHalfOpenRetried引數外,WIN2000作業系統可以通過設定動態backlog(dynamic backlog)來增大系統所能容納的最大半連線數,配置動態backlog由AFD.SYS驅動完成,AFD.SYS是一種核心級的驅動,用於支援基於window socket的應用程式,比如ftp、telnet等。AFD.SYS在登錄檔的位置: HKLM\System\CurrentControlSet\Services\AFD\ParametersEnableDynamicBacklog值為1時,表示啟用動態backlog,可以修改最大半連線數。
MinimumDynamicBacklog表示半連線佇列為單個TCP端囗分配的最小空閒連線數,當該TCP端囗在backlog佇列的空閒連線小於此臨界值時,系統為此端囗自動啟用擴充套件的空閒連線(DynamicBacklogGrowthDelta),Microsoft推薦該值為20。
MaximumDynamicBacklog是當前活動的半連線和空閒連線的和,當此和超過某個臨界值時,系統拒絕SYN包,Microsoft推薦MaximumDynamicBacklog值不得超過2000。
DynamicBacklogGrowthDelta值是指擴充套件的空閒連線數,此連線數並不計算在MaximumDynamicBacklog內,當半連線佇列為某個TCP端囗分配的空閒連線小於MinimumDynamicBacklog時,系統自動分配DynamicBacklogGrowthDelta所定義的空閒連線空間,以使該TCP端囗能處理更多的半連線。Microsoft推薦該值為10。
LINUX:Linux用變數tcp_max_syn_backlog定義backlog佇列容納的最大半連線數。在Redhat 7.3中,該變數的值預設為256,這個值是遠遠不夠的,一次強度不大的SYN攻擊就能使半連線佇列佔滿。我們可以通過以下命令修改此變數的值:
sysctl -w net.ipv4.tcp_max_syn_backlog=“2048”
Sun Solaris Sun Solaris用變數tcp_conn_req_max_q0來定義最大半連線數,在Sun Solaris 8中,該值預設為1024,可以通過add命令改變這個值:
ndd -set /dev/tcp tcp_conn_req_max_q0 2048
HP-UX:HP-UX用變數tcp_syn_rcvd_max來定義最大半連線數,在HP-UX 11.00中,該值預設為500,可以通過ndd命令改變預設值:
#ndd -set /dev/tcp tcp_syn_rcvd_max 2048
■縮短超時時間
上文提到,通過增大backlog佇列能防範SYN攻擊;另外減少超時時間也使系統能處理更多的SYN請求。我們知道,timeout超時時間,也即半連線存活時間,是系統所有重傳次數等待的超時時間總和,這個值越大,半連線數佔用backlog佇列的時間就越長,系統能處理的SYN請求就越少。為縮短超時時間,可以通過縮短重傳超時時間(一般是第一次重傳超時時間)和減少重傳次數來實現。
Win2000第一次重傳之前等待時間預設為3秒,為改變此預設值,可以通過修改網路接囗在登錄檔裡的TcpInitialRtt註冊值來完成。重傳次數由TcpMaxConnectResponseRetransmissions 來定義,登錄檔的位置是:HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters registry key。
當然我們也可以把重傳次數設定為0次,這樣伺服器如果在3秒內還未收到ack確認包就自動從backlog佇列中刪除該連線條目。
LINUX:Redhat使用變數tcp_synack_retries定義重傳次數,其預設值是5次,總超時時間需要3分鐘。
Sun Solaris Solaris 預設的重傳次數是3次,總超時時間為3分鐘,可以通過ndd命令修改這些預設值。
作者:渲染筆墨情
來源:CSDN
原文:https://blog.csdn.net/qq_37675827/article/details/77978450
版權宣告:本文為博主原創文章,轉載請附上博文連結!