Wireshark-FTP流量分析

FTP 流量分析

FTP是仅基于TCP的服务,不支持UDP,相比其他协议(如 HTTP协议),FTP协议要复杂一些。与一般的C/S应用不同,一般的C/S应用程序一般只会建立一个Socket连接,这个连接同时处理服务器端和客户端的连接命令和数据传输。而FTP协议中将命令与数据分开传送的方法提高了效率。

FTP使用2个端口,一个数据端口和一个命令端口(也叫做控制端口)。控制Socket用来传送命令,数据Socket是用于传送数据。每一个 FTP命令发送之后,FTP服务器都会返回一个字符串,其中包括一个响应代码和一些说明信息。其中的返回码主要是用于判断命令是否被成功执行了。

命令端口和数据端口

一般来说,客户端有一个 Socket 用来连接 FTP 服务器的相关端口,它负责 FTP 命令的发送和接收返回的响应信息,这个就是命令端口。一些在服务器上进行的操作就通过这个端口传输,比如“登陆”,“删除文件”这些。服务器的命令端口号一般是21。

而对于像上传、下载这些,文件要在客户机与服务器进行传输的操作,就要另开一个端口。这个端口一般是20。

关于数据端口的操作在主动模式(PORT)和被动模式(PASV)又有两种不同的运作模式。

主动模式(PORT)和被动模式(PASV)

主动模式下,客户端随机打开一个大于1024的端口向服务器的命令端口P(即21端口),发起连接,同时开放N +1端口监听,并向服务器发出“port N+1”命令,由服务器从它自己的数据端口(即20端口)主动连接到客户端指定的数据端口(N+1)。FTP的客户端只是告诉服务器自己的端口号,让服务器来连接客户端指定的端口。对于客户端的防火墙来说,这是从外部到内部的连接,可能会被阻塞。

为了解决服务器发起到客户的连接问题,有了另一种FTP连接方式,即被动方式。命令连接和数据连接都由客户端发起,这样就解决了从服务器到客户端的数据端口的连接被防火墙过滤的问题。被动模式下,当开启一个FTP连接时,客户端打开两个任意的本地端口(N > 1024和N+1)。第一个端口连接服务器的21端口,提交PASV命令。然后服务器会开启一个任意的端口(P > 1024),返回如227 entering passive mode (h1,h2,h3,h4,p1,p2)。它返回了227开头的信息,在括号中有以逗号隔开的六个数字,前四个指服务器的地址,最后两个,将倒数第二个乘 256再加上最后一个数字,这就是FTP服务器开放的用来进行数据传输的端口。

主要的FTP命令

FTP 每个命令都有 3 到 4 个字母组成,命令后面跟参数,用空格分开。每个命令都以”\r\n”结束。 要下载或上传一个文件,首先要登入 FTP 服务器,然后发送命令,最后退出。

这个过程中,主要用到的命令有 USER、PASS、SIZE、REST、CWD、RETR、PASV、PORT、QUIT。

  • USER: 指定用户名。通常是控制连接后第一个发出的命令。“USER username\r\n”: 用户名为 username 登录。
  • PASS: 指定用户密码。该命令紧跟 USER 命令后。“PASS passwd\r\n”:密码为 passwd。
  • SIZE: 从服务器上返回指定文件的大小。“SIZE file.txt\r\n”:如果 file.txt 文件存在,则返回该文件的大小。
  • CWD: 改变工作目录。如:“CWD bankafile\r\n”。
  • PASV: 让服务器在数据端口监听,进入被动模式。如:“PASV\r\n”。
  • PORT: 告诉 FTP 服务器客户端监听的端口号,让 FTP 服务器采用主动模式连接客户端。如:“PORT h1,h2,h3,h4,p1,p2”。
  • RETR: 下载文件。“RETR LIST easter.tar.gz \r\n”:下载文件LIST easter.tar.gz。
  • APPE: 上传文件。“STOR LIST easter.tar.gz\r\n”:上传文件LIST easter.tar.gz,如果文件存在,那么就增加上传。
  • STOR: 上传文件。“STOR LIST easter.tar.gz\r\n”:上传文件LIST easter.tar.gz。
  • REST: 该命令并不传送文件,而是略过指定点后的数据。此命令后应该跟其它要求文件传输的 FTP 命令。“REST 100\r\n” : 重新指定文件传送的偏移量为 100 字节。
  • QUIT: 关闭与服务器的连接。

FTP 响应码

客户端发送FTP命令后,服务器返回响应码,响应码用三位数字编码表示:

第一个数字给出了命令状态的一般性指示,比如响应成功、失败或不完整。

第二个数字是响应类型的分类,如 2 代表跟连接有关的响应,3 代表用户认证。

第三个数字提供了更加详细的信息。

第一个数字的含义如下:

1 表示服务器正确接收信息,还未处理。
2 表示服务器已经正确处理信息。
3 表示服务器正确接收信息,正在处理。
4 表示信息暂时错误。
5 表示信息永久错误。

第二个数字的含义如下:

0 表示语法。
1 表示系统状态和信息。
2 表示连接状态。
3 表示与用户认证有关的信息。
4 表示未定义。
5 表示与文件系统有关的信息。

实例分析

实验环境

客户机 IP:192.168.1.106

服务器 IP:192.168.1.109

Wireshark使用

Wireshark界面大致如下:

在封包详细信息中的分类如下:

Frame: 物理层的数据帧概况

Ethernet II: 数据链路层以太网帧头部信息

Internet Protocol Version 4: 互联网层IP包头部信息

Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP

File Transfer Protocol: 应用层的信息,此处是FTP协议

建立连接:

第一次握手:首先客户机的 57658 端口与服务器的 21 号端口建立TCP连接,由客户机发送位码为syn=1,随机产生seq number=0 的数据包到服务器,服务器由SYN=1知道,客户机要求建立联机:

第二次握手:服务器确认连接信息,向客户机发送ack number=1(主机A的seq+1),syn=1,ack=1,随机产生seq=0的包

第三次握手:客户机收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,客户机会再发送ack number=(主机B的seq+1),ack=1,服务器收到后确认 seq 值与 ack=1 则连接建立成功。

其实TCP建立的过程,就是两个主机在确认对方的ack number是否与自己发出的seq number+1相同,相互确认后便建立起了连接。

客户机的 57658 端口与服务器的 21 号端口连接后,服务器返回了FTP的 Banner 传输开始。

首先客户机发送 USER 命令,然后服务器返回状态码 331 表示准备处理与用户认证有关的信息。

接着使用 PASS 命令输入密码:

可以看到FTP中密码是由明文进行传输的。

服务器返回 230 状态码用户成功登陆,客户机就可以使用 FTP 服务了。

整个过程里,由于没有文件的下载上传,所以只有 21 端口在工作。接下来我们将分析下文件下载时FTP数据端口的流量。

文件下载:

当进行文件下载时首先由客户机发送命令 PASV 进行被动模式连接,服务器接着回应 227 Entering Passive Mode (192,168,1,109,104,134).\r\n 表示连接到 IP:192.168.1.109 的 26758(104*256+134)号端口。

然后客户机的 58985 号端口与服务器的 26758号端口进行TCP三次握手建立连接。

参考

Wireshark学习FTP流程:https://blog.csdn.net/longyc2010/article/details/43113173
Wireshark捕获经过指定ip的数据包:https://blog.csdn.net/dkqiang/article/details/51911337
FTP命令详解:https://blog.csdn.net/IndexMan/article/details/46387561