21 - Pentesting FTP
Grupo de Segurança Try Hard
Informações Básicas
O Protocolo de Transferência de Arquivos (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 de texto simples que utiliza como caractere de nova linha 0x0d 0x0a
então às vezes você precisa conectar usando telnet
ou nc -C
.
Porta Padrão: 21
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.
No entanto, se o Cliente FTP tiver um firewall configurado que controle 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/
Depuração de Conexão
Os comandos debug
e trace
do FTP podem ser usados para ver como a comunicação está ocorrendo.
Enumeração
Captura de Banner
Conectar ao FTP usando starttls
Enumeração não autorizada
Com nmap
Você pode usar os comandos HELP
e FEAT
para obter algumas informações do servidor FTP:
Login anônimo
anônimo : anônimo anônimo : ftp : 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
Automatizado
Os testes de login Anon e bounce FTP são realizados por padrão pelo nmap com a opção -sC ou:
Conexão do navegador
Você pode se conectar a um servidor FTP usando um navegador (como o Firefox) usando uma URL como:
Note que se uma aplicação web estiver enviando dados controlados por um usuário diretamente para um servidor FTP, você pode enviar bytes de dupla codificação de URL %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
Se o seu usuário/senha tiver caracteres especiais, o comando seguinte pode ser usado:
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 hexadecimal).**
EPRT |2|127.0.0.1|80|
** Isso indicará ao servidor FTP para estabelecer uma conexão TCP (indicado pelo "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/algo.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 irá anexar os dados.STOR /caminho/algo.txt
ComoAPPE
, mas irá sobrescrever os arquivosSTOU /caminho/algo.txt
ComoAPPE
, mas se existir, não fará nada.RETR /caminho/do/arquivo
Uma conexão passiva ou de porta deve ser estabelecida. Em seguida, o servidor FTP enviará o arquivo indicado por essa conexãoREST 6
Isso indicará ao servidor que na próxima vez que enviar algo usandoRETR
, 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
Faz 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. Em seguida, 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.
Você também pode abusar desse comportamento para fazer um servidor FTP interagir com outros protocolos. Você poderia fazer upload de um arquivo contendo uma solicitação HTTP e fazer o servidor FTP vulnerável enviá-lo 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 o servidor FTP vulnerável baixar 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ê deseja falar com outro servidor HTTP ou FTP, precisa 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 colocar algum cabeçalho de imagem no início)Use
PORT
para se conectar ao servidor e serviço arbitráriosUse
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 estiver enviando uma solicitação HTTP, coloque a mesma solicitação uma após a outra até ~0.5MB pelo menos. Assim:
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 Servidor Filezilla
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 ele usando uma senha em branco e criar um novo usuário para o serviço FTP.
Arquivos de configuração
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
- Alterar a propriedade dos arquivos enviados anonimamentechown_username=username
- Usuário que recebe a propriedade dos arquivos enviados anonimamentelocal_enable=YES
- Permitir que usuários locais façam loginno_anon_password=YES
- Não solicitar senha para anônimoswrite_enable=YES
- Permitir comandos: STOR, DELE, RNFR, RNTO, MKD, RMD, APPE e SITE
Shodan
ftp
port:21
Grupo de Segurança Try Hard
Comandos Automáticos do HackTricks
Last updated