FTP协议分析

TCP/IP协议

Posted by Pele on March 30, 2022

FTP 协议分析

文件传输协议(英语:File Transfer Protocol,缩写:FTP)是一个用于在计算机网络上在客户端和服务器之间进行文件传输的应用层协议。文件传送(file transfer)和文件访问(file access)之间的区别在于:前者由FTP提供,后者由如NFS等应用系统提供[1]RFC 959 定义了此规范。 —— Wikipedia

FTP实现的目标

  1. 促进文件的共享(计算机程序或数据)

  2. 鼓励间接或者隐式的使用远程计算机

  3. 向用户屏蔽不同主机中各种文件存储系统(File system)的细节

  4. 可靠和高效的传输数据

主动和被动模式

FTP有两种使用模式:主动和被动。

主动模式要求客户端和服务器端同时打开并且监听一个端口以创建连接。在这种情况下,客户端由于安装了防火墙会产生一些问题。所以,创立了被动模式。

被动模式只要求服务器端产生一个监听相应端口的进程,这样就可以绕过客户端安装了防火墙的问题。

安全性

FTP不是一项安全的协议,并且具有许多安全漏洞[13]。1999年5月发布的RFC 2577中列出了以下几个主要的漏洞:

通过FTP传输的流量不会被加密,所有传输通过明文进行的。任何能够在网络上执行数据包捕获( 嗅探 )的人都可以读取用户名、密码、命令内容和数据[14][15]

常见FTP命令

img

常见FTP响应码

img

响应码 信息
150 打开连接
200 成功
211 系统状态回复
213 文件状态回复
227 进入被动模式(IP, port)
421 服务关闭
450 文件不可用
452 磁盘空间不足
500 无效命令
501 错误参数
550 文件不可用

FTP 报文分析

FTP服务器配置

基于腾讯云服务器搭建FTP服务器

服务器硬件信息

image-20220329224247835

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

image-20220329223636298

安装vsftpd

截屏2022-03-17 22.46.10

vsftpd配置

image-20220330082551674

  • 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端口用于数据传输

截屏2022-03-19 10.14.27

截屏2022-03-29 22.31.32

服务器端口信息

image-20220329225009117

添加用户

截屏2022-03-19 10.07.24

登录测试

image-20220330082715869

至此,FTP服务搭建完成

FTP-CLI

使用本地PC远程访问服务器

iShot2022-03-30 08.08.38

查看根目录下文件信息

iShot2022-03-30 08.08.58

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

image-20220330090206945

从服务器下载test.txt文件

iShot2022-03-30 08.09.38

抓包分析

三次握手🤝 建立TCP连接

image-20220330094433045

建立连接

image-20220330094619180

服务器的21端口与本机的53012端口建立通信

  • Response code: Service ready for user (220) 服务准备就绪
  • Response arg: (vsFTP 3.0.3)

image-20220330151830433

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

image-20220330152027115

  • Request: USER pqq
  • 用户名:pqq

image-20220330152140187

Response: Please specify the password. 输入密码

image-20220330152243063

  • Request:PASS Pqq12138

image-20220330152507652

  • Response:Login successful. 登录成功

image-20220330152613213

主机收到登录成功的报文后,向服务器回复了一个确认报文

通过这两个报文可得知,在登录的过程中,对账号和密码并没有加密,通过捕获报文可以直接看到用户的用户名和密码,存在安全隐患。

FTP操作

更换工作路径

image-20220330152739764

  • Request: CWD /

    Change Work Directory 更改工作路径

image-20220330153437443

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

image-20220330153702613

  • Reques:TYPE A

    请求切换到ASC II 传输模式

image-20220330154317017

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

image-20220330154838233

  • Request : PASV

image-20220330154911348

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

image-20220330160344944

  • Request: LIST

image-20220330160611555

  • Response: 150 Here comes the directory listing.

image-20220330160624375

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

  • Response: 226 Directory send OK.

客户端请求LIST命令,服务器一个发送了三个报文:

  1. 150 打开连接
  2. TCP 报文传输数据
  3. 226 结束数据连接

#####

下载文件

image-20220330160046753

  • Request: RETR test.txt
上传文件

image-20220330161252471

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

image-20220330180703391

  • Request: RNFR text.txt

image-20220330180853350

  • Response: 350 Read for RNTO

image-20220330181050657

  • Request: RNTO newname.txt

image-20220330181143806

  • Response: 250 Rename successful

修改文件名成功

image-20220330181713273

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

删除文件

image-20220330181835205

  • Request: DELE newname.txt

image-20220330182103691

  • Response: 250 Delete operation successful.

image-20220330182216555

  • 断开21端口的TCP连接