
Modalità Lotta per la Libertà: imbracatura di hacking open source
FFM è un'imbracatura di hacking che puoi utilizzare durante la fase di post-sfruttamento di un impegno di red-teaming. L'idea dello strumento è stata derivata da una conferenza del 2007 di @thegrugq.
È stato presentato al SSTIC 2018 (video) e le diapositive di accompagnamento sono disponibili a questo URL. Se non hai familiarità con questa classe di strumenti, è fortemente consigliato dare un'occhiata per capire qual è lo scopo di un'imbracatura di hacking. Tutti i commenti sono inclusi nelle diapositive.
Questo progetto è distribuito secondo i termini della Licenza GPL v3.
La documentazione principale vive in questo README e nei moduli dei comandi sotto commands/.
I collegamenti all'intervento SSTIC sopra rimangono il miglior background di alto livello su come l'imbracatura è pensata per essere utilizzata.
Materiale aggiuntivo per walkthrough è disponibile su:
ice-wzl ha contribuito con comandi, documentazione e refactoring durante la storia del progetto.docker con questo strumento.Dockerfile in questo repository ridurrà drasticamente i potenziali errori incontrati.Docker installato sul tuo sistema localegit 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
#esegui il tuo nuovo contenitore e accedi a un prompt /bin/bash come root
docker run -it --entrypoint /bin/bash -u 0 fb6dd17e3b91
passwd per root e neosu neo e ora sei prontogit clone https://github.com/JusticeRage/FFM.git
cd /FFM
pip install -r requirements.txt
L'obiettivo di un'imbracatura di hacking è agire come un assistente che automatizza compiti comuni durante la fase di post-sfruttamento, ma anche proteggere l'utente da errori che potrebbe commettere.
È una strumentazione della shell. Esegui ./ffm.py per attivarla e puoi iniziare a lavorare immediatamente. I comandi sono suddivisi tra i piccoli moduli sotto commands/, con commands/command_manager.py che gestisce l'individuazione e la registrazione. I gruppi principali sono enumeration, help, stealth, transfer ed execution.
Ci sono due comandi che devi conoscere:
!list per visualizzare tutti i comandi forniti dall'imbracatura.!list tags per vedere i diversi tag sotto cui i comandi possono essere raggruppati!list tags
List of commands available:
enumeration
execution
help
stealth
transfer
!list enumeration (o uno degli altri tag) per vedere i comandi che rientrano in quella categoria.!list enumeration
List of commands available:
!backup-hunter: Cerca file di backup
!info: Restituisce CPU, Architettura, Memoria e Versione del Kernel per la macchina corrente.
!log: Attiva/disattiva la registrazione dell'input e dell'output dell'imbracatura su un file.
!mtime: Restituisce i file modificati negli ultimi X minuti
!os: Stampa la distribuzione della macchina corrente.
!db-hunter: Cerca file .sqlite, .sqlite3 e .db
!sshkeys: Cerca chiavi SSH private e pubbliche sulla macchina corrente.
!suid: Trova binari SUID, SGID sulla macchina corrente.
--snip--
SHIFT+TAB per eseguire il completamento tramite tab sulla macchina locale. Questo potrebbe essere utile se sei connesso tramite ssh a un computer remoto ma hai bisogno di fare riferimento a un file che si trova sulla tua macchina.Questa imbracatura di hacking fornisce alcune funzionalità descritte di seguito. Man mano che vengono descritte, verrà introdotta anche la filosofia di progettazione alla base dello strumento. Non ci si aspetta che tutti i comandi implementati in FFM siano adatti a te. Ognuno ha il suo modo di fare le cose, e personalizzare l'imbracatura per le tue esigenze specifiche richiederà probabilmente di modificare parte del codice e/o scrivere alcuni plugin. È stato fatto un grande sforzo per garantire che questo sia un compito indolore.
!os è un comando estremamente semplice che esegue cat /etc/*release* per mostrare quale sistema operativo sta eseguendo la macchina corrente. È probabilmente più utile come dimostrazione che nel contesto di un'imbracatura di hacking, puoi definire alias che funzionano attraverso i confini delle macchine. Collegati via SSH a qualsiasi computer, digita !os e il comando verrà eseguito. I comandi di enumerazione vivono in commands/enumeration_commands.py, i comandi di aiuto in commands/help_commands.py, e i comandi relativi alla stealth sono suddivisi tra commands/stealth_commands.py, commands/notty_sudo.py e commands/log_control.py.!backup-hunter Cerca file di backup!info Restituisce CPU, Architettura, Memoria e Versione del Kernel per la macchina corrente.!log Attiva/disattiva la registrazione dell'input e dell'output dell'imbracatura su un file. Implementato in .!download [file remoto] [percorso locale] preleva un file dalla macchina remota e lo copia localmente attraverso il terminale. Questo comando è un po' più complesso perché sono necessari controlli degli errori più rigorosi, ma è un altro comando che puoi facilmente leggere per iniziare. Vive in commands/download_file.py. Nota che richiede xxd o od sulla macchina remota per funzionare correttamente.!download-dir [directory remota] [destinazione locale] trasmette un archivio tar di una directory remota attraverso il terminale e lo estrae localmente senza toccare il filesystem remoto. Vive in commands/download_directory.py. Richiede tar e base64 sulla macchina remota, e usa anche gzip quando disponibile.!upload [file locale] [percorso remoto] funziona esattamente come il comando precedente, tranne che un file locale viene messo sulla macchina remota. Vive in commands/upload_file.py.!sh [script locale] Esegue uno script shell dalla macchina locale in memoria. Vive in commands/remote_script.py.!py [script locale] esegue uno script Python locale sulla macchina remota, e lo fa interamente in memoria. Vive in commands/remote_script.py. Dai un'occhiata al mio altro repository per script che potresti voler usare. Questo comando usa una sintassi multilinea con <<, il che significa che pseudoshell che non la supportano (Weevely è un buon esempio) romperanno questo comando piuttosto male.!py3 [script locale] fa esattamente la stessa cosa tranne che per sistemi con python3. Usa lo stesso modulo, commands/remote_script.py.!elf [script locale] Esegue un eseguibile dalla macchina locale in memoria usando qualunque interprete Python compatibile sia disponibile sulla macchina remota. Vive in commands/remote_elf.py.!pty genera un TTY, cosa che non vuoi nella maggior parte dei casi perché tende a lasciare tracce forensi. Tuttavia, alcuni comandi (sudo) o exploit richiedono un TTY per essere eseguiti, quindi è fornito per comodità. UNSET HISTFILE HISTFILESIZE HISTSIZE PROMPT_COMMAND viene passato non appena viene generato, insieme a export TERM=xterm.!sudo Invoca sudo senza un TTY. Vive in commands/notty_sudo.py.I plugin possono essere ulteriormente configurati modificando ffm.conf.
Concettualmente, i comandi (come descritti sopra) sono usati per generare del bash che viene inoltrato alla shell. Possono eseguire operazioni più complesse catturando l'output della shell e generando istruzioni aggiuntive in base a ciò che viene restituito.
I processori sono un po' diversi in quanto vengono piuttosto usati per riscrivere i dati che circolano tra l'utente e il processo bash sottostante. Sebbene sia vero che qualsiasi processore potrebbe essere riscritto come comando, è sembrato più pulito separare i due. I processori di input lavorano su ciò che viene digitato dall'utente una volta che premono il tasto ENTER, e i processori di output possono modificare qualsiasi cosa restituita dalla shell.
processors/ssh_command_line.py. Tutto ciò che fa è aggiungere l'opzione -T a qualsiasi comando SSH che vede se è mancante. Assicurati di dare un'occhiata al suo semplice codice se sei interessato a scrivere un processore.processors/assert_torify.py, contiene una lista nera di comandi di rete (ssh, nc) e li blocca se non sembrano essere proxyati attraverso uno strumento come torify. L'imbracatura fa del suo meglio per infastidire l'utente solo se sembra che il comando sia in esecuzione sulla macchina locale. Ovviamente questa non dovrebbe essere la tua unica salvaguardia contro la fuga del tuo indirizzo IP di casa.processors/sample_output_processor.py è un processore di output molto semplice che evidenzia in rosso qualsiasi occorrenza della parola "password". Poiché è piuttosto inutile, non è abilitato nel framework ma puoi comunque usarlo come punto di partenza se vuoi fare qualcosa di più sofisticato.CTRL+R non è ancora implementato e ci manca tutti moltissimo.
Più problematico è il fatto che il framework si blocca di tanto in tanto. Nel 99% dei casi, ciò accade quando non riesce a rilevare che un comando che ha lanciato ha terminato l'esecuzione. Di solito, ciò significa che il prompt dei comandi della macchina su cui sei loggato non è stato riconosciuto come tale. In tal caso, puoi provare a migliorare l'espressione regolare situata all'inizio del file ffm.py, o accedere alla stessa macchina con ssh -T poiché non ci sarà più un prompt problematico.
Per impostazione predefinita, FFM rinuncia a leggere l'output di un comando dopo 5 minuti (alcuni plugin potrebbero implementare timeout diversi); quindi se il framework si blocca, dovrai aspettare fino a vedere un messaggio di errore (anche se il processo sottostante è ancora in esecuzione, potresti comunque non essere in grado di digitare comandi).
Penso di aver coperto tutto su questo strumento. Ancora una volta, è un po' diverso da ciò che rilascio di solito poiché la maggior parte delle persone probabilmente dovrà modificarlo prima che possa essere di valore per loro.
Molti plugin devono ancora essere scritti, quindi assicurati di condividere qualsiasi miglioramento apporti a FFM. Sentiti libero di aprire issue non solo per bug, ma anche se stai cercando di fare qualcosa e non riesci a capire come; in questo modo potrò migliorare la documentazione per tutti.
commands/log_control.py!mtime Restituisce i file modificati negli ultimi X minuti. Ad esempio !mtime 5 otterrà tutti i file sulla macchina locale (a cui hai diritto di vedere) che sono stati modificati negli ultimi 5 minuti.!db-hunter Cerca file .sqlite, .sqlite3 e .db e altri file di database!sshkeys Cerca chiavi SSH private e pubbliche sulla macchina corrente.!suid Trova binari SUID, SGID sulla macchina corrente.!strange-dirs Controlla il dispositivo a partire dal percorso specificato dall'utente per directory strane su un host!sudo-version Controlla una versione vulnerabile di sudo!vm Controlla se il dispositivo è una macchina virtuale