java实现FTP协议:wireshark抓包解析

Laila ·
更新时间:2024-11-14
· 936 次阅读

本节我们看看ftp协议的数据包格式,同时使用代码加以实现。首先我们现在机器上安装ftp服务器,我在自己的机器上安装了QuickFTP Server,它是我随便找来的一款Mac ftp服务器,如下图所示,我将连接端口设置为2100,同时设置了用户名和密码,如此我们就可以通过抓包的方式了解协议的数据包格式:

屏幕快照 2020-02-20 上午10.32.01.png

然后打开wireshark,在过滤条件中输入tcp.port==2100,接着开始监听,如此就能抓取相应ftp数据包。接着我从手机上使用ftp客户端连接到服务器,同时使用设置好的用户名密码登陆,在wireshark上抓包结果如下:

屏幕快照 2020-02-20 上午10.41.06.png

注意到前3条是tcp连接的三次握手,第四条是双方沟通tcp数据传输一些参数可以忽略,真正属于ftp协议数据的是第5条服务器发送给客户端的信息,点击查看内如如下:
屏幕快照 2020-02-20 上午10.43.14.png
我们注意看它的数据部分,那才是ftp协议的专有内如,首先开始对应回复码220,上一节我们描述过回复码三位数字的作用,该数值表示服务器已经准备好接收客户端的请求,接下来的字符串时服务器对该回复码的文字解释,在协议实现是不用关心。这里要注意的是,所有包含协议数据的数据包都对应[PSH,ACK],如果仅仅含有[ACK]那就是对上一次接收到数据包的应答而已,所以点击下一条[PSH,ACK]就可以看ftp协议的下一个数据包内容,于是我们点击查看下一条包含ftp数据的协议包:

屏幕快照 2020-02-20 上午10.49.22.png

数据内容以字符串"USER"开始,这表示客户端向服务器端提交用户名,而且用户名以明文字符串"chenyi"来表示。然后继续看下一条[PSH,ACK]数据包,其内容如下:
屏幕快照 2020-02-20 上午10.52.13.png
数据以331开头,该回复码在前几节解释过,它表示客户端的请求被接受,同时请求正在处理中,还需要执行后续步骤,它表示用户名正确但还需要提交密码,于是我们继续查看客户端发给服务器的下一条[PSH,ACK]数据包,其内容如下:

屏幕快照 2020-02-20 上午10.56.12.png

在数据部分以字符串"PASS"开始,这是操作命令,表示客户端向服务器提供密码,而且可以明确看到密码为1111,继续看服务器回复给客户端的[PSH,ACK]数据包:

屏幕快照 2020-02-20 上午10.58.23.png

数据部分以回复码230开始,该数值表示用户登录成功,所有操作将继续进行,再看下一个客户端发送给服务器的[PSH,ACK]数据包,可以看到数据内容仅仅是字符串"PWD"这是客户端在向服务器请求当前文件目录,由此查看服务器返回的[PSH,ACK]数据包:
屏幕快照 2020-02-20 上午11.02.35.png
回复数据首先是回复码257,它表示路径名确立,接着是”\“表示当前处于根目录,继续看下一条客户端回复给服务器的[PSH,ACK]数据包:
屏幕快照 2020-02-20 上午11.08.18.png
回复的数据只有操作命令”FEAT",它表示让服务器列举当前目录下的文件内容,接下来看服务器回复的[PSH,ACK]数据包内容:
屏幕快照 2020-02-20 上午11.10.44.png
数据包含的回复码为211,他表示服务器将返回包含系统信息的内容,继续看客户端回复的[PSH,ACK]数据包:
屏幕快照 2020-02-20 上午11.15.41.png
客户端回复给服务器的数据为"PASV"它表示客户端将以被动模式接收服务器数据,也就是让服务器等待客户端发起的数据请求,由此我们看下一条服务器回复的[PSH,ACK]:
屏幕快照 2020-02-20 上午11.17.34.png
数据起始以227开始,它是对上一条"PASV"请求的回应,它表示传输进入被动模式,特别需要注意的是数据中包含了用于数据传输的ip和端口号,其中ip就是192.168.2.243,这是服务器地址,接下来的两个字节数据用于计算数据传输端口,计算方法是17*256+222结果为4574,也就是客户端要连接服务器的4574端口去获取数据,下一次客户端将通过该端口号获得数据内容,继续往下看客户端发送的[PSH,ACK]数据包:

屏幕快照 2020-02-20 上午11.21.34.png

数据内容为"TYPE A",这是客户端向服务器设定数据的传输格式,前面我们提到过ftp主要有两种数据传输格式,一种是基于ASCII的文本模式,另一种是基于二进制的模式,该命令表示数据传输使用ASCII文本模式,我们看下一条服务器返回的[PSH,ACK]:
屏幕快照 2020-02-20 上午11.24.49.png
数据的回复码为220,它表示命令请求完成,同时在解释字符串中它表明数据传输将使用ASCII吗模式,继续看客户端发送给服务器的下一条[PSH,ACK]:
屏幕快照 2020-02-20 上午11.27.23.png

客户端向服务器发送的请求命令为"LIST",它要求枚举当前路径下的文件信息,于是我们继续看服务器返回的[PSH,ACK]:

屏幕快照 2020-02-20 上午11.29.29.png
服务器返回的回复码是150,它表示请求被接受,数据通道已经打开,此时我们要监听端口4574才能获得客户端和服务器通讯的数据,因此在wireshark上将过滤条件改为tcp.port==4574,这时可以看到双方tcp三次握手,接着就是服务器推送给客户端的信息:

屏幕快照 2020-02-20 下午4.57.35.png

内容显示的是当前路径下的文件信息,它采用了unix的文件列举格式,首先第一个字节表示文件类型,’-'表示普通文件,'s’表示socket等,接下来rw-------表示文件的权限,前三个字符表示用户权限,接下来三个字符表示群权限,最后表示其他用户权限,‘-’表示不允许任何操作。接下来是数值表示链接数,继续下来的字符串表示文件所属用户及所在群,接下来的数字是文件大小,单位为字节,接下来是修改时间和文件名,格式具体内容可以搜索。

数据内容传输结束后tcp连接关闭,我们重新回到命令传输通道,可以看到服务器发来如下[PSH,ACK]数据包:

屏幕快照 2020-02-20 下午5.17.20.png
回复码为226,对应含义为数据传输连接关闭,从它附带的文本信息也得知,它表示数据传输完成。

以上就是对ftp协议的抓包分析,下一节我们研究如何进行代码实现。

更详细的讲解和代码调试演示过程,请点击链接

更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:
这里写图片描述


作者:tyler_download



JAVA wireshark ftp协议 ftp

需要 登录 后方可回复, 如果你还没有账号请 注册新账号