FTP 協議解析


本文首發:https://www.somata.net/2019/ftp_protocol_analysis.html

FTP全稱: File Transfer Protocol,是一個用於文件傳輸的協議,本文主要講解FTP協議。如果有不懂的地方可以查詢FTP的定義文檔: RFC 959 或者在評論中提出,同時有寫錯的地方也希望能提出來,大家一起進步。

FTP 是一個協議而不是一個服務,很多人把FTP理解為了一個服務,這里是不正確的,其實應用了FTP協議的服務也有很多,例如:vsftpd, pure-ftpd, Filezila Server等。

我這里主要講解以下FTP的工作模式、FTP的命令和FTP應答代碼的作用三個部分。以及在最后有一個ftp連接抓包作為講解內容便於理解。

FTP工作模式

FTP的完整工作有2個TCP連接,分別用於命令傳輸和數據傳輸(文件傳輸)。其分開為2個連接主要就是為了防止傳輸二進制文件破壞了命令連接的終端,可以在命令連接中指定數據傳輸的模式,以此來降低程序開發的復雜性。

FTP 的工作模式分主動連接被動連接,這兩者的區別主要就在於數據連接的連接方式:

  • 主動連接:服務器 20/TCP 端口主動發起連接到客戶端指定的端口。

image-20191130111521996

  • 被動連接:客戶端主動發起連接到服務器端指定端口。

image-20191130111527356

這里也會有人問,主動模式和被動模式的意義何在? 這里我也就說以下:

  1. 現在大部分用戶的網絡其實都並不是公網地址,都是使用NAT轉換過的內網地址,如果使用主動連接模式服務器不可能連接到客戶端開啟的端口。所以只能使用被動連接模式,讓客戶端主動連接服務器端口,以此來達到數據傳輸的目的。
  2. 主動連接的好處其實就在於便於配置防火牆規則,由服務器的20/TCP主動連接客戶端端口,防火牆只需要配置出口允許20/TCP連接即可,不像被動連接需要開啟多個TCP端口監聽數據連接。

FTP命令

FTP的命令有很多,我這里也就不一一講解了,主要講解以下一些常用常見的命令:

接入命令

命令 解釋
USER 輸入用戶名
PASS 輸入用戶密碼
QUIT 退出用戶登錄
REIN 重新登入用戶
ACCT 部分服務軟件並不需要再一開始就認可,
可能再進入某個目錄后開始要求用戶認證

文件管理類命令

命令 解釋
CWD 更改服務上的工作目錄
CDUP 切換到父目錄(上級目錄)
DELE 刪除服務器上的文件
LIST 列出當前目錄的文件(UNIX形式)
NLST 列出當前目錄下的文件(只包含文件名)
MKD 在服務器上創建一個目錄
PWD 顯示當前工作路徑
RMD 從服務器上刪除目錄
RNFR 指定需要重命令的文件。(需要配合RNTO使用)
RNTO 更名為指定命令

傳輸時的數據模式

命令 解釋
TYPE 定義文件類型。A(ASCII)、E(EBCDIC)、I(Image)、L(Local byte size)
STRU 數據組織類型。F(file)、R(record structure)、P(page structure)
MODE 定義傳輸方式。S(stream)、B(block)、C(compressed)
PASV 指定服務器開啟被動連接模式

文件傳送命令

命令 解釋
RETR 下載文件
STOR 上傳文件
STOU 與STOR類似,但是文件名稱不由客戶端控制,
由服務器端自動生成文件名,並且使用 250 代碼返回文件名稱。
STAT 放回服務器狀態
ALLO 指定服務器需要預留的空間大小
ABORT 停止之前的所有命令,包括文件傳輸
APPE 如果文件不存在則創建文件,
如果文件以存在則以追加形式添加到文件中。
PORT 指定數據連接端口。共6位,按,分割。
前4位為IP位,后2位為端口為,端口位1*256+端口位2 = 指定開啟的端口。
REST 類似於斷點續傳功能。

其他命令

命令 解釋
HELP 查詢服務器的幫助信息
NOOP 檢測服務器允許狀態
SITE 此命令用於查詢特定於服務器的專有服務
SYST 查詢服務器使用的操作系統

FTP應答代碼

FTP 客戶端是通過應答碼來檢測服務所表達的意思,除了幾個特殊的應答碼,大部分應答碼后面的內容是給用戶查看的。

FTP 應答碼的分類:

第一個標志位:

  • 1xx:服務器正在積極響應,但是還未准備完成。

  • 2xx:命令已經正常啟動。

  • 3xx:命令被接收,需要等待進一步響應。

  • 4xx:命令錯誤,無法接收該命令,客戶端可以重新嘗試命令。

  • 5xx:命令無法被接收,客戶端無需再次嘗試該命令。

第二標志位:

  • x0x:有關語法是否正確。

  • x1x:對信息請求的回復。

  • x2x:連接狀態信息。

  • x3x:認證和通過信息。

  • x4x:預留。

  • x5x:文件系統對於請求的回復。

響應代碼 解釋說明
110 重啟標志位,后面的提示信息標志服務器狀態,提示信息固定
120 服務器准備就緒的時間
125 數據連接已正常開啟,開始傳輸文件
150 文件狀態正常,開始開啟數據連接
200 命令執行成功
202 命令尚未實現,該站點不支持該命令
211 系統狀態,或系統幫助信息
212 目錄狀態
213 文件狀態
214 命令幫助信息
215 該系統類型
220 服務已為新連接的用戶就緒
221 服務退出控制連接
225 打開數據連接,未開始數據傳輸
226 結束數據連接,數據傳輸已完成
227 進入被動模式(IP 地址、ID 端口)
230 用戶登入成功
250 請求文件操作完成
257 路徑名建立成功
331 用戶名正確,需要用戶密碼
332 需要登入用戶
350 請求文件的工作需要得到進一步確認
421 服務不可能,即將關閉控制連接
425 無法打開數據連接
426 連接中止,傳輸關閉。
450 請求文件尚不可用,文件可能被占用
451 請求操作終止,遇到本地錯誤
452 請求操作終止,磁盤空間不足
500 命令語法錯誤,可能包含命令過長的錯誤
501 命令參數錯誤
502 命令尚未被執行
503 命令次序錯誤
504 該命令尚未被完成
530 尚未登入服務器
532 存儲文件需要帳號
550 請求的動作尚未執行,文件不可用
551 請求操作終止,不知道的頁類型
552 請求操作終止,超出用戶配額
553 請求操作終止,文件名不允許

FTP 命令抓包分析

這個是我用 wireshark 抓包抓到的命令連接的數據。

image-20191130150159361

這里我干了3件事情,上傳文件、下載文件和目錄瀏覽(2次)。所以這里實際上完成了四次數據傳輸,我們待會一一查看。

眼尖的人應該已經發現了,是由客戶端發送了 PORT 指令,所以是由服務器端連接客戶端,也就是主動連接模式,這里需要注意!!

第一段:登入前的服務器配置

220 (vsFTPd 3.0.3)    # 220,表示服務器准備完成,客戶端客戶發送命令了。 后面跟的是服務器的版本信息。
OPTS UTF8 ON          # 表示服務器需要切換到UTF8字符集進行工作。
200 Always in UTF8 mode.    #200,表示命令執行成功,后面的提示信息表示已經工作再UTF8模式下了。

第二段:用戶認證

USER ftp                        # 指定用戶ftp(匿名用戶,anonymous也是匿名用戶)
331 Please specify the password.    # 331 表示需要輸入密碼
PASS             # 表示輸入密碼,FTP規定匿名用戶可以選擇需要輸入自己的郵箱,但是這里可以省略不寫。
230 Login successful.    # 230 表示用戶登入成功

第三段內容:目錄當前瀏覽

PORT 192,168,10,103,211,216    # PORT,這里用於指定客戶端的IP地址和端口
200 PORT command successful. Consider using PASV.    # 表示命令執行成功, 這里是端口連接成功
LIST        # 表示列出當前工作目錄下的文件
150 Here comes the directory listing.        # 150 表示即將開始傳輸數據。
226 Directory send OK.        # 226 表示文件傳輸成功。

PORT命令中的前四位為IP地址,后2位為端口,其中端口應該這樣計算: 211 * 256 + 216 = 54232

這個是這條命令的返回結果(在數據連接中,所以這里當前的命令連接中是看不到的)
image-20191130151243400

第四段內容:切換目錄

CWD pub    # CWD,表示切換到pub目錄下。
250 Directory successfully changed.    # 250 表示請求操作執行完成。

第五段內容:再次瀏覽當前目錄

# 與第三段相同,不過多講解。
PORT 192,168,10,103,211,217
200 PORT command successful. Consider using PASV.
LIST
150 Here comes the directory listing.
226 Directory send OK.

下圖為返回內容:

image-20191130151759375

第六段內容:上傳文件

PORT 192,168,10,103,211,218
200 PORT command successful. Consider using PASV.
STOR test.c        # STOP 表示上傳文件,文件名為 test.c
150 Ok to send data.    # 150,表示文件狀態正常,開始傳輸數據。
226 Transfer complete.    # 226,表示文件傳輸完畢。

第六段內容:下載文件

PORT 192,168,10,103,211,219
200 PORT command successful. Consider using PASV.
RETR test.file    # RETR 下載文件。
150 Opening BINARY mode data connection for test.file (12 bytes).    # 150,表示文件正常,開始傳輸文件,后面會提示文件名稱和文件大小。
226 Transfer complete.

第六段內容:退出

QUIT    # 退出
221 Goodbye.    # 服務退出控制連接

本文經「原本」原創認證,作者乾坤盤,訪問yuanben.io查詢【2MLRYL4K】獲取授權信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM