FTP是应用层的协议,它基于传输层,为用户服务,它们负责进行文件的传输。FTP是一个8位的客户端/服务器协议,能操作任何类型的文件而不需要进一步处理,就像MIME或Unicode一样。但是,FTP有着极高的延时,这意味着,从开始请求到第一次接收需求数据之间的时间会非常长,并且不时的必需执行一些冗长的登陆进程。
FTP服务一般运行在20和21两个端口。端口20用于在客户端和服务器之间传输数据流,而端口21用于传输控制流,并且是命令通向ftp服务器的进口。这里的数据流指的是数据的流动,控制流是控制数据的流动。它们之间的区别在于数据流中有数据,而控制流中没有数据,只有控制指令。当数据通过数据流传输时,控制流处于空闲状态。而当控制流空闲很长时间后,客户端的防火墙会将其会话置为超时,这样当大量数据通过防火墙时,会产生一些问题。此时,虽然文件可以成功的传输,但因为控制会话会被防火墙断开,传输会产生一些错误。
FTP的工作流程如下图。在该图中的客户端是希望从服务器端下载或上传文件的计算机。服务器端是提供FTP服务的计算机,它监听某一端口的TCP链接请求。控制链接和数据链接均是TCP链接,控制链接用于传送用户名、密码及设置传输方式等控制信息,数据链接用于传送文件数据。客户端和服务器端分别运行着控制进程和数据传送进程。
当用户要从服务器下载文件时,可以通过用户界面让客户端的控制进程发起一个TCP链接请求。服务器端的控制进程接受了该请求后,建立了控制链接。于是,双方就可以相互传递控制信息了,但此时双方还不能传输文件数据。为传输数据,双方的数据传送进程还需要再建立一个数据链接。
当客户端向服务器端发出建立TCP控制链接请求时,使用的服务器的端口号是21(默认),同时要告诉服务器端开启一个空闲的端口号,用于以后建立数据传送连接。然后,服务器端用端口号20(默认)与客户端所提供的端口建立数据传送连接,开始数据传送。
此处要注意,由于客户端和服务器端分别使用了两个不同的端口号来传送控制信息和数据,所以它们之间不会相互干扰,而且可以同时进行。
一般情况下,控制链接是一直存在的,但数据连接在一个文件传输完成后要断开。如果还需要传输另一个文件,要重新建立数据链接。这个特性使得FTP在传输大量的小文件时效率比较低,因为每一个文件传输时都要建立和关闭TCP链接,这样会消耗一些时间,不像某些协议(如Samba),可以在一个链接内把所有的文件一次性传输完毕。
FTP的工作模式与其他网络通讯协议有很大的区别。通常在采用HTTP等协议进行通信时,通信双方只用一个通信端口进行通信,即只有一个连接。而FTP使用两个独立的链接,其主要优点是使网络数据传输分工更加明确,同时在文件传输时还可以利用控制连接传送控制信息。
当客户端与服务器端建立连接后,客户端的控制进程就可以通过该连接向服务器端发送控制命令了。服务器端随时处于监听状态,服务器端的控制进程接到命令后,将根据命令内容做相应的工作,并把结果返回给客户端。
控制命令以ASCII字符串的形式被传输,每个命令以3个或4个大写的ASCII字符开始,后面可以带参数。命令和参数之间用空格符分隔,并以一对回车符和换行符(CR/LF)作为命令的结束标志。FTP协议常见的控制命令如下表:
FTP常用控制命令:
当服务器端接收到客户端的命令后,将根据命令的功能做相应的处理。处理以后的情况,如命令执行是否成功、出错类似、服务器端是否已处于就绪状态等信息,将通过控制链接发送给客户端。这些内容就是应答。对FTP控制命令进行应答的目的是为了对数据传输过程进行同步,也是为了让客户端了解服务器目前的状态。
FTP应答由3个ASCII码数字构成,后面再跟随一些解释性的文本符号。数字是供机器处理的,而文本符号则是面向用户的。3位数字每位都有一定的意义,第1位确定响应是好的、坏的还是不完全的,通过检查第1位,用户进程通常就能够知道大致要采取什么行动了。如果用户程序希望了解出了什么问题,可以继续检查第2位。第3位表示其它一些信息。下面分别介绍这3位可用的值,如下:
第1位有5个值,其含义如下:
1XX确定预备应答:表示仅仅是在发送另一个命令前期待另一个应答时启动。
2XX确定完成应答:表示要求的操作已经完成,可用接受新命令。
3XX确定中间应答:该命令已经被接受,另一个命令必须被发送。
4XX暂时拒绝完成应答:请求的命令没有执行,但差错状态是暂时的,命令一会可以再发。
5XX永久拒绝完成应答:该命令不被接受,并且要求不要再重试。
第2位所代表的含义如下所示:
X0X:语法错误。
X1X:一般性的解释信息。
X2X:与控制和数据连接有关。
X3X:与认证和账户登录过程有关。
X4X:未指明。
X5X:与文件系统有关。
第3个数字是在第2个数字的基础上对应答内容的进一步细化,没有具体的规定。常见的响应码如下表:
FTP响应码:
之前有学习者反应,过滤条件没有介绍的很清晰,这里给大家加入一些常用的过滤条件。方便大家快速的定位数据:
1)对源地址为192.168.0.1的包的过滤,即抓取源地址满足要求的包:
表达式为:
ip.src == 192.168.0.1
2)对目的地址为192.168.0.1的包的过滤,即抓取目的地址满足要求的包:
表达式为:
ip.dst == 192.168.0.1
3)对源或者目的地址为192.168.0.1的包的过滤,即抓取满足源或者目的地址的ip地址是192.168.0.1的包:
表达式为:
ip.addr == 192.168.0.1
或者:
ip.src == 192.168.0.1 or ip.dst == 192.168.0.1
4)要排除以上的数据包,我们只需要将其用括号囊括,然后使用“!”即可:
表达式为:
!(表达式)
1)仅仅需要捕获某种协议的数据包,表达式很简单仅仅需要把协议的名字输入即可。
表达式为:
http
2)需要捕获多种协议的数据包,也只需对协议进行逻辑组合即可。
表达式为:
http or telnet(多种协议加上逻辑符号的组合即可)
3)排除某种协议的数据包:
表达式为:
not arp
!tcp
1)捕获某一端口的数据包:
表达式为:
tcp.port == 80
2)捕获多端口的数据包,可以使用and来连接,下面是捕获高端口的表达式:
表达式为:
udp.port >= 2048
1)针对长度的过滤(这里的长度指定的是数据段的长度):
表达式为:
udp.length < 30
http.content_length <=20
2)针对数据包内容的过滤:
表达式为:
http.request.uri matches "vipscu"(匹配http请求中含有vipscu字段的请求信息)
通过以上的最基本的过滤条件的学习,如果随意发挥,可以灵活应用,就基本上算是入门了。以下是比较复杂的实例:
tcp dst port 3128
显示目的TCP端口为3128的封包。
ip src host 10.1.1.1
显示来源IP地址为10.1.1.1的封包。
host 10.1.2.3
显示目的或来源IP地址为10.1.2.3的封包。
src portrange 2000-2500
显示来源为UDP或TCP,并且端口号在2000至2500范围内的封包。
not imcp
显示除了icmp以外的所有封包。(icmp通常被ping工具使用)
src host 10.7.2.12 and not dst net 10.200.0.0/16
显示来源IP地址为10.7.2.12,但目的地不是10.200.0.0/16的封包。
(src host 10.4.1.12 or src net 10.6.0.0/16) and tcp dst portrange 200-10000 and dst net 10.0.0.0/8
显示来源IP为10.4.1.12或者来源网络为10.6.0.0/16,目的地TCP端口号在200至10000之间,并且目的位于网络10.0.0.0/8内的所有封包。
1)熟悉并掌握Wireshark的基本操作。
2)加深对常用网络协议的理解,提高就业机会。
3)培养学生理论联系实践的研究兴趣。
服务器:windows系统,IP地址:10.1.1.33
测试者:windows系统,IP地址:随机
在实验环境中,我们通过模拟局域网的两台机器之间的数据传输,来抓取和分析。
FTP数据,用到Quick Easy FTP Server软件。
在局域网环境中,我们使用一个小工具来(Quick Easy FTP Server)实现FTP服务器。
双击桌面的Quick Easy FTP Server,如下图(如果打开提示建立空文档失败,将程序拖至C盘重新打开即可):
如上图,可以创建匿名的,但是匿名就没有密码,这里我们创建一个,下一步:
输入密码,这里随意,记住即可,后面客户端登录会用到。下一步:
选择一个FTP服务器的目录,我们选择C盘下的FTP目录(文件夹下面放入一些数据)。这里目录必须存在。下一步:
权限我们选择“允许下载”和“允许上传”即可。这两个是比较常见的,其他的配置默认。点击下一步:
这样我们就配置好Quick Easy FTP Server,下面,我们选择点击开启按钮(左上角的绿色按钮,即左上角绿色问号最左边的按钮),开启之后,状态变化,如下:
这样我们就配置完Quick Easy FTP Server。
这里介绍一种容易出错的地方,就是开启时提示失败,可能是默认端口21被占用了,这里给出两种办法:
1.改变默认端口,21改为数字较大的端口。
2.使用netstat –ano | findstr “21”,查看哪个进程在占用21端口,然后在任务管理器中关闭占用端口的程序即可。这里推荐方法1。
下面我们在测试者机器上,打开Wireshark抓包工具,过滤条件输入ip.addr == 10.1.1.33,这里可以通过cmd的命令行去登录FTP服务器,也可以通过浏览器登录,我们这里,为了熟悉FTP的常用命令,使用cmd的命令行登录,如下:
上面的信息就是登录FTP服务器后,进行了一个上传和下载文件的操作,此处我们返回Wireshark界面停止抓包,保存,截图如下:
接下来,我们就详细的对上面的步骤,进行分析。
在FTP工作流程中使用控制连接和数据连接两种方式来实现数据传输,下面我们来分析这两种包的详细信息。
1)分析控制连接的数据:
FTP的控制连接用于传送用户名、密码及设置传输方式等控制信息,下面以保存的ftp.pcapng捕获文件为例,分析FTP协议控制连接数据包。
上图中显示了所有数据包的Info列,在这里可以看到ftp传输的所有信息,因为FTP是明文形式传输数据包的,所以我们在InFo列里能看到登录FTP服务器的用户名、密码和传输文件等。在上图中,登录FTP服务器的用户名为Hetian,密码为123456,下载了文件cat.jpg及上传了文件Tulip.jpg。这里显示的都是成功,如果传输过程中出错的话,会返回相应的应答码。
在捕获的FTP数据包中,USER,PASS,CWD,RETR和STOR等都是控制连接使用的控制命令。这些控制命令在包详细信息中,显示的格式都相同。这里以控制用户信息的命令为例,分析包的详细信息。在ftp.pcapng捕获文件中,捕获的用户信息如下:
从该界面可以看到登录FTP服务器时,使用的控制命令是USER和PASS。根据这两个命令,可以看到登录的账号为Hetian,密码为123456。这两个包的详细信息如下:
File Transfer Protocol (FTP)
USER Hetian\r\n
Request command: USER
Request arg: Hetian
从上面的信息中,可以看到该包使用了FTP协议,输入的用户名为Hetian,请求的命令是USER,请求参数为Hetian。
File Transfer Protocol (FTP)
PASS 123456\r\n
Request command: PASS
Request arg: 123456
从上面的信息中,可以看到输入的密码为123456,请求的命令是PASS,请求参数为123456。
其余的CMD等命令,学习者自己查看下。
2)分析数据连接的数据:
数据连接用于传送文件数据,也就是通过FTP服务器进行上传和下载文件。下面以捕获的文件为例,分析数据连接的数据。
上面的图中,控制命令RETR和PORT的数据分别为上传和下载的数据包。这里我们以下载文件为例(上传相同原理),点击上面的第811帧数据,右键:
选择Follow TCP Stream选项:
上面显示了所有FTP的传输信息,如果想要查看传输的数据,就要将这些信息去掉。关闭上面的窗口,在Wireshark中,你会发现过滤条件被修改为如下:
最简单的方法就是,在前面加一个!,就能达到去掉的效果。如下图:
接下来就是要找到我们下载的文件。如何能快速的找到下载的文件呢,这里给出两种方法,大家自行选择:
1.通过协议的字段去分析:你会发现,去掉了FTP的控制连接数据,显示的是TCP协议的数据,在TCP协议中,PUSH字段表示推送数据,我们就可以在Info中找到PUSH字段,间接找到想要的文件。
2.我们知道下载的文件是JPG格式,所以也就知道二进制的表示为JFIF(exe格式用二进制分析器打开是MZ的道理是一样的),所以就可以通过Wireshark自带的搜索,快速找到文件所在的帧数。搜索的快捷键是Ctrl+F。如下图:
这样也能找到相应的帧信息。我们在找到帧信息之后(814帧或者820均可),通过右键,Follow TCP Stream,可以看到数据的信息,其中的JFIF表示了文件格式为jpg,如下:
我们点击上图的Save as,输入名字cat.jpg即可。
打开保存的文件,即我们下载的图片:
todo
这个时候关闭Follow TCP Stream弹出的窗口,Wireshark显示的信息如下:
上面的数据包显示了传输cat.jpg文件的所有非FTP控制数据包,在该过程中,明细可以看到,经历了TCP的三次握手和四次断开连接。请学习者根据上面的方法,去寻找找到上传的文件信息。