文章目录
前 言
FTP(File Transfer Protocol,文件传输协议)是互联网上常用的协议之一,人们用FTP实现互连网上的文件传输。由于TCP/IP协议族在设计时是处在一个相互信任的平台上的,使得在网络安全越来越被重视的今天,TCP/IP协议族的安全性也成为了安全界研究的一个重点,著名的ARP欺骗,交换环境下的数据监听,中间人攻击,以及DDOS,都利用了TCP/IP协议的脆弱性,FTP协议也或多或少的存在着一些问题,本文从FTP协议本身出来,探讨一下FTP协议的安全性。
第一章 FTP协议
一、协议简介
FTP协议和HTTP协议类似,都是采用的TCP连接,但与HTTP协议不同的是,HTTP协议的所有数据都是通过80端口进行传输(这里不考虑SSL),而FTP把数据和命令分开来处理,我们暂且把它们分别命名为“命令通道”和“数据通道”。命令通道一般是在我们熟悉的21端口,而数据通道通常是一个高端口。例如客户机要从FTP服务器上获取某个文件,首先由客户机登录服务器,与服务器建立连接,这就是我们前面讲的“命令通道”,客户机从这条通道将请求文件的命令发往服务器,服务器接到此命令后将与客户机重新建立一条连接,这就是我们面前讲的“数据通道”,文件数据将通过数据通道传送到客户机。
二、数据表示
FTP协议规范提供了控制文件传送与存储的多种选择。在以下四个方面都须作出一个选择。
(一)文件类型
(1)ASCII码文件类型 一般情况下ASCII码文件类型是默认选择的。
(2)EBCDIC文件类型 该类型传输方式要求两端都是EBCDIC系统。
(3)图像文件类型(也称二进制类型) 数据发送呈现为一个比特流,通常用于传输二进制文件
(4)本地文件类型 该方式在具有不同字节大小的主机之间传输二进制文件。
(二)格式控制
该选项只对ASCII和EBCDIC文件有效。
(1)非打印
(2)远程登录格式控制
(3)Fortran回车控制
(三)结构
(1)文件结构
(2)记录结构
(3)页结构
(四)传输方式
(1)流方式
(2)块方式
(3)压缩方式
三、FTP命令
FTP命令和应答是在命令通道以ASCII码开形式传送的,以下给出常用的命令及命令的相关说明:
命令 说 明
ABOR 放弃先前的FTP命令和数据转输
LIST 列表显示文件或目录
PASS 服务器上的口令
PORT 客户IP地址和端口
QUIT 从服务器上注销
RETR 取一个文件
STOR 存一个文件
SYST 服务器返回系统类型
TYPE 说明文件类型
USER 服务器上的用户名
四、FTP应答
FTP应答都是ASCII码形式的3位数字,并跟有报文选项。3位数字每一位都有不同的意义,这里给出一些常见的反回数字:
125 数据通道已经打开;传输开始。
200 就绪命令。
214 帮助报文。
331 用户名就绪,要求输入口令。
425 不能打开数据通道。
500 语法错误(未认可命令)。
501 语法错误(无效参数)。
502 未实现的MODE(方式命令)类型。
五、连接管理
我们在前面讲了FTP的命令传输和数据传输是通过不同的端口进行传输的,连接管理也就理所当然的成了FTP协议的核心问题。其中最关键的又是数据通道的管理。
数据通道有以下三大用途:
- 从客户向服务器发送一个文件。
- 从服务器向客户发送一个文件。
- 从服务器向客户发送文件域目录列表。
其中传输模式又有主动FTP和被动FTP之分。主动FTP的一般过程如下:
- 客户发出命令建立数据连接。
- 客户通常在客户端主机上为所在数据连接选择一个临时端口号。客户从该端口发布一个被动的打开。
- 客户使用PORT命令从命令通道把数据通道的端口发向服务器。
- 服务器在命令通道上接收端口号,并向客户端主机上的端口发存一个主动的打开。这时服务器的数据通道使用的是20端口。
而被动FTP与主动FTP不同的是它不是由客户主机开一个临时端口,而是由服务器开一个临时端口等待客户机的连接。Fedora自带的vsftp就是采用的被动的传输模式。下面是从登录vsftp,到执行ls,再到退出的全过程。
[xinhe@xinhe xinhe]$ ftp -d xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).
220 Welcome to ylyz FTP service.
Name (xxx.xxx.xxx.xxx:xinhe): xplore
---> USER xinhe
331 Please specify the password.
Password:
---> PASS XXXX
230 Login successful.
---> SYST
215 UNIX Type: L8
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
ftp: setsockopt (ignored): Permission denied
---> PASV
227 Entering Passive Mode (xxx,xxx,xxx,xxx,204,73)
---> LIST
150 Here comes the directory listing.
drwxr-xr-x 11 48 48 4096 Jul 21 10:52 xxx
drwxr-xr-x 19 48 48 4096 Jul 31 14:18 xxxx
drwx------ 2 0 0 16384 Jun 23 03:18 lost+found
drwxr-xr-x 3 510 510 4096 Aug 03 05:42 software
drwxr-xr-x 2 510 510 4096 Jun 30 09:34 tmp
drwxr-xr-x 6 510 510 4096 Jun 27 08:17 xxxxx
drwxrwxr-x 10 501 501 4096 Aug 12 20:35 xxxxxxx
-rw-r--r-- 1 510 510 12649185 Aug 12 20:34 xxxx
drwxr-xr-x 7 501 12 4096 Jul 03 15:13 xinhe
drwxr-xr-x 7 510 510 4096 Aug 13 19:08 zwell
226 Directory send OK.
Ftp> bye
---> QUIT
221 Goodbye.
以上就是登录某台vsftp的服务器,执行了一个ls然后再退出的全过程,以上是采用的被动传输模式,关键看这一句:
---> PASV
227 Entering Passive Mode (xxx,xxx,xxx,xxx,204,73)
这一句告诉了我们服务器的IP和开临时数据端口,接着便是登录到这一临时端口 52297 ,临时端口的算法:204*256+73。为了更清楚的了解之过程,我们对这一过程的数据传送进行了监视。以下是客户机登录临时端口过程中的一段
08/24-15:24:24.052846 0:E0:4C:F0:E0:EA -> 0:D0:F8:51:FC:81 type:0x800 len:0x4A
192.168.10.8:32791 -> xxx.xxx.xxx.xxx:52297 TCP TTL:64 TOS:0x0 ID:39780 IpLen:20 DgmLen:60 DF
******S* Seq: 0x42206DD2 Ack: 0x0 Win: 0x16D0 TcpLen: 40
TCP Options (5) => MSS: 1460 SackOK TS: 849590 0 NOP WS: 0
注:由于测式过程中的服务器是公网上的真实服务器,故屏弊其地址。
第二章 安全隐患
以上我们讨论了FTP协议本身和FTP的具体传输过程,在这一过程中,很多地方都存在着安全隐患,随着互联网和普及了深入,网络安全也越来越被人们重视,在这里我把一些常见的关于FTP的安全隐患提出来,希望引起人们对FTP安全的重视,使FTP服务器和数据传输过程更加安全。
一、FTP服务器软件漏洞
这类安全隐患不是本文讨论的重点,但是在这里必须把它提出来,因为它对于FTP服务供应商来说就是恶梦,也是倍受黑客们关注的焦点,常用的FTP服务软件有Wu-ftpd, ProFTPD,vsftpd,以及windows下常用的Serv-U等,最常见也最可怕的漏洞就是缓冲区溢出,近来Wu-ftpd和Serv-U的溢出漏洞层出不穷,ProFTPD也出现过缓冲区溢出,目前比较安全的还是vsftp,必竞是号称非常安全的FTP。
二、明文口令
前面讲过了,TCP/IP协议族的设计在地相互信任和安全的基础上的,FTP的设计当然也没有采用加密传送,这样的话,FTP客户与服务器之前所有的数据传送都是通过明文的方式,当然也包括了口令。
至从有了交换环境下的数据监听之后,这种明文传送就变得十分危险,因为别人可能从传输过程过捕获一些敏感的信息,如用户名和口令等。像HTTPS和SSH都采用加密解决了这一问题。而FTP仍然是明文传送,而像UINX和LINUX这类系统的ftp账号通常就是系统帐号,(vsftp就是这样做的)。这样黑客就可以通过捕获FTP的用户名和口令来取得系统的帐号,如果该帐号可以远程登录的话,通常采用本地溢出来获得root权限。这样这台FTP服务器就被黑客控制了。
以下是我捕获的明文传送的数据:
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
08/24-15:24:13.511233 0:E0:4C:F0:E0:EA -> 0:D0:F8:51:FC:81 type:0x800 len:0x4F
192.168.10.8:32790 -> xxx.xxx.xxx.xxx:21 TCP TTL:64 TOS:0x10 ID:36423 IpLen:20 DgmLen:65 DF
***AP*** Seq: 0x407F7F77 Ack: 0x1BD963BF Win: 0x16D0 TcpLen: 32
TCP Options (3) => NOP NOP TS: 848536 1353912910
55 53 45 52 20 78 70 6C 6F 72 65 0D 0A USER xinhe..
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
08/24-15:24:13.557058 0:D0:F8:51:FC:81 -> 0:E0:4C:F0:E0:EA type:0x800 len:0x42
xxx.xxx.xxx.xxx:21 -> 192.168.10.8:32790 TCP TTL:56 TOS:0x0 ID:29145 IpLen:20 DgmLen:52 DF
***A**** Seq: 0x1BD963BF Ack: 0x407F7F84 Win: 0x16A0 TcpLen: 32
TCP Options (3) => NOP NOP TS: 1353916422 848536
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
08/24-15:24:13.560516 0:D0:F8:51:FC:81 -> 0:E0:4C:F0:E0:EA type:0x800 len:0x64
xxx.xxx.xxx.xxx:21 -> 192.168.10.8:32790 TCP TTL:56 TOS:0x0 ID:29146 IpLen:20 DgmLen:86 DF
***AP*** Seq: 0x1BD963BF Ack: 0x407F7F84 Win: 0x16A0 TcpLen: 32
TCP Options (3) => NOP NOP TS: 1353916426 848536
33 33 31 20 50 6C 65 61 73 65 20 73 70 65 63 69 331 Please speci
66 79 20 74 68 65 20 70 61 73 73 77 6F 72 64 2E fy the password.
0D 0A ..
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
08/24-15:24:13.571556 0:E0:4C:F0:E0:EA -> 0:D0:F8:51:FC:81 type:0x800 len:0x42
192.168.10.8:32790 -> xxx.xxx.xxx.xxx:21 TCP TTL:64 TOS:0x10 ID:36424 IpLen:20 DgmLen:52 DF
***A**** Seq: 0x407F7F84 Ack: 0x1BD963E1 Win: 0x16D0 TcpLen: 32
TCP Options (3) => NOP NOP TS: 848542 1353916426
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
08/24-15:24:21.364315 0:E0:4C:F0:E0:EA -> 0:D0:F8:51:FC:81 type:0x800 len:0x54
192.168.10.8:32790 -> xxx.xxx.xxx.xxx:21 TCP TTL:64 TOS:0x10 ID:36425 IpLen:20 DgmLen:70 DF
***AP*** Seq: 0x407F7F84 Ack: 0x1BD963E1 Win: 0x16D0 TcpLen: 32
TCP Options (3) => NOP NOP TS: 849321 1353916426
50 41 53 53 20 78 70 6C 6F 72 65 5F 32 30 30 34 PASS test
0D 0A ..
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
这样就我们就可以看到该ftp服务器上的用户名是:xinhe和密码:test。
三、FTP旗标
这个问题相对来说不是很严重,现在很多服务软件都有这类问题,黑客在发起攻击之前一般要先确定对方所用的版本号。这样便于选择攻击程序。以下是一个例子:
[xinhe@xinhe xinhe]$ ftp xxx.xxx.xxx.xxx
Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).
220-Serv-U FTP Server v5.1 for WinSock ready…
220 S TEAM
这此信息我们可知该服务器使用的服务软件可能就是Serv-U 5.1
四、通过FTP服务器进行端口扫描
FTP客户端所发送的PORT命令告诉服务器FTP服务器传送数据时应当连向的IP和端口,通常,这就是FTP客户所在机器的IP地址及其所绑定的端口。然而FTP协议本身并没有要求客户发送的PORT命令中必须指定自已的IP。
利用这一点,黑客就可以通过第三方FTP服务器对目标机器进行端口扫描,这种方式一般称为FTP反射,对黑客而言,这种扫描方式具有以下两个优点:
(1)提供匿名性
由于端口扫描的源地址为FTP服务器的IP地址,而不是黑客的机器,所以这种方式很好的隐藏了黑客的真实IP。
(2)避免阻塞
由于通过第三方FTP服务器进行扫描,即使目标机器通过添加内核ACL或无效路由来自动阻塞对其进行扫描的机器,但黑客可以过不过的FTP服务器来完成其扫描工作。
Nmap就可以实现这一扫描过程,以下是一次利用ftp服务器进行扫描的实例。
[xinhe@xinhe xinhe]$ nmap -b xinhe:test@xxx.xxx.xxx.xxx:21 -v xxx.xxx.xxx.xxx
Hint: if your bounce scan target hosts aren't reachable from here, remember to use -P0 so we don't try and ping them prior to the scan
Starting nmap 3.48 ( http://www.insecure.org/nmap/ ) at 2004-08-24 20:16 CST
Resolved ftp bounce attack proxy to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).
Machine xxx.xxx.xxx.xxx MIGHT actually be listening on probe port 80
Host xxx.xxx.xxx.xxx appears to be up ... good.
Attempting connection to ftp://xinhe:test@xxx.xxx.xxx.xxx:21
Connected:220 Welcome to FTP service.
Login credentials accepted by ftp server!
Initiating TCP ftp bounce scan against xxx.xxx.xxx.xxx at 20:16
Adding open port 237/tcp
Deleting port 237/tcp, which we thought was open
Changed my mind about port 237
Adding open port 434/tcp
Deleting port 434/tcp, which we thought was open
Changed my mind about port 434
Adding open port 1509/tcp
Deleting port 1509/tcp, which we thought was open
Changed my mind about port 1509
Adding open port 109/tcp
Deleting port 109/tcp, which we thought was open
Changed my mind about port 109
Adding open port 766/tcp
Deleting port 766/tcp, which we thought was open
Changed my mind about port 766
Adding open port 1987/tcp
Deleting port 1987/tcp, which we thought was open
Changed my mind about port 1987
Adding open port 5998/tcp
Deleting port 5998/tcp, which we thought was open
Changed my mind about port 5998
Adding open port 1666/tcp
Deleting port 1666/tcp, which we thought was open
Changed my mind about port 1666
Adding open port 506/tcp
Deleting port 506/tcp, which we thought was open
Changed my mind about port 506
caught SIGINT signal, cleaning up
五、数据劫持
我们在前面讲了FTP的数据传输过程,同样FTP协议本身本并没有要求传输命令的客户IP和进行数据传输的客户IP一致,这样黑客就有可能劫持到客户和服务器之间传送的数据。根据数据传输的模式可把数据劫持分为主动数据劫持和被动数据劫持。
1、被动数据劫持
跟据前面讲的被动传输过程我们可以看出,在FTP客户端发出PASV或PORT命令之后并且在发出数据请求之前,存在一个易受攻击的窗口。如果黑客能猜到这个端口,就能够连接并载取或替换正在发送的数据。
要实现被动数据劫持就必须知道服务器上打开的临时端口号,然后很多服务器并不是随机选取端口,而是采用递增的方式,这样黑客要猜到这个端口号就不是很难了。
2、主动数据劫持
主动数据劫持比被动数据劫持要困难很多,因为在主动传输的模式下是由客户打开临时端口来进行数据传输,而黑客是很难找到客户的IP和临时端口的。
第三章 安全策略
一、使用较比安全的系统和FTP服务软件
这里安全的系统主要是最好不要采用windows系统作服务器,因为系统本身的安全性就很成问题,windows每年都要暴N个漏洞,一旦有溢出漏洞很可能就能拿到管理员权限。一旦系统被入侵了,运行在此系统之上的服务也就无安全性可言。Linux和BSD都将是不错的选择。
服务软件采用漏洞比较少的,如vsftp,而且确保版本的更新。
二、使用密文传输用户名和口令
这里我们可以采用scp和sftp,也可以使用SSH来转发。这样即使黑客能监听到客户与服务器之间的数据交换,没有密钥也得不到口令。使用SSH转发有一些条件限制,首先要求服务器和客户端都是主动模式,然后是服务器必须允许命令通道之外的机器向其发送PORT命令。
三、更改服务软件的旗标
更改服务软件的旗标能起到迷惑攻击者的作用,至少能迷惑很多扫描器,造成扫描器的误报,但更改旗标并不是解决安全问题的根本办法,安全漏洞不会因为旗标不同而消失,不过更改总比不改要好一些。现在大多数的服务端软件都可以在配置文件里更改该FTP的旗标。
四、加强协议安全性
这一点是服务软件的提供商需要做的,一是对PORT命令进行检查,PORT后的IP应和客户主机是同一IP,我们对FTP的攻击很多都是通过构造特殊的PORT命令来实现的,所以PORT命令的使用对于攻击者来说就显得尤为重要了。做到这一点并不是很容易,Wu-ftpd就花了几年的时间。目前针对数据劫持还没什么完美的防御方法,目前能做的就是检查命令通道和数据通道的IP地址是不是一致,但这也不能百分之百地防止数据劫持的发生。因为客户机和黑客可能处于同一内网。
后 记
网络已深入到社会生活的方方面面,网络安全也越来越显得重要,FTP协议安全只是网络安全中一个很小的部分,网络安全还有很多工作要做,这篇文章由于时间的关系写得比较浅显,没有把FTP服务软件的源码拿出来讲(很多好的东西都是开源的),我想如果能把源码拿来对照源码讲FTP的传输过程,这样我们会对FTP的传输过程有一个本质的了解,也更容易从中找到某些不为人知的安全隐患。