专栏首页Coding迪斯尼java实现FTP协议:wireshark抓包解析

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

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

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

注意到前3条是tcp连接的三次握手,第四条是双方沟通tcp数据传输一些参数可以忽略,真正属于ftp协议数据的是第5条服务器发送给客户端的信息,点击查看内如下:

我们注意看它的数据部分,那才是ftp协议的专有内容,首先开始对应回复码220,上一节我们描述过回复码三位数字的作用,该数值表示服务器已经准备好接收客户端的请求,接下来的字符串时服务器对该回复码的文字解释,在协议实现是不用关心。这里要注意的是,所有包含协议数据的数据包都对应[PSH,ACK],如果仅仅含有[ACK]那就是对上一次接收到数据包的应答而已,所以点击下一条[PSH,ACK]就可以看ftp协议的下一个数据包内容,于是我们点击查看下一条包含ftp数据的协议包:

数据内容以字符串”USER”开始,这表示客户端向服务器端提交用户名,而且用户名以明文字符串”chenyi”来表示。然后继续看下一条[PSH,ACK]数据包,其内容如下:

数据以331开头,该回复码在前几节解释过,它表示客户端的请求被接受,同时请求正在处理中,还需要执行后续步骤,它表示用户名正确但还需要提交密码,于是我们继续查看客户端发给服务器的下一条[PSH,ACK]数据包,其内容如下:

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

数据部分以回复码230开始,该数值表示用户登录成功,所有操作将继续进行,再看下一个客户端发送给服务器的[PSH,ACK]数据包,可以看到数据内容仅仅是字符串”PWD”这是客户端在向服务器请求当前文件目录,由此查看服务器返回的[PSH,ACK]数据包:

回复数据首先是回复码257,它表示路径名确立,接着是”\“表示当前处于根目录,继续看下一条客户端回复给服务器的[PSH,ACK]数据包:

回复的数据只有操作命令”FEAT”,它表示让服务器列举当前目录下的文件内容,接下来看服务器回复的[PSH,ACK]数据包内容:

数据包含的回复码为211,他表示服务器将返回包含系统信息的内容,继续看客户端回复的[PSH,ACK]数据包:

客户端回复给服务器的数据为”PASV”它表示客户端将以被动模式接收服务器数据,也就是让服务器等待客户端发起的数据请求,由此我们看下一条服务器回复的[PSH,ACK]:

数据起始以227开始,它是对上一条”PASV”请求的回应,它表示传输进入被动模式,特别需要注意的是数据中包含了用于数据传输的ip和端口号,其中ip就是192.168.2.243,这是服务器地址,接下来的两个字节数据用于计算数据传输端口,计算方法是17*256+222结果为4574,也就是客户端要连接服务器的4574端口去获取数据,下一次客户端将通过该端口号获得数据内容,继续往下看客户端发送的[PSH,ACK]数据包:

数据内容为”TYPE A”,这是客户端向服务器设定数据的传输格式,前面我们提到过ftp主要有两种数据传输格式,一种是基于ASCII的文本模式,另一种是基于二进制的模式,该命令表示数据传输使用ASCII文本模式,我们看下一条服务器返回的[PSH,ACK]:

数据的回复码为220,它表示命令请求完成,同时在解释字符串中它表明数据传输将使用ASCII吗模式,继续看客户端发送给服务器的下一条[PSH,ACK]:

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

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

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

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

回复码为226,对应含义为数据传输连接关闭,从它附带的文本信息也得知,它表示数据传输完成。

以上就是对ftp协议的抓包分析

本文分享自微信公众号 - Coding迪斯尼(gh_c9f933e7765d),作者:陈屹

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • HTTP协议原理及java实现:数据的基本传输模式

    zu说到基于TCP协议的上层协议,绝对绕不开的是HTTP协议,在其设计之初,设计者绝对想不到该协议具备的灵活性能够让其成为最广泛使用的TCP上层协议,在我看来H...

    望月从良
  • HTTP数据包头部格式解读1

    HTTP协议的大部分功能其实通过其协议包头来实现。因为HTTP协议包头作用如此重要,因此需要单独列出一节来详细讲解。协议包头大体上分为4类,分别为通用包头,请求...

    望月从良
  • TFTP,简单文本传输协议的基本原理

    随着互联网发展,文件传输效率越来越快,相应的传输协议也越来越复杂。早年有很多文件传输协议如今已经很少再用,所谓老兵不死,只是慢慢凋零。这些协议尽管现在使用不多,...

    望月从良
  • 树莓派打造洋葱Tor代理路由

    这篇文章将给大家讲讲,如何使用树莓派打造洋葱路由,它可以帮助你构建安全的网络环境。 平时有感觉到别人在监控你么,不用再担心啦,现在只要使用Onion Pi To...

    FB客服
  • 自造微博轮子,再爬姐姐和奶奶殿下

    缘起 昨天写了一篇文章,主要是有感于文章马伊琍的婚姻,才爬了下他们微博下的评论,结果有位老哥说

    周萝卜
  • Vue:Vue中的导航浮顶

    MrTreasure
  • python 类的字符串显示

    class Pair: def init(self, x, y): self.x = x self.y = y

    用户5760343
  • Hadoop学习笔记—20.网站日志分析项目案例(三)统计分析

      为了能够借助Hive进行统计分析,首先我们需要将清洗后的数据存入Hive中,那么我们需要先建立一张表。这里我们选择分区表,以日期作为分区的指标,建表语句如下...

    Edison Zhou
  • Cobalt Strike 初体验

    Cobalt Strike 一款以 metasploit 为基础的 GUI 的框架式渗透测试工具,集成了端口转发、服务扫描,自动化溢出,多模式端口监听,win ...

    信安之路
  • Appium+python自动化27-android特有的wait_activity

    前言 在启动app的时候,如果直接做下一步点击操作,经常会报错,于是我们会在启动完成的时候加sleep。 那么问题来了,这个sleep时间到底设置多少合适呢?设...

    上海-悠悠

扫码关注云+社区

领取腾讯云代金券