
Modo de Luta pela Liberdade: plataforma de hacking open source
FFM é um harness de hacking que você pode usar durante a fase de pós-exploração de um engajamento de red-teaming. A ideia da ferramenta foi derivada de uma conferência de 2007 do @thegrugq.
Foi apresentada no SSTIC 2018 (vídeo) e o deck de slides que a acompanha está disponível em esta url. Se você não estiver familiarizado com esta classe de ferramentas, é fortemente recomendado dar uma olhada nelas para entender qual é o propósito de um harness de hacking. Todos os comentários estão incluídos nos slides.
Este projeto é distribuído sob os termos da Licença GPL v3.
A documentação principal está neste README e nos módulos de comando em commands/.
A palestra do SSTIC mencionada acima continua sendo o melhor background de alto nível sobre como o harness deve ser usado.
Material adicional de walkthrough está disponível em:
ice-wzl contribuiu com comandos, documentação e refatorações durante a história do projeto.docker com esta ferramenta.Dockerfile neste repositório reduzirá drasticamente os erros em potencial encontrados.Docker instalado no seu sistema localgit 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
#execute seu novo contêiner e acesse um prompt /bin/bash como root
docker run -it --entrypoint /bin/bash -u 0 fb6dd17e3b91
passwd para root e neosu neo e agora você está pronto git clone https://github.com/JusticeRage/FFM.git
cd /FFM
pip install -r requirements.txt
O objetivo de um harness de hacking é atuar como um auxiliar que automatiza tarefas comuns durante a fase de pós-exploração, mas também protege o usuário contra erros que possa cometer.
É uma instrumentação do shell. Execute ./ffm.py para ativá-lo e você pode começar a trabalhar
imediatamente. Os comandos são distribuídos nos pequenos módulos em commands/, com
commands/command_manager.py lidando com descoberta e registro. Os principais grupos são
enumeração, ajuda, stealth, transferência e execução.
Existem dois comandos que você precisa conhecer:
!list para exibir todos os comandos fornecidos pelo harness.!list tags para ver as diferentes tags nas quais os comandos podem ser agrupados!list tags
Lista de comandos disponíveis:
enumeration
execution
help
stealth
transfer
!list enumeration (ou uma das outras tags) para ver comandos que se enquadram nessa categoria.!list enumeration
Lista de comandos disponíveis:
!backup-hunter: Caça por arquivos de backup
!info: Retorna CPU(s), Arquitetura, Memória e Versão do Kernel para a máquina atual.
!log: Alterna o registro (logging) da entrada e saída do harness para um arquivo.
!mtime: Retorna arquivos modificados nos últimos X minutos
!os: Exibe a distribuição da máquina atual.
!db-hunter: Caça por arquivos .sqlite, .sqlite3 e .db
!sshkeys: Caça por chaves SSH privadas e públicas na máquina atual.
!suid: Encontra binários SUID, SGID na máquina atual.
--snip--
SHIFT+TAB para realizar a conclusão com tab na máquina local. Isso pode ser útil se você estiver
conectado via SSH em um computador remoto, mas precisar referenciar um arquivo localizado na sua máquina.Este harness de hacking fornece algumas funcionalidades descritas abaixo. Conforme descritas, a filosofia de design por trás da ferramenta também será apresentada. Não se espera que todos os comandos implementados no FFM sejam adequados para você. Cada um tem sua própria maneira de fazer as coisas, e ajustar o harness à sua necessidade específica provavelmente exigirá que você modifique parte do código e/ou escreva alguns plugins. Muito esforço foi dedicado para garantir que esta seja uma tarefa indolor.
!os é um comando extremamente simples que apenas executa cat /etc/*release* para mostrar qual SO
a máquina atual está executando. Provavelmente é mais valioso como uma demonstração de que, no
contexto de um harness de hacking, você pode definir aliases que funcionam através dos limites das máquinas.
Conecte-se via SSH a qualquer computador, digite !os e o comando será executado. Os comandos de enumeração residem em
commands/enumeration_commands.py, os comandos de ajuda em commands/help_commands.py, e os
comandos relacionados a stealth estão divididos entre commands/stealth_commands.py,
commands/notty_sudo.py e commands/log_control.py.!backup-hunter Caça por arquivos de backup!info Retorna CPU(s), Arquitetura, Memória e Versão do Kernel para a máquina atual.!log Alterna o registro (logging) da entrada e saída do harness para um arquivo. Implementado em
.!download [arquivo remoto] [caminho local] obtém um arquivo da máquina remota e o copia
localmente através do terminal. Este comando é um pouco mais complexo porque uma verificação de erros mais rigorosa
é necessária, mas é outro comando que você pode ler facilmente para começar. Ele reside
em commands/download_file.py. Observe que requer xxd ou od na máquina remota para
funcionar corretamente.!download-dir [diretório remoto] [destino local] transmite um arquivo tar de um diretório remoto
através do terminal e o extrai localmente sem tocar no sistema de arquivos remoto.
Ele reside em commands/download_directory.py. Requer tar e base64 na máquina
remota, e também usa gzip quando disponível.!upload [arquivo local] [caminho remoto] funciona exatamente como o comando anterior,
exceto que um arquivo local é colocado na máquina remota. Ele reside em commands/upload_file.py.!sh [script local] Executa um script shell da máquina local na memória. Ele reside em
commands/remote_script.py.!py [script local] executa um script Python local na máquina remota, e o faz
inteiramente na memória. Ele reside em commands/remote_script.py. Confira meu
outro repositório para scripts que você pode
querer usar. Este comando usa uma sintaxe multilinha com <<, o que significa que pseudo-shells
que não suportam isso (Weevely é um bom exemplo) quebrarão este comando bastante.!py3 [script local] faz exatamente a mesma coisa, exceto para sistemas com python3. Ele usa o mesmo módulo, commands/remote_script.py.!elf [script local] Executa um executável da máquina local na memória usando qualquer interpretador Python compatível disponível na máquina remota. Ele reside em commands/remote_elf.py.!pty gera um TTY, que é algo que você não quer na maioria dos casos porque tende a
deixar evidências forenses. No entanto, alguns comandos (sudo) ou exploits exigem um TTY para serem executados,
então isso é fornecido como uma conveniência. UNSET HISTFILE HISTFILESIZE HISTSIZE PROMPT_COMMAND é passado para ele assim que
é gerado, junto com export TERM=xterm!sudo Invoca o sudo sem um TTY. Ele reside em commands/notty_sudo.py.Plugins podem ser ainda mais configurados editando ffm.conf.
Conceitualmente, comandos (conforme descritos acima) são usados para gerar um pouco de bash que é encaminhado
para o shell. Eles podem realizar operações mais complexas capturando a saída do shell e
gerando instruções adicionais com base no que é retornado.
Processadores são um pouco diferentes, pois são usados para reescrever dados circulando entre
o usuário e o processo bash subjacente. Embora seja verdade que qualquer processador poderia ser reescrito
como um comando, pareceu um pouco mais limpo separar os dois. Processadores de entrada trabalham em qualquer coisa
digitada pelo usuário assim que pressionam a tecla ENTER, e processadores de saída podem modificar qualquer coisa
retornada pelo shell.
processors/ssh_command_line.py. Tudo o que ele faz é adicionar
a opção -T a qualquer comando SSH que ele veja se estiver faltando. Certifique-se de verificar seu código
simples se você estiver interessado em escrever um processador.processors/assert_torify.py, contém uma
lista negra de comandos de rede (ssh, nc) e os bloqueia se eles não parecerem estar sendo proxyados
através de uma ferramenta como torify. O harness faz o possível para incomodar o usuário apenas se parecer
que o comando está sendo executado na máquina local. Obviamente, isso não deve ser sua única
salvaguarda contra vazar seu endereço IP residencial.processors/sample_output_processor.py é um processador de saída muito simples que
destaca em vermelho qualquer ocorrência da palavra "password". Como é bastante inútil, não está habilitado
no framework, mas você ainda pode usá-lo como ponto de partida se quiser fazer algo mais
sofisticado.CTRL+R ainda não foi implementado e todos sentimos muita falta dele.
Mais problemático é o fato de que o framework trava de vez em quando. Em 99% dos casos,
isso acontece quando ele falha em detectar que um comando que lançou terminou de executar. Geralmente,
isso significa que o prompt de comando da máquina na qual você está logado não pôde ser reconhecido
como tal. Nesse caso, você pode tentar melhorar a expressão regular localizada bem no
início do arquivo ffm.py, ou fazer login na mesma máquina com ssh -T, pois não haverá
mais nenhum prompt problemático.
Por padrão, o FFM desistirá de tentar ler a saída de um comando após 5 minutos (alguns
plugins podem implementar timeouts diferentes); portanto, se o framework travar, você precisará esperar
até ver uma mensagem de erro (embora se o processo subjacente ainda estiver em execução, você pode
ainda não conseguir digitar comandos).
Acho que cobri tudo sobre esta ferramenta. Novamente, é um pouco diferente do que eu costumo lançar, pois a maioria das pessoas provavelmente precisará modificá-lo antes que possa ser valioso para elas.
Muitos plugins ainda precisam ser escritos, portanto, certifique-se de compartilhar quaisquer melhorias que você fizer no FFM. Sinta-se à vontade para abrir issues não apenas para bugs, mas também se você estiver tentando fazer algo e não conseguir descobrir como; assim poderei melhorar a documentação para todos.
commands/log_control.py!mtime Retorna arquivos modificados nos últimos X minutos. Por exemplo, !mtime 5 obterá todos os arquivos na máquina local (aos quais você tem direitos de ver) que foram modificados nos últimos 5 minutos.!db-hunter Caça por arquivos .sqlite, .sqlite3 e .db e outros arquivos de banco de dados!sshkeys Caça por chaves SSH privadas e públicas na máquina atual.!suid Encontra binários SUID, SGID na máquina atual.!strange-dirs Verifica o dispositivo começando pelo caminho especificado pelo usuário em busca de diretórios estranhos em um host!sudo-version Verifica se há uma versão vulnerável do sudo!vm Verifica se o dispositivo é uma Máquina Virtual