Kontrolle über Ihren Server durch einen Reverse-Shell-Angriff
10. August 2022
0 Min. LesezeitAnmerkung der Redaktion: 9. Mai 2023
Dieser Beitrag, ursprünglich am 10. August 2022 veröffentlicht, wurde aktualisiert und zeigt, wie Snyk Sie dabei unterstützen kann, Reverse-Shell-Angriffe zu verhindern.
Eine Anwendung in Ihrer bevorzugten Programmiersprache zu erstellen und auszuführen, ist normalerweise ziemlich einfach. Nach der Entwicklung Ihrer Anwendung ist auch die Bereitstellung und Veröffentlichung im Internet unkompliziert. Was Sie auf keinen Fall brauchen, ist jemand, der Ihr System übernimmt und Ihre brandneue Anwendung vollständig kontrolliert. In diesem Artikel erkläre ich, wie das durch einen Reverse-Shell-Angriff geschehen kann.
Beachten Sie, dass die Codebeispiele in diesem Artikel ausschließlich Lernzwecken dienen. Ich möchte vor allem erklären, was ein Remote-Shell-Angriff ist und wie er in Ihren Anwendungen auftreten kann. Es wird nicht empfohlen, dieses oder ein anderes Beispiel zum Hacken anderer Personen zu verwenden. In den meisten Ländern ist Hacken ohne Zustimmung des Ziels illegal – selbst wenn Sie die besten Absichten haben.
Was ist eine Reverse-Shell?
Eine Reverse-Shell (oder Connect-Back-Shell) ist eine Shell-Sitzung, die der Zielcomputer zu einem Remote-Host aufbaut. Der Zielcomputer öffnet die Sitzung zu einem bestimmten Host und Port. Eine Shell-Verbindung kann hergestellt werden, wenn der Remote-Host an diesem Port mit der entsprechenden Software auf Verbindungen wartet. Wichtig ist: Die Verbindung wird vom Zielcomputer initiiert, nicht vom Remote-Host.
Bei einem Remote-Shell-Angriff versucht ein Angreifer, den Computer des Opfers dazu zu bringen, eine solche Verbindung zu initiieren. Der Angriff kann interaktiven Shell-Zugriff (also im Grunde ein Terminal) ermöglichen und dem Angreifer die Kontrolle über den Computer des Opfers verschaffen.
Wie kommt es zu einem Reverse-Shell-Angriff?
In den meisten Fällen kommt es zu einem Reverse-Shell-Angriff, wenn eine Anwendung für eine Sicherheitslücke zur Remote-Codeausführung anfällig ist. Ein Angreifer nutzt eine solche Sicherheitslücke in einer Anwendung, um Code auf dem Computer des Opfers auszuführen, der die Shell-Sitzung initiiert. Ohne es zu wissen, stellt das Opfer eine Verbindung her. Der Angreifer muss lediglich am richtigen Port auf eingehende Verbindungen warten. Sobald die Verbindung hergestellt ist, hat der Angreifer Shell-Zugriff auf den Computer des Opfers und kann allerlei spannende Dinge tun.
Stellen Sie sich einen Tennisball vor: Wenn Sie ihn gegen etwas Hartes werfen, springt er zurück. Sie müssen ihn nur am richtigen Ort und zur richtigen Zeit auffangen.
Eine Reverse-Shell-Verbindung herstellen
Für das Erstellen einer Reverse-Shell gibt es je nach Programmiersprache verschiedene Möglichkeiten. Bevor wir diesen Reverse-Shell-Code ausführen, müssen wir jedoch sicherstellen, dass wir am richtigen Port auf eingehende Verbindungen warten.
Mit netcat auf eingehende Verbindungen warten
Ein hervorragendes Tool dafür ist netcat. Netcat (oft zu nc abgekürzt) ist ein Netzwerkdienstprogramm zum Lesen und Schreiben von Netzwerkverbindungen über TCP oder UDP. Auf dem Computer, mit dem sich die Reverse-Shell verbinden soll, können Sie mit netcat an einem bestimmten Port auf eingehende Verbindungen warten. Das folgende Beispiel zeigt, wie netcat an Port 9001 auf Verbindungen wartet. Der Parameter v ist nicht unbedingt erforderlich, liefert mir aber eine praktische ausführliche Ausgabe.
Eine Reverse-Shell in Python, Java oder Node.js ausführen
Sehen wir uns zwei Möglichkeiten an, eine Reverse-Shell einzurichten. Beide Beispiele eignen sich für Systeme, auf denen die bash-Shell installiert ist.
Reverse-Shell-Payload:
Bei der ersten Methode starten wir die Shell programmatisch. Anschließend stellen wir über die entsprechende IP-Adresse und den passenden Port eine Socket-Verbindung zum Remote-Computer her.
Zum Schluss verbinden wir die Dateideskriptoren (Eingabe, Ausgabe und Fehler) der Shell mit der neu erstellten Socket-Verbindung.
Java
In diesem Java-Beispiel leiten wir den InputStream und den ErrorStream des Prozesses an den OutputStream der Remote-Socket-Verbindung weiter. Dasselbe müssen wir auch in umgekehrter Richtung tun und den Socket OutputStream in den Inputstream des bash-Prozesses schreiben.
Python-Reverse-Shell
In diesem Python-Skript verbinden wir stdin, stdout und stderr mit der Socket-Verbindung. In Unix-ähnlichen Systemen sind dies die ersten drei Dateideskriptoren. Anschließend verwenden wir pty, um bash auszuführen.
Node.js
Dieses Node.js-Beispiel ähnelt dem Python-Beispiel sehr. Wir führen bash aus und verbinden die Standard-Dateideskriptoren passend mit der Socket-Verbindung.
Einen Reverse-Shell-Befehl ausführen:
Die zweite Methode ist etwas kürzer. Die meisten Programmiersprachen bieten eine Möglichkeit, Shell-Befehle auszuführen, zum Beispiel:
Runtime.getRuntime()in Javaos.system()in Pythonrequire(‘child_process’).exec()in Node.js
Mit diesen Funktionen können wir einen einzeiligen Shell-Befehl aufrufen, der die Reverse-Shell für uns initiiert.
Java
Python
Node.js
Wenn Sie zuerst den netcat-Befehl ausführen, der an Port 9001 auf Verbindungen wartet, und danach diesen Code ausführen, sehen Sie, dass die Verbindung hergestellt wird. Anschließend können Sie Shell-Befehle wie den folgenden ausführen.

Mit all diesen Beispielen stellen Sie eine Reverse-Shell-Verbindung zu Ihrem eigenen Computer her. Wenn Sie dies auf einem Remote-Computer tun möchten, müssen Sie natürlich die IP-Adresse entsprechend ändern. Denken Sie auch daran, dass Ihre Berechtigungen selbst bei bestehendem Zugriff von dem Benutzerkonto abhängen, unter dem der Code auf dem Computer des Opfers ausgeführt wird. Für erweiterte Berechtigungen müssen Sie möglicherweise noch etwas mehr tun.
Einen Reverse-Shell-Angriff mithilfe einer Sicherheitslücke zur Remote-Codeausführung erstellen
Um mit solchen Codebeispielen einen tatsächlichen Angriff durchzuführen, müssen wir eine Sicherheitslücke zur Codeausführung ausnutzen und den Code in ein bestehendes System einschleusen. Ein bekanntes Beispiel ist die Log4Shell-Sicherheitslücke, die im Dezember 2021 entdeckt wurde. Dabei war es möglich, eine Gadget-Klasse einzuschleusen, die bei ihrer Instanziierung Code ausführte. Viele Beispiele zeigten, wie sich der Taschenrechner oder etwas anderes Harmloses starten ließ. Mit dem folgenden Code lässt sich jedoch ein Gadget für diese berüchtigte Log4j-Sicherheitslücke erstellen. Wenn Sie Log4Shell ausnutzen, starten Sie nicht mehr den Taschenrechner, sondern machen daraus einen Wegbereiter für eine Reverse-Shell.
Fast jede Remote-Codeausführung lässt sich für einen Reverse-Shell-Angriff nutzen. Zu den weiteren aktuellen Beispielen zählen Spring4Shell und die RCE-Sicherheitslücke in Apache Commons Configuration. Beide waren nicht so problematisch wie Log4Shell. Sie können jedoch jede der beiden Sicherheitslücken für einen Reverse-Shell-Angriff nutzen und möglicherweise die Kontrolle über einen Zielcomputer erlangen. Daher ist es entscheidend, zu verhindern, dass Benutzereingaben (teilweise) ausgeführt werden.
Mit Snyk Open Source können Sie Ihre Anwendung auf Sicherheitslücken in Open-Source-Bibliotheken untersuchen, darunter auch auf dieses Problem mit Log4j. Hier sehen Sie ein Beispiel für die Ausgabe des Snyk IntelliJ IDEA plugin's, in der dieses Problem und seine Behebung erwähnt werden.

So verhindern Sie Reverse-Shell-Angriffe
Wenn wir verhindern können, dass ein Angreifer Code auf Ihrem Computer ausführt, schließen wir fast alle Möglichkeiten für einen Reverse-Shell-Angriff aus. Sehen wir uns einige Maßnahmen an, mit denen Sie als Entwickler böswillige Reverse-Shell-Angriffe verhindern können.
Vermeiden Sie Ausführungsanweisungen. Anweisungen in Ihrem Code, mit denen Skripte oder andere Codebestandteile ausgeführt werden können, wie etwa
exec(), sollten Sie möglichst vermeiden.Bereinigen und validieren Sie Eingaben. Jede Eingabe ist als potenziell böswillig zu betrachten. Das gilt nicht nur für direkte Benutzereingaben. Wenn beispielsweise ein Datenbankfeld als Eingabe für eine Ausführung dient, kann jemand versuchen, die Datenbank anzugreifen.
Führen Sie Ihre Anwendung mit eingeschränkten Berechtigungen aus. Führen Sie Ihre Anwendung nicht als root aus, sondern erstellen Sie einen Benutzer mit den geringstmöglichen Berechtigungen. Das kommt leider bei Anwendungen in Docker-Containern häufig vor, da der Standardbenutzer in einem Docker-Container root ist.
Verhindern Sie Sicherheitslücken, die Remote-Codeausführung ermöglichen. Wenn eine Bibliothek oder ein Framework kompromittiert wurde, ersetzen Sie es durch eine sichere Version.
Fast jede Remote-Codeausführung lässt sich für einen Reverse-Shell-Angriff nutzen, selbst wenn das Anwendungsszenario weit hergeholt erscheint.
Snyk hilft Ihnen dabei!
Snyk hilft Ihnen, Reverse-Shell-Angriffe zu verhindern, indem es Code und Abhängigkeiten scannt. Das Tool weist auf potenzielle Sicherheitsfehler in Ihrem eigenen Code hin und prüft transitive Abhängigkeiten auf bekannte Sicherheitslücken.
Starten Sie mit Capture-the-Flag
Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Challenges lösen.
