hacktricks/network-services-pentesting/pentesting-ftp
2024-03-29 19:49:46 +01:00
..
ftp-bounce-attack.md Translated to Ukranian 2024-03-29 19:49:46 +01:00
ftp-bounce-download-2oftp-file.md Translated to Ukranian 2024-03-29 19:49:46 +01:00
README.md Translated to Ukranian 2024-03-29 19:49:46 +01:00

21 - Тестування на проникнення FTP

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Try Hard Security Group

{% embed url="https://discord.gg/tryhardsecurity" %}


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

Протокол передачі файлів (FTP) служить стандартним протоколом для передачі файлів по комп'ютерній мережі між сервером та клієнтом.
Це текстовий протокол, який використовує як символ нового рядка 0x0d 0x0a, тому іноді вам потрібно підключатися за допомогою telnet або nc -C.

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

PORT   STATE SERVICE
21/tcp open  ftp

Активне та Пасивне Підключення

У Активному FTP FTP клієнт спочатку ініціює контрольне підключення зі свого порту N до порту команд FTP-сервера - порту 21. Після цього клієнт слухає порт N+1 та відправляє порт N+1 на FTP-сервер. FTP сервер потім ініціює підключення даних зі свого порту M до порту N+1 FTP-клієнта.

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

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

Джерело: https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/

Налагодження Підключення

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

Перелік

Захоплення Банера

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

Неавтентифікована перевірка

За допомогою 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 обліковими даними: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt

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

Перевірка FTP з можливістю анонімного входу та переадресації виконується за замовчуванням за допомогою nmap з опцією -sC або:

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

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

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

ftp://anonymous:anonymous@10.10.10.98

Зверніть увагу, що якщо веб-застосунок надсилає дані, котрі контролює користувач, прямо на FTP-сервер, ви можете надіслати подвійне кодування URL %0d%0a (у подвійному кодуванні URL це %250d%250a) байтів і змусити FTP-сервер виконувати довільні дії. Однією з можливих довільних дій є завантаження вмісту з сервера, котрим керує користувач, виконання сканування портів або спроба спілкування з іншими службами на основі простого тексту (наприклад, 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

Якщо ваш логін/пароль містить спеціальні символи, можна використати наступну команду:

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-й символ як "0" і 6-й як порт у десятковому або використовувати 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

Атака FTPBounce

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

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

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

  1. Завантажте запит (у текстовому файлі) на вразливий сервер. Пам'ятайте, що якщо ви хочете спілкуватися з іншим HTTP- або FTP-сервером, вам потрібно змінити рядки на 0x0d 0x0a
  2. Використовуйте REST X, щоб уникнути відправлення символів, які ви не хочете відправляти (можливо, для завантаження запиту всередині файлу вам потрібно було додати деякий заголовок зображення на початку)
  3. Використовуйте PORT, щоб підключитися до довільного сервера та служби
  4. Використовуйте RETR, щоб відправити збережений запит на сервер.

Дуже ймовірно, що це викине помилку Socket not writable через те, що з'єднання не триває достатньо довго, щоб відправити дані за допомогою RETR. Рекомендації для спроб уникнути цього:

  • Якщо ви відправляєте запит HTTP, повторюйте той самий запит один за одним до ~0.5 МБ як мінімум. Наприклад:

{% file src="../../.gitbook/assets/posts (1).txt" %} posts.txt {% endfile %}

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

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

Вразливість сервера Filezilla

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
  • port:21

Try Hard Security Group

{% embed url="https://discord.gg/tryhardsecurity" %}


Автоматичні команди HackTricks

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.xyz/pentesting/pentesting-ftp

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'
Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!