
Um framework mínimo de reverse shell autenticado para alcançar hosts com acesso de saída à internet.
bepr é um pequeno programa autenticado de shell reverso cliente/servidor que opera por meio de conexões WebSocket de saída.
Um único binário cobre todos os 3 modos: modo servidor, modo cliente e modo usuário. Ele é empacotado com instruções de instalação para rpm, deb e pkg, e tem apenas 1MB.
Criei o bepr porque estou viajando e gostaria de controlar computadores em casa sem expô-los à internet pública. Isso requer apenas um domínio (para TLS) e um servidor para funcionar.
Acesse https://github.com/Aperocky/bepr/releases para encontrar a versão do pacote para a sua plataforma. Baixe-o e use estes comandos para instalar:
sudo installer -pkg bepr-<version>.pkg -target /
sudo dpkg -i bepr_<version>_<arch>.deb
sudo rpm -i bepr-<version>-<arch>.rpm
Ou use update scripts para instalá-lo automaticamente executando o 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
E agora, dependendo da finalidade da sua máquina, configure cada host. O binário funciona nos três modos, mas não sincroniza automaticamente — configure tudo antes de sair!
Você precisa do seu próprio certificado TLS e domínio; essa parte não é coberta pelo bepr. Crie a configuração do 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
Inicie o serviço:
linux:
sudo systemctl enable --now bepr
A partir do servidor, você pode listar clientes registrados e usuários conectados; isso passa por um socket local.
[email protected]:~# bepr list
aperocky user disconnected
laptop client disconnected
mac_m1 client connected
pi_zero client connected
Você também pode se conectar diretamente a um cliente com este socket local; isso se comporta da mesma forma que o modo usuário.
bepr connect laptop
Isso oferece caminhos de usuário e cliente no seu domínio:
$domain/bepr/client/mac_m1 # Connect from client
$domain/bepr/user/aperocky # Connect from user
Uma vez conectado, o stdin/stdout do terminal bepr connect é canalizado para o shell do cliente selecionado. Os shells dos clientes são executados dentro de um PTY, enquanto o servidor é um roteador de bytes de passagem bruta. Vários clientes podem estar conectados ao servidor ao mesmo tempo, mas um único cliente pode ter apenas um usuário conectado por vez.
Em cada host cliente, gere um par de chaves:
ssh-keygen -t ed25519 -f /etc/bepr/client-keys/pi_zero
Copie a chave pública para o key_dir do servidor:
/etc/bepr/client-keys/pi_zero.pub -> client ID pi_zero on server
Crie a configuração do cliente. O ID do cliente na URL deve corresponder ao nome do arquivo de chave pública no 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
Inicie o serviço/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
O caminho legado domain/bepr/$name também é aceito para compatibilidade com versões anteriores de clientes antigos. Inicie o serviço da mesma forma que o servidor.
Observação: o cliente inicia um shell imediatamente ao se conectar ao servidor, não quando um usuário se conecta. O shell é executado persistentemente em segundo plano. Se você se conectar e encontrar o terminal em um estado ruim, execute stty sane. Se o shell em si estiver sem resposta, encerre-o pelo PID na máquina cliente — o cliente se reconectará automaticamente e iniciará um novo shell em até 10 segundos.
Para operar a partir de uma máquina remota sem fazer encaminhamento SSH do socket do servidor, use o modo usuário. No servidor, adicione um user_key_dir à configuração do 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
Copie a chave pública do usuário para o servidor:
/etc/bepr/user-keys/aperocky.pub -> user ID aperocky
Na máquina do usuário, crie uma configuração de usuário:
# cat ~/.config/bepr/user.conf
server = wss://server.example/bepr/user/aperocky
private_key_path = ~/.ssh/aperocky_user_ed25519
bepr list e bepr connect usarão esta configuração automaticamente, sem flags adicionais. Seus comandos fazem a ponte do servidor diretamente para os hosts clientes.
O binário bepr pode ser executado manualmente, sem serviço/empacotamento, com comandos e argumentos diretos:
./bepr server --config $server_config_path
./bepr client --config $client_config_path
./bepr connect --socket $socket_file_path $destination