
Un framework minimalista de reverse shell autenticada para alcanzar hosts con acceso saliente a internet.
bepr es un pequeño programa de shell inversa cliente/servidor autenticado sobre conexiones WebSocket salientes.
Un único binario cubre los 3 modos: modo servidor, modo cliente y modo usuario. Se distribuye con instrucciones de instalación para rpm, deb y pkg, y ocupa 1MB.
Creé bepr porque estoy de viaje y me gustaría controlar computadoras en casa sin exponerlas a la internet pública. Esto solo requiere un dominio (para TLS) y un servidor para que funcione.
Ve a https://github.com/Aperocky/bepr/releases para encontrar la versión del paquete para tu plataforma. Descárgalo y usa estos comandos para instalarlo
sudo installer -pkg bepr-<version>.pkg -target /
sudo dpkg -i bepr_<version>_<arch>.deb
sudo rpm -i bepr-<version>-<arch>.rpm
O usa scripts de actualización para instalarlo automáticamente ejecutando el 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
Y ahora, dependiendo de para qué sirva tu máquina, configura cada host. El binario funciona en los tres modos pero no se sincroniza automáticamente — ¡configúralo antes de irte!
Necesitas tu propio certificado TLS y dominio; esa parte no está cubierta por bepr. Crea la configuración del servidor:
# 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
Inicia el servicio:
linux:
sudo systemctl enable --now bepr
Desde el servidor puedes listar los clientes registrados y los usuarios conectados; esto se hace a través de un socket local.
[email protected]:~# bepr list
aperocky user disconnected
laptop client disconnected
mac_m1 client connected
pi_zero client connected
También puedes conectarte a un cliente directamente con este socket local; se comporta igual que el modo usuario.
bepr connect laptop
Esto ofrece rutas de usuario y de cliente en tu dominio:
$domain/bepr/client/mac_m1 # Connect from client
$domain/bepr/user/aperocky # Connect from user
Una vez conectado, la stdin/stdout de la terminal bepr connect se canaliza hacia el shell del cliente seleccionado. Los shells de los clientes se ejecutan dentro de una PTY, mientras que el servidor es un enrutador de bytes de paso directo. Puede haber varios clientes conectados al servidor al mismo tiempo, pero un solo cliente solo puede tener un usuario conectado a la vez.
En cada host cliente, genera un par de claves:
ssh-keygen -t ed25519 -f /etc/bepr/client-keys/pi_zero
Copia la clave pública al key_dir del servidor:
/etc/bepr/client-keys/pi_zero.pub -> client ID pi_zero on server
Crea la configuración del cliente. El ID de cliente en la URL debe coincidir con el nombre del archivo de clave pública en el servidor:
# 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
Inicia el servicio/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
La ruta heredada domain/bepr/$name también se acepta por compatibilidad con clientes antiguos. Inicia el servicio de la misma manera que el servidor.
Nota: el cliente inicia un shell inmediatamente al conectarse al servidor, no cuando un usuario se conecta. El shell se ejecuta de forma persistente en segundo plano. Si te conectas y encuentras la terminal en mal estado, ejecuta stty sane. Si el shell no responde, mátalo por PID en la máquina cliente — el cliente se reconectará automáticamente y generará un shell nuevo en menos de 10 segundos.
Para operar desde una máquina remota sin hacer SSH-forwarding del socket del servidor, usa el modo usuario. En el servidor, agrega un user_key_dir a la configuración del servidor:
# 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
Copia la clave pública del usuario al servidor:
/etc/bepr/user-keys/aperocky.pub -> user ID aperocky
En la máquina del usuario, crea una configuración de usuario:
# cat ~/.config/bepr/user.conf
server = wss://server.example/bepr/user/aperocky
private_key_path = ~/.ssh/aperocky_user_ed25519
bepr list y bepr connect usarán esta configuración automáticamente sin banderas adicionales. Tus comandos establecen un puente desde el servidor directamente hacia los hosts clientes.
El binario bepr se puede ejecutar manualmente sin servicio/paquete con comandos y argumentos directos:
./bepr server --config $server_config_path
./bepr client --config $client_config_path
./bepr connect --socket $socket_file_path $destination