mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 22:52:06 +00:00
302 lines
19 KiB
Markdown
302 lines
19 KiB
Markdown
# 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 %}
|