
Mode de combat pour la liberté : harnais de hacking open source
FFM est un harnais de piratage que vous pouvez utiliser pendant la phase de post-exploitation d'un engagement de red teaming. L'idée de l'outil provient d'une conférence de 2007 de @thegrugq.
Il a été présenté au SSTIC 2018 (vidéo) et le jeu de diapositives correspondant est disponible à cette url. Si vous n'êtes pas familier avec cette classe d'outils, il est fortement conseillé de les consulter pour comprendre le but d'un harnais de piratage. Tous les commentaires sont inclus dans les diapositives.
Ce projet est distribué sous les termes de la licence GPL v3.
La documentation principale se trouve dans ce README et dans les modules de commandes sous commands/.
Les liens vers l'exposé SSTIC ci-dessus restent le meilleur aperçu de haut niveau sur la façon dont le harnais est censé être utilisé.
Du matériel supplémentaire de démonstration est disponible à :
ice-wzl a contribué des commandes, de la documentation et des refactorisations au cours de l'historique du projet.docker avec cet outil.Dockerfile dans ce dépôt réduira considérablement les erreurs potentielles rencontrées.Docker installé sur votre système local.git clone https://github.com/JusticeRage/FFM.git
cd /FFM
docker build Docker_Install/ -t ffm:ffm
docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/ffm ffm fb6dd17e3b91 9 minutes ago 614 MB
docker.io/library/ubuntu 22.04 3b418d7b466a 2 weeks ago 80.3 MB
#run your new container and drop into a /bin/bash prompt as root
docker run -it --entrypoint /bin/bash -u 0 fb6dd17e3b91
passwd) pour root et neosu neo et vous êtes prêt. git clone https://github.com/JusticeRage/FFM.git
cd /FFM
pip install -r requirements.txt
Le but d'un harnais de piratage est d'agir comme un assistant qui automatise les tâches courantes pendant la phase de post-exploitation, mais aussi de protéger l'utilisateur contre les erreurs qu'il pourrait commettre.
C'est une instrumentation du shell. Lancez ./ffm.py pour l'activer et vous pouvez commencer à travailler immédiatement. Les commandes sont réparties dans les petits modules sous commands/, avec commands/command_manager.py qui gère la découverte et l'enregistrement. Les groupes principaux sont l'énumération, l'aide, la furtivité, le transfert et l'exécution.
Il y a deux commandes que vous devez connaître :
!list pour afficher toutes les commandes fournies par le harnais.!list tags pour voir les différents tags sous lesquels les commandes peuvent être classées.!list tags
List of commands available:
enumeration
execution
help
stealth
transfer
!list enumeration (ou un autre tag) pour voir les commandes de cette catégorie.!list enumeration
List of commands available:
!backup-hunter: Hunts for backup files
!info: Returns CPU(s), Architecture, Memory, and Kernel Verison for the current machine.
!log: Toggles logging the harness' input and output to a file.
!mtime: Returns files modified in the last X minutes
!os: Prints the distribution of the current machine.
!db-hunter: Hunts for .sqlite, .sqlite3, and .db files
!sshkeys: Hunts for Private and Public SSH keys on the current machine.
!suid: Finds SUID, SGID binaries on the current machine.
--snip--
SHIFT+TAB pour effectuer une complétion par tabulation sur la machine locale. Cela peut être utile si vous êtes connecté en SSH à un ordinateur distant mais que vous devez référencer un fichier situé sur votre machine.Ce harnais de piratage offre quelques fonctionnalités décrites ci-dessous. Au fur et à mesure de leur description, la philosophie de conception derrière l'outil sera également introduite. Il n'est pas attendu que toutes les commandes implémentées dans FFM vous conviennent. Chacun a sa propre façon de faire, et adapter le harnais à vos besoins spécifiques nécessitera probablement de modifier une partie du code et/ou d'écrire quelques plugins. Beaucoup d'efforts ont été faits pour que cette tâche soit indolore.
!os est une commande extrêmement simple qui se contente d'exécuter cat /etc/*release* pour afficher le système d'exploitation de la machine courante. Elle est probablement plus utile comme démonstration que, dans le contexte d'un harnais de piratage, vous pouvez définir des alias qui fonctionnent à travers les limites des machines. Connectez-vous en SSH à n'importe quel ordinateur, tapez !os et la commande sera exécutée. Les commandes d'énumération se trouvent dans commands/enumeration_commands.py, les commandes d'aide dans commands/help_commands.py, et les commandes liées à la furtivité sont réparties entre commands/stealth_commands.py, commands/notty_sudo.py et commands/log_control.py.!backup-hunter Recherche les fichiers de sauvegarde.!info Retourne le(s) CPU, l'architecture, la mémoire et la version du noyau de la machine courante.!log Active ou désactive la journalisation des entrées et sorties du harnais dans un fichier. Implémenté dans .!download [fichier distant] [chemin local] récupère un fichier depuis la machine distante et le copie localement via le terminal. Cette commande est un peu plus complexe car une vérification d'erreur plus stricte est nécessaire, mais c'est une autre commande que vous pouvez facilement lire pour commencer. Elle se trouve dans commands/download_file.py. Notez qu'elle nécessite xxd ou od sur la machine distante pour fonctionner correctement.!download-dir [répertoire distant] [destination locale] streame une archive tar d'un répertoire distant à travers le terminal et l'extrait localement sans toucher au système de fichiers distant. Elle se trouve dans commands/download_directory.py. Elle nécessite tar et base64 sur la machine distante, et utilise aussi gzip si disponible.!upload [fichier local] [chemin distant] fonctionne exactement comme la commande précédente, sauf qu'un fichier local est placé sur la machine distante. Elle se trouve dans commands/upload_file.py.!sh [script local] Exécute un script shell depuis la machine locale en mémoire. Elle se trouve dans commands/remote_script.py.!py [script local] exécute un script Python local sur la machine distante, et ce entièrement en mémoire. Elle se trouve dans commands/remote_script.py. Consultez mon autre dépôt pour des scripts que vous pourriez vouloir utiliser. Cette commande utilise une syntaxe multiligne avec <<, ce qui signifie que les pseudo-shells qui ne la supportent pas (Weevely en est un bon exemple) casseront cette commande assez gravement.!py3 [script local] fait exactement la même chose pour les systèmes avec python3. Elle utilise le même module, commands/remote_script.py.!elf [script local] Exécute un exécutable depuis la machine locale en mémoire en utilisant n'importe quel interpréteur Python compatible disponible sur la machine distante. Elle se trouve dans commands/remote_elf.py.!pty génère un TTY, ce qui n'est pas souhaitable dans la plupart des cas car cela tend à laisser des traces médico-légales. Cependant, certaines commandes (sudo) ou exploits nécessitent un TTY pour fonctionner, donc cela est fourni comme une commodité. UNSET HISTFILE HISTFILESIZE HISTSIZE PROMPT_COMMAND lui est passé dès sa création, ainsi que export TERM=xterm!sudo Invoque sudo sans TTY. Elle se trouve dans commands/notty_sudo.py.Les plugins peuvent être configurés davantage en éditant ffm.conf.
Conceptuellement, les commandes (comme décrites ci-dessus) sont utilisées pour générer du bash qui est transmis au shell. Elles peuvent effectuer des opérations plus complexes en capturant la sortie du shell et en générant des instructions supplémentaires basées sur ce qui est retourné.
Les processeurs sont un peu différents car ils sont plutôt utilisés pour réécrire les données circulant entre l'utilisateur et le processus bash sous-jacent. Bien qu'il soit vrai que n'importe quel processeur pourrait être réécrit comme une commande, il a semblé plus propre de séparer les deux. Les processeurs d'entrée agissent sur ce qui est tapé par l'utilisateur lorsqu'il appuie sur la touche ENTRÉE, et les processeurs de sortie peuvent modifier tout ce qui est retourné par le shell.
processors/ssh_command_line.py. Tout ce qu'il fait est d'ajouter l'option -T à toute commande SSH qu'il voit si elle est manquante. Assurez-vous de consulter son code simple si vous êtes intéressé par l'écriture d'un processeur.processors/assert_torify.py, contient une liste noire de commandes réseau (ssh, nc) et les bloque si elles ne semblent pas être proxyfiées via un outil comme torify. Le harnais fait de son mieux pour ne déranger l'utilisateur que si la commande semble être exécutée sur la machine locale. Évidemment, cela ne devrait pas être votre seule protection contre la fuite de votre adresse IP personnelle.processors/sample_output_processor.py est un processeur de sortie très simple qui surligne en rouge toute occurrence du mot "password". Comme il est assez inutile, il n'est pas activé dans le framework mais vous pouvez toujours l'utiliser comme point de départ si vous voulez faire quelque chose de plus sophistiqué.CTRL+R n'est pas encore implémenté et nous le regrettons tous amèrement.
Plus problématique est le fait que le framework se bloque de temps en temps. Dans 99% des cas, cela se produit lorsqu'il ne parvient pas à détecter qu'une commande qu'il a lancée a fini de s'exécuter. Habituellement, cela signifie que l'invite de commande de la machine sur laquelle vous êtes connecté n'a pas pu être reconnue comme telle. Dans ce cas, vous pouvez essayer d'améliorer l'expression régulière située au tout début du fichier ffm.py, ou vous connecter à cette même machine avec ssh -T car il n'y aura alors plus d'invite problématique.
Par défaut, FFM abandonne la tentative de lire la sortie d'une commande après 5 minutes (certains plugins peuvent implémenter des délais différents) ; donc si le framework se bloque, vous devrez attendre jusqu'à voir un message d'erreur (bien que si le processus sous-jacent est toujours en cours, vous pourriez toujours ne pas pouvoir taper de commandes).
Je pense avoir couvert tout ce qui concerne cet outil. Encore une fois, il est un peu différent de ce que je publie habituellement car la plupart des gens devront probablement le modifier avant qu'il ne leur soit utile.
De nombreux plugins restent à écrire, alors assurez-vous de partager toute amélioration que vous apportez à FFM. N'hésitez pas à ouvrir des problèmes non seulement pour des bugs, mais aussi si vous essayez de faire quelque chose et que vous ne trouvez pas comment faire ; ainsi je pourrai améliorer la documentation pour tout le monde.
commands/log_control.py!mtime Retourne les fichiers modifiés dans les X dernières minutes. Par exemple !mtime 5 récupérera tous les fichiers sur la machine locale (auxquels vous avez accès) qui ont été modifiés dans les 5 dernières minutes.!db-hunter Recherche les fichiers .sqlite, .sqlite3, .db et autres fichiers de base de données.!sshkeys Recherche les clés SSH privées et publiques sur la machine courante.!suid Trouve les binaires SUID, SGID sur la machine courante.!strange-dirs Vérifie les répertoires étranges sur un hôte à partir d'un chemin spécifié par l'utilisateur.!sudo-version Vérifie une version vulnérable de sudo.!vm Vérifie si l'appareil est une machine virtuelle.