网络通讯

关注公众号 jb51net

关闭
软件教程 > 网络通讯 >

FTP协议的分析和扩展

脚本之家

表明客户端希望进入Passive模式; 
5、服务器端进行应答,应答包括服务器的IP地址和一个暂时的端口,这个暂时的端口是客户端 
在打开数据传输连接时应该使用的端口; 
6、客户端发送一个SYN包,源端口为客户端自己选择的一个暂时端口,目的端口为服务器在PASV 
应答命令中指定的暂时端口号; 
7、服务器端发送SYN ACK包给客户端,目的端口为客户端自己选择的暂时端口,源端口为PASV 
应答中指定的暂时端口号; 
8、客户端发送一个ACK包; 
9、发送数据的主机以这个连接来发送数据,数据以TCP段(注:segment,第4层的PDU)形式发送( 
一些命令,如STOR表示客户端要发送数据,RETR表示服务器段发送数据),这些TCP段都需要 
对方进行ACK确认; 
10、当数据传输完成以后,发送数据的主机以一个FIN命令来结束数据连接,这个FIN命令需要另一 
台主机以ACK确认,另一台主机也发送一个FIN命令,这个FIN命令同样需要发送数据的主机以A 
CK确认; 
11、客户端能在控制连接上发送更多的命令,这可以打开和关闭另外的数据连接;有时候客户端结 
束后,客户端以FIN命令来关闭一个控制连接,服务器端以ACK包来确认客户端的FIN,服务器 
同样也发送它的FIN,客户端用ACK来确认。 

下图图示了Passive模式FTP的开始几个步骤: 
/====================================================================\ 
| | 
| [ ftp Client ] [ ftp Server ] | 
| | 
| (TCP:21 连接初始化,控制端口) | 
| SYN | 
| Port xxxx ----------------------> Port 21 [TCP] | 
| SYN+ACK | 
| Port xxxx <---------------------- Port 21 | 
| ACK | 
| Port xxxx ----------------------> Port 21 | 
| | 
| (PASV操作: 被动连接数据端口初始化) | 
| | 
| PASV | 
| Port xxxx ----------------------> Port 21 | 
| PASV OK, IP, Port yyyy | 
| Port xxxx <---------------------- Port 21 | 
| SYN | 
| Port zzzz ----------------------> Port yyyy | 
| SYN+ACK | 
| Port zzzz <---------------------- Port yyyy | 
| ACK | 
| Port zzzz ----------------------> Port yyyy | 
| | 
| | 
| (数据操作: 数据传输) | 
| List, Retr or Stor | 
| Port xxxx ----------------------> Port 21 | 
| Data + ACK | 
| Port zzzz <---------------------> Port yyyy | 
| . | 
| . | 
| . | 
| | 
\====================================================================/ 
一个PASV请求要求服务器在服务器选择的一个新的端口上接受数据连接,PASV命令没有任何参 
数,服务器端的回应只是一行显示服务器IP地址和服务器接受连接的TCP端口号。 

下图显示了服务器对PASV命令的回应,服务器告诉客户端它在端口5365(192,168,179,100,20 
,245)上进行监听,计算端口的方法是20*256+245=5365; 
/====================================================================\ 
| TCP - Transport Control Protocol | 
| Source Port: 21 ftp | 
| Destination Port: 1249 | 
| Sequence Number: 4239887193 | 
| Ack Number: 36925357 | 
| Offset: 5 (20 bytes) | 
| Reserved: %000000 | 
| Flags: %011000 | 
| 0. .... (No Urgent pointer) | 
| .1 .... Ack | 
| .. 1... Push | 
| .. .0.. (No Reset) | 
| .. ..0. (No SYN) | 
| .. ...0 (No FIN) | 
| | 
| Window: 8760 | 
| Checksum: 0x3EAB | 
| Urgent Pointer: 0 | 
| No TCP Options | 
| | 
| FTP Control - File Transfer Protocol | 
| Line 1: PASV 192,168,0,1,100,20,245<CR><LF> | 
| | 
| FCS - Frame Check Sequence | 
| FCS (Calculated): 0xBED4346D | 
\====================================================================/ 
当收到PASV命令的回应后,客户端打开一个TCP连接,源端口为一个暂时的端口,目的端口为 
服务器提供的暂时端口。 

下图显示了客户端的TCP连接建立过程,正如上面所说,目的端口为5365。 
/====================================================================\ 
| TCP - Transport Control Protocol | 
| Source Port: 1250 | 
| Destination Port: 5365 | 
| Sequence Number: 36931503 | 
| Ack Number: 0 | 
| Offset: 7 (28 bytes) | 
| Reserved: %000000 | 
| Flags: %000010 | 
| 0. .... (No Urgent pointer) | 
| .0 .... (No Ack) | 
| .. 0... (No Push) | 
| .. .0.. (No Reset) | 
| .. ..1. SYN | 
| .. ...0 (No FIN) | 
| | 
| Window: 8192 | 
| Checksum: 0x1A57 | 
| Urgent Pointer: 0 | 
| No TCP Options | 
| | 
| TCP Options | 
| Options Type: 2 Maxinum Segment Size | 
| Length: 4 | 
| MSS: 1460 | 
| | 
| FCS - Frame Check Sequence | 
| FCS (Calculated): 0x5A1BD023 | 
\====================================================================/ 

大多数人认为在防火墙网络环境中Passive模式比Port模式的问题小,但我们注意到在Passive 
模式下,客户端打开一个暂时的目的端口连接,一些防火墙或者CISCO设备的访问列表(ACL)可 
能会阻止这种连接,同样服务器的回应也是从一个暂时的端口到一个暂时的端口,防火墙或者 
CISCO的访问列表也会阻止这种连接。在CISCO路由器上你可以用访问列表关键字"established 
"来避免第二个问题,"established"关键字告诉路由器允许带ACK字端的包通过,服务器端的S 
YN ACK包带有ACK字端。在新版本PIX IOS中也可以通过fixit关键字建立针对ftp协议的深层状 
态检测过滤,其他大多数状态检测防火墙例如LinuxNetfilters也支持ftp协议的状态检测,进行 
准确的PASV动态端口过滤。 


>>2.3 用户名和口令的明文传输 
FTP另一个声名狼藉的问题是它以明文方式发送用户名和口令,也就是不加密地发送。任何人 
只要在网络中合适的位置放置一个协议分析仪就可以看到用户名和口令;FTP发送的数据也是 
以明文方式传输,通过对ftp连接的监控和数据收集就可以收集和重现ftp的数据传输并实现协 
议连接回放。事实上很多用户把相同的用户名和口令用在不同的应用中,这样这个问题可能 
看起来更为糟糕;如果黑客收集到FTP口令,他们也可能就得到了你在线帐号或者其他一些 
机密数据的口令。 

下面是通过tcpdump -- 一个著名的网络协议分析程序抓取的ftp的完整通讯过程。 
/=================================================================\ 
21:55:36.682402 IP 192.168.0.1.2323 > 192.168.0.3.21: S 2047626269:2047626269(0) 
win 65535 <mss 1460,nop,nop,sackOK> (DF) 
21:55:36.682792 IP 192.168.0.3.21 > 192.168.0.1.2323: S 3917547047:3917547047(0) 
ack 2047626270 win 65535 <mss 1460,nop,nop,sackOK> (DF) 
21:55:36.682855 IP 192.168.0.1.2323 > 192.168.0.3.21: . ack 1 win 65535 (DF) 
<TCP三步握手> 
21:55:36.854899 IP 192.168.0.3.21 > 192.168.0.1.2323: P 1:115(114) ack 1 win 65535 
(DF) 
0x0000 4500 009a d570 4000 8006 a398 c0a8 0003 E....p@......... 
0x0010 c0a8 0001 0015 0913 e981 0628 7a0c 4c1e ...........(z.L. 
0x0020 5018 ffff cd50 0000 3232 302d 5468 6973 P....P..220-This 
0x0030 2073 6572 7665 7220 6973 2066 6f72 2070 .server.is.for.p 
0x0040 7269 7661 7465 2075 7365 206f 6e6c 790d rivate.use.only. 
0x0050 0a32 .2 
21:55:37.016115 IP 192.168.0.1.2323 > 192.168.0.3.21: . ack 115 win 65421 (DF) 
0x0000 4500 0028 b8d0 4000 8006 c0aa c0a8 0001 E..(..@......... 
0x0010 c0a8 0003 0913 0015 7a0c 4c1e e981 069a ........z.L..... 
0x0020 5010 ff8d 6f83 0000 P...o... 
21:55:37.016471 IP 192.168.0.3.21 > 192.168.0.1.2323: P 115:154(39) ack 1 win 
65535 (DF) 
<FTP协议连接> 
0x0000 4500 004f d586 4000 8006 a3cd c0a8 0003 E..O..@......... 
0x0010 c0a8 0001 0015 0913 e981 069a 7a0c 4c1e ............z.L. 
0x0020 5018 ffff 074f 0000 3232 3020 506c 6561 P....O..220.Plea 
0x0030 7365 2065 6e74 6572 2079 6f75 7220 6c6f se.enter.your.lo 
0x0040 6769 6e20 6e61 6d65 206e 6f77 2e0d 0a gin.name.now... 
21:55:37.022282 IP 192.168.0.1.2323 > 192.168.0.3.21: P 1:12(11) ack 154 win 65382 
(DF) 
0x0000 4500 0033 b8d2 4000 8006 c09d c0a8 0001 E..3..@......... 
0x0010 c0a8 0003 0913 0015 7a0c 4c1e e981 06c1 ......