Перейти к содержанию

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 установить соединение с IP 127.0.0.1 на порт 80 (необходимо указать 5-й и 6-й байты в десятичной системе или использовать их для представления порта в шестнадцатеричной системе).

  • EPRT |2|127.0.0.1|80|
    Указывает серверу FTP установить TCP-соединение (обозначенное как 2) с IP 127.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-сервера.

Теория проста:

  1. Загрузите запрос (в текстовом файле) на уязвимый сервер. Помните, что если вы хотите общаться с другим HTTP или FTP сервером, вам нужно использовать символы новой строки 0x0d 0x0a.
  2. Используйте команду REST X, чтобы избежать отправки нежелательных символов (возможно, для загрузки запроса в файл вам нужно было добавить заголовок изображения в начале).
  3. Используйте команду PORT, чтобы подключиться к произвольному серверу и сервису.
  4. Используйте команду 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