mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-20 18:14:15 +00:00
274 lines
15 KiB
Markdown
274 lines
15 KiB
Markdown
# 21 - Pentesting FTP
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
|
|
|
|
</details>
|
|
|
|
## Informações Básicas
|
|
|
|
O **Protocolo de Transferência de Arquivos (FTP)** é um protocolo padrão de rede usado para a transferência de arquivos de computador entre um cliente e um servidor em uma rede de computadores.\
|
|
É um protocolo de **texto simples** que usa como **caractere de nova linha `0x0d 0x0a`**, portanto, à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 a partir 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 controle as conexões de dados de entrada de fora, 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 a partir 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 **`debug`** e **`trace`** do **FTP** podem ser usados para ver **como está ocorrendo a comunicação**.
|
|
|
|
## Enumeração
|
|
|
|
### Banner Grabbing
|
|
```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
|
|
```
|
|
### Enumeração não autorizada
|
|
|
|
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
|
|
|
|
_anônimo: anônimo_\
|
|
_anônimo: _\
|
|
_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 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
|
|
|
|
Verificações de login anônimo e 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 do 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
|
|
```
|
|
Observe que se um **aplicativo da 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` (na codificação dupla de URL, isso é `%250d%250a`) e fazer com que o **servidor FTP execute ações arbitrárias**. Uma dessas possíveis ações arbitrárias é baixar conteúdo de um servidor controlado pelo usuário, realizar varreduras de porta 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
|
|
```
|
|
## Alguns comandos FTP
|
|
|
|
* **`USER nome_de_usuário`**
|
|
* **`PASS senha`**
|
|
* **`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 hexa_).
|
|
* **`EPRT |2|127.0.0.1|80|`** Isso indicará ao servidor FTP para estabelecer uma conexão TCP (_indicada 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`** Listar recursivamente (se permitido pelo servidor)
|
|
* **`APPE /caminho/algum_arquivo.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, ele anexará os dados.
|
|
* **`STOR /caminho/algum_arquivo.txt`** Como `APPE`, mas sobrescreverá os arquivos
|
|
* **`STOU /caminho/algum_arquivo.txt`** Como `APPE`, mas se existir, não fará nada.
|
|
* **`RETR /caminho/para/arquivo`** Deve ser estabelecida uma conexão passiva ou de porta. Em seguida, o servidor FTP enviará o arquivo indicado por essa conexão
|
|
* **`REST 6`** Isso indicará ao servidor que na próxima vez que ele enviar algo usando `RETR`, ele deve começar no 6º byte.
|
|
* **`TYPE i`** Definir transferência para binário
|
|
* **`PASV`** Isso abrirá uma conexão passiva e indicará ao usuário onde ele pode se conectar
|
|
* **`PUT /tmp/arquivo.txt`** Fazer upload do arquivo indicado para o FTP
|
|
|
|
![](<../../.gitbook/assets/image (227).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 verificar quais portas de um host estão abertas por meio de um servidor FTP.
|
|
|
|
[**Aprenda aqui como abusar de um servidor FTP para verificar portas.**](ftp-bounce-attack.md)
|
|
|
|
Você também pode abusar desse comportamento para fazer um servidor FTP interagir com outros protocolos. Você pode **fazer upload de um arquivo contendo uma solicitação HTTP** e fazer com que o servidor FTP vulnerável **a envie para um servidor HTTP arbitrário** (_talvez para adicionar um novo usuário administrador?_) ou até mesmo fazer upload de uma solicitação FTP e fazer com que o servidor FTP vulnerável baixe um arquivo para um servidor FTP diferente.\
|
|
A teoria é fácil:
|
|
|
|
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 alterar as linhas 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ê precise 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 **cause um erro como** _**Socket não gravável**_ **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,5 MB** pelo menos. Assim:
|
|
|
|
{% file src="../../.gitbook/assets/posts (1).txt" %}
|
|
posts.txt
|
|
{% endfile %}
|
|
|
|
* Tente **preencher a solicitação com dados "lixo" relativos ao protocolo** (falando com FTP, talvez apenas comandos de 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 está um [exemplo antigo de como abusar disso para fazer um servidor FTP baixar um arquivo de um servidor FTP diferente.](ftp-bounce-download-2oftp-file.md)
|
|
|
|
## Vulnerabilidade do Filezilla Server
|
|
|
|
O **FileZilla** geralmente **se vincula** a um **serviço administrativo local** 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 usuários anônimos.
|
|
* `chown_uploads=YES` - Alterar a propriedade dos 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 solicitar senha para usuários anônimos
|
|
* `write_enable=YES` - Permitir comandos: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE e SITE
|
|
|
|
### Shodan
|
|
|
|
* `ftp`
|
|
* `port:21`
|
|
|
|
## Comandos Automáticos do HackTricks
|
|
```
|
|
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'
|
|
```
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Compartilhe seus truques de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
|
|
|
|
</details>
|