FTP,很多人都非常熟悉了。很多FTP实现的软件使用主动模式来传输数据,那主动模式和被动模式的区别在哪呢?
为啥有了主动模式还有被动模式呢?
借助wireshark来分析FTP主动模式和被动模式的区别。
FTP对应的最新RFC是RFC959,在RFC959里面,有1张图片,很形象地描述了FTP的工作原理。
从图1中看出,FTP的客户端和服务器建立了两个TCP连接,一个用来传输命令和响应,一个用来传输数据,很明显,两个连接不会使用同一个端口。
FTP服务器用来传输命令的默认端口是21,而用来传输数据的端口是20(主动模式),用wireshark来深入学习下。
认证
1、2、3号数据包用来与FTP服务器建立TCP连接。
[4]FTP Server:服务器已经准备好了。
当建立连接后,服务器会主动告知客户端,FTP服务已经准备好了,这个数据包可能包括FTP服务器的信息,比如用的什么服务器软件,如果是filezilla server,里面会包括filezilla的字样。
[5]FTP Client:我是ultrain。
5号数据包告诉FTP服务器,自己的用户名,用来认证。从数据包详细看,FTP命令格式很简单,USER ultrain,显示命令,然后是命令的参数。
服务器收到USER命令后,会查看是否存在这个用户,如果存在,就向客户端索要该用户的密码,向客户端发送约定的代码和一个字符串,这个代码范围从200到532,不是连续的。看下部分代码的含义。
可以想到,6号数据包的代码是331。
6号包的具体内容:
为了与客户端向服务器发送的命令格式对应,服务器的响应格式,331 描述,这样方便处理。
有些FTP服务器在处理后面的字符串参数时,并没有校验长度,导致缓冲区溢出。比如USER命令,后面的用户名如果发送过长,假如FTP服务器没有正确处理,可能会导致服务器崩溃或缓冲区溢出攻击,当然,这是另外一个问题了。
[6]FTP Server:名字是OK的,需要密码。
[7]FTP Client:密码是654312。
[8]FTP Server:用户登录进来了。
认证过程很简单,这里省略了TCP的ACK确认包,所以数据包数量比你真实抓到的数据包少。然后,用户名和密码都是明文的,这是一个比较大的安全隐患。
数据传输
接下来是数据的传输过程。
[19]FTP Client:当前目录是什么(PWD)?
[20]FTP Server:"/"是当前目录。
服务器好敷衍啊。。。其实不是,还没开始传输数据。接着看。
[21]FTP Client:我的IP地址和端口是192.168.17.128和1057。
[22]FTP Server:PORT命令执行成功。
PORT命令用来通知FTP服务器,传输数据时,客户端监听的端口。通常我们的理解,客户端是主动去连接服务器,服务器等着客户端来连接。而这里不一样,在传输数据时,服务器来主动连接客户端,太阳打北边出来了,这是放下身段了。
你可能会问,端口1057怎么来的,明明是433。这里有一个公式,但是我不写,写公式可能会降低阅读量。如何计算呢?就是4*256+33=1057,不信你可以用手机算下。至于为什么这么做,我就不知道了,知道是规定就行了。
22和23号数据包是客户端告知服务器,使用什么传输模式。
25、26及27号数据包,服务器使用20端口主动与客户端的1057端口建立连接,28和29号数据包传输FTP数据。我把光标放在了30号数据包上,当然是想引起你们的注意。
30号数据包是对28、29号数据包的确认,一般来说,TCP中,每发送一个数据包,都会收到一个确认的ACK包,而这里服务器发了两个TCP包,却收到了一个ACK确认,怎么看出来30号数据包是对28和29号数据包的确认,从ACK号可以看出,30号ACK是1529,27号的seq是1,28和29的长度加起来是1460+68=1528,所以30号是1529。
把两个数据包的确认包合并成1个包,看起来像累积确认,其实是SACK协议,选择确认协议,这个不是本文重点,不能走在跑题的不归路上。
31、32、33、34是TCP的4次挥手,传输命令的连接没有断开,而数据通道一旦发送完数据,连接就断开了,可以回过头看下,第1张图的注意2,数据连接不需要一直存在。假如有段时间不需要传输数据,如果一直保持着数据连接,就会占用资源。
到这里我觉得文章很长了,但是还没介绍完。上面的过程是FTP的主动模式,FTP的被动模式与主动模式不同(这一句是废话),FTP的主动模式与被动模式,是站在服务器的角度上,主动模式:数据连接中,服务器主动连接客户端。被动模式:数据连接中,服务器被动接受服务器的连接。
看下被动模式PASV,这是另外一个数据包。
[23]FTP Client:请开启被动模式PASV。
[24]FTP Server:进入被动模式,我监听的端口是1388,数据传输时,你来连接这个端口。
26、27和28号数据包,是服务器被动接受来自客户端的连接,和主动模式对比,主动模式是服务器用20端口,主动与客户端的1057端口建立连接。
还记得文章开头的问题吗?为啥还存在被动模式呢,这是因为从FTP服务器与客户端建立数据连接时,可能会被防火墙等边界设备过滤掉,或者在边界设备上,假如做了NAT,FTP服务器无法主动连接客户端(不知道说的对不对)。
至此,结束。
但是,我使用filezillaServer作为FTP服务器,设置支持被动模式,用windows自带的ftp客户端连接,输入命令literal pasv,传输数据时依然使用的主动模式,貌似windows的ftp客户端不支持被动模式。如果你知道原因,请告诉我。
本文来源于:FTP-主动模式和被动模式的分析-变化吧门户
特别声明:以上文章内容仅代表作者本人观点,不代表变化吧门户观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。
- 赞助本站
- 微信扫一扫
-
- 加入Q群
- QQ扫一扫
-
评论