18 KiB
21 - Pentesting FTP
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 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? Verifique os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe seus truques de hacking enviando PRs para o repositório hacktricks e repositório hacktricks-cloud.
Encontre vulnerabilidades que são mais importantes para que você possa corrigi-las mais rapidamente. O Intruder rastreia sua superfície de ataque, executa varreduras proativas de ameaças, encontra problemas em toda a sua pilha de tecnologia, desde APIs até aplicativos da web e sistemas em nuvem. Experimente gratuitamente hoje.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
Informações Básicas
O Protocolo de Transferência de Arquivos (FTP) é um protocolo de rede padrão 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
, 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 a partir da sua porta N para a porta de comando do servidor FTP - porta 21. O cliente então escuta na porta N+1 e envia a porta N+1 para o servidor FTP. O servidor FTP então inicia a conexão de dados, da sua porta M para a porta N+1 do cliente FTP.
No entanto, se o cliente FTP tiver um firewall configurado que controle as conexões de dados recebidas 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 da 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 dos seus números de porta M. E o cliente inicia a conexão de dados da sua porta P para a porta M do servidor FTP.
Fonte: https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/
Depuração da 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
O protocolo FTP (File Transfer Protocol) é amplamente utilizado para transferir arquivos entre um cliente e um servidor. No entanto, o FTP não é um protocolo seguro, pois as informações são transmitidas em texto simples, o que pode permitir que um invasor intercepte e leia os dados confidenciais.
Para aumentar a segurança da conexão FTP, é possível usar o comando AUTH TLS
ou AUTH SSL
para estabelecer uma conexão segura. No entanto, uma abordagem mais moderna é usar o comando STARTTLS
, que permite que a conexão seja atualizada para uma conexão segura após a negociação inicial.
Aqui está um exemplo de como conectar ao FTP usando STARTTLS
:
-
Abra um terminal e digite o seguinte comando:
ftp
-
Conecte-se ao servidor FTP digitando o seguinte comando:
open <endereço_do_servidor_ftp>
-
Faça o login com suas credenciais de usuário e senha.
-
Após fazer o login, digite o seguinte comando para iniciar a negociação
STARTTLS
:quote AUTH TLS
ou
quote AUTH SSL
-
Se a negociação for bem-sucedida, a conexão será atualizada para uma conexão segura.
A partir desse ponto, todas as informações transmitidas entre o cliente e o servidor FTP serão criptografadas, garantindo a confidencialidade dos dados.
É importante ressaltar que nem todos os servidores FTP suportam o comando STARTTLS
. Portanto, verifique se o servidor que você está tentando acessar oferece suporte a essa funcionalidade antes de tentar estabelecer uma conexão segura.
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 lista completa com as credenciais padrão do ftp: https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ftp-betterdefaultpasslist.txt
Automatizado
Os testes de login anônimo e bounce FTP são realizados 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 de URL dupla %0d%0a
(na codificação de URL dupla, 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 suportadosPORT 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 hexadecimal).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 atualLIST -R
Listar recursivamente (se permitido pelo servidor)APPE /caminho/alguma_coisa.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/alguma_coisa.txt
Semelhante aoAPPE
, mas ele substituirá os arquivosSTOU /caminho/alguma_coisa.txt
Semelhante aoAPPE
, mas se o arquivo 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ãoREST 6
Isso indicará ao servidor que na próxima vez que ele enviar algo usandoRETR
, ele deve começar no 6º byte.TYPE i
Define a transferência para binárioPASV
Isso abrirá uma conexão passiva e indicará ao usuário onde ele pode se conectarPUT /tmp/arquivo.txt
Fazer upload do arquivo indicado para o FTP
Ataque FTPBounce
Alguns servidores FTP permitem o comando PORT. Esse comando pode ser usado para indicar ao servidor que você deseja se conectar a outro servidor FTP em alguma porta. Em seguida, 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 com que um servidor FTP interaja 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 faça o download de um arquivo para um servidor FTP diferente.
A teoria é simples:
- Faça upload da solicitação (dentro de um arquivo de texto) para o servidor vulnerável. Lembre-se de que, se você quiser conversar com outro servidor HTTP ou FTP, precisará alterar as linhas com
0x0d 0x0a
- 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 adicionar algum cabeçalho de imagem no início) - Use
PORT
para se conectar ao servidor e serviço arbitrários - 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 (1).txt" %} posts.txt {% endfile %}
- Tente preencher a solicitação com dados "lixo" relativos ao protocolo (ao falar 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 está um exemplo antigo de como abusar disso para fazer um servidor FTP fazer o download de um arquivo de um servidor FTP diferente.
Vulnerabilidade do Filezilla Server
O FileZilla geralmente 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 ele 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
- Altera a propriedade dos arquivos enviados anonimamente.chown_username=username
- Usuário que recebe a propriedade dos arquivos enviados anonimamente.local_enable=YES
- Permite que usuários locais façam login.no_anon_password=YES
- Não solicita senha para usuários anônimos.write_enable=YES
- Permite os comandos: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE e SITE.
Shodan
ftp
port:21
Encontre vulnerabilidades que são mais importantes para que você possa corrigi-las mais rapidamente. O Intruder rastreia sua superfície de ataque, realiza varreduras proativas de ameaças, encontra problemas em toda a sua pilha de tecnologia, desde APIs até aplicativos da web e sistemas em nuvem. Experimente gratuitamente hoje.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
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 🎥
- 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? Verifique os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe seus truques de hacking enviando PRs para o repositório hacktricks e repositório hacktricks-cloud.