hacktricks/network-services-pentesting/pentesting-ftp/README.md

285 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 %}
## 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.
Fonte: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
### Depuração de Conexão
Os comandos **FTP** **`debug`** e **`trace`** podem ser usados para ver **como está ocorrendo a comunicação**.
## Enumeração
### Captura de Banner
```bash
nc -vn <IP> 21
openssl s_client -connect crossfit.htb:21 -starttls ftp #Get certificate if any
```
### Conectar ao FTP usando 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
Com **nmap**
```bash
sudo nmap -sV -p21 -sC -A 10.10.10.10
```
Você pode usar os comandos `HELP` e `FEAT` para obter algumas informações do servidor 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...)
```
### Login anônimo
_anonymous : anônimo_\
_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
```
### [Força bruta](../../generic-methodologies-and-resources/brute-force.md#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)
### Automatizado
Login anônimo e 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:
```bash
ftp://anonymous:anonymous@10.10.10.98
```
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 codificação 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).
## Baixar todos os arquivos do 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
```
Se seu usuário/senha tiver caracteres especiais, o [seguinte comando](https://stackoverflow.com/a/113900/13647948) pode ser usado:
```bash
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
```
## Alguns comandos FTP
* **`USER username`**
* **`PASS password`**
* **`HELP`** O servidor indica quais comandos são suportados
* \*\*`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`** Isso enviará a lista de arquivos na pasta atual
* **`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
* **`PASV`** Isso abrirá uma conexão passiva e indicará ao usuário onde ele pode se conectar
* **`PUT /tmp/file.txt`** Carrega o arquivo indicado para o FTP
![](<../../.gitbook/assets/image (386).png>)
## Ataque FTPBounce
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 **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.\
A teoria é fácil:
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 as linhas 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)
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
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" %}
Aprenda e pratique Hacking AWS:<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">\
Aprenda e pratique Hacking GCP: <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>Supporte o HackTricks</summary>
* 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.
</details>
{% endhint %}