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】获取授权信息。

posted @ 2020-01-09 19:56  乾坤盘  阅读(2379)  评论(0编辑  收藏  举报