前言
ftp 是一种用于在客户端和服务器之间传输文件的协议
环境搭建
这里使用 vsftpd 来搭建环境,ftp server 还有许多种,如 pure-ftpd
version: '3.8'
services:
ftp:
image: fauria/vsftpd
container_name: ftp-lab
restart: unless-stopped
ports:
- "21:21"
- "21100-21110:21100-21110"
environment:
FTP_USER: demo
FTP_PASS: demo123
PASV_ADDRESS: 127.0.0.1 # 服务器上修改成宿主机实际ip
PASV_MIN_PORT: 21100
PASV_MAX_PORT: 21110
volumes:
- ./data:/home/vsftpd
ftp 用户帐密 demo:demo123,挂载目录到 /home/vsftpd 作为数据目录
控制端口 21,被动模式数据端口 21100-21110
宿主机目录结构如下:
ftp-lab
├── data
│ └── demo
│ └── upload
│ └── hello.txt
└── docker-compose.yml
写一个文件到 ftp 目录中
echo "hello ftp" > data/demo/upload/hello.txt
连接
GUI 工具有很多,比如 FileZilla、WinSCP
这里使用命令行直接连接
❯ ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 3.0.2)
Name (127.0.0.1): demo
331 Please specify the password.
Password:
230 Login successful.
ftp>
主动模式 vs 被动模式
参考: https://www.cnblogs.com/longan-wang/p/15660490.html
主动模式:

- 客户端以随机非特权端口 N,就是大于 1024 的端口,对 server 端21端口发起连接
- 客户端开始监听 N+1 端口;
- 服务端会主动以 20 端口连接到客户端的 N+1 端口。
此时需要客户端具有公网地址,如果客户端客户端处于内网(NAT网关之后),或者被防火墙拦截,那么服务器对客户端端口发起的连接会失败
被动模式:

- 客户端以随机非特权端口连接服务端的 21 端口
- 服务端开启一个非特权端口为被动端口,并返回给客户端
- 客户端以 非特权端口+1 的端口主动连接服务端的被动端口
切换为被动模式,此时连接的被动端口就是上面配置的 21100-21110 其中的一个了:
ftp> dir
500 Illegal PORT command.
500 Unknown command.
425 Use PORT or PASV first.
ftp> passive
Passive mode on.
ftp> dir
227 Entering Passive Mode (127,0,0,1,82,118).
150 Here comes the directory listing.
drwxr-xr-x 3 ftp ftp 96 May 05 04:51 upload
226 Directory send OK.
常用命令
| 命令 | 作用 | 示例 |
|---|---|---|
open |
连接 FTP 服务器 | open 127.0.0.1 |
user |
登录用户名 | user demo |
ls |
简单列出远程目录内容 | ls |
dir |
详细列出远程目录内容 | dir |
pwd |
显示当前远程目录 | pwd |
cd |
切换远程目录 | cd upload |
cdup 或 cd .. |
返回上一级远程目录 | cd .. |
lcd |
显示或切换本地目录 | lcd /tmp |
!ls / !dir |
查看本地目录内容 | !ls |
get |
下载单个文件 | get hello.txt |
mget |
批量下载文件 | mget *.txt |
put |
上传单个文件 | put test.txt |
mput |
批量上传文件 | mput *.txt |
delete |
删除远程文件 | delete hello.txt |
mdelete |
批量删除远程文件 | mdelete *.txt |
mkdir |
创建远程目录 | mkdir newdir |
rmdir |
删除远程目录 | rmdir olddir |
rename |
重命名远程文件 | rename old.txt new.txt |
ascii |
切换为文本传输模式 | ascii |
binary |
切换为二进制传输模式 | binary |
passive |
切换主动/被动模式 | passive |
status |
查看当前 FTP 状态 | status |
help 或 ? |
查看帮助 | help get |
syst |
查看服务器系统类型 | syst |
close |
关闭当前连接 | close |
bye / quit / exit |
退出 FTP | bye |
匿名登录
需要修改 /etc/vsftpd/vsftpd.conf 中 anonymous_enable 的配置
# Run in the foreground to keep the container running:
background=NO
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=YES
# Uncomment this to allow local users to log in.
local_enable=YES
## Enable virtual users
guest_enable=YES
## Virtual users will use the same permissions as anonymous
virtual_use_local_privs=YES
# Uncomment this to enable any form of FTP write command.
write_enable=YES
## PAM file name
pam_service_name=vsftpd_virtual
## Home Directory for virtual users
user_sub_token=$USER
local_root=/home/vsftpd/$USER
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
chroot_local_user=YES
# Workaround chroot check.
# See https://www.benscobie.com/fixing-500-oops-vsftpd-refusing-to-run-with-writable-root-inside-chroot/
# and http://serverfault.com/questions/362619/why-is-the-chroot-local-user-of-vsftpd-insecure
allow_writeable_chroot=YES
## Hide ids from user
hide_ids=YES
## Enable logging
xferlog_enable=YES
xferlog_file=/var/log/vsftpd/vsftpd.log
## Enable active mode
port_enable=YES
connect_from_port_20=YES
ftp_data_port=20
## Disable seccomp filter sanboxing
seccomp_sandbox=NO
### Variables set at container runtime
pasv_address=127.0.0.1
pasv_max_port=21110
pasv_min_port=21100
pasv_addr_resolve=NO
pasv_enable=YES
file_open_mode=0666
local_umask=077
xferlog_std_format=NO
reverse_lookup_enable=YES
pasv_promiscuous=NO
port_promiscuous=NO
然后重启 ftp 服务即可匿名登录
service restart vsftpd # Centos6
systemctl restart vsftpd # Centos7
❯ ftp 127.0.0.1
Connected to 127.0.0.1.
220 (vsFTPd 3.0.2)
Name (127.0.0.1): anonymous
331 Please specify the password.
Password:
230 Login successful.
ftp> passive
Passive mode on.
ftp> dir
227 Entering Passive Mode (127,0,0,1,82,116).
150 Here comes the directory listing.
drwxr-xr-x 2 ftp ftp 4096 Jun 09 2021 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (127,0,0,1,82,113).
150 Here comes the directory listing.
226 Directory send OK.
匿名用户的默认访问目录是 /var/ftp/pub
vsftpd v2.3.4
一个后门,见 msf2 靶机渗透