0x01 VSFTP概述
FTP是file transfer protaocol (文件传输协议)的英文简称,用户Internet上的双向传输。使用FTPl来传输时,是具有一定程度的危险性,因为是明文传输。
VSFTP是一个基于GPL发布的类Unix系统上使用FTP服务器软件,全称Very Secure FTP.
0x011 特性
- Vsftp程序是额运行者一般是普通用户,降低了相对应进程的权限,提高了安全性
- 任何需要执行较高权限的指令都需要上层程序许可
- ftp所需要用的绝大多数命令都被整合到vsftp中,基本不需要系统额外提供命令
- 拥有chroot功能,可以改变用户的根目录,限制用户只能再自己的home目录。
0x02 VSFTP连接类型
graph LR
A[控制连接 持续连接]
B[TCP21 命令通道]
C[收发FTP命令]
A --> B --> C
D[数据连接 按需连接]
E[TCP20 数据通道]
F[用于上传下载数据]
D --> E --> F
一般就算搭建VSFTP运行后,20端口是查不到的。因为是只有用户在21端口操作下载和上传时VSFTP才会启用20端口。
0x03 VSFTP工作模式
VSFTP有两种工作模式
0x031 port 模式 (默认)
主动模式也称Port模式
- FTP客户端首先和服务器的TCP21端口建立连接,用来发送命令
- 客户端需要接收数据的时候在这个端口上发送PORT命令
- PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP20端口连接客户端指定端口发送数据。
- FTP Server 必须和客户端建立一个新的连接用来传送数据。
0x032 Passive 模式
被动模式也称Passive模式
- FTP客户端首先和服务器的TCP21端口建立连接,用来发送命令
- 但是建立连接后客户端发送Pasv命令。服务器收到Pasv,打开一个临时端口(端口大于1023小于65535)并且通知客户端在这个端口上传送数据的请求
- 客户端连接FTP服务器的连接端口,然后FTP服务器将通过这个端口传输数据。
0x04 VSFTP传输模式
Binary模式: 不对数据进行任何处理,适合进行可执行文件,压缩文件,图片等
ASCII模式: 在文件传输时,自动适应目标操作系统的结束符,如回车等。
Redhat 默认采用Binary模式,这样能尽量的保证大多数文件传输后能正常使用。
切换方式:在FTP>提示符下输入ascii即切换成ASCII模式,输入bin即binary
0x05 VSFTP软件信息
服务端软件名: vsftpd
客户端软件名: ftp
服务名: vsftpd
端口号: 20,21,指定范围内随机端口
配置文件: /etc/vsftpd/vsftpd.conf
0x06 登录验证方式
0x061 匿名用户验证:
用户账号名称: ftp或anonymous
用户账号密码: 无密码
工作目录: /var/ftp
默认权限: 默认可下载不可上传,上传权限由两部分组成(主配置文件和文件系统)
0x062 本地用户验证
用户账号名称: 本地用户 /etc/passwd
用户账号密码: 用户密码 /etc/shadow
工作目录: 登录用户的Home目录
权限: 最大权限( drwx——)
0x063 虚拟(virtual) 用户验证
- 创建虚拟用户来代替本地用户,减少本地用户曝光率
- 使用本地用户作为虚拟用户的映射用户,为虚拟用户提供工作目录和权限控制
- 能够设置严格权限(为每一个用户生成单独的配置文件)
graph LR
A1[客户端]
A2[匿名帐户:ftp,anonymous,/var/ftp]
A1 --> 匿名账户 --> A2
0x07 实验部署
匿名权限控制选项:
anonymous_enable=YES: #启用匿名访问
anon_umask=022: #匿名用户所上传文件的权限掩码
anon_root=/var/ftp: #匿名用户的FTP根目录
anon_upload_enable=YES:#允许上传文件
anon_mkdir_write_enable=YES:#允许创建目录
anon_other_write_enable=YES:#开放其他写入权
anon_max_rate=0: #限制最大传输速率,单位为字节
本地用户权限控制选项:
listen=YES:#是否以独立运行的方式监听服务
listen_address=192.168.4.1:#设置监听的IP地址
listen_port=21:#设置监听FTP服务的端口号
write_enable=YES:#是否启用写入权限
download_enable=YES:#是否允许下载文件
userlist_enable=YES:#是否允许user_list中的中户登录
userlist_deny=YES:#是否禁用user_list中的用户
max_clients=0:#限制并发客户端连接数
max_per_ip=0:#限制同一IP地址的并发连接数
chroot_local_user=YES #是否将用户禁锢在主目录
chroot_list_enable=YES #允许/etc/vsftpd/chroot_list里的目录用户随意切换目录
配置文件: ftpusers
#禁止/etc/vsftpd/ftpusers 文件中出现的用户登录FTP,权限比user_list更高,即使生效
#修改被动模式数据传输的端口
pasv_enable=YES
pasv_min_post=30000
pasv_max_post=50000
传输端口就会在30000~50000中随机一个
注意:虚拟账户使用的时匿名用户的权限,需要在在主文件上取消anon权限。在单独配置文件的时候可以写对应的权限。
0x08 Openssl+vsftpd加密验证
FTP传输的过程是明文传输的。
扩展:
tcpdump 这个可以拿来做Linux的指定端口抓包工具
tcpdump [选项] [端口号]
选项:
-i : interface指定Tcpdump需要监听的端口
-n : 对地址以数字的方式显示,否则显示为主机名
-nn : 除了——n的作用外,还会把端口显示为数值,否则显示端口为服务名
-X :输出包的头部数据,会以16进制和ASCII码两种方式同时输出
-vv : 产生更详细的输出
0x081 Openssl
1. 检查是否安装了Openssl
rpm -q openssl
2. 查看vsftpd 是否支持openssl
ldd /usr/sbin/vsftpd | grep libssl
3. 生产加密信息的密钥和证书文件
默认位置在 : /etc/ssl/certs/
生成步骤:
openssl genrsa -out vsftpd.key 1024
#建立服务器私钥openssl req -new -key vsftpd.key -out vsftpd.csr
#通过密钥生成对应的证书文件需要依次输入国家,地区,组织,组织单位,邮箱等信息。最重要的是有一个common name,可以写你的名字或者域名。如果为了https申请,这个必须和域名吻合,否则游览器会报错。生成的csr文件交给CA签名后形成服务端自己的证书
openssl x509 -req -days 365 -sha256 -in vsftpd.csr -sinkey vsftpd.key -out vsftpd.csr
#使用CA服务器签发证书,设置证书的有效期等信息
注意1: 生成完密钥和证书之后,将本目录/etc/ssl/certs/
的权限修改为500.
注意2:在实验环境中可以用命令生成测试,在生产环境中必须要在https证书厂商主从(否则游览器不识别)
4. 修改vsftp主配置文件
# vi /etc/vsftpd/vsftpd.conf
ssl_enable=YES #启动认证
ssl_tlsv1=YES
ssl_tlsv2=YES
ssl_tlsv3=YES
#开启tlsv1,2,3
allow_anon_ssl=YES
#允许匿名用户和虚拟用户
force_anon_logins_ssl=YES
force_anon_data_ssl=YES
#匿名登陆和传输时强制使用SSL加密
force_local_logins_ssl=YES
force_local_data_ssl=YES
#本地用户登录和传输时强制使用SSL加密
rsa_cert_file=/etc/ssl/certs/vsftpd.crt
#指定rsa证书位置
rsa_private_key=/etc/ssl/certs/vsftpd.key
#指定rsa密钥位置