mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
259 lines
16 KiB
Markdown
259 lines
16 KiB
Markdown
# 21 - Pentesting FTP
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## Basic Information
|
||
|
||
**Протокол передачі файлів (FTP)** слугує стандартним протоколом для передачі файлів через комп'ютерну мережу між сервером і клієнтом.\
|
||
Це **протокол у відкритому тексті**, який використовує **символ нового рядка `0x0d 0x0a`**, тому іноді вам потрібно **підключитися за допомогою `telnet`** або **`nc -C`**.
|
||
|
||
**Порт за замовчуванням:** 21
|
||
```
|
||
PORT STATE SERVICE
|
||
21/tcp open ftp
|
||
```
|
||
### Connections Active & Passive
|
||
|
||
В **Active FTP** FTP **клієнт** спочатку **ініціює** контрольне **з'єднання** з порту N до командного порту FTP сервера – порту 21. Потім **клієнт** **прослуховує** порт **N+1** і надсилає порт N+1 до FTP сервера. FTP **сервер** потім **ініціює** з'єднання для передачі даних, з **його порту M до порту N+1** FTP клієнта.
|
||
|
||
Але, якщо у FTP клієнта налаштований брандмауер, який контролює вхідні з'єднання для передачі даних ззовні, тоді активний FTP може бути проблемою. І, доцільним рішенням для цього є Passive FTP.
|
||
|
||
В **Passive FTP** клієнт ініціює контрольне з'єднання з його порту N до порту 21 FTP сервера. Після цього клієнт видає **команду passv**. Сервер потім надсилає клієнту один з його номерів порту M. І **клієнт** **ініціює** з'єднання для передачі даних з **його порту P до порту M** FTP сервера.
|
||
|
||
Source: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
|
||
|
||
### Connection debugging
|
||
|
||
Команди **FTP** **`debug`** та **`trace`** можуть бути використані для того, щоб побачити **як відбувається комунікація**.
|
||
|
||
## Enumeration
|
||
|
||
### Banner Grabbing
|
||
```bash
|
||
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**
|
||
```bash
|
||
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_
|
||
```bash
|
||
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](../../generic-hacking/brute-force.md#ftp)
|
||
|
||
Тут ви можете знайти гарний список з типовими ftp обліковими даними: [https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt)
|
||
|
||
### Automated
|
||
|
||
Anon login та bounce FTP перевірки виконуються за замовчуванням nmap з опцією **-sC** або:
|
||
```bash
|
||
nmap --script ftp-* -p 21 <ip>
|
||
```
|
||
## Browser connection
|
||
|
||
Ви можете підключитися до FTP-сервера, використовуючи браузер (наприклад, Firefox), за допомогою URL, як-от:
|
||
```bash
|
||
ftp://anonymous:anonymous@10.10.10.98
|
||
```
|
||
Зверніть увагу, що якщо **веб-додаток** надсилає дані, контрольовані користувачем, **безпосередньо на FTP-сервер**, ви можете надіслати подвоєне URL-кодування `%0d%0a` (в подвоєному URL-кодуванні це `%250d%250a`) байти і змусити **FTP-сервер виконувати довільні дії**. Однією з цих можливих довільних дій є завантаження вмісту з сервера, контрольованого користувачем, виконання сканування портів або спроба зв'язатися з іншими сервісами на основі простого тексту (наприклад, http).
|
||
|
||
## Завантажити всі файли з FTP
|
||
```bash
|
||
wget -m ftp://anonymous:anonymous@10.10.10.98 #Donwload all
|
||
wget -m --no-passive ftp://anonymous:anonymous@10.10.10.98 #Download all
|
||
```
|
||
Якщо ваш логін/пароль містить спеціальні символи, можна використовувати [наступну команду](https://stackoverflow.com/a/113900/13647948):
|
||
```bash
|
||
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
|
||
|
||
.png>)
|
||
|
||
## Атака FTPBounce
|
||
|
||
Деякі FTP сервери дозволяють команду PORT. Цю команду можна використовувати, щоб вказати серверу, що ви хочете підключитися до іншого FTP сервера на певному порту. Тоді ви можете використовувати це для сканування, які порти хоста відкриті через FTP сервер.
|
||
|
||
[**Дізнайтеся тут, як зловживати FTP сервером для сканування портів.**](ftp-bounce-attack.md)
|
||
|
||
Ви також можете зловживати цією поведінкою, щоб змусити 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.5MB** принаймні. Ось так:
|
||
|
||
{{#file}}
|
||
posts.txt
|
||
{{#endfile}}
|
||
|
||
- Спробуйте **заповнити запит "сміттєвими" даними, що стосуються протоколу** (говорячи про FTP, можливо, просто сміттєві команди або повторюючи інструкцію `RETR`, щоб отримати файл)
|
||
- Просто **заповніть запит великою кількістю нульових символів або інших** (розділених на рядки або ні)
|
||
|
||
У будь-якому випадку, ось вам [старий приклад про те, як зловживати цим, щоб змусити FTP сервер завантажити файл з іншого FTP сервера.](ftp-bounce-download-2oftp-file.md)
|
||
|
||
## Уразливість сервера 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`
|
||
|
||
## 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.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'
|
||
```
|
||
{{#include ../../banners/hacktricks-training.md}}
|