
Un framework minimal de reverse shell authentifié pour atteindre des hôtes ayant un accès Internet sortant.
bepr est un petit programme de shell inverse client/serveur authentifié via des connexions WebSocket sortantes.
Un seul binaire couvre les 3 modes : mode serveur, mode client et mode utilisateur. Il est conditionné avec des instructions d'installation pour rpm, deb et pkg, et pèse 1 Mo.
J'ai créé bepr parce que je voyage et souhaite contrôler des ordinateurs chez moi sans les exposer à l'internet public. Cela nécessite seulement un domaine (pour TLS) et un serveur pour fonctionner.
Rendez-vous sur https://github.com/Aperocky/bepr/releases pour trouver la version du paquet pour votre plateforme. Téléchargez-le et utilisez ces commandes pour installer :
sudo installer -pkg bepr-<version>.pkg -target /
sudo dpkg -i bepr_<version>_<arch>.deb
sudo rpm -i bepr-<version>-<arch>.rpm
Ou utilisez les scripts de mise à jour pour l'installer automatiquement en exécutant le script :
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
Et maintenant, selon l'usage de votre machine, configurez chaque hôte. Le binaire fonctionne dans les trois modes mais ne se synchronise pas automatiquement — configurez avant de partir !
Vous avez besoin de votre propre certificat TLS et domaine ; cette partie n'est pas couverte par bepr. Créez la configuration du serveur :
# 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
Démarrez le service :
linux:
sudo systemctl enable --now bepr
Depuis le serveur, vous pouvez lister les clients enregistrés et les utilisateurs connectés, cela passe par un socket local.
[email protected]:~# bepr list
aperocky user disconnected
laptop client disconnected
mac_m1 client connected
pi_zero client connected
Vous pouvez également vous connecter à un client directement avec ce socket local, cela se comporte comme le mode utilisateur.
bepr connect laptop
Cela offre des chemins utilisateur et client sur votre domaine :
$domain/bepr/client/mac_m1 # Connect from client
$domain/bepr/user/aperocky # Connect from user
Une fois attaché, le terminal stdin/stdout de bepr connect est redirigé vers le shell du client sélectionné. Les shells clients s'exécutent dans un PTY, tandis que le serveur est un routeur d'octets brut de passage. Plusieurs clients peuvent être connectés au serveur en même temps, mais un seul client ne peut avoir qu'un seul utilisateur attaché à la fois.
Sur chaque hôte client, générez une paire de clés :
ssh-keygen -t ed25519 -f /etc/bepr/client-keys/pi_zero
Copiez la clé publique dans le key_dir du serveur :
/etc/bepr/client-keys/pi_zero.pub -> client ID pi_zero on server
Créez la configuration du client. L'ID client dans l'URL doit correspondre au nom de fichier de la clé publique sur le serveur :
# 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
Démarrez le service/daemon :
linux:
sudo systemctl enable --now bepr
mac:
sudo launchctl bootstrap system /Library/LaunchDaemons/com.bepr.plist
sudo launchctl enable system/com.bepr
sudo launchctl kickstart -k system/com.bepr
Le chemin hérité domain/bepr/$name est également accepté pour la rétrocompatibilité avec les anciens clients. Démarrez le service de la même manière que le serveur.
Remarque : le client lance un shell immédiatement lors de la connexion au serveur, pas lorsqu'un utilisateur s'attache. Le shell s'exécute en permanence en arrière-plan. Si vous vous attachez et trouvez le terminal dans un mauvais état, exécutez stty sane. Si le shell lui-même ne répond pas, tuez-le par PID sur la machine cliente — le client se reconnectera automatiquement et lancera un nouveau shell dans les 10 secondes.
Pour opérer depuis une machine distante sans transférer le socket du serveur par SSH, utilisez le mode utilisateur. Sur le serveur, ajoutez un user_key_dir à la configuration du serveur :
# 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
Copiez la clé publique de l'utilisateur sur le serveur :
/etc/bepr/user-keys/aperocky.pub -> user ID aperocky
Sur la machine utilisateur, créez une configuration utilisateur :
# cat ~/.config/bepr/user.conf
server = wss://server.example/bepr/user/aperocky
private_key_path = ~/.ssh/aperocky_user_ed25519
bepr list et bepr connect utiliseront automatiquement cette configuration sans indicateurs supplémentaires. Vos commandes font le pont depuis le serveur directement vers les hôtes clients.
Le binaire bepr peut être exécuté manuellement sans service/paquet avec des commandes directes et des arguments :
./bepr server --config $server_config_path
./bepr client --config $client_config_path
./bepr connect --socket $socket_file_path $destination