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-сервиса.
Конфигурационные файлы
Конфигурационные файлы, которые могут быть полезны:
ftpusers
ftp.conf
proftpd.conf
vsftpd.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