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.
O **File Transfer Protocol (FTP)** serve como um protocolo padrão para transferência de arquivos em uma rede de computadores entre um servidor e um cliente.\
É um protocolo **em texto simples** que usa como **caractere de nova linha `0x0d 0x0a`** então às vezes você precisa **conectar usando `telnet`** ou **`nc -C`**.
No **FTP Ativo**, o **cliente** FTP primeiro **inicia** a **conexão** de controle de sua porta N para a porta de comando do servidor FTP – porta 21. O **cliente** então **escuta** a porta **N+1** e envia a porta N+1 para o servidor FTP. O **Servidor** FTP então **inicia** a **conexão** de dados, de **sua porta M para a porta N+1** do cliente FTP.
Mas, se o cliente FTP tiver um firewall configurado que controla as conexões de dados de entrada de fora, então o FTP ativo pode ser um problema. E, uma solução viável para isso é o FTP Passivo.
No **FTP Passivo**, o cliente inicia a conexão de controle de sua porta N para a porta 21 do servidor FTP. Após isso, o cliente emite um **comando passv**. O servidor então envia ao cliente um de seus números de porta M. E o **cliente****inicia** a **conexão** de dados de **sua porta P para a porta M** do servidor FTP.
Aqui você pode encontrar uma boa lista com credenciais padrão de 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)
Note que se uma **aplicação web** estiver enviando dados controlados por um usuário **diretamente para um servidor FTP**, você pode enviar bytes codificados em URL duplo `%0d%0a` (neste codificado em URL duplo é `%250d%250a`) e fazer o **servidor FTP realizar ações arbitrárias**. Uma dessas possíveis ações arbitrárias é baixar conteúdo de um servidor controlado por usuários, realizar varredura de portas ou tentar se comunicar com outros serviços baseados em texto simples (como http).
* \*\*`PORT 127,0,0,1,0,80`\*\*Isso indicará ao servidor FTP para estabelecer uma conexão com o IP 127.0.0.1 na porta 80 (_você precisa colocar o 5º caractere como "0" e o 6º como a porta em decimal ou usar o 5º e 6º para expressar a porta em hex_).
* \*\*`EPRT |2|127.0.0.1|80|`\*\*Isso indicará ao servidor FTP para estabelecer uma conexão TCP (_indicado por "2"_) com o IP 127.0.0.1 na porta 80. Este comando **suporta IPv6**.
* **`LIST -R`** Lista recursivamente (se permitido pelo servidor)
* **`APPE /path/something.txt`** Isso indicará ao FTP para armazenar os dados recebidos de uma **conexão passiva** ou de uma **conexão PORT/EPRT** em um arquivo. Se o nome do arquivo existir, os dados serão adicionados.
* **`STOR /path/something.txt`** Como `APPE`, mas irá sobrescrever os arquivos
* **`STOU /path/something.txt`** Como `APPE`, mas se existir, não fará nada.
* **`RETR /path/to/file`** Uma conexão passiva ou de porta deve ser estabelecida. Então, o servidor FTP enviará o arquivo indicado através dessa conexão
* **`REST 6`** Isso indicará ao servidor que na próxima vez que enviar algo usando `RETR` deve começar no 6º byte.
* **`TYPE i`** Define a transferência como binária
Alguns servidores FTP permitem o comando PORT. Este comando pode ser usado para indicar ao servidor que você deseja se conectar a outro servidor FTP em alguma porta. Então, você pode usar isso para escanear quais portas de um host estão abertas através de um servidor FTP.
Você também poderia abusar desse comportamento para fazer um servidor FTP interagir com outros protocolos. Você poderia **carregar um arquivo contendo uma solicitação HTTP** e fazer o servidor FTP vulnerável **enviá-la para um servidor HTTP arbitrário** (_talvez para adicionar um novo usuário admin?_) ou até mesmo carregar uma solicitação FTP e fazer o servidor FTP vulnerável baixar um arquivo de um servidor FTP diferente.\
1.**Carregue a solicitação (dentro de um arquivo de texto) para o servidor vulnerável.** Lembre-se de que se você quiser falar com outro servidor HTTP ou FTP, precisa mudar de linha com `0x0d 0x0a`
2.**Use `REST X` para evitar enviar os caracteres que você não quer enviar** (talvez para carregar a solicitação dentro do arquivo você precisou colocar algum cabeçalho de imagem no início)
É altamente provável que isso **gere um erro como**_**Socket not writable**_**porque a conexão não dura o suficiente para enviar os dados com `RETR`**. Sugestões para tentar evitar isso são:
* Tente **preencher a solicitação com dados "lixo" relativos ao protocolo** (falando com FTP, talvez apenas comandos lixo ou repetindo a instrução `RETR` para obter o arquivo)
De qualquer forma, aqui você tem um [exemplo antigo sobre como abusar disso para fazer um servidor FTP baixar um arquivo de um servidor FTP diferente.](ftp-bounce-download-2oftp-file.md)
**FileZilla** geralmente **vincula** a **local** um **serviço administrativo** para o **FileZilla-Server** (porta 14147). Se você puder criar um **túnel** da **sua máquina** para acessar esta porta, você pode **conectar-se** a **ela** usando uma **senha em branco** e **criar** um **novo usuário** para o serviço FTP.
Aprenda e pratique 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">\
Aprenda e pratique Hacking GCP: <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)
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.