FTP協議的分析和擴展

來源:本站原創 網絡技術詳解 超過896 views圍觀 0條評論

1.0<< FTP和TCP端口號
根據是使用Port模式還是Passive模式,FTP使用不同的TCP端口號,在詳細描述FTP前,我們來
簡單討論一下TCP端口號的一些基本概念。TCP使用端口號來標識所發送和接收的應用,端口號
可以幫助TCP來分離字節流并且幫相應字節傳遞給正確的應用程序。
TCP端口號可以是半永久的和暫時的。服務器端監聽在半永久的端口上來讓客戶端訪問。客戶
端使用暫時的端口在本地標識一個對話,客戶端端口只在使用TCP服務時候才存在,而服務器
端口只要服務器在運行就一直在監聽。
TCP端口可以歸為3類:
1、眾所周知的端口來標識在TCP上運行的標準服務,包括FTP、HTTP、TELNET、SMTP等,這些
    端口號碼范圍為0-1023;
2、注冊端口號用來標識那些已經向IANA(Internet Assigned Numbers Assigned Numbers
    Authority)注冊的應用,注冊端口號為1024-49151;
3、私有端口號是非注冊的并且可以動態地分配給任何應用,私有端口為49152-65535;
   注冊的端口號本來打算只給注冊的應用使用,可近年來端口號已經陷入了到達極限的困境,你
    可能會看到本來應該是給注冊應用使用的注冊端口被非注冊應用用做暫時的端口。RFC1700詳
    細標注了眾所周知的和注冊的端口號,然而不幸的是,這個RFC文檔自從1994年以來一直沒有
    被更新,然后你仍可以從IANA得到一個及時更新的端口列表,詳細URL為:
    http://www.iana.org/assignments/port-numbers
>;>;2.0<< FTP Port模式和FTP Passive模式
當你對一個FTP問題進行排錯時候,你首先要問的一個問題是使用的是port模式的還是passive
模式。因為這兩種行為迥異,所以這兩種模式引起的問題也不同;在過去,客戶端缺省為acti
ve(port)模式;近來,由于Port模式的安全問題,許多客戶端的FTP應用缺省為Passive模式。
>;>;2.1   FTP Port模式
Port模式的FTP步驟如下:
1、 客戶端發送一個TCP SYN(TCP同步)包給服務器段眾所周知的FTP控制端口21,客戶端
   使用暫時的端口作為它的源端口;
2、 服務器端發送SYN ACK(同步確認)包給客戶端,源端口為21,目的端口為客戶端上使用
   的暫時端口;
3、 客戶端發送一個ACK(確認)包;客戶端使用這個連接來發送FTP命令,服務器端使用這個
   連接來發送FTP應答;
4、 當用戶請求一個列表(List)請求或者發起一個要求發送或者接受文件的請求,客戶端軟件使用
   PORT命令,這個命令包含了一個暫時的端口,客戶端希望服務器在打開一個數據連接時候使用
   這個暫時端口;PORT命令也包含了一個IP地址,這個IP地址通常是客戶自己的IP地址,而且FT
   P也支持第三方(third-party)模式,第三方模式是客戶端告訴服務器端打開與另臺主機的連接;
5、 服務器端發送一個SYN包給客戶端的暫時端口,源端口為20,暫時端口為客戶端在PORT命令中
   發送給服務器端的暫時端口號;
6、 客戶端以源端口為暫時端口,目的端口為20發送一個SYN ACK包;
7、 服務器端發送一個ACK包;
8、 發送數據的主機以這個連接來發送數據,數據以TCP段(注:segment,第4層的PDU)形式發送(
   一些命令,如STOR表示客戶端要發送數據,RETR表示服務器段發送數據),這些TCP段都需要
   對方進行ACK確認(注:因為TCP協議是一個面向連接的協議)
9、 當數據傳輸完成以后,發送數據的主機以一個FIN命令來結束數據連接,這個FIN命令需要另一
   臺主機以ACK確認,另一臺主機也發送一個FIN命令,這個FIN命令同樣需要發送數據的主機以A
   CK確認;
10、 客戶端能在控制連接上發送更多的命令,這可以打開和關閉另外的數據連接;有時候客戶端結
   束后,客戶端以FIN命令來關閉一個控制連接,服務器端以ACK包來確認客戶端的FIN,服務器
   同樣也發送它的FIN,客戶端用ACK來確認。
下圖圖示了FTP PORT模式前幾步步驟:
/====================================================================\
|                                                                    |
|    [ ftp Client ]                       [ ftp Server ]       |
|                                                                    |
|    (TCP:21 連接初始化,控制端口)                                  |
|                            SYN                                   |
|        Port xxxx ———————->; Port 21    [TCP]   |
|                             SYN+ACK                                |
|        Port xxxx <———————- Port 21              |
|                            ACK                                   |
|        Port xxxx ———————->; Port 21              |
|                                                                    |
|    (控制操作: 用戶列目錄或傳輸文件)                               |
|                                                                    |
|                       Port, IP, Port yyyy                          |
|        Port xxxx <———————- Port 21              |
|                       Port Seccussful                            |
|        Port xxxx <———————- Port 21              |
|                       List, Retr or Stor                         |
|        Port xxxx ———————->; Port 21              |
|                                                                    |
|                                                                    |
|        (TCP:20 連接初始化,數據端口)                                   |
|                            SYN                               |
|        Port yyyy <———————- Port 20              |
|                         SYN+ACK                               |
|        Port yyyy ———————->; Port 20              |
|                            ACK                               |
|        Port yyyy <———————- Port 20              |
|                                                                    |
|                                                                    |
|        (數據操作: 數據傳輸)                                        |
|                         Data + ACK                            |
|        Port yyyy <———————>; Port 20              |
|                            .                                  |
|                            .                                  |
|                            .                                  |
|                                                                    |
\====================================================================/
FTP Port模式會給網絡管理人員在許多方面帶來很多問題,首先,在PORT命令消息中的IP地址和端
口號的編碼不是直白地顯示。另外,應用層的協議命令理論上不應該包含網絡地址信息(注:
IP地址),因為這打破了協議層的原則并且可能導致協同性和安全性方面的問題。
下圖是WildPackets EtherPeek協議分析儀解碼了PORT命令的地址參數,地址參數后是端口號,見PORT
192,168,10,232,6,127;6,127部分的第一個阿拉伯數字乘以256,然后加上第2個阿拉伯數字
就得到端口號,所以客戶端指定了端口號為6*256+127=1663;
/====================================================================\
| IP Header – Internet Protocol Datagram                             |
| Version:              4                                        |
| Header Length:        5   (20   bytes)                             |
|                                                                    |
| ……………                                                  |
|                                                                    |
| Time To Live:       128                                     |
| Protocol:          6   TCP – Transmission Control Protocol     |
| Header Checksum:    0xAA36                                  |
| Source IP Address: 192.168.0.1   DEMO                          |
| Dest. IP Address:     192.168.0.3   VI                         |
| No IP Options                                                 |
|                                                                    |
| TCP – Transport Control Protocol                                   |
| Source Port:       2342   manage-exec                          |
| Destination Port:     21   ftp                                  |
| Sequence Number:    2435440100                               |
| Ack Number:           9822605                                  |
| Offset:             5   (20   bytes)                             |
| Reserved:          %000000                                  |
| Flags:             %011000                                  |
|                      0. …. (No Urgent pointer)             |
|                      .1 …. Ack                                |
|                      .. 1… Push                            |
|                      .. .0.. (No Reset)                      |
|                      .. ..0. (No SYN)                         |
|                      .. …0 (No FIN)                         |
|                                                                    |
| Window:             65150                                      |
| Checksum:          0x832A                                  |
| Urgent Pointer:    0                                        |
| No TCP Options                                                 |
|                                                                    |
| FTP Control – File Transfer Protocol                            |
| Line   1:              PORT 192,168,0,1,9,39<CR>;<LF>;              |
|                                                                    |
| FCS – Frame Check Sequence                                         |
| FCS (Calculated):     0xF4C04A4F                               |
\====================================================================/

 

下圖驗證了服務器端的確從端口20打開到端口1663的TCP連接:
/====================================================================\
| TCP – Transport Control Protocol                                   |
| Source Port:       20   ftp-data                            |
| Destination Port:     1663                                     |
| Sequence Number:    2578824336                               |
| Ack Number:           0                                        |
| Offset:             6   (24   bytes)                             |
| Reserved:          %000000                                  |
| Flags:             %000010                                  |
|                      0. …. (No Urgent pointer)             |
|                      .0 …. (No Ack)                         |
|                      .. 0… (No Push)                          |
|                      .. .0.. (No Reset)                      |
|                      .. ..1. SYN                                |
|                      .. …0 (No FIN)                         |
|                                                                    |
| Window:             3731                                     |
| Checksum:          0x8A4C                                  |
| Urgent Pointer:    0                                        |
| No TCP Options                                                 |
|                                                                    |
| TCP Options                                                        |
| Options Type:       2 Maxinum Segment Size                |
| Length:             4                                        |
| MSS:                1460                                     |
|                                                                    |
| FCS – Frame Check Sequence                                         |
| FCS (Calculated):     0x5A1BD023                               |
\====================================================================/
當使用FTP時候,網絡中的防火墻必須要聲明相應的端口,防火墻必須要跟蹤FTP對話然后檢查
PORT命令,防火墻必須要參與從服務器端到客戶端在PORT命令中指定的端口連接的建立過程。
如果網絡中使用了NAT(注:網絡地址翻譯),那么NAT的網關同樣也需要聲明相應的端口,網
關需要把在PORT命令中指定的IP地址翻譯成分配給客戶的地址,然后重新計算TCP的Checksum
;如果網關沒有正確地執行這個操作,FTP就失敗了。
黑客可能會利用FTP支持第三方特性這一特點,在PORT命令中設置IP地址和端口號參數來指定
一臺目標主機的地址和端口號(有時候稱這種攻擊為FTP反彈攻擊),例如黑客可以讓一臺FTP
服務器不斷地從它的源端口20發送TCP SYN包給一系列目的端口,讓FTP服務器看起來正在進行
端口掃描,目的主機不知道攻擊來自黑客的主機,看起來攻擊象是來自FTP服務器。一些常用的
FTP應用在PORT命令中設置地址為0.0.0.0,這樣做的意圖是讓FTP服務器只需要與打開控制連接
的相同客戶進行數據連接,設置地址為0.0.0.0可能會讓防火墻不知所措。例如,CISCO PIX IOS
6.0以上版本的PIX(注:CISCO硬件防火墻設備,6.0以上版本為其修正了相關的FTP協議)
要求數據連接的IP地址與已經存在的控制連接的IP地址必須相同。這樣做的原因是防止黑客用
PORT命令來攻擊別的機器,雖然一些FTP應用設置IP地址為0.0.0.0不是有意圖的攻擊,但在PI
X修正協議環境下的確引起了一些問題,同時對其他不允許第三方模式和避免FTP反彈攻擊的防
火墻來說,這也會引起相同的問題。
>;>;2.2   FTP Passive模式
下面的列表描述了Passive模式的FTP的步驟,步驟1到3和Port模式FTP相同,步驟9到11同樣與
Port模式FTP最后三步相同。
1、客戶端發送一個TCP SYN(TCP同步)包給服務器段眾所周知的FTP控制端口21,客戶端使
    用暫時的端口作為它的源端口;
2、服務器端發送SYN ACK(同步確認)包給客戶端,源端口為21,目的端口為客戶端上使用
    的暫時端口;
3、客戶端發送一個ACK(確認)包;客戶端使用這個連接來發送FTP命令,服務器端使用這個
    連接來發送FTP應答;
4、當用戶請求一個列表(List)或者發送或接收文件時候,客戶端軟件發送PASV命令給服務器端
    表明客戶端希望進入Passive模式;
5、服務器端進行應答,應答包括服務器的IP地址和一個暫時的端口,這個暫時的端口是客戶端
    在打開數據傳輸連接時應該使用的端口;
6、客戶端發送一個SYN包,源端口為客戶端自己選擇的一個暫時端口,目的端口為服務器在PASV
    應答命令中指定的暫時端口號;
7、服務器端發送SYN ACK包給客戶端,目的端口為客戶端自己選擇的暫時端口,源端口為PASV
    應答中指定的暫時端口號;
8、客戶端發送一個ACK包;
9、發送數據的主機以這個連接來發送數據,數據以TCP段(注:segment,第4層的PDU)形式發送(
    一些命令,如STOR表示客戶端要發送數據,RETR表示服務器段發送數據),這些TCP段都需要
    對方進行ACK確認;
10、當數據傳輸完成以后,發送數據的主機以一個FIN命令來結束數據連接,這個FIN命令需要另一
    臺主機以ACK確認,另一臺主機也發送一個FIN命令,這個FIN命令同樣需要發送數據的主機以A
    CK確認;
11、客戶端能在控制連接上發送更多的命令,這可以打開和關閉另外的數據連接;有時候客戶端結
    束后,客戶端以FIN命令來關閉一個控制連接,服務器端以ACK包來確認客戶端的FIN,服務器
    同樣也發送它的FIN,客戶端用ACK來確認。
下圖圖示了Passive模式FTP的開始幾個步驟:
/====================================================================\
|                                                                    |
|    [ ftp Client ]                       [ ftp Server ]       |
|                                                                    |
|    (TCP:21 連接初始化,控制端口)                                  |
|                            SYN                                   |
|        Port xxxx ———————->; Port 21    [TCP]   |
|                             SYN+ACK                                |
|        Port xxxx <———————- Port 21              |
|                            ACK                                   |
|        Port xxxx ———————->; Port 21              |
|                                                                    |
|    (PASV操作: 被動連接數據端口初始化)                            |
|                                                                    |
|                             PASV                                   |
|        Port xxxx ———————->; Port 21              |
|                   PASV OK, IP, Port yyyy                      |
|        Port xxxx <———————- Port 21              |
|                            SYN                               |
|        Port zzzz ———————->; Port yyyy          |
|                         SYN+ACK                               |
|        Port zzzz <———————- Port yyyy          |
|                            ACK                               |
|        Port zzzz ———————->; Port yyyy          |
|                                                                    |
|                                                                    |
|        (數據操作: 數據傳輸)                                        |
|                       List, Retr or Stor                         |
|        Port xxxx ———————->; Port 21              |
|                         Data + ACK                            |
|        Port zzzz <———————>; Port yyyy          |
|                            .                                  |
|                            .                                  |
|                            .                                  |
|                                                                    |
\====================================================================/
一個PASV請求要求服務器在服務器選擇的一個新的端口上接受數據連接,PASV命令沒有任何參
數,服務器端的回應只是一行顯示服務器IP地址和服務器接受連接的TCP端口號。
下圖顯示了服務器對PASV命令的回應,服務器告訴客戶端它在端口5365(192,168,179,100,20
,245)上進行監聽,計算端口的方法是20*256+245=5365;
/====================================================================\
| TCP – Transport Control Protocol                                   |
| Source Port:       21   ftp                                  |
| Destination Port:     1249                                     |
| Sequence Number:    4239887193                               |
| Ack Number:           36925357                                   |
| Offset:             5   (20   bytes)                             |
| Reserved:          %000000                                  |
| Flags:             %011000                                  |
|                      0. …. (No Urgent pointer)             |
|                      .1 …. Ack                                |
|                      .. 1… Push                            |
|                      .. .0.. (No Reset)                      |
|                      .. ..0. (No SYN)                         |
|                      .. …0 (No FIN)                         |
|                                                                    |
| Window:             8760                                     |
| Checksum:          0x3EAB                                  |
| Urgent Pointer:    0                                        |
| No TCP Options                                                 |
|                                                                    |
| FTP Control – File Transfer Protocol                            |
| Line   1:              PASV 192,168,0,1,100,20,245<CR>;<LF>;        |
|                                                                    |
| FCS – Frame Check Sequence                                         |
| FCS (Calculated):     0xBED4346D                               |
\====================================================================/
當收到PASV命令的回應后,客戶端打開一個TCP連接,源端口為一個暫時的端口,目的端口為
服務器提供的暫時端口。
下圖顯示了客戶端的TCP連接建立過程,正如上面所說,目的端口為5365。
/====================================================================\
| TCP – Transport Control Protocol                                   |
| Source Port:       1250                                     |
| Destination Port:     5365                                     |
| Sequence Number:    36931503                                   |
| Ack Number:           0                                        |
| Offset:             7   (28   bytes)                             |
| Reserved:          %000000                                  |
| Flags:             %000010                                  |
|                      0. …. (No Urgent pointer)             |
|                      .0 …. (No Ack)                         |
|                      .. 0… (No Push)                          |
|                      .. .0.. (No Reset)                      |
|                      .. ..1. SYN                                |
|                      .. …0 (No FIN)                         |
|                                                                    |
| Window:             8192                                     |
| Checksum:          0x1A57                                  |
| Urgent Pointer:    0                                        |
| No TCP Options                                                 |
|                                                                    |
| TCP Options                                                        |
| Options Type:       2 Maxinum Segment Size                |
| Length:             4                                        |
| MSS:                1460                                     |
|                                                                    |
| FCS – Frame Check Sequence                                         |
| FCS (Calculated):     0x5A1BD023                               |
\====================================================================/
大多數人認為在防火墻網絡環境中Passive模式比Port模式的問題小,但我們注意到在Passive
模式下,客戶端打開一個暫時的目的端口連接,一些防火墻或者CISCO設備的訪問列表(ACL)可
能會阻止這種連接,同樣服務器的回應也是從一個暫時的端口到一個暫時的端口,防火墻或者
CISCO的訪問列表也會阻止這種連接。在CISCO路由器上你可以用訪問列表關鍵字”established
“來避免第二個問題,”established”關鍵字告訴路由器允許帶ACK字端的包通過,服務器端的S
YN ACK包帶有ACK字端。在新版本PIX IOS中也可以通過fixit關鍵字建立針對ftp協議的深層狀
態檢測過濾,其他大多數狀態檢測防火墻例如LinuxNetfilters也支持ftp協議的狀態檢測,進行
準確的PASV動態端口過濾。

文章出自:CCIE那點事 http://www.qdxgqk.live/ 版權所有。本站文章除注明出處外,皆為作者原創文章,可自由引用,但請注明來源。 禁止全文轉載。
本文鏈接:http://www.qdxgqk.live/?p=231轉載請注明轉自CCIE那點事
如果喜歡:點此訂閱本站
  • 相關文章
  • 為您推薦
  • 各種觀點
?
暫時還木有人評論,坐等沙發!
發表評論

您必須 [ 登錄 ] 才能發表留言!

?
?
萌宠夺宝游戏