目录

  1. 1. 前言
  2. 2. 环境搭建
  3. 3. 连接
  4. 4. 主动模式 vs 被动模式
  5. 5. 常用命令
  6. 6. 匿名登录
  7. 7. vsftpd v2.3.4

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

FTP

2025/11/24 DevOps
  |     |   总文章阅读量:

前言

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

主动模式:

  1. 客户端以随机非特权端口 N,就是大于 1024 的端口,对 server 端21端口发起连接
  2. 客户端开始监听 N+1 端口;
  3. 服务端会主动以 20 端口连接到客户端的 N+1 端口。

此时需要客户端具有公网地址,如果客户端客户端处于内网(NAT网关之后),或者被防火墙拦截,那么服务器对客户端端口发起的连接会失败

被动模式:

  1. 客户端以随机非特权端口连接服务端的 21 端口
  2. 服务端开启一个非特权端口为被动端口,并返回给客户端
  3. 客户端以 非特权端口+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
cdupcd .. 返回上一级远程目录 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 靶机渗透