FTP 协议分析
文件传输协议(英语:File Transfer Protocol,缩写:FTP)是一个用于在计算机网络上在客户端和服务器之间进行文件传输的应用层协议。文件传送(file transfer)和文件访问(file access)之间的区别在于:前者由FTP提供,后者由如NFS等应用系统提供[1]。RFC 959 定义了此规范。 —— Wikipedia
FTP实现的目标
-
促进文件的共享(计算机程序或数据)
-
鼓励间接或者隐式的使用远程计算机
-
向用户屏蔽不同主机中各种文件存储系统(File system)的细节
-
可靠和高效的传输数据
主动和被动模式
FTP有两种使用模式:主动和被动。
主动模式要求客户端和服务器端同时打开并且监听一个端口以创建连接。在这种情况下,客户端由于安装了防火墙会产生一些问题。所以,创立了被动模式。
被动模式只要求服务器端产生一个监听相应端口的进程,这样就可以绕过客户端安装了防火墙的问题。
安全性
FTP不是一项安全的协议,并且具有许多安全漏洞[13]。1999年5月发布的RFC 2577中列出了以下几个主要的漏洞:
通过FTP传输的流量不会被加密,所有传输通过明文进行的。任何能够在网络上执行数据包捕获( 嗅探 )的人都可以读取用户名、密码、命令内容和数据[14][15]。
常见FTP命令

常见FTP响应码

| 响应码 | 信息 |
|---|---|
| 150 | 打开连接 |
| 200 | 成功 |
| 211 | 系统状态回复 |
| 213 | 文件状态回复 |
| 227 | 进入被动模式(IP, port) |
| 421 | 服务关闭 |
| 450 | 文件不可用 |
| 452 | 磁盘空间不足 |
| 500 | 无效命令 |
| 501 | 错误参数 |
| 550 | 文件不可用 |
FTP 报文分析
FTP服务器配置
基于腾讯云服务器搭建FTP服务器
服务器硬件信息

服务器搭载的是 Ubuntu Server 18.04.1 LTS 64bit

安装vsftpd

vsftpd配置

- listen=YES 监听IPv4请求
- listen_ipv6=NO 不监听IPv6请求
- anonymous_enable = YES 允许匿名访问
- local_enable = YES 允许本地用户登录
- write_enable = YES 允许写入文件
- local_umask = 022 umask权限022 允许读写
- dirmessage_enable = YES 用户切换目录时会向其发送消息
- use_loacltime = 使用主机时间
- xferlog_enable = YES 打开日志记录
- connect_from_port_20 = YES 使用20端口
- pasv_enable = YES 启动被动模式
- pasv_min_port = 10000 最小端口
- pasv_max_port = 11000 最大端口
- local_root = /home/ftpfile 设置根目录
- userlist_enable = YES 使用userlist存储用户信息
- ftpd_banner 登录时的欢迎语句
服务器防火墙配置
在防火墙中允许使用服务器的20和21端口,打开10000~11000端口用于数据传输


服务器端口信息

添加用户

登录测试

至此,FTP服务搭建完成
FTP-CLI
使用本地PC远程访问服务器

查看根目录下文件信息

在当前目录创建一个文件夹,名为test

从服务器下载test.txt文件

抓包分析
三次握手🤝 建立TCP连接

建立连接

服务器的21端口与本机的53012端口建立通信
- Response code: Service ready for user (220) 服务准备就绪
- Response arg: (vsFTP 3.0.3)

Response: 530 Please login with USER and PASS. 使用用户名和密码登录

- Request: USER pqq
- 用户名:pqq

Response: Please specify the password. 输入密码

- Request:PASS Pqq12138

- Response:Login successful. 登录成功

主机收到登录成功的报文后,向服务器回复了一个确认报文
通过这两个报文可得知,在登录的过程中,对账号和密码并没有加密,通过捕获报文可以直接看到用户的用户名和密码,存在安全隐患。
FTP操作
更换工作路径

-
Request: CWD /
Change Work Directory 更改工作路径

- REsponse: 250 Directory successfully changed.
切换传输模式

-
Reques:TYPE A
请求切换到ASC II 传输模式

- Response:200 Switching to ASCII mode
启用被动模式

- Request : PASV

- Response: 227 Entering Passive Mode (121,5,22,41,55).
- $41*256 + 55=10551$ 将在服务器的10551端口上进行数据传输
列出文件

- Request: LIST

- Response: 150 Here comes the directory listing.

- TCP报文: Src Port : 10282, Dst Port: 53015

- Response: 226 Directory send OK.
客户端请求LIST命令,服务器一个发送了三个报文:
- 150 打开连接
- TCP 报文传输数据
- 226 结束数据连接
#####
下载文件

- Request: RETR test.txt
上传文件

- Request: STOR test.txt
重命名文件

- Request: RNFR text.txt

- Response: 350 Read for RNTO

- Request: RNTO newname.txt

- Response: 250 Rename successful
修改文件名成功

客户端收到主机的250成功信息后回复一个TCP确认报文
删除文件

- Request: DELE newname.txt

- Response: 250 Delete operation successful.

- 断开21端口的TCP连接