Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
beagle — Beagle es una herramienta de respuesta a incidentes y forense digital que transforma registros de seguridad y datos en gráficos. | Kitploit
Herramientas/GitHubGitHub/yampelo/beagle
Análisis ForenseForensia DigitalInteligencia de AmenazasRespuesta a IncidentesAnálisis de Registros
GitHubyampelo/beagle

beagle

Beagle es una herramienta de respuesta a incidentes y forense digital que transforma registros de seguridad y datos en gráficos.

Ver Repositorio
1.4k151hace 6 añosRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Beagle

Build Status codecov Read The Docs Docker PyPI Slack

  1. Acerca de Beagle
  2. Instalación
    1. Docker
    2. Paquete Python
    3. Configuración
  3. Interfaz web
    1. Subir datos
    2. Navegar por grafos existentes
    3. Interfaz de grafo
      1. Inspeccionar nodos y aristas
      2. Expandir vecinos
      3. Ocultar nodos
      4. Ejecutar mutadores
      5. Alternar tipos de nodos y aristas
      6. Deshacer/Rehacer y restablecer
      7. Perspectivas del grafo
  4. Biblioteca Python
    1. Controlar la generación de aristas
    2. Cargar JSON guardado
  5. Documentación

Acerca de Beagle

Beagle es una herramienta de respuesta a incidentes y forense digital que transforma fuentes de datos y registros en grafos. Las fuentes de datos compatibles incluyen Triajes de FireEye HX, archivos EVTX de Windows, registros de SysMon e imágenes de memoria RAM de Windows. Los grafos resultantes pueden enviarse a bases de datos de grafos como Neo4J o DGraph, o mantenerse localmente como objetos NetworkX de Python.

Beagle puede usarse directamente como biblioteca de Python, o a través de una interfaz web proporcionada.

La biblioteca puede utilizarse como una secuencia de llamadas funcionales desde una única fuente de datos.

root@kitploit:~
>>> from beagle.datasources import SysmonEVTX

>>> graph = SysmonEVTX("malicious.evtx").to_graph()
>>> graph
<networkx.classes.multidigraph.MultiDiGraph at 0x12700ee10>

Como un grafo generado a partir de un conjunto de múltiples artefactos

root@kitploit:~
>>> from beagle.datasources import SysmonEVTX, HXTriage, PCAP
>>> from beagle.backends import NetworkX

>>> nx = NetworkX.from_datasources(
    datasources=[
        SysmonEVTX("malicious.evtx"),
        HXTriage("alert.mans"),
        PCAP("traffic.pcap"),
    ]
)
>>> G = nx.graph()
<networkx.classes.multidigraph.MultiDiGraph at 0x12700ee10>

O llamando estrictamente a cada paso intermedio del proceso de fuente de datos a grafo.

root@kitploit:~
>>> from beagle.backends import NetworkX
>>> from beagle.datasources import SysmonEVTX
>>> from beagle.transformers import SysmonTransformer

>>> datasource = SysmonEVTX("malicious.evtx")

# Los transformadores toman una fuente de datos y transforman cada evento
# en una tupla de uno o más nodos.
>>> transformer = SysmonTransformer(datasource=datasource)
>>> nodes = transformer.run()

# Los transformadores devuelven un array de nodos.
[
    (<SysMonProc> process_guid="{0ad3e319-0c16-59c8-0000-0010d47d0000}"),
    (<File> host="DESKTOP-2C3IQHO" full_path="C:\Windows\System32\services.exe"),
    ...
]

# Los backends toman los nodos y los transforman en grafos
>>> backend = NetworkX(nodes=nodes)
>>> G = backend.graph()
<networkx.classes.multidigraph.MultiDiGraph at 0x126b887f0>

Los grafos se centran en la actividad de procesos individuales y están pensados principalmente para ayudar a los analistas a investigar la actividad en los hosts, no entre ellos.

Instalación

Docker

Beagle está disponible como un archivo docker:

root@kitploit:~
docker pull yampelo/beagle
mkdir -p data/beagle
docker run -v "$PWD/data/beagle":"/data/beagle" -p 8000:8000 yampelo/beagle

Paquete Python

También está disponible como biblioteca. La documentación completa de la API está disponible en https://beagle-graphs.readthedocs.io

root@kitploit:~
pip install pybeagle

Nota: Solo se admite Python 3.6+ actualmente.

Rekall no se instala automáticamente. Para instalar Rekall ejecute el siguiente comando en su lugar:

root@kitploit:~
pip install pybeagle[rekall]

Configuración

  • Visión general completa de cada entrada de configuración

Cualquier entrada en el archivo de configuración se puede modificar usando variables de entorno que sigan el siguiente formato: BEAGLE__{SECTION}__{KEY}. Por ejemplo, para cambiar la clave API de VirusTotal utilizada al usar la imagen Docker, usaría el parámetro -e y establecería la variable BEAGLE__VIRUSTOTAL__API_KEY:

root@kitploit:~
docker run -v "data/beagle":"/data/beagle" -p 8000:8000 -e "BEAGLE__VIRUSTOTAL__API_KEY=$API_KEY" beagle

Las variables de entorno y los directorios se pueden definir fácilmente usando docker compose

root@kitploit:~
version: "3"

services:
    beagle:
        image: yampelo/beagle
        volumes:
            - /data/beagle:/data/beagle
        ports:
            - "8000:8000"
        environment:
            - BEAGLE__VIRUSTOTAL__API_KEY=$key$

Interfaz web

La imagen Docker de Beagle viene con una interfaz web que envuelve el proceso de transformación de datos en grafos, así como su uso para investigar datos.

Subir datos

El formulario de carga envuelve el proceso de creación del grafo y utiliza automáticamente NetworkX como backend. Dependiendo de los parámetros requeridos por la fuente de datos, el formulario solicitará una carga de archivo o una entrada de texto. Por ejemplo:

  • El informe de sandbox de la API de VT solicita el hash para graficar.
  • FireEye HX requiere el triaje HX.

Cualquier grafo creado se almacena localmente en la carpeta definida bajo la clave dir de la sección storage en la configuración. Esto se puede modificar estableciendo la variable de entorno BEAGLE__STORAGE__DIR.

Opcionalmente, se puede agregar un comentario a cualquier grafo para ayudar a describirlo mejor.

Cada fuente de datos extraerá automáticamente metadatos del parámetro proporcionado. Los metadatos y el comentario son visibles más adelante al ver los grafos existentes de la fuente de datos.

Navegar por grafos existentes

Al hacer clic en una fuente de datos en la barra lateral se renderiza una tabla con todos los grafos analizados para esa fuente de datos.

Interfaz de grafo

Ver un grafo en Beagle proporciona una interfaz web que permite a los analistas pivotar rápidamente alrededor de un incidente.

La interfaz se divide en dos partes principales: la parte izquierda contiene varias perspectivas del grafo (Grafo, Árbol, Tabla, etc.), y la parte derecha permite filtrar nodos y aristas por tipo, buscar nodos y expandir las propiedades de un nodo. También permite deshacer y rehacer operaciones realizadas en el grafo.

Cualquier elemento del grafo que tenga un divisor encima es plegable:

Inspeccionar nodos y aristas

Los nodos en el grafo muestran los primeros 15 caracteres de un campo específico. Por ejemplo, para un nodo de proceso, será el nombre del proceso.

Las aristas simplemente muestran el tipo de arista.

Un clic único en un nodo o arista enfocará ese elemento y mostrará su información en el panel "Información del nodo" en la barra lateral derecha.

Enfocar un nodo
Enfocar una arista

Expandir vecinos

Un doble clic en un nodo traerá cualquier nodo vecino. Un nodo vecino es cualquier nodo conectado al nodo clickeado mediante una arista. Si no hay vecinos que traer, no se verá ningún cambio en el grafo.

  • Esto es independiente de la dirección. Esto significa que se podría traer un proceso padre o un proceso hijo al hacer doble clic en un nodo.
  • Beagle solo traerá 25 nodos a la vez.

Ocultar nodos

Un clic único prolongado en un nodo lo ocultará del grafo, así como cualquier arista que dependa de él.

Ejecutar mutadores

Al hacer clic derecho en un nodo aparece un menú contextual que permite ejecutar mutadores de grafos. Los mutadores son funciones que toman el estado del grafo y devuelven un nuevo estado.

Dos mutadores extremadamente útiles son:

  1. Rastreo hacia atrás de un nodo: Encuentra la secuencia de nodos y aristas que llevaron a la creación de este nodo.
    • Rastrear hacia atrás un nodo de proceso mostrará su árbol de procesos.
  2. Expandir todos los descendientes: Desde el nodo actual, muestra cada nodo que tiene este nodo como ancestro.
    • Expandir un nodo de proceso mostrará todos los nodos de procesos hijos que generó, cualquier archivo que haya podido tocar, y prácticamente toda la actividad que ocurrió como resultado de este nodo.
Rastreo hacia atrás de un nodo

El rastreo hacia atrás de un nodo es extremadamente útil y es similar a realizar un análisis de causa raíz de infección en archivos de registro.

Expandir descendientes de un nodo

Expandir los descendientes de un nodo permite ver inmediatamente todo lo que ocurrió debido a este nodo. Esta acción revela el subgrafo enraizado en el nodo seleccionado.

Alternar tipos de nodos y aristas

A veces, un nodo o arista puede no ser relevante para el incidente actual; se pueden alternar los tipos de aristas y nodos activándolos o desactivándolos. Tan pronto como se alterna el tipo, los nodos o aristas de ese tipo se eliminan del grafo visible.

Desactivar un tipo de nodo impide que ese tipo de nodo se use al usar mutadores o al traer vecinos.

Deshacer/Rehacer y restablecer

¡Cualquier acción en el grafo es inmediatamente reversible! Usando los botones de deshacer/rehacer se puede revertir cualquier acción realizada. El botón de restablecer devuelve el grafo al estado en que se cargó, ahorrando una actualización.

Perspectivas del grafo

A medida que se cambia el estado actual del grafo usando las acciones anteriores, también se puede querer ver el conjunto actual de nodos y aristas visibles desde una perspectiva diferente. Las pestañas en la parte superior de la pantalla del grafo permiten transformar los datos en una variedad de vistas:

  • Grafo (perspectiva predeterminada)
  • Árbol
  • Tabla
  • Línea de tiempo
  • Markdown

Cada una de las perspectivas admite enfocar nodos haciendo clic en ellos.

Biblioteca Python

El proceso de generación de grafos se puede realizar mediante programación usando la biblioteca Python. El proceso de generación de grafos consta de tres pasos:

  1. Las clases DataSource analizan y generan eventos uno por uno.
  2. Las clases Transformer toman esas entradas y las transforman en varias clases Node como Process.
  3. Las clases Backend toman el array de nodos, los colocan en una estructura de grafo y los envían a una ubicación deseada.

El paquete Python se puede instalar mediante pip:

root@kitploit:~
pip install pybeagle

Crear un grafo requiere encadenar estos componentes. Esto se puede hacer automáticamente usando la función to_graph().

root@kitploit:~
from beagle.datasources import HXTriage

# Por defecto, usar el método to_graph() utiliza NetworkX y el primer transformador.
G = HXTriage('test.mans').to_graph()
<networkx.classes.multidigraph.MultiDiGraph at 0x12700ee10>

También se puede hacer explícitamente en cada paso. Usando las llamadas funcionales, también se puede definir qué Backend se desea usar, por ejemplo, para enviar datos a DGraph

root@kitploit:~
from beagle.datasources import HXTriage
from beagle.backends import DGraph
from beagle.transformers import FireEyeHXTransformer

# Los datos se enviarán a la instancia de DGraph configurada en el
# archivo de configuración
backend = HXTriage('test.mans').to_graph(backend=DGraph)

# También se puede especificar el transformador
backend = HXTriage('test.mans').to_transformer(transformer=FireEyeHXTransformer).to_graph(backend=DGraph)

Al llamar a los métodos to_graph o to_transformer, se pueden pasar argumentos a esas clases:

root@kitploit:~
from beagle.datasources import HXTriage
from beagle.backends import Graphistry

# Enviar a Graphistry, anonimizar los datos primero y devolver la URL
graphistry_url = HXTriage('test.mans').to_graph(backend=Graphistry, anonymize=True, render=False)

También se puede invocar manualmente cada paso del proceso anterior, accediendo a las salidas intermedias

root@kitploit:~
>>> from beagle.backends import NetworkX
>>> from beagle.datasources import HXTriage
>>> from beagle.transformers import FireEyeHXTransformer

>>> datasource = HXTriage("test.mans")
>>> transformer = FireEyeHXTransformer(datasource=datasource)
>>> nodes = transformer.run()
>>> backend = NetworkX(nodes=nodes)
>>> G = backend.graph()

Si se desea llamar manualmente a cada paso, es necesario asegurarse de que la clase Transformer sea compatible con la salida de la clase DataSource proporcionada.

  • Todos los Backends son compatibles con todos los Transformers.

Cada fuente de datos define la lista de transformadores con los que es compatible, y se puede acceder a ella mediante el atributo .transformers:

root@kitploit:~
>>> from beagle.datasources import HXTriage
>>> HXTriage.transformers
[beagle.transformers.fireeye_hx_transformer.FireEyeHXTransformer]

Controlar la generación de aristas

Por defecto, las aristas no se condensan, lo que significa que si un nodo de proceso u escribe en un nodo de archivo v 5000 veces, habrá 5000 aristas entre esos nodos. A veces, especialmente al intentar visualizar los datos, esto puede abrumar a un analista.

Se pueden condensar las 5000 aristas en una sola arista para ese tipo de acción (escritura en este caso), pasando al backend el parámetro consolidate_edges=True, por ejemplo:

root@kitploit:~
SysmonEVTX("data/sysmon/autoruns-sysmon.evtx").to_graph(NetworkX, consolidate_edges=False)
# El grafo contiene 826 nodos y 2469 aristas.

SysmonEVTX("data/sysmon/autoruns-sysmon.evtx").to_graph(NetworkX, consolidate_edges=True)
# El grafo contiene 826 nodos y 1396 aristas

Por defecto, la interfaz web consolida las aristas.

Cargar JSON guardado

Usar el backend NetworkX permite guardar el grafo resultante como un objeto JSON, guardándolo para más adelante. Se puede usar el método estático NetworkX.from_json para cargarlo de nuevo.

root@kitploit:~
import json
from beagle.datasources import SysmonEVTX
from beagle.backends import NetworkX

# Obtener un objeto nx.MultiDiGraph
graph = SysmonEVTX("malicious.evtx").to_graph()

# Convertir el objeto a JSON
graph_json = NetworkX.graph_to_json(graph)

with open("my_graph.json", "w") as f:
    json.dump(graph_json, f)

# Más adelante:
# G es el mismo objeto nx.MultiDiGraph generado por `.to_graph()`
G = NetworkX.from_json("my_graph.json")

Documentación

  • Visión general de la API REST
  • Configuración
  • Desarrollo
  • Lógica de diseño
Descargar herramienta