
Modo de lucha por la libertad: arnés de hacking de código abierto
FFM es un arnés de hacking que puedes usar durante la fase de post-explotación de un compromiso de red team. La idea de la herramienta se derivó de una conferencia de 2007 de @thegrugq.
Se presentó en SSTIC 2018 (video) y la presentación de diapositivas adjunta está disponible en esta url. Si no estás familiarizado con esta clase de herramientas, se recomienda encarecidamente echarles un vistazo para entender cuál es el propósito de un arnés de hacking. Todos los comentarios están incluidos en las diapositivas.
Este proyecto se distribuye bajo los términos de la Licencia GPL v3.
La documentación principal reside en este README y los módulos de comandos bajo commands/.
La charla de SSTIC enlazada arriba sigue siendo el mejor contexto de alto nivel sobre cómo se pretende usar el arnés.
Material adicional de tutoriales está disponible en:
ice-wzl contribuyó comandos, documentación y refactorizaciones durante la historia del proyecto.docker con esta herramienta.Dockerfile en este repositorio reducirá drásticamente los posibles errores encontrados.Docker instalado en tu 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
# Ejecuta tu nuevo contenedor y accede a un prompt de /bin/bash como root
docker run -it --entrypoint /bin/bash -u 0 fb6dd17e3b91
passwd para root y neosu neo y ya estás listo git clone https://github.com/JusticeRage/FFM.git
cd /FFM
pip install -r requirements.txt
El objetivo de un arnés de hacking es actuar como un asistente que automatiza tareas comunes durante la fase de post-explotación, pero también proteger al usuario de errores que pueda cometer.
Es una instrumentación del shell. Ejecuta ./ffm.py para activarlo y puedes empezar a trabajar
inmediatamente. Los comandos están distribuidos en los pequeños módulos bajo commands/, con
commands/command_manager.py manejando el descubrimiento y registro. Los grupos principales son
enumeración, ayuda, sigilo, transferencia y ejecución.
Hay dos comandos que necesitas conocer:
!list para mostrar todos los comandos proporcionados por el arnés.!list tags para ver las diferentes etiquetas bajo las que se pueden clasificar los comandos!list tags
Lista de comandos disponibles:
enumeration
execution
help
stealth
transfer
!list enumeration (o cualquiera de las otras etiquetas) para ver comandos que pertenecen a esa categoría.!list enumeration
Lista de comandos disponibles:
!backup-hunter: Busca archivos de respaldo
!info: Devuelve CPU(s), Arquitectura, Memoria y Versión del Kernel de la máquina actual.
!log: Activa/desactiva el registro de la entrada y salida del arnés en un archivo.
!mtime: Devuelve archivos modificados en los últimos X minutos
!os: Muestra la distribución de la máquina actual.
!db-hunter: Busca archivos .sqlite, .sqlite3 y .db
!sshkeys: Busca claves SSH privadas y públicas en la máquina actual.
!suid: Encuentra binarios SUID, SGID en la máquina actual.
--snip--
SHIFT+TAB para realizar autocompletado en la máquina local. Esto puede ser útil si estás
conectado por SSH a una computadora remota pero necesitas hacer referencia a un archivo que está en tu máquina.Este arnés de hacking proporciona algunas características que se describen a continuación. Mientras se describen, también se introducirá la filosofía de diseño detrás de la herramienta. No se espera que todos los comandos implementados en FFM te sirvan. Cada uno tiene su propia forma de hacer las cosas, y ajustar el arnés a tus necesidades específicas probablemente requerirá que modifiques parte del código y/o escribas algunos plugins. Se ha trabajado mucho para asegurar que esto sea una tarea sin dolor.
!os es un comando extremadamente simple que solo ejecuta cat /etc/*release* para mostrar qué SO
está ejecutando la máquina actual. Probablemente es más valioso como demostración de que, en el
contexto de un arnés de hacking, puedes definir alias que funcionan a través de los límites de las máquinas.
Conéctate por SSH a cualquier computadora, escribe !os y el comando se ejecutará. Los comandos de enumeración viven en
commands/enumeration_commands.py, los comandos de ayuda en commands/help_commands.py, y los
comandos relacionados con el sigilo están distribuidos entre commands/stealth_commands.py,
commands/notty_sudo.py y commands/log_control.py.!backup-hunter Busca archivos de respaldo!info Devuelve CPU(s), Arquitectura, Memoria y Versión del Kernel de la máquina actual.!log Activa/desactiva el registro de la entrada y salida del arnés en un archivo. Implementado en
.!download [archivo remoto] [ruta local] obtiene un archivo de la máquina remota y lo copia
localmente a través del terminal. Este comando es un poco más complejo porque se requiere una verificación de errores más estricta, pero es otro comando que puedes leer fácilmente para empezar. Vive en
commands/download_file.py. Ten en cuenta que requiere xxd u od en la máquina remota para
funcionar correctamente.!download-dir [directorio remoto] [destino local] transmite un archivo tar de un directorio
remoto a través del terminal y lo extrae localmente sin tocar el sistema de archivos remoto.
Vive en commands/download_directory.py. Requiere tar y base64 en la máquina
remota, y también usa gzip cuando está disponible.!upload [archivo local] [ruta remota] funciona exactamente igual que el comando anterior,
excepto que se coloca un archivo local en la máquina remota. Vive en commands/upload_file.py.!sh [script local] Ejecuta un script de shell desde la máquina local en memoria. Vive en
commands/remote_script.py.!py [script local] ejecuta un script Python local en la máquina remota, y lo hace
enteramente en memoria. Vive en commands/remote_script.py. Echa un vistazo a mi
otro repositorio para scripts que podrías
querer usar. Este comando utiliza una sintaxis multilínea con <<, lo que significa que los pseudo-shells
que no lo soportan (Weevely es un buen ejemplo) romperán este comando bastante mal.!py3 [script local] hace exactamente lo mismo excepto para sistemas con python3. Usa el mismo módulo, commands/remote_script.py.!elf [script local] Ejecuta un ejecutable desde la máquina local en memoria usando el intérprete Python compatible que esté disponible en la máquina remota. Vive en commands/remote_elf.py.!pty genera un TTY, algo que no quieres en la mayoría de los casos porque tiende a
dejar evidencia forense. Sin embargo, algunos comandos (sudo) o exploits requieren un TTY para
ejecutarse, así que esto se proporciona por conveniencia. UNSET HISTFILE HISTFILESIZE HISTSIZE PROMPT_COMMAND se le pasa en cuanto se
genera, junto con export TERM=xterm!sudo Invoca sudo sin un TTY. Vive en commands/notty_sudo.py.Los plugins se pueden configurar más editando ffm.conf.
Conceptualmente, los comandos (como se describen arriba) se utilizan para generar algo de bash que se reenvía
al shell. Pueden realizar operaciones más complejas capturando la salida del shell y
generando instrucciones adicionales basadas en lo que se devuelve.
Los procesadores son un poco diferentes, ya que se utilizan más bien para reescribir datos que circulan entre
el usuario y el proceso bash subyacente. Si bien es cierto que cualquier procesador podría reescribirse
como un comando, parecía un poco más limpio separarlos. Los procesadores de entrada trabajan sobre lo que
el usuario escribe una vez que presiona la tecla ENTER, y los procesadores de salida pueden modificar cualquier cosa
devuelta por el shell.
processors/ssh_command_line.py. Todo lo que hace es agregar
la opción -T a cualquier comando SSH que vea si falta. Asegúrate de revisar su simple
código si estás interesado en escribir un procesador.processors/assert_torify.py, contiene una
lista negra de comandos de red (ssh, nc) y los bloquea si no parecen estar siendo proxyficados
a través de una herramienta como torify. El arnés hace todo lo posible para solo molestar al usuario si parece
que el comando se está ejecutando en la máquina local. Obviamente, esto no debería ser tu única
salvaguarda contra filtrar tu dirección IP de casa.processors/sample_output_processor.py es un procesador de salida muy simple que
resalta en rojo cualquier ocurrencia de la palabra "password". Como es bastante inútil, no está habilitado
en el framework, pero aún puedes usarlo como punto de partida si quieres hacer algo más
sofisticado.CTRL+R aún no está implementado y todos lo extrañamos mucho.
Más problemático es el hecho de que el framework se cuelga de vez en cuando. En el 99% de los casos,
esto ocurre cuando no logra detectar que un comando que lanzó ha terminado de ejecutarse. Por lo general,
esto significa que el prompt de comando de la máquina en la que has iniciado sesión no pudo ser reconocido
como tal. En ese caso, puedes intentar mejorar la expresión regular ubicada al comienzo
del archivo ffm.py, o iniciar sesión en esa misma máquina con ssh -T ya que no habrá
ningún prompt problemático.
Por defecto, FFM se rendirá al intentar leer la salida de un comando después de 5 minutos (algunos
plugins pueden implementar tiempos de espera diferentes); así que si el framework se cuelga, tendrás que esperar
hasta que veas un mensaje de error (aunque si el proceso subyacente aún se está ejecutando, puede que
aún no puedas escribir comandos).
Creo que he cubierto todo sobre esta herramienta. De nuevo, es un poco diferente de lo que suelo publicar, ya que la mayoría de las personas probablemente necesitarán modificarlo antes de que les sea útil.
Quedan muchos plugins por escribir, así que asegúrate de compartir cualquier mejora que hagas a FFM. Siéntete libre de abrir issues no solo para errores, sino también si estás tratando de hacer algo y no puedes averiguar cómo; de esta manera podré mejorar la documentación para todos.
commands/log_control.py!mtime Devuelve archivos modificados en los últimos X minutos. Por ejemplo !mtime 5 obtendrá todos los archivos en la máquina local (a los que tengas derechos de ver) que hayan sido modificados en los últimos 5 minutos.!db-hunter Busca archivos .sqlite, .sqlite3 y .db y otros archivos de bases de datos!sshkeys Busca claves SSH privadas y públicas en la máquina actual.!suid Encuentra binarios SUID, SGID en la máquina actual.!strange-dirs Comprueba el dispositivo comenzando desde la ruta especificada por el usuario en busca de directorios extraños en un host!sudo-version Comprueba si hay una versión vulnerable de sudo!vm Comprueba si el dispositivo es una Máquina Virtual