Learn & practice AWS Hacking:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Learn & practice GCP Hacking: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* 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.
**Протокол передачі файлів (FTP)** слугує стандартним протоколом для передачі файлів через комп'ютерну мережу між сервером і клієнтом.\
Це **протокол у відкритому тексті**, який використовує **символ нового рядка `0x0d 0x0a`**, тому іноді вам потрібно **підключитися за допомогою `telnet`**або**`nc -C`**.
В**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 сервера.
Тут ви можете знайти гарний список з типовими 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)
Зверніть увагу, що якщо **веб-додаток** надсилає дані, контрольовані користувачем, **безпосередньо на FTP-сервер**, ви можете надіслати подвоєне URL-кодування `%0d%0a` (в подвоєному URL-кодуванні це `%250d%250a`) байти і змусити **FTP-сервер виконувати довільні дії**. Однією з цих можливих довільних дій є завантаження вмісту з сервера, контрольованого користувачем, виконання сканування портів або спроба зв'язатися з іншими сервісами на основі простого тексту (наприклад, http).
* \*\*`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`** Це відкриє пасивне з'єднання і вкаже користувачу, куди він може підключитися
Деякі FTP-сервери дозволяють команду PORT. Цю команду можна використовувати, щоб вказати серверу, що ви хочете підключитися до іншого FTP-сервера на певному порту. Тоді ви можете використовувати це для сканування, які порти хоста відкриті через FTP-сервер.
Ви також можете зловживати цією поведінкою, щоб змусити FTP-сервер взаємодіяти з іншими протоколами. Ви могли б**завантажити файл, що містить HTTP-запит**і змусити вразливий FTP-сервер **надіслати його на довільний HTTP-сервер** (_можливо, щоб додати нового адміністратора?_) або навіть завантажити FTP-запит і змусити вразливий FTP-сервер завантажити файл з іншого FTP-сервера.\
1.**Завантажте запит (всередині текстового файлу) на вразливий сервер.** Пам'ятайте, що якщо ви хочете спілкуватися з іншим HTTP або FTP-сервером, вам потрібно змінити рядки на `0x0d 0x0a`
2.**Використовуйте `REST X`, щоб уникнути надсилання символів, які ви не хочете надсилати** (можливо, щоб завантажити запит всередині файлу, вам потрібно було вставити заголовок зображення на початку)
Імовірно, це **викличе помилку, як**_**Socket not writable**_**тому що з'єднання не триває достатньо довго, щоб надіслати дані за допомогою `RETR`**. Пропозиції, щоб спробувати уникнути цього:
* Спробуйте **заповнити запит "сміттєвими" даними, що стосуються протоколу** (говорячи про FTP, можливо, просто сміттєві команди або повторюючи інструкцію `RETR`, щоб отримати файл)
* Просто **заповніть запит великою кількістю нульових символів або інших** (розділених на рядки або ні)
У будь-якому випадку, ось вам [старий приклад про те, як зловживати цим, щоб змусити FTP-сервер завантажити файл з іншого FTP-сервера.](ftp-bounce-download-2oftp-file.md)
**FileZilla** зазвичай **прив'язується** до **локального****адміністративного сервісу** для **FileZilla-Server** (порт 14147). Якщо ви можете створити **тунель** з **вашого комп'ютера** для доступу до цього порту, ви можете **підключитися** до **нього** за допомогою **порожнього пароля**і**створити****нового користувача** для FTP-сервісу.
Вивчайте та практикуйте AWS Hacking:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Вивчайте та практикуйте GCP Hacking: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)