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)**<img src="/.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.
Il **File Transfer Protocol (FTP)** funge da protocollo standard per il trasferimento di file attraverso una rete informatica tra un server e un client.\
È un protocollo **in chiaro** che utilizza come **carattere di nuova linea `0x0d 0x0a`** quindi a volte è necessario **connettersi usando `telnet`** o **`nc -C`**.
In **Active FTP**, il **client** FTP prima **inizia** la **connessione** di controllo dalla sua porta N alla porta di comando del server FTP – porta 21. Il **client** poi **ascolta** sulla porta **N+1** e invia la porta N+1 al server FTP. Il **server** FTP poi **inizia** la **connessione** dati, dalla **sua porta M alla porta N+1** del client FTP.
Ma, se il client FTP ha un firewall configurato che controlla le connessioni dati in entrata dall'esterno, allora l'Active FTP potrebbe essere un problema. E, una soluzione praticabile per questo è il Passive FTP.
Nel **Passive FTP**, il client inizia la connessione di controllo dalla sua porta N alla porta 21 del server FTP. Dopo questo, il client emette un **comando passv**. Il server poi invia al client uno dei suoi numeri di porta M. E il **client****inizia** la **connessione** dati dalla **sua porta P alla porta M** del server FTP.
Qui puoi trovare un'ottima lista con le credenziali ftp predefinite: [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)
Nota che se un **web application** sta inviando dati controllati da un utente **direttamente a un server FTP** puoi inviare una doppia codifica URL `%0d%0a` (in doppia codifica URL questo è `%250d%250a`) byte e far sì che il **server FTP esegua azioni arbitrarie**. Una di queste possibili azioni arbitrarie è scaricare contenuti da un server controllato dall'utente, eseguire la scansione delle porte o cercare di comunicare con altri servizi basati su testo semplice (come http).
* \*\*`PORT 127,0,0,1,0,80`\*\*Questo indicherà al server FTP di stabilire una connessione con l'IP 127.0.0.1 sulla porta 80 (_devi mettere il 5° carattere come "0" e il 6° come la porta in decimale o usare il 5° e 6° per esprimere la porta in esadecimale_).
* \*\*`EPRT |2|127.0.0.1|80|`\*\*Questo indicherà al server FTP di stabilire una connessione TCP (_indicata da "2"_) con l'IP 127.0.0.1 sulla porta 80. Questo comando **supporta IPv6**.
* **`LIST -R`** Elenca ricorsivamente (se consentito dal server)
* **`APPE /path/something.txt`** Questo indicherà al FTP di memorizzare i dati ricevuti da una **connessione passiva** o da una connessione **PORT/EPRT** in un file. Se il nome del file esiste, aggiungerà i dati.
* **`STOR /path/something.txt`** Come `APPE` ma sovrascriverà i file
* **`STOU /path/something.txt`** Come `APPE`, ma se esiste non farà nulla.
* **`RETR /path/to/file`** Deve essere stabilita una connessione passiva o una connessione port. Poi, il server FTP invierà il file indicato attraverso quella connessione
* **`REST 6`** Questo indicherà al server che la prossima volta che invia qualcosa usando `RETR` dovrebbe iniziare al 6° byte.
* **`TYPE i`** Imposta il trasferimento su binario
Alcuni server FTP consentono il comando PORT. Questo comando può essere utilizzato per indicare al server che si desidera connettersi a un altro server FTP su una certa porta. Poi, puoi usare questo per scansionare quali porte di un host sono aperte attraverso un server FTP.
Potresti anche abusare di questo comportamento per far interagire un server FTP con altri protocolli. Potresti **caricare un file contenente una richiesta HTTP** e far sì che il server FTP vulnerabile **la invii a un server HTTP arbitrario** (_magari per aggiungere un nuovo utente admin?_) o persino caricare una richiesta FTP e far sì che il server FTP vulnerabile scarichi un file da un altro server FTP.\
1.**Carica la richiesta (all'interno di un file di testo) sul server vulnerabile.** Ricorda che se vuoi parlare con un altro server HTTP o FTP devi cambiare le righe con `0x0d 0x0a`
2.**Usa `REST X` per evitare di inviare i caratteri che non vuoi inviare** (magari per caricare la richiesta all'interno del file dove dovevi mettere un'intestazione di immagine all'inizio)
3.**Usa `PORT` per connetterti al server e al servizio arbitrari**
È altamente probabile che questo **generi un errore come**_**Socket non scrivibile**_**perché la connessione non dura abbastanza per inviare i dati con `RETR`**. Suggerimenti per cercare di evitare ciò sono:
* Prova a **riempire la richiesta con dati "spazzatura" relativi al protocollo** (parlando con FTP magari solo comandi spazzatura o ripetendo l'istruzione `RETR` per ottenere il file)
* Basta **riempire la richiesta con molti caratteri nulli o altri** (divisi su righe o meno)
Comunque, qui hai un [vecchio esempio su come abusare di questo per far scaricare un file da un server FTP diverso.](ftp-bounce-download-2oftp-file.md)
**FileZilla** di solito **lega** a **locale** un **servizio amministrativo** per il **FileZilla-Server** (porta 14147). Se riesci a creare un **tunnel** dalla **tua macchina** per accedere a questa porta, puoi **connetterti** ad **essa** usando una **password vuota** e **creare** un **nuovo utente** per il servizio FTP.
Impara e pratica il hacking AWS:<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">\
Impara e pratica il hacking GCP: <imgsrc="/.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)
* Controlla i [**piani di abbonamento**](https://github.com/sponsors/carlospolop)!
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Condividi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos su github.