
Ein minimales, authentifiziertes Reverse-Shell-Framework zum Erreichen von Hosts mit ausgehendem Internetzugang.
bepr ist ein winziges, authentifiziertes Client/Server-Reverse-Shell-Programm über ausgehende WebSocket-Verbindungen.
Eine einzelne Binärdatei deckt alle 3 Modi ab: Servermodus, Clientmodus und Benutzermodus. Sie wird mit Installationsanleitungen für rpm, deb und pkg ausgeliefert und ist 1 MB groß.
Ich habe bepr erstellt, weil ich unterwegs bin und Computer zu Hause steuern möchte, ohne sie dem öffentlichen Internet auszusetzen. Dafür werden lediglich eine Domain (für TLS) und ein Server benötigt.
Gehe zu https://github.com/Aperocky/bepr/releases, um die Version des Pakets für deine Plattform zu finden. Lade sie herunter und verwende diese Befehle zur Installation:
sudo installer -pkg bepr-<version>.pkg -target /
sudo dpkg -i bepr_<version>_<arch>.deb
sudo rpm -i bepr-<version>-<arch>.rpm
Oder verwende die Update-Skripte, um es durch Ausführen des Skripts automatisch zu installieren:
curl -fsSL https://raw.githubusercontent.com/Aperocky/bepr/main/packaging/scripts/update-deb.sh | sh
curl -fsSL https://raw.githubusercontent.com/Aperocky/bepr/main/packaging/scripts/update-macos.sh | sh
curl -fsSL https://raw.githubusercontent.com/Aperocky/bepr/main/packaging/scripts/update-rpm.sh | sh
Und nun, je nachdem, wofür dein Rechner gedacht ist, konfiguriere jeden Host. Die Binärdatei funktioniert in allen drei Modi, synchronisiert aber nicht automatisch – richte alles ein, bevor du gehst!
Du benötigst dein eigenes TLS-Zertifikat und deine eigene Domain; dieser Teil wird nicht von bepr abgedeckt. Erstelle die Serverkonfiguration:
# cat /etc/bepr/server.conf
bind = 0.0.0.0:443
key_dir = /etc/bepr/client-keys
tls_cert = /etc/bepr/tls/cert.pem
tls_key = /etc/bepr/tls/privkey.pem
Starte den Dienst:
Linux:
sudo systemctl enable --now bepr
Vom Server aus kannst du registrierte Clients und verbundene Benutzer auflisten; dies erfolgt über einen lokalen Socket.
[email protected]:~# bepr list
aperocky user disconnected
laptop client disconnected
mac_m1 client connected
pi_zero client connected
Du kannst dich mit diesem lokalen Socket auch direkt mit einem Client verbinden; dies verhält sich genauso wie der Benutzermodus.
bepr connect laptop
Dies bietet Benutzer- und Client-Pfade auf deiner Domain an:
$domain/bepr/client/mac_m1 # Connect from client
$domain/bepr/user/aperocky # Connect from user
Sobald die Verbindung hergestellt ist, werden stdin/stdout des bepr connect-Terminals an die ausgewählte Client-Shell weitergeleitet. Client-Shells laufen in einer PTY, während der Server ein reiner Byte-Router ist, der Daten unverändert durchleitet. Mehrere Clients können gleichzeitig mit dem Server verbunden sein, aber ein einzelner Client kann jeweils nur einen Benutzer angehängt haben.
Erzeuge auf jedem Clientrechner ein Schlüsselpaar:
ssh-keygen -t ed25519 -f /etc/bepr/client-keys/pi_zero
Kopiere den öffentlichen Schlüssel in das key_dir des Servers:
/etc/bepr/client-keys/pi_zero.pub -> client ID pi_zero on server
Erstelle die Clientkonfiguration. Die Client-ID in der URL muss mit dem Dateinamen des öffentlichen Schlüssels auf dem Server übereinstimmen:
# cat /etc/bepr/client.conf
server = wss://server.example/bepr/client/pi_zero
private_key_path = /etc/bepr/client-keys/pi_zero
shell = /bin/sh
Starte den Dienst/Daemon:
Linux:
sudo systemctl enable --now bepr
macOS:
sudo launchctl bootstrap system /Library/LaunchDaemons/com.bepr.plist
sudo launchctl enable system/com.bepr
sudo launchctl kickstart -k system/com.bepr
Der veraltete Pfad domain/bepr/$name wird aus Gründen der Abwärtskompatibilität mit älteren Clients ebenfalls akzeptiert. Starte den Dienst auf die gleiche Weise wie den Server.
Hinweis: Der Client startet sofort bei der Verbindung mit dem Server eine Shell, nicht erst, wenn sich ein Benutzer verbindet. Die Shell läuft dauerhaft im Hintergrund. Wenn du dich verbindest und das Terminal in einem schlechten Zustand vorfindest, führe stty sane aus. Wenn die Shell selbst nicht reagiert, beende sie per PID auf dem Clientrechner – der Client verbindet sich automatisch neu und startet innerhalb von 10 Sekunden eine neue Shell.
Um von einem entfernten Rechner aus zu arbeiten, ohne den Server-Socket per SSH weiterzuleiten, verwende den Benutzermodus. Füge auf dem Server ein user_key_dir zur Serverkonfiguration hinzu:
# cat /etc/bepr/server.conf
bind = 0.0.0.0:443
key_dir = /etc/bepr/client-keys
user_key_dir = /etc/bepr/user-keys
tls_cert = /etc/bepr/tls/cert.pem
tls_key = /etc/bepr/tls/privkey.pem
Kopiere den öffentlichen Schlüssel des Benutzers auf den Server:
/etc/bepr/user-keys/aperocky.pub -> user ID aperocky
Erstelle auf dem Benutzerrechner eine Benutzerkonfiguration:
# cat ~/.config/bepr/user.conf
server = wss://server.example/bepr/user/aperocky
private_key_path = ~/.ssh/aperocky_user_ed25519
bepr list und bepr connect verwenden diese Konfiguration automatisch ohne zusätzliche Flags. Deine Befehle werden über den Server direkt an die Client-Hosts weitergeleitet.
Die bepr-Binärdatei kann ohne Dienst/Paketierung manuell mit direkten Befehlen und Argumenten ausgeführt werden:
./bepr server --config $server_config_path
./bepr client --config $client_config_path
./bepr connect --socket $socket_file_path $destination