Testen von Hydra mit nicht unterstützten Protokollen

HydraHydraBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen Sie, wie Sie Hydra verwenden können, um die Sicherheit von Diensten zu testen, auch wenn diese Protokolle verwenden, die von Hydra nicht direkt unterstützt werden. Das Lab beginnt mit der Simulation eines Angriffs auf einen gefälschten Dienst, der mit einem Python-Skript implementiert wurde. Dadurch können Sie die grundlegende Funktionalität von Hydra verstehen.

Sie werden einen einfachen, auf Python basierenden Dienst erstellen, der einen Benutzernamen und ein Passwort erfordert. Außerdem erstellen Sie entsprechende Listen von Benutzernamen und Passwörtern, die Hydra verwenden kann. Anschließend führt das Lab Sie durch den Versuch, einen Angriff auf diesen Dienst durchzuführen, zeigt Ihnen potenzielle Fehler auf und erklärt, wie Sie einen SNMP-Dienst angreifen können. Abschließend wird das Ergebnis des SNMP-Angriffs bestätigt.


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{{"Testen von Hydra mit nicht unterstützten Protokollen"}} hydra/single_password -.-> lab-550775{{"Testen von Hydra mit nicht unterstützten Protokollen"}} hydra/target_ip -.-> lab-550775{{"Testen von Hydra mit nicht unterstützten Protokollen"}} hydra/target_service -.-> lab-550775{{"Testen von Hydra mit nicht unterstützten Protokollen"}} hydra/verbose_mode -.-> lab-550775{{"Testen von Hydra mit nicht unterstützten Protokollen"}} hydra/success_detection -.-> lab-550775{{"Testen von Hydra mit nicht unterstützten Protokollen"}} hydra/error_handling -.-> lab-550775{{"Testen von Hydra mit nicht unterstützten Protokollen"}} hydra/troubleshooting -.-> lab-550775{{"Testen von Hydra mit nicht unterstützten Protokollen"}} end

Angriff auf einen gefälschten Dienst versuchen

In diesem Schritt werden wir einen Angriff auf einen gefälschten Dienst mit Hydra simulieren. Dies hilft Ihnen zu verstehen, wie Hydra funktioniert und wie Sie es verwenden können, um Passwörter zu knacken. Wir beginnen mit einem einfachen Szenario, um Sie mit dem Tool vertraut zu machen.

Zunächst erstellen wir einen einfachen "Dienst", der einen Benutzernamen und ein Passwort erfordert. Dazu verwenden wir ein einfaches Python-Skript.

Navigieren Sie in Ihr Projektverzeichnis:

cd ~/project

Erstellen Sie eine Datei namens fake_service.py:

nano fake_service.py

Fügen Sie den folgenden Python-Code in die Datei fake_service.py ein:

#!/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.")

Speichern Sie die Datei und verlassen Sie den Editor. Machen Sie das Skript ausführbar:

chmod +x fake_service.py

Jetzt starten Sie den gefälschten Dienst im Hintergrund:

./fake_service.py &

Dadurch wird das Python-Skript gestartet, das auf Verbindungen auf Port 65432 wartet. Das & setzt den Prozess in den Hintergrund.

Als nächstes erstellen wir Listen mit Benutzernamen und Passwörtern, die Hydra verwenden kann. Erstellen Sie eine Datei namens users.txt:

nano users.txt

Fügen Sie den folgenden Benutzernamen in die Datei ein:

testuser

Speichern Sie die Datei und verlassen Sie den Editor.

Erstellen Sie eine Datei namens passwords.txt:

nano passwords.txt

Fügen Sie die folgenden Passwörter in die Datei ein:

password
password123
wrongpassword

Speichern Sie die Datei und verlassen Sie den Editor.

Jetzt verwenden wir Hydra, um unseren gefälschten Dienst anzugreifen. Wir verwenden das generic-Modul, da wir einen benutzerdefinierten Dienst erstellt haben.

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

Lassen Sie uns diesen Befehl analysieren:

  • hydra: Der Hydra-Befehl.
  • -l testuser: Gibt den zu verwendenden Benutzernamen an. In diesem Beispiel verwenden wir einen einzelnen Benutzernamen.
  • -P passwords.txt: Gibt die Datei mit der Passwortliste an.
  • 127.0.0.1: Die Ziel-IP-Adresse (in diesem Fall der lokale Rechner).
  • generic: Gibt das generische Modul an, das es uns ermöglicht, das Protokoll zu definieren.
  • "USER <USER> PASS <PASS> RET Login successful!": Dies ist die Protokolldefinition. <USER> und <PASS> sind Platzhalter, die Hydra durch den Benutzernamen und das Passwort aus den Listen ersetzt. RET Login successful! teilt Hydra mit, nach "Login successful!" in der Antwort zu suchen, um einen erfolgreichen Login festzustellen.
  • -s 65432: Gibt die Portnummer an.
  • -vV: Ausführlicher Modus, der die Versuche in Echtzeit anzeigt.

Sie sollten sehen, dass Hydra verschiedene Passwörter versucht. Nach ein paar Sekunden sollte es das richtige Passwort finden:

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

Diese Ausgabe zeigt, dass Hydra erfolgreich das Passwort password123 für den Benutzer testuser gefunden hat.

Schließlich stoppen wir den gefälschten Dienst. Zunächst finden wir seine Prozess-ID:

ps aux | grep fake_service.py

Sie sollten eine Zeile ähnlich der folgenden sehen:

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

Die zweite Zahl (in diesem Beispiel 1234) ist die Prozess-ID (PID). Ersetzen Sie 1234 durch die tatsächliche PID aus Ihrer Ausgabe.

Jetzt beenden wir den Prozess:

kill 1234

Dadurch wird der gefälschte Dienst gestoppt.

Überprüfung von Fehlern und unterstützten Diensten

In diesem Schritt werden wir die häufigsten Fehler untersuchen, die beim Verwenden von Hydra auftreten können, und lernen, wie man unterstützte Dienste identifiziert. Das Verständnis dieser Aspekte ist entscheidend für ein erfolgreiches Passwortknacken.

Zunächst erzeugen wir absichtlich einen Fehler mit Hydra. Wir versuchen, einen nicht existierenden Dienst auf einem hohen Port anzugreifen.

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

Dieser Befehl ähnelt dem, den wir im vorherigen Schritt verwendet haben, aber wir haben den Port auf 65535 geändert, auf dem wahrscheinlich kein Dienst läuft.

Führen Sie den Befehl aus. Sie werden wahrscheinlich eine Fehlermeldung ähnlich der folgenden sehen:

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

Diese Fehlermeldung "Connection refused" (Verbindung abgelehnt) zeigt an, dass Hydra keine Verbindung zum angegebenen Port herstellen konnte. Dies kann mehrere Gründe haben: Es läuft kein Dienst auf diesem Port, eine Firewall blockiert die Verbindung oder der Zielhost ist nicht erreichbar.

Jetzt lernen wir, wie man feststellt, welche Dienste Hydra unterstützt. Hydra verfügt über integrierte Module für viele gängige Dienste, was es einfacher macht, diese anzugreifen. Um eine Liste der unterstützten Dienste anzuzeigen, können Sie die Option -h verwenden:

hydra -h

Dieser Befehl zeigt eine Hilfemeldung mit einer Liste der unterstützten Module an. Scrollen Sie durch die Ausgabe, um den Abschnitt "Supported protocols" (Unterstützte Protokolle) zu finden. Sie werden eine Liste von Protokollen wie ftp, ssh, smtp, http-get, mysql, snmp und viele andere sehen.

Beispielsweise würden Sie das ssh-Modul verwenden, wenn Sie einen SSH-Dienst angreifen möchten. Wenn Sie einen FTP-Dienst angreifen möchten, würden Sie das ftp-Modul verwenden.

Versuchen wir ein weiteres Beispiel. Angenommen, Sie möchten einen HTTP-Dienst angreifen. Je nach Authentifizierungsmethode des Webservers können Sie die Module http-get oder http-post verwenden.

Um mehr Informationen über ein bestimmtes Modul zu erhalten, können Sie die Option -U gefolgt vom Modulnamen verwenden. Beispielsweise, um Informationen über das http-get-Modul zu erhalten:

hydra -U http-get

Dies zeigt die Optionen und die Syntax für die Verwendung des http-get-Moduls an. Achten Sie auf die erforderlichen Parameter, wie die URL und alle spezifischen HTTP-Header.

Das Verständnis der Fehlermeldungen und das Wissen, welche Dienste Hydra unterstützt, sind für die Fehlerbehebung und den erfolgreichen Angriff unerlässlich. Im nächsten Schritt werden wir uns auf den Angriff auf einen SNMP-Dienst konzentrieren.

Angriff auf einen SNMP-Dienst

In diesem Schritt werden wir versuchen, die SNMP-Community-String (Gemeinschaftskennwort) mit Hydra zu knacken. SNMP (Simple Network Management Protocol, einfaches Netzwerkverwaltungsprotokoll) wird zur Verwaltung von Netzwerkgeräten verwendet. Die Community-String fungiert wie ein Passwort, und Standard- oder schwache Community-Strings sind eine häufige Schwachstelle.

Zunächst erstellen wir eine Wortliste mit gängigen SNMP-Community-Strings.

Navigieren Sie in Ihr Projektverzeichnis:

cd ~/project

Erstellen Sie eine Datei namens snmp_communities.txt:

nano snmp_communities.txt

Fügen Sie die folgenden gängigen Community-Strings in die Datei ein:

public
private
community
secret
admin

Speichern Sie die Datei und verlassen Sie den Editor.

Jetzt verwenden wir Hydra, um den SNMP-Dienst anzugreifen. Wir gehen davon aus, dass der SNMP-Dienst auf dem Standardport (161) auf dem lokalen Rechner (127.0.0.1) läuft.

hydra -P snmp_communities.txt 127.0.0.1 snmp -vV

Lassen Sie uns diesen Befehl analysieren:

  • hydra: Der Hydra-Befehl.
  • -P snmp_communities.txt: Gibt die Datei mit der Passwortliste an, die die Community-Strings enthält.
  • 127.0.0.1: Die Ziel-IP-Adresse (in diesem Fall der lokale Rechner).
  • snmp: Gibt das SNMP-Modul an.
  • -vV: Ausführlicher Modus, der die Versuche in Echtzeit anzeigt.

Führen Sie den Befehl aus. Sie sollten sehen, dass Hydra verschiedene Community-Strings versucht. Wenn der Ziel-SNMP-Dienst einen der Community-Strings aus unserer Liste verwendet, wird Hydra ihn finden.

Die Ausgabe könnte wie folgt aussehen, wenn es die "public"-Community-String findet:

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

Diese Ausgabe zeigt, dass Hydra erfolgreich die Community-String public gefunden hat.

Wenn Hydra keine gültige Community-String findet, wird es alle Strings in der Liste ausprobieren und dann ohne Anzeige eines erfolgreichen Logins beenden.

Es ist wichtig zu beachten, dass in diesem Lab davon ausgegangen wird, dass ein SNMP-Dienst auf dem Standardport mit einer anfälligen Community-String läuft. In einer realen Welt würden Sie die Ziel-IP-Adresse und den Port identifizieren müssen und möglicherweise eine umfassendere Wortliste verwenden. Sie müssen möglicherweise auch Tools wie nmap verwenden, um festzustellen, ob der SNMP-Dienst läuft und welche Version er hat.

Bestätigung des SNMP-Angriffs-Ergebnisses

In diesem Schritt werden wir das Ergebnis des SNMP-Angriffs bestätigen, indem wir die gefundene Community-String verwenden, um Informationen vom SNMP-Dienst abzurufen. Hierzu verwenden wir den Befehl snmpwalk.

Stellen Sie zunächst sicher, dass der Befehl snmpwalk installiert ist. Er ist Teil des Pakets snmp. Wenn es noch nicht installiert ist, können Sie es mit folgenden Befehlen installieren:

sudo apt update
sudo apt install snmp -y

Da wir in einem Docker-Container sind, werden sudo apt update und sudo apt install snmp -y wahrscheinlich fehlschlagen. Für den Zweck dieses Labs gehen wir davon aus, dass snmpwalk bereits installiert ist.

Jetzt verwenden wir snmpwalk, um Informationen vom SNMP-Dienst abzurufen, indem wir die Community-String verwenden, die wir (hoffentlich) im vorherigen Schritt gefunden haben. Nehmen wir an, die Community-String ist "public".

snmpwalk -v 1 -c public 127.0.0.1

Lassen Sie uns diesen Befehl analysieren:

  • snmpwalk: Der SNMP-Walk-Befehl.
  • -v 1: Gibt die SNMP-Version an (in diesem Fall Version 1).
  • -c public: Gibt die Community-String an ("public" in diesem Beispiel). Ersetzen Sie "public" durch die tatsächliche Community-String, die Sie gefunden haben.
  • 127.0.0.1: Die Ziel-IP-Adresse (in diesem Fall der lokale Rechner).

Führen Sie den Befehl aus. Wenn die Community-String korrekt ist, sollten Sie eine Vielzahl von Ausgaben sehen, die vorbei scrollen. Diese Ausgabe repräsentiert die Informationen, die vom SNMP-Dienst abgerufen wurden.

Die Ausgabe besteht aus Zeilen wie diesen:

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:

Diese Ausgabe zeigt verschiedene Systeminformationen, wie die Systembeschreibung, die Objekt-ID, die Betriebszeit, die Kontaktinformationen, den Systemnamen und den Standort.

Wenn Sie eine Fehlermeldung wie "Timeout: No Response from 127.0.0.1" sehen, bedeutet dies, dass die Community-String falsch ist, der SNMP-Dienst nicht läuft oder es ein Netzwerkverbindungsfehler gibt. Überprüfen Sie die Community-String noch einmal und stellen Sie sicher, dass der SNMP-Dienst auf dem Zielhost läuft.

Durch die erfolgreiche Verwendung von snmpwalk mit der gefundenen Community-String haben Sie das Ergebnis des SNMP-Angriffs bestätigt und gezeigt, dass Sie in der Lage sind, Informationen vom SNMP-Dienst abzurufen. Dies unterstreicht die Wichtigkeit der Verwendung starker und eindeutiger Community-Strings, um SNMP-Dienste vor unbefugtem Zugriff zu schützen.

Zusammenfassung

In diesem Lab haben wir zunächst einen Angriff auf einen gefälschten Dienst mit Hydra simuliert, um dessen Funktionsweise und Fähigkeiten beim Knacken von Passwörtern zu verstehen. Wir haben einen einfachen, auf Python basierenden Dienst erstellt, der eine Authentifizierung mit Benutzername und Passwort erfordert und auf Port 65432 lauscht.

Anschließend haben wir Benutzername- und Passwortlisten (users.txt und passwords.txt) für Hydra vorbereitet, die es bei seinem Angriff nutzen kann. Der gefälschte Dienst wurde im Hintergrund gestartet und ist nun bereit, Verbindungsversuche entgegenzunehmen.