Tester Hydra avec des protocoles non pris en charge

HydraHydraBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire (lab), vous apprendrez à utiliser Hydra pour tester la sécurité des services, même ceux avec des protocoles non pris en charge. Le laboratoire commence par simuler une attaque sur un faux service implémenté avec un script Python, vous permettant de comprendre la fonctionnalité de base de Hydra.

Vous allez créer un simple service basé sur Python qui nécessite un nom d'utilisateur et un mot de passe, ainsi que les listes correspondantes de noms d'utilisateurs et de mots de passe pour Hydra. Le laboratoire vous guidera ensuite dans la tentative d'attaque sur ce service, l'examen des erreurs potentielles et l'exploration de la manière d'attaquer un service SNMP, confirmant finalement le résultat de l'attaque SNMP.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL hydra(("Hydra")) -.-> hydra/HydraGroup(["Hydra"]) hydra/HydraGroup -.-> hydra/single_username("Single Username Attack") hydra/HydraGroup -.-> hydra/single_password("Single Password Attack") hydra/HydraGroup -.-> hydra/target_ip("Target IP Specification") hydra/HydraGroup -.-> hydra/target_service("Target Service Selection") hydra/HydraGroup -.-> hydra/verbose_mode("Verbose Mode Usage") hydra/HydraGroup -.-> hydra/success_detection("Login Success Detection") hydra/HydraGroup -.-> hydra/error_handling("Error Message Handling") hydra/HydraGroup -.-> hydra/troubleshooting("Basic Troubleshooting") subgraph Lab Skills hydra/single_username -.-> lab-550775{{"Tester Hydra avec des protocoles non pris en charge"}} hydra/single_password -.-> lab-550775{{"Tester Hydra avec des protocoles non pris en charge"}} hydra/target_ip -.-> lab-550775{{"Tester Hydra avec des protocoles non pris en charge"}} hydra/target_service -.-> lab-550775{{"Tester Hydra avec des protocoles non pris en charge"}} hydra/verbose_mode -.-> lab-550775{{"Tester Hydra avec des protocoles non pris en charge"}} hydra/success_detection -.-> lab-550775{{"Tester Hydra avec des protocoles non pris en charge"}} hydra/error_handling -.-> lab-550775{{"Tester Hydra avec des protocoles non pris en charge"}} hydra/troubleshooting -.-> lab-550775{{"Tester Hydra avec des protocoles non pris en charge"}} end

Tenter une attaque sur un faux service

Dans cette étape, nous allons simuler une attaque sur un faux service en utilisant Hydra. Cela vous aidera à comprendre le fonctionnement de Hydra et à l'utiliser pour craquer des mots de passe. Nous commencerons par un scénario simple pour vous familiariser avec l'outil.

Tout d'abord, créons un simple "service" qui nécessite un nom d'utilisateur et un mot de passe. Nous utiliserons un simple script Python à cette fin.

Accédez à votre répertoire de projet :

cd ~/project

Créez un fichier nommé fake_service.py :

nano fake_service.py

Collez le code Python suivant dans le fichier fake_service.py :

#!/usr/bin/env python3

import socket
import sys

HOST = '127.0.0.1'  ## Standard loopback interface address (localhost)
PORT = 65432        ## Port to listen on (non-privileged ports are > 1023)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print(f"Connected by {addr}")
        username = conn.recv(1024).decode().strip()
        password = conn.recv(1024).decode().strip()

        if username == 'testuser' and password == 'password123':
            conn.sendall(b"Login successful!")
        else:
            conn.sendall(b"Login failed.")

Enregistrez le fichier et quittez l'éditeur. Rendez le script exécutable :

chmod +x fake_service.py

Maintenant, exécutez le faux service en arrière-plan :

./fake_service.py &

Cela lance le script Python, qui écoute les connexions sur le port 65432. Le symbole & met le processus en arrière-plan.

Ensuite, créons une liste de noms d'utilisateurs et de mots de passe pour Hydra. Créez un fichier nommé users.txt :

nano users.txt

Ajoutez le nom d'utilisateur suivant au fichier :

testuser

Enregistrez le fichier et quittez l'éditeur.

Créez un fichier nommé passwords.txt :

nano passwords.txt

Ajoutez les mots de passe suivants au fichier :

password
password123
wrongpassword

Enregistrez le fichier et quittez l'éditeur.

Maintenant, utilisons Hydra pour attaquer notre faux service. Nous utiliserons le module generic car nous avons créé un service personnalisé.

hydra -l testuser -P passwords.txt 127.0.0.1 generic "USER <USER> PASS <PASS> RET Login successful!" -s 65432 -vV

Décortiquons cette commande :

  • hydra : La commande Hydra.
  • -l testuser : Spécifie le nom d'utilisateur à utiliser. Nous utilisons un seul nom d'utilisateur dans cet exemple.
  • -P passwords.txt : Spécifie le fichier de liste de mots de passe.
  • 127.0.0.1 : L'adresse IP cible (localhost dans ce cas).
  • generic : Spécifie le module générique, qui nous permet de définir le protocole.
  • "USER <USER> PASS <PASS> RET Login successful!" : C'est la définition du protocole. <USER> et <PASS> sont des espaces réservés que Hydra remplace par le nom d'utilisateur et le mot de passe de la liste. RET Login successful! indique à Hydra de rechercher "Login successful!" dans la réponse pour déterminer une connexion réussie.
  • -s 65432 : Spécifie le numéro de port.
  • -vV : Mode verbeux, qui affiche les tentatives en temps réel.

Vous devriez voir Hydra tester différents mots de passe. Après quelques secondes, il devrait trouver le bon mot de passe :

Hydra v9.6 (c) 2024 by van Hauser/THC & David Maciejak - Please use caution!

Hydra starting at 2024-10-27 14:30:00
[DATA] 1 task/1 service (1 connection per task, 1 thread per task)
[DATA] attacking service 127.0.0.1 on port 65432
[DATA] testing user: 'testuser'   password: 'password'
[DATA] testing user: 'testuser'   password: 'password123'
[65432] [generic] host: 127.0.0.1   login: testuser   password: password123
Hydra is finishing at 2024-10-27 14:30:02 after 00:00:02
1 task completed, 1 valid password found

Cette sortie montre que Hydra a trouvé avec succès le mot de passe password123 pour l'utilisateur testuser.

Enfin, arrêtons le faux service. Tout d'abord, trouvez son identifiant de processus :

ps aux | grep fake_service.py

Vous verrez une ligne similaire à celle-ci :

labex     1234  0.1  0.2  12345  6789 pts/0    Sl   14:29   0:00 ./fake_service.py

Le deuxième nombre (1234 dans cet exemple) est l'identifiant de processus (PID). Remplacez 1234 par le PID réel de votre sortie.

Maintenant, tuez le processus :

kill 1234

Cela arrête le faux service.

Examiner les erreurs et les services pris en charge

Dans cette étape, nous allons explorer les erreurs courantes rencontrées lors de l'utilisation de Hydra et apprendre à identifier les services pris en charge. Comprendre ces aspects est crucial pour un craquage de mots de passe efficace.

Tout d'abord, créons intentionnellement une erreur avec Hydra. Nous allons essayer d'attaquer un service inexistant sur un port élevé.

hydra -l testuser -P passwords.txt 127.0.0.1 generic "USER <USER> PASS <PASS> RET Login successful!" -s 65535 -vV

Cette commande est similaire à celle que nous avons utilisée dans l'étape précédente, mais nous avons changé le port pour 65535, qui est peu susceptible d'exécuter un service.

Exécutez la commande. Vous verrez probablement un message d'erreur similaire à celui-ci :

Hydra v9.6 (c) 2024 by van Hauser/THC & David Maciejak - Please use caution!

Hydra starting at 2024-10-27 14:35:00
[ERROR] Could not connect to 127.0.0.1:65535 - Connection refused

Cette erreur "Connection refused" indique que Hydra n'a pas pu établir une connexion au port spécifié. Cela peut être dû à plusieurs raisons : aucun service n'écoute sur ce port, un pare-feu bloque la connexion ou l'hôte cible est injoignable.

Maintenant, explorons comment déterminer quels services Hydra prend en charge. Hydra dispose de modules intégrés pour de nombreux services courants, ce qui facilite leur attaque. Pour voir la liste des services pris en charge, vous pouvez utiliser l'option -h :

hydra -h

Cette commande affichera un message d'aide avec la liste des modules pris en charge. Faites défiler la sortie pour trouver la section "Supported protocols". Vous verrez une liste de protocoles tels que ftp, ssh, smtp, http-get, mysql, snmp et bien d'autres.

Par exemple, si vous voulez attaquer un service SSH, vous utiliserez le module ssh. Si vous voulez attaquer un service FTP, vous utiliserez le module ftp.

Essayons un autre exemple. Supposons que vous vouliez attaquer un service HTTP. Vous pouvez utiliser les modules http-get ou http-post, selon la méthode d'authentification utilisée par le serveur web.

Pour obtenir plus d'informations sur un module spécifique, vous pouvez utiliser l'option -U suivie du nom du module. Par exemple, pour obtenir des informations sur le module http-get :

hydra -U http-get

Cela affichera les options et la syntaxe pour utiliser le module http-get. Faites attention aux paramètres requis, tels que l'URL et les en-têtes HTTP spécifiques.

Comprendre les messages d'erreur et savoir quels services Hydra prend en charge est essentiel pour la résolution de problèmes et la réalisation d'attaques réussies. Dans l'étape suivante, nous nous concentrerons sur l'attaque d'un service SNMP.

Attaquer un service SNMP

Dans cette étape, nous allons tenter de craquer la chaîne de communauté SNMP en utilisant Hydra. SNMP (Simple Network Management Protocol - Protocole de gestion de réseau simple) est utilisé pour gérer les équipements réseau. La chaîne de communauté agit comme un mot de passe, et les chaînes de communauté par défaut ou faibles sont une vulnérabilité courante.

Tout d'abord, créons une liste de mots de chaînes de communauté SNMP courantes.

Accédez à votre répertoire de projet :

cd ~/project

Créez un fichier nommé snmp_communities.txt :

nano snmp_communities.txt

Ajoutez les chaînes de communauté courantes suivantes au fichier :

public
private
community
secret
admin

Enregistrez le fichier et quittez l'éditeur.

Maintenant, nous allons utiliser Hydra pour attaquer le service SNMP. Nous supposons que le service SNMP est en cours d'exécution sur le port par défaut (161) sur le localhost (127.0.0.1).

hydra -P snmp_communities.txt 127.0.0.1 snmp -vV

Décortiquons cette commande :

  • hydra : La commande Hydra.
  • -P snmp_communities.txt : Spécifie le fichier de liste de mots de passe contenant les chaînes de communauté.
  • 127.0.0.1 : L'adresse IP cible (localhost dans ce cas).
  • snmp : Spécifie le module SNMP.
  • -vV : Mode verbeux, qui affiche les tentatives en temps réel.

Exécutez la commande. Vous devriez voir Hydra tester différentes chaînes de communauté. Si le service SNMP cible utilise l'une des chaînes de communauté de notre liste, Hydra la trouvera.

La sortie pourrait ressembler à ceci si elle trouve la chaîne de communauté "public" :

Hydra v9.6 (c) 2024 by van Hauser/THC & David Maciejak - Please use caution!

Hydra starting at 2024-10-27 14:40:00
[DATA] 1 task/1 service (1 connection per task, 1 thread per task)
[DATA] attacking service 127.0.0.1 on port 161
[161] [snmp] host: 127.0.0.1 community: public
Hydra is finishing at 2024-10-27 14:40:01 after 00:00:01
1 task completed, 1 valid password found

Cette sortie montre que Hydra a trouvé avec succès la chaîne de communauté public.

Si Hydra ne trouve pas de chaîne de communauté valide, il testera toutes les chaînes de la liste puis se terminera sans afficher de connexion réussie.

Il est important de noter que ce laboratoire suppose qu'un service SNMP est en cours d'exécution sur le port par défaut avec une chaîne de communauté vulnérable. Dans un scénario réel, vous devriez identifier l'adresse IP et le port cibles, et éventuellement utiliser une liste de mots plus complète. Vous devriez également peut-être utiliser des outils comme nmap pour identifier si le service SNMP est en cours d'exécution et sa version.

Confirmer le résultat de l'attaque SNMP

Dans cette étape, nous allons confirmer le résultat de l'attaque SNMP en utilisant la chaîne de communauté découverte pour récupérer des informations du service SNMP. Nous utiliserons la commande snmpwalk à cette fin.

Tout d'abord, assurez-vous que la commande snmpwalk est installée. Elle fait partie du paquet snmp. Si elle n'est pas déjà installée, vous pouvez l'installer avec :

sudo apt update
sudo apt install snmp -y

Étant donné que nous sommes dans un conteneur Docker, sudo apt update et sudo apt install snmp -y échoueront probablement. Pour le besoin de ce laboratoire, nous supposerons que snmpwalk est déjà installé.

Maintenant, utilisons snmpwalk pour récupérer des informations du service SNMP en utilisant la chaîne de communauté que nous avons (espérons-le) découverte à l'étape précédente. Supposons que la chaîne de communauté soit "public".

snmpwalk -v 1 -c public 127.0.0.1

Décortiquons cette commande :

  • snmpwalk : La commande SNMP walk.
  • -v 1 : Spécifie la version SNMP (version 1 dans ce cas).
  • -c public : Spécifie la chaîne de communauté ("public" dans cet exemple). Remplacez "public" par la chaîne de communauté réelle que vous avez découverte.
  • 127.0.0.1 : L'adresse IP cible (localhost dans ce cas).

Exécutez la commande. Si la chaîne de communauté est correcte, vous devriez voir de nombreuses lignes de sortie défiler. Cette sortie représente les informations récupérées du service SNMP.

La sortie sera composée de lignes telles que :

SNMPv2-MIB::sysDescr.0 = STRING: Linux labex 5.15.0-86-generic #96-Ubuntu SMP Fri Oct 6 15:55:15 UTC 2023 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (145678) 0:24:16.78
SNMPv2-MIB::sysContact.0 = STRING:
SNMPv2-MIB::sysName.0 = STRING: labex
SNMPv2-MIB::sysLocation.0 = STRING:

Cette sortie montre diverses informations système, telles que la description du système, l'identifiant d'objet, le temps de fonctionnement, les informations de contact, le nom du système et l'emplacement.

Si vous voyez un message d'erreur comme "Timeout: No Response from 127.0.0.1", cela signifie que la chaîne de communauté est incorrecte, que le service SNMP n'est pas en cours d'exécution ou qu'il y a un problème de connectivité réseau. Vérifiez à nouveau la chaîne de communauté et assurez-vous que le service SNMP est en cours d'exécution sur l'hôte cible.

En utilisant avec succès snmpwalk avec la chaîne de communauté découverte, vous avez confirmé le résultat de l'attaque SNMP et démontré la capacité de récupérer des informations du service SNMP. Cela souligne l'importance d'utiliser des chaînes de communauté fortes et uniques pour protéger les services SNMP contre l'accès non autorisé.

Résumé

Dans ce laboratoire, nous avons commencé par simuler une attaque sur un service fictif en utilisant Hydra pour comprendre sa fonctionnalité et ses capacités de craquage de mots de passe. Nous avons créé un simple service basé sur Python qui nécessite une authentification par nom d'utilisateur et mot de passe, écoutant sur le port 65432.

Nous avons ensuite préparé des listes de noms d'utilisateurs et de mots de passe (users.txt et passwords.txt) pour que Hydra les utilise dans son attaque. Le service fictif a été lancé en arrière-plan, prêt à recevoir les tentatives de connexion.