
Freedom Fighting Mode: Open-Source-Hacking-Werkzeugsammlung
FFM ist ein Hacking-Harness, den Sie während der Post-Exploitation-Phase eines Red-Teaming-Einsatzes verwenden können. Die Idee des Tools stammt von einer Konferenz von 2007 von @thegrugq.
Es wurde auf der SSTIC 2018 präsentiert (Video) und der dazugehörige Foliensatz ist unter dieser URL verfügbar. Wenn Sie mit dieser Art von Werkzeugen nicht vertraut sind, wird dringend empfohlen, sie sich anzusehen, um den Zweck eines Hacking-Harness zu verstehen. Alle Kommentare sind in den Folien enthalten.
Dieses Projekt wird unter den Bedingungen der GPL v3 Lizenz vertrieben.
Die primäre Dokumentation befindet sich in dieser README und den Befehlsmodulen unter commands/. Die oben genannten SSTIC-Vortragslinks bleiben der beste übergeordnete Hintergrund zur Verwendung des Harness. Zusätzliches Walkthrough-Material ist verfügbar unter:
ice-wzl hat im Laufe der Projektgeschichte Befehle, Dokumentation und Refactorings beigetragen.docker mit diesem Tool zu verwenden.Dockerfile in diesem Repository wird potenzielle Fehler drastisch reduzieren.Docker auf Ihrem lokalen System installiert istgit 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 für root und neosu neo und schon sind Sie bereit git clone https://github.com/JusticeRage/FFM.git
cd /FFM
pip install -r requirements.txt
Das Ziel eines Hacking-Harness ist es, als Helfer zu fungieren, der häufige Aufgaben während der Post-Exploitation-Phase automatisiert, aber auch den Benutzer vor Fehlern schützt, die er machen könnte.
Es ist eine Instrumentierung der Shell. Führen Sie ./ffm.py aus, um es zu aktivieren, und Sie können sofort mit der Arbeit beginnen. Die Befehle sind auf die kleinen Module unter commands/ verteilt, wobei commands/command_manager.py die Erkennung und Registrierung übernimmt. Die Hauptgruppen sind Enumeration, Hilfe, Stealth, Transfer und Ausführung.
Es gibt zwei Befehle, die Sie kennen müssen:
!list ein, um alle vom Harness bereitgestellten Befehle anzuzeigen.!list tags ein, um die verschiedenen Tags zu sehen, unter denen Befehle kategorisiert werden können.!list tags
List of commands available:
enumeration
execution
help
stealth
transfer
!list enumeration (oder eines der anderen Tags) eingeben, um Befehle zu sehen, die in diese Kategorie fallen.!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, um die Tab-Vervollständigung auf dem lokalen Rechner durchzuführen. Dies kann nützlich sein, wenn Sie per SSH auf einem entfernten Computer angemeldet sind, aber auf eine Datei auf Ihrem eigenen Rechner verweisen müssen.Dieser Hacking-Harness bietet einige Funktionen, die unten beschrieben werden. Dabei wird auch die Designphilosophie hinter dem Tool vorgestellt. Es wird nicht erwartet, dass alle in FFM implementierten Befehle für Sie geeignet sind. Jeder hat seine eigene Arbeitsweise, und die Anpassung des Harness an Ihre spezifischen Bedürfnisse erfordert wahrscheinlich, dass Sie etwas Code ändern und/oder ein paar Plugins schreiben. Es wurde viel Mühe darauf verwendet, dass dies eine schmerzlose Aufgabe ist.
!os ist ein extrem einfacher Befehl, der lediglich cat /etc/*release* ausführt, um das Betriebssystem des aktuellen Rechners anzuzeigen. Er ist wahrscheinlich am wertvollsten als Demonstration, dass man im Kontext eines Hacking-Harness Aliase definieren kann, die maschinenübergreifend funktionieren. SSHen Sie sich auf einen beliebigen Computer, geben Sie !os ein und der Befehl wird ausgeführt. Die Enumeration-Befehle befinden sich in commands/enumeration_commands.py, die Hilfe-Befehle in commands/help_commands.py und die Stealth-Befehle sind auf commands/stealth_commands.py, commands/notty_sudo.py und commands/log_control.py verteilt.!backup-hunter Sucht nach Sicherungsdateien!info Gibt CPU(s), Architektur, Arbeitsspeicher und Kernelversion des aktuellen Rechners zurück.!log Schaltet die Protokollierung der Harness-Ein- und Ausgabe in eine Datei um. Implementiert in .!download [entfernte Datei] [lokaler Pfad] holt eine Datei vom entfernten Rechner und kopiert sie lokal über das Terminal. Dieser Befehl ist etwas komplexer, da eine strengere Fehlerprüfung erforderlich ist, aber es ist ein weiterer Befehl, den Sie leicht lesen können, um loszulegen. Er befindet sich in commands/download_file.py. Beachten Sie, dass er xxd oder od auf dem entfernten Rechner benötigt, um ordnungsgemäß zu funktionieren.!download-dir [entferntes Verzeichnis] [lokales Ziel] streamt ein tar-Archiv eines entfernten Verzeichnisses über das Terminal und extrahiert es lokal, ohne das entfernte Dateisystem zu berühren. Es befindet sich in commands/download_directory.py. Es benötigt tar und base64 auf dem entfernten Rechner und verwendet zusätzlich gzip, wenn verfügbar.!upload [lokale Datei] [entfernter Pfad] funktioniert genauso wie der vorherige Befehl, nur dass eine lokale Datei auf den entfernten Rechner gelegt wird. Er befindet sich in commands/upload_file.py.!sh [lokales Skript] Führt ein Shell-Skript vom lokalen Rechner im Speicher aus. Es befindet sich in commands/remote_script.py.!py [lokales Skript] führt ein lokales Python-Skript auf dem entfernten Rechner aus, und zwar vollständig im Speicher. Es befindet sich in commands/remote_script.py. Schauen Sie sich mein anderes Repository für Skripte an, die Sie verwenden möchten. Dieser Befehl verwendet eine mehrzeilige Syntax mit <<, was bedeutet, dass Pseudo-Shells, die dies nicht unterstützen (Weevely ist ein gutes Beispiel), diesen Befehl ziemlich stark beeinträchtigen.!py3 [lokales Skript] macht genau dasselbe, nur für Systeme mit Python3. Es verwendet dasselbe Modul, commands/remote_script.py.!elf [lokales Skript] Führt eine ausführbare Datei vom lokalen Rechner im Speicher aus, wobei jeder kompatible Python-Interpreter auf dem entfernten Rechner verwendet wird. Es befindet sich in commands/remote_elf.py.!pty erzeugt ein TTY, was man in den meisten Fällen nicht möchte, da es forensische Spuren hinterlässt. Einige Befehle (sudo) oder Exploits erfordern jedoch ein TTY, daher wird dies als Annehmlichkeit bereitgestellt. UNSET HISTFILE HISTFILESIZE HISTSIZE PROMPT_COMMAND wird ihm sofort beim Erzeugen übergeben, zusammen mit export TERM=xterm.!sudo Ruft sudo ohne TTY auf. Es befindet sich in commands/notty_sudo.py.Plugins können durch Bearbeiten von ffm.conf weiter konfiguriert werden.
Konzeptionell werden Befehle (wie oben beschrieben) verwendet, um etwas Bash zu generieren, das an die Shell weitergeleitet wird. Sie können komplexere Operationen durchführen, indem sie die Ausgabe der Shell erfassen und basierend auf dem Zurückgegebenen zusätzliche Anweisungen generieren. Prozessoren sind etwas anders, da sie eher dazu verwendet werden, Daten umzuschreiben, die zwischen dem Benutzer und dem zugrunde liegenden Bash-Prozess zirkulieren. Es stimmt zwar, dass jeder Prozessor als Befehl neu geschrieben werden könnte, es schien aber sauberer, die beiden zu trennen. Eingabeprozessoren arbeiten mit dem, was der Benutzer nach Drücken der ENTER-Taste eingibt, und Ausgabeprozessoren können alles ändern, was die Shell zurückgibt.
processors/ssh_command_line.py. Es fügt lediglich die Option -T zu jedem SSH-Befehl hinzu, den es sieht, falls sie fehlt. Schauen Sie sich unbedingt seinen einfachen Code an, wenn Sie daran interessiert sind, einen Prozessor zu schreiben.processors/assert_torify.py, enthält eine Blacklist von Netzwerkbefehlen (ssh, nc) und blockiert sie, wenn sie nicht über ein Tool wie torify weitergeleitet zu werden scheinen. Der Harness bemüht sich, den Benutzer nur dann zu belästigen, wenn es den Anschein hat, dass der Befehl auf dem lokalen Rechner ausgeführt wird. Offensichtlich sollte dies nicht Ihre einzige Sicherheitsmaßnahme gegen das Durchsickern Ihrer Heim-IP-Adresse sein.processors/sample_output_processor.py ein sehr einfacher Ausgabeprozessor, der jedes Vorkommen des Wortes 'password' rot hervorhebt. Da es ziemlich nutzlos ist, ist es im Framework nicht aktiviert, aber Sie können es dennoch als Ausgangspunkt verwenden, wenn Sie etwas Anspruchsvolleres tun möchten.CTRL+R ist noch nicht implementiert und wir vermissen es alle sehr.
Problematischer ist die Tatsache, dass das Framework von Zeit zu Zeit hängt. In 99% der Fälle geschieht dies, wenn es nicht erkennt, dass ein von ihm gestarteter Befehl die Ausführung beendet hat. Normalerweise bedeutet dies, dass die Eingabeaufforderung des Rechners, bei dem Sie angemeldet sind, nicht als solche erkannt werden konnte. In diesem Fall können Sie versuchen, den regulären Ausdruck am Anfang der Datei ffm.py zu verbessern, oder sich mit ssh -T auf demselben Rechner anmelden, da es dann keine problematische Eingabeaufforderung mehr gibt. Standardmäßig gibt FFM nach 5 Minuten auf, die Ausgabe eines Befehls zu lesen (einige Plugins können andere Timeouts implementieren); wenn das Framework also hängt, müssen Sie warten, bis Sie eine Fehlermeldung sehen (obwohl Sie möglicherweise immer noch keine Befehle eingeben können, wenn der zugrunde liegende Prozess noch läuft).
Ich denke, ich habe alles über dieses Tool abgedeckt. Noch einmal, es ist etwas anders als das, was ich normalerweise veröffentliche, da die meisten Leute es wahrscheinlich anpassen müssen, bevor es für sie nützlich sein kann.
Viele Plugins müssen noch geschrieben werden, also teilen Sie unbedingt alle Verbesserungen mit, die Sie an FFM vornehmen. Zögern Sie nicht, Issues zu eröffnen, nicht nur für Fehler, sondern auch, wenn Sie versuchen, etwas zu tun und nicht herausfinden, wie; auf diese Weise kann ich die Dokumentation für alle verbessern.
commands/log_control.py!mtime Gibt Dateien zurück, die in den letzten X Minuten geändert wurden. Beispiel: !mtime 5 zeigt alle Dateien auf dem lokalen Rechner (die Sie sehen dürfen), die in den letzten 5 Minuten geändert wurden.!db-hunter Sucht nach .sqlite-, .sqlite3- und .db-Dateien sowie anderen Datenbankdateien!sshkeys Sucht nach privaten und öffentlichen SSH-Schlüsseln auf dem aktuellen Rechner.!suid Findet SUID-, SGID-Binärdateien auf dem aktuellen Rechner.!strange-dirs Überprüft das Gerät ab einem benutzerdefinierten Pfad auf seltsame Verzeichnisse auf einem Host!sudo-version Prüft auf eine anfällige sudo-Version!vm Überprüft, ob das Gerät eine virtuelle Maschine ist