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)
<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 %}
## Informações Básicas
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`**.
**Porta Padrão:** 21
```
PORT STATE SERVICE
21/tcp open ftp
```
### Conexões Ativas e Passivas
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 ftp padrão: [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)
### Automatizado
O login anônimo e as verificações de bounce FTP são realizadas por padrão pelo nmap com a opção **-sC** ou:
```bash
nmap --script ftp-* -p 21 <ip>
```
## Conexão pelo navegador
Você pode se conectar a um servidor FTP usando um navegador (como o Firefox) usando uma URL como:
Note que se uma **aplicação web** estiver enviando dados controlados por um usuário **diretamente para um servidor FTP**, você pode enviar bytes de codificação dupla de URL `%0d%0a` (nesta codificação dupla de URL é `%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**.
* **`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.
* **`RETR /path/to/file`** Uma conexão passiva ou uma conexão de porta deve ser estabelecida. Então, o servidor FTP enviará o arquivo indicado através dessa conexão
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.
[**Aprenda aqui como abusar de um servidor FTP para escanear portas.**](ftp-bounce-attack.md)
Você também poderia abusar desse comportamento para fazer um servidor FTP interagir com outros protocolos. Você poderia **fazer upload de 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 fazer upload de uma solicitação FTP e fazer o servidor FTP vulnerável baixar um arquivo de um servidor FTP diferente.\
1.**Faça upload da 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 deseja enviar** (talvez para fazer upload da solicitação dentro do arquivo você precisou colocar algum cabeçalho de imagem no início)
3.**Use `PORT` para se conectar ao servidor e serviço arbitrários**
4.**Use `RETR` para enviar a solicitação salva para o servidor.**
É 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:
* Se você estiver enviando uma solicitação HTTP, **coloque a mesma solicitação uma após a outra** até **\~0.5MB** pelo menos. Assim:
{% file src="../../.gitbook/assets/posts.txt" %}
posts.txt
{% endfile %}
* 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)
* Apenas **preencha a solicitação com muitos caracteres nulos ou outros** (divididos em linhas ou não)
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)
## Vulnerabilidade do Servidor Filezilla
**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.
## Arquivos de configuração
```
ftpusers
ftp.conf
proftpd.conf
vsftpd.conf
```
### Pós-Exploração
A configuração padrão do vsFTPd pode ser encontrada em `/etc/vsftpd.conf`. Aqui, você pode encontrar algumas configurações perigosas:
*`anonymous_enable=YES`
*`anon_upload_enable=YES`
*`anon_mkdir_write_enable=YES`
*`anon_root=/home/username/ftp` - Diretório para anônimos.
*`chown_uploads=YES` - Mudar a propriedade de arquivos enviados anonimamente
*`chown_username=username` - Usuário que recebe a propriedade dos arquivos enviados anonimamente
*`local_enable=YES` - Permitir que usuários locais façam login
*`no_anon_password=YES` - Não pedir senha para anônimos
*`write_enable=YES` - Permitir comandos: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE, e SITE
### Shodan
*`ftp`
*`port:21`
## HackTricks Comandos Automáticos
```
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
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" %}
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.