hacktricks/network-services-pentesting/pentesting-ftp
2023-06-06 18:56:34 +00:00
..
ftp-bounce-attack.md Translated to Portuguese 2023-06-06 18:56:34 +00:00
ftp-bounce-download-2oftp-file.md Translated to Portuguese 2023-06-06 18:56:34 +00:00
README.md Translated to Portuguese 2023-06-06 18:56:34 +00:00

21 - Pentesting FTP

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

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/

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

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

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

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

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

Automatizado

Verificações de login anônimo e bounce FTP são realizadas por padrão pelo nmap com a opção -sC ou:

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:

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

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

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.

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.

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'
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥