21 - Тестирование FTP
Основная информация
Протокол передачи файлов (FTP) — это стандартный протокол для передачи файлов по компьютерной сети между сервером и клиентом. Этот протокол использует текстовые данные, передавая их в виде строки, заканчивающейся символами новой строки 0x0d 0x0a. В некоторых случаях для подключения необходимо использовать команды telnet или nc -C.
Порт по умолчанию: 21
Пример вывода:
PORT   STATE  SERVICE
21/tcp open   ftp
Активное и пассивное соединение
В активном режиме FTP клиент сначала инициирует управляющее соединение с порта N на командный порт сервера — порт 21. Затем клиент начинает слушать на порту N+1 и передает его номер серверу. После этого FTP-сервер устанавливает соединение для передачи данных со своего порта M на порт N+1 клиента.
Однако, если у клиента настроен файрвол, который блокирует входящие соединения извне, активный режим FTP может вызвать проблемы. В такой ситуации можно использовать пассивный режим FTP.
В пассивном режиме FTP клиент устанавливает управляющее соединение с порта N на порт 21 сервера. После этого клиент отправляет команду PASV, и сервер сообщает клиенту номер своего порта M. Затем клиент инициирует передачу данных, подключаясь со своего порта P к порту M сервера.
Отладка соединения
Команды FTP debug и trace можно использовать для отслеживания процесса общения между клиентом и сервером.
Перечисление
Получение баннеров
Вы можете использовать следующие команды для получения информации о сервере:
nc -vn <IP> 21
openssl s_client -connect crossfit.htb:21 -starttls ftp # Получить сертификат, если есть
Подключение к FTP с использованием STARTTLS
lftp
lftp :~> set ftp:ssl-force true
lftp :~> set ssl:verify-certificate no
lftp :~> connect 10.10.10.208
lftp 10.10.10.208:~> login
Usage: login <user|URL> [<pass>]
lftp 10.10.10.208:~> login username Password
Анонимное перечисление
С помощью nmap:
sudo nmap -sV -p21 -sC -A 10.10.10.10
Вы можете использовать команды HELP и FEAT, чтобы получить информацию о сервере FTP:
HELP
214-The following commands are recognized (* =>'s unimplemented):
214-CWD     XCWD    CDUP    XCUP    SMNT*   QUIT    PORT    PASV    
214-EPRT    EPSV    ALLO*   RNFR    RNTO    DELE    MDTM    RMD     
214-XRMD    MKD     XMKD    PWD     XPWD    SIZE    SYST    HELP    
214-NOOP    FEAT    OPTS    AUTH    CCC*    CONF*   ENC*    MIC*    
214-PBSZ    PROT    TYPE    STRU    MODE    RETR    STOR    STOU    
214-APPE    REST    ABOR    USER    PASS    ACCT*   REIN*   LIST    
214-NLST    STAT    SITE    MLSD    MLST    
214 Direct comments to root@drei.work
FEAT
211-Features:
 PROT
 CCC
 PBSZ
 AUTH TLS
 MFF modify;UNIX.group;UNIX.mode;
 REST STREAM
 MLST modify*;perm*;size*;type*;unique*;UNIX.group*;UNIX.mode*;UNIX.owner*;
 UTF8
 EPRT
 EPSV
 LANG en-US
 MDTM
 SSCN
 TVFS
 MFMT
 SIZE
211 End
STAT
# Информация о сервере FTP (версия, конфигурации, статус...)
Анонимный вход
ftp <IP>
> anonymous
> anonymous
> ls -a # Просмотреть все файлы (даже скрытые)
> binary # Установить передачу в бинарном формате вместо ASCII
> ascii # Установить передачу в формате ASCII вместо бинарного
> bye # выйти
Брутфорс
Здесь вы можете найти список стандартных учетных данных FTP: Список паролей
Автоматизация
Анонимный вход и проверки FTP через bounce выполняются по умолчанию с помощью nmap с опцией -sC или:
nmap --script ftp-* -p 21 <ip>
Подключение через браузер
Вы можете подключиться к FTP-серверу с помощью браузера (например, Firefox) используя URL вида:
ftp://anonymous:anonymous@10.10.10.98
Обратите внимание, что если веб-приложение отправляет данные, контролируемые пользователем, напрямую на FTP-сервер, можно использовать двойное кодирование URL, например %0d%0a (в двойном кодировании это %250d%250a), чтобы заставить FTP-сервер выполнять произвольные действия. Одно из таких возможных действий — загрузка контента с сервера, контролируемого пользователем, выполнение сканирования портов или попытка взаимодействия с другими текстовыми сервисами (такими как HTTP).
Загрузка всех файлов с FTP
wget -m ftp://anonymous:anonymous@10.10.10.98 # Загрузить все файлы
wget -m --no-passive ftp://anonymous:anonymous@10.10.10.98 # Загрузить все файлы без пассивного режима
Если ваши логин и пароль содержат специальные символы, можно использовать следующую команду:
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
Команды FTP
- 
USER username
Устанавливает имя пользователя для подключения. - 
PASS password
Устанавливает пароль для подключения. - 
HELP
Сервер указывает, какие команды поддерживаются. - 
PORT 127,0,0,1,0,80
Указывает серверу FTP установить соединение с IP127.0.0.1на порт80(необходимо указать 5-й и 6-й байты в десятичной системе или использовать их для представления порта в шестнадцатеричной системе). - 
EPRT |2|127.0.0.1|80|
Указывает серверу FTP установить TCP-соединение (обозначенное как2) с IP127.0.0.1на порт80. Эта команда поддерживает IPv6. - 
LIST
Отправляет список файлов в текущей папке. - 
LIST -R
Список файлов рекурсивно (если это разрешено сервером). - 
APPE /path/something.txt
Указывает серверу FTP сохранять данные, полученные через пассивное соединение или соединение PORT/EPRT, в файл. Если файл уже существует, данные будут добавлены. - 
STOR /path/something.txt
АналогичноAPPE, но заменяет содержимое файла. - 
STOU /path/something.txt
АналогичноAPPE, но если файл существует, ничего не происходит. - 
RETR /path/to/file
Необходимо установить пассивное или порт-соединение. Затем сервер FTP отправит указанный файл через это соединение. - 
REST 6
Указывает серверу, что при следующей передаче с помощьюRETRследует начать с 6-го байта. - 
TYPE i
Устанавливает режим передачи в бинарный. - 
PASV
Открывает пассивное соединение и указывает пользователю, к какому порту можно подключиться. - 
PUT /tmp/file.txt
Загружает указанный файл на FTP-сервер. 
Атака FTP Bounce
Некоторые FTP-серверы разрешают использование команды PORT. Эта команда позволяет указать серверу, что вы хотите подключиться к другому FTP-серверу на указанном порту. Это можно использовать для сканирования открытых портов на хосте через FTP-сервер.
Также можно злоупотребить этим поведением, чтобы заставить FTP-сервер взаимодействовать с другими протоколами. Вы можете загрузить файл, содержащий HTTP-запрос, и заставить уязвимый FTP-сервер отправить его на произвольный HTTP-сервер (возможно, для добавления нового администратора?) или даже загрузить FTP-запрос и заставить уязвимый FTP-сервер скачать файл с другого FTP-сервера.
Теория проста:
- Загрузите запрос (в текстовом файле) на уязвимый сервер. Помните, что если вы хотите общаться с другим HTTP или FTP сервером, вам нужно использовать символы новой строки 
0x0d 0x0a. - Используйте команду 
REST X, чтобы избежать отправки нежелательных символов (возможно, для загрузки запроса в файл вам нужно было добавить заголовок изображения в начале). - Используйте команду 
PORT, чтобы подключиться к произвольному серверу и сервису. - Используйте команду 
RETR, чтобы отправить сохранённый запрос на сервер. 
Уязвимость FileZilla Server
FileZilla обычно связывается с локальным административным сервисом для FileZilla-Server (порт 14147). Если вы можете создать туннель с вашего компьютера для доступа к этому порту, вы можете подключиться к нему, используя пустой пароль, и создать нового пользователя для FTP-сервиса.
Конфигурационные файлы
Конфигурационные файлы, которые могут быть полезны:
ftpusersftp.confproftpd.confvsftpd.conf
Пост-эксплуатация
По умолчанию конфигурация vsFTPd может находиться в файле /etc/vsftpd.conf. В этом файле можно найти некоторые опасные настройки:
- 
anonymous_enable=YES
Разрешает анонимный доступ. - 
anon_upload_enable=YES
Разрешает анонимную загрузку файлов. - 
anon_mkdir_write_enable=YES
Разрешает анонимное создание каталогов. - 
anon_root=/home/username/ftp
Каталог для анонимных пользователей. - 
chown_uploads=YES
Изменяет владельца анонимно загруженных файлов. - 
chown_username=username
Пользователь, который получает права собственности на анонимно загруженные файлы. - 
local_enable=YES
Разрешает вход локальным пользователям. - 
no_anon_password=YES
Не требует пароль от анонимных пользователей. - 
write_enable=YES
Разрешает команды:STOR,DELE,RNFR,RNTO,MKD,RMD,APPE, иSITE. 
Shodan
Для поиска уязвимых FTP-серверов можно использовать Shodan с параметрами:
ftp
port:21