hacktricks/network-services-pentesting/pentesting-ftp/README.md

302 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 21 - Pentesting FTP
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
**Try Hard Security Group**
<figure><img src="../../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
{% embed url="https://discord.gg/tryhardsecurity" %}
***
## Основна інформація
**Протокол передачі файлів (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-methodologies-and-resources/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
Анонімний вхід та перевірки 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
![](<../../.gitbook/assets/image (386).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 src="../../.gitbook/assets/posts.txt" %}
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`
***
**Try Hard Security Group**
<figure><img src="../../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
{% 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'
```
{% hint style="success" %}
Вивчайте та практикуйте AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Вивчайте та практикуйте GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Підтримайте HackTricks</summary>
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на github.
</details>
{% endhint %}