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
ThreatIntel-Aggregator — Plataforma de inteligencia de amenazas autoalojada — agregación de feeds, triaje con IA, cobertura de MITRE ATT&CK e ingeniería de detección integrada con Sentinel. Se ejecuta de forma independiente o totalmente integrada en Azure. | Kitploit
Herramientas/GitHubGitHub/ethan-andrews/threatintel-aggregator
Herramientas DefensivasGestión de Indicadores de Compromiso (IOC)Feeds y Agregadores de AmenazasAnálisis de VulnerabilidadesRecopilación de InformaciónVirtualización de SeguridadInteligencia de AmenazasRespuesta a Incidentes
Seguridad de IA
Análisis de Registros
GitHubethan-andrews/threatintel-aggregator

ThreatIntel-Aggregator

Plataforma de inteligencia de amenazas autoalojada — agregación de feeds, triaje con IA, cobertura de MITRE ATT&CK e ingeniería de detección integrada con Sentinel. Se ejecuta de forma independiente o totalmente integrada en Azure.

Ver Repositorio
149hace 1 díaAún no revisado

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

Agregador de Threat Intel

Banner

Typing SVG

License Backend Tests Frontend Build Buy Me a Coffee

Una plataforma de threat intelligence autoalojada que agrega feeds RSS de más de 60 proveedores de seguridad, ejecuta triaje con IA, correlaciona los hallazgos con tu inventario de activos de RunZero y expone alertas accionables a través de un panel web en modo oscuro.

Diseñada para ejecutarse de forma independiente con cero dependencia de la nube, o totalmente integrada en un entorno Azure/Entra/Sentinel — elige el nivel que se ajuste a lo que tengas.


Niveles de despliegue

NivelScriptTriaje con IAAutenticaciónAlmacenamientoLo que obtienes
Basicscripts/setup-basic.shDesactivadoClave de API localPostgres local (Docker)Agregación de feeds, extracción de IOCs, matriz MITRE, paneles — sin IA, sin nube, nada que registrar
Basic + APIscripts/setup-basic-api.shAnthropic (directo)Clave de API localPostgres local (Docker)Todo lo anterior, más triaje de severidad/TTP/resumen con IA
Azure + APIscripts/setup-azure.ps1Azure AI FoundrySSO con Microsoft Entra IDTu propio Postgres (Azure DB for PostgreSQL, etc.)Despliegue completo en Azure Container Apps, SSO con roles por usuario. (La integración del pipeline de detections.ai llegará en una versión futura — ver más abajo.)

Los tres ejecutan exactamente el mismo código de aplicación — lo único que cambia es qué variables de entorno están definidas. Consulta Variables de entorno para la referencia completa.```bash

Basic — no AI, no cloud

./scripts/setup-basic.sh

Basic + API — adds direct Anthropic triage

./scripts/setup-basic-api.sh

Azure + API — full SIEM-integrated deployment (PowerShell 7+, az CLI)

./scripts/setup-azure.ps1

root@kitploit:~
Los dos scripts de bash levantan un contenedor local de Postgres, aplican el esquema y generan `backend/.env` / `frontend/.env.local` por ti — luego imprimen los dos comandos para iniciar realmente la aplicación (`pip install` + ejecutar backend, `npm install` + ejecutar el servidor de desarrollo del frontend). `setup-azure.ps1` es un envoltorio fino alrededor de `infra/provision.ps1`, el runbook real de despliegue de Azure Container Apps.

---

## Características

- **Agregación de feeds** — sondea más de 60 feeds RSS de seguridad de Nivel 1/2/3 según una programación; deduplica y filtra contenido promocional automáticamente
- **Triaje con IA** — clasifica cada entrada con severidad (Crítica/Alta/Media/Baja/Informativa), TTPs de MITRE ATT&CK y un resumen en lenguaje sencillo. Modular por proveedor: API directa de Anthropic o Azure AI Foundry, conmutables mediante una variable de entorno sin perder funcionalidad en ningún caso
- **Extracción de IOC** — extrae automáticamente IPs, dominios, URLs, hashes de archivos y CVEs de cada entrada
- **Integración con RunZero** — sincroniza tu inventario de activos y correlaciona inteligencia de amenazas contra activos en vivo; coincide en CVEs, nombres de software, versiones de SO y direcciones IP. Tres subpestañas bajo `RUNZERO`: **Matches** (entradas correlacionadas contra tu inventario, filtrables por severidad/fecha/confianza/KEV), **Exposure** (postura confirmada/posible a nivel de organización con seguimiento de remediación) y **Metrics** (tendencias de ingesta vs. remediación a lo largo del tiempo)
- **Your Stack** — define el software/SO de tu entorno; vuelve a puntuar todas las entradas por relevancia
- **Libro mayor de IOC** — libro mayor buscable de todos los indicadores extraídos con referencias cruzadas de entradas y exportación STIX/CSV
- **Matriz MITRE ATT&CK** — mapa de calor de la cobertura de TTPs a través de la inteligencia de amenazas ingerida
- **Panel de estado de feeds** — estado de sondeo por feed, seguimiento de fallos consecutivos y volumen de artículos de 7 días
- **Detections** — una superficie de revisión de 9 pestañas (ver abajo) que cubre todo lo registrado como detección, ya sea generado por IA, importado desde tus propios archivos o sincronizado desde un espacio de trabajo de Sentinel en vivo
- **Autenticación modular** — SSO de Microsoft Entra ID con acceso basado en roles, o una única clave de API local compartida con cero dependencia de Azure. Detectada automáticamente por el frontend; ver [Modos de autenticación](#auth-modes)

### Dos características relacionadas con detecciones

Este repositorio en realidad incluye dos cosas relacionadas pero utilizables de forma independiente bajo el paraguas de "detections":

1. **La pestaña `DETECTIONS`** — una superficie de revisión autocontenida, dividida en nueve subpestañas:
   - **All Detections** — el catálogo completo de analíticas registradas, filtrable por técnica/disposición/estado de revisión, cada una expandible a su descripción y KQL completo.
   - **Defender Custom Detections** — el mismo catálogo, limitado a detecciones destinadas a las reglas de detección personalizadas de Microsoft Defender for Endpoint en lugar de a las reglas analíticas de Sentinel.
   - **Alignment Reviews** — cada vez que una analítica de detección se registra contra una técnica de MITRE, una comprobación de IA compara su cobertura real con la propia descripción de MITRE de esa técnica. Cuando diverge o solo cubre parcialmente la técnica, aterriza aquí como un elemento de revisión humana con el razonamiento de la IA, una corrección de KQL sugerida y el propio resultado de validación de esa corrección (puerta estática + backtest) — nunca una sugerencia ciega.
   - **Disposition Alerts** — una cola de detección de podredumbre: una analítica aprobada cuya telemetría se degrada o cuya regla subyacente empieza a dar errores se marca aquí para re-revisión, nombrada por su propia detección en lugar de solo por la técnica MITRE compartida.
   - **Generated Hunts** — las detecciones se agrupan en hunts (uno por archivo importado hoy; uno por artículo de TI/proyecto de detections.ai de origen una vez que se lance esa integración), coincidiendo con la propia característica Hunts de Microsoft Sentinel. Un hunt puede sincronizarse en un espacio de trabajo real de Sentinel como un objeto `Microsoft.SecurityInsights/hunts` más sus consultas de búsqueda guardadas constituyentes (restringido por `SENTINEL_HUNTING_SYNC_ENABLED` y un `mode` — off/manual/auto — configurable por equipo en Settings > API Settings; nunca un auto-push silencioso a menos que lo habilites).
   - **Sentinel Hunts** — el inventario en vivo de lo que realmente está desplegado en la característica Hunting de tu espacio de trabajo de Sentinel, extraído directamente de ARM en lugar del propio historial de sincronización de esta aplicación; incluye sugerencias de prueba/ajuste por consulta que puedes aplicar o descartar en el lugar.
   - **Sentinel Analytics Rules** — la misma idea para las Analytics Rules de Microsoft Sentinel (`Microsoft.SecurityInsights/alertRules`) — un tipo de recurso de Sentinel distinto de Hunting, ya que estas son las que realmente disparan incidentes/alertas según una programación — con el mismo flujo de trabajo de aplicar/descartar sugerencias de ajuste.
   - **Local Detections** — ver [Ejecución sin Sentinel ni un proveedor de IA](#running-without-sentinel-or-an-ai-provider-local-detections-import) abajo.
   - **Audit Log** (solo administradores) — un registro entre pipelines de cada comprobación que esta aplicación ha ejecutado realmente: resultados de puerta estática/sonda de control de detecciones generadas por IA, intentos de sincronización de hunts de Sentinel y ejecuciones de prueba de consultas de hunt/reglas analíticas de Sentinel, combinados en una única lista paginada y filtrable — cubriendo deliberadamente lo que ninguna pestaña de revisión individual hace por sí sola.

   Se ejecuta completamente dentro del backend principal, sin necesidad de despliegue adicional para la propia superficie de revisión. Su propio diseño de API sigue deliberadamente las convenciones de detections.ai a continuación, aunque es totalmente autocontenido.
2. **Orquestador de pipeline de detections.ai — próximamente.** detections.ai tiene una API pública en desarrollo para la generación de detecciones asistida por IA, y este repositorio tiene una integración real construida para ella (`backend/detection_pipeline/orchestrator.py`) que toma inteligencia de amenazas triada, la compara con la cobertura de detección existente y genera KQL en borrador para tu espacio de trabajo de Sentinel como un trabajo programado. Esta integración dará soporte a esa API una vez que esté disponible, y aún no forma parte de esta versión pública. Mientras tanto, **no la necesitas en absoluto para usar la pestaña Detections** — [Local Detections Import](#running-without-sentinel-or-an-ai-provider-local-detections-import) abajo cubre el mismo objetivo de "obtener detecciones reales en esta aplicación" para configuraciones sin generación por IA y sin Sentinel hoy.

### Ejecución sin Sentinel ni un proveedor de IA: Local Detections Import

Dado el nombre y el discurso principal de la aplicación, la pregunta más común de un auto-hospedador en el nivel **Basic** probablemente será *"No tengo Sentinel ni un proveedor de IA configurado — ¿aún puedo obtener algo de las pestañas Detections/Hunts?"* La respuesta es sí: apunta la aplicación a una carpeta de tus propios archivos de reglas de detección (escritos a mano, exportados de un tenant real de Sentinel/Defender, o extraídos de un repositorio público de reglas Sigma/Sentinel) y los catalogará, etiquetará con MITRE y validará estáticamente — sin conexión a Sentinel y sin necesidad de `DETECTIONS_AI_API_KEY`/clave de Anthropic para nada de ello.

- **Formatos soportados, desde el primer día:** archivos sin procesar `.kql`/`.txt`/`.yar`/`.spl` o de cualquier extensión, cada uno opcionalmente emparejado con un sidecar `.json`/`.yaml` (`{"file": "myrule.kql", "title": "...", "description": "...", "technique_id": "T1059.001"}`) para metadatos que la propia exportación de Microsoft no necesita declarar por separado; YARA; Suricata; Sigma YAML (de uno o varios documentos); Splunk SPL; y el propio JSON nativo exportado de Analytics Rule/Hunting Query de Microsoft (solo las reglas de tipo `Scheduled` llevan una consulta KQL sin procesar que esta aplicación puede evaluar — cualquier otro tipo se reconoce y se reporta, no se omite silenciosamente).
- **Qué se ejecuta realmente sobre un archivo importado:** validación estática (el mismo motor de durabilidad/hallazgos que usa la ruta de generación por IA) para contenido KQL; también una comprobación de alineación con MITRE, si *sí* tienes un proveedor de IA configurado (un eje independiente de Sentinel — puedes tener uno, ambos o ninguno); todo lo dependiente de Sentinel (backtesting, sondas de telemetría, seguimiento de disposición) queda fuera de alcance y se muestra como "no Sentinel connection configured" en lugar de una celda en blanco engañosa.
- **Dónde aparece:** el contenido importado se convierte en una fila normal de hunt/detección — mismas tablas, mismo flujo de trabajo de revisión, misma visualización de técnica MITRE que cualquier cosa que genere el pipeline de IA — por lo que también aparece en las vistas regulares `ALL DETECTIONS`/`GENERATED HUNTS`, no solo en su propia pestaña. La subpestaña dedicada **Local Detections** (bajo `DETECTIONS`, solo administradores para activar una importación) es donde la apuntas a una carpeta y observas el progreso/resultados por archivo.
- **Configuración:** establece `LOCAL_IMPORT_DIR` a una ruta absoluta en el sistema de archivos del backend (un volumen montado, en un despliegue en contenedor) — todo lo importado debe residir bajo esa raíz; la interfaz de usuario te permite elegir una subruta debajo de ella, nunca una ubicación arbitraria del sistema de archivos. Ver [Variables de entorno](#environment-variables).
- **Pruébalo de inmediato:** `examples/local-detections-samples/` incluye una pequeña carpeta lista para importar — dos reglas KQL válidas (una emparejada con un sidecar `.json` para mostrar ese mecanismo), una regla deliberadamente inválida (para ver el banner de marcado como inválido) y un archivo no reconocido (para ver el banner de importación fallida). Apunta `LOCAL_IMPORT_DIR` a ella para ver los tres estados de resultado en tu primera importación, sin necesidad de escribir reglas.

**Local Detections** — una ejecución de importación completada: el banner de resumen señala los archivos que fueron catalogados pero marcados como inválidos por el análisis estático (aquí, una regla que alerta sobre un único hash codificado) junto a los que se importaron limpiamente, y cada archivo se convierte en una fila normal de hunt/detección a continuación

![Local Detections](https://assets.kitploit.com/production/public/readmes/55296/caf1d88594b2bef58bc52b99a779da6d51aeb2b032ae1808fb114c1b8d6aca07/8985c51d3404ac6592121c1d2217d5faa6551c97d65600b3a9b050d5cd4767ce-display-v1.webp)

---

## Capturas de pantalla

Todas las capturas de pantalla a continuación usan datos sintéticos (nombres de organizaciones falsos, IPs de ejemplo RFC 5737, dominios `.example`) generados para documentación — sin inteligencia de amenazas real ni datos de clientes.

**Feed** — explora y filtra entradas de inteligencia de amenazas triadas con severidad, etiquetas, IOCs y TTPs

![Feed](https://assets.kitploit.com/production/public/readmes/55296/e75cea290ced1c3b96346bf04578c6964569b5c70ac4982b91a9f2fea761c4e9/75ad877a8fafd97692b94e9f033f28191973ff10ec6d94626633f13cad189cc1-display-v1.webp)

<br>

**Dashboard** — desglose de severidad de un vistazo y principales técnicas MITRE ATT&CK

![Dashboard](https://assets.kitploit.com/production/public/readmes/55296/eb48a8bbda9454d3f9e134228080ca250d581375f16e4828da282592278c7118/58f1568d9f9896867c01334e00cc8ef3dfb55f2e31a637a349ff2c5f0718b4c2-display-v1.webp)

<br>

**MITRE ATT&CK** — mapa de calor de matriz completa de cobertura de técnicas a través de la inteligencia ingerida

![MITRE ATT&CK](https://assets.kitploit.com/production/public/readmes/55296/9df0d60a5197e785dd85356a6beba126ef16bd91518f2d84108b987afaaf9b06/cac6e7cbe4f1b993265c84719288aa8789814fe1aff97821b5f0f27baaf65e3d-display-v1.webp)

<br>

**Your Stack** — define tu entorno; las entradas del feed se vuelven a puntuar por relevancia

![Your Stack](https://assets.kitploit.com/production/public/readmes/55296/40839d08db86d678c276bb6d52ec403f807a6593f58b341db27e3e7d8701f652/b7ebedd6e968a264cdf73259aa8d8fef404795023efd998f5a9b0255556f77c2-display-v1.webp)

<br>

**IOCs** — libro mayor buscable de todos los indicadores extraídos con exportación STIX/CSV

![IOCs](https://assets.kitploit.com/production/public/readmes/55296/87ac0ff28d571697f6f3ab0ca6905ab5e137bb190cc0bca1fc064db88904614b/e7f960a68d10c87a9467eb42e438cdd81026c5eb5daa9667f9185dc7b395ebe6-display-v1.webp)

<br>

**Integrations** — resumen de conectores para Sentinel, Defender y RunZero: estado configurado/habilitado y atajos a la propia pestaña de cada uno

![Integrations](https://assets.kitploit.com/production/public/readmes/55296/b261064e5162d7dd615fab4d8eb332735cc412ae6ada1e095c2bca0f0afcf989/d92aa2477825a8eeb126bb5fa3396f3292fe8af23a7806538d9f74eb561efac2-display-v1.webp)

<br>

**RunZero** — correlación de activos, seguimiento de exposición a nivel de organización y métricas de remediación, todo proveniente de tu inventario de RunZero

![RunZero](https://assets.kitploit.com/production/public/readmes/55296/1c14c9bf6fa927012db3fef13c5fbe9187aaf3a9e914358b7408a872f61dc6d0/be053e10181d5b79a14a9aff7b249c3450cf787f0379d84651bb060bf9c2b8b6-display-v1.webp)

<br>

**Exposure** — organizaciones clasificadas por número de coincidencias de amenazas; haz clic en cualquier tarjeta para ver las entradas coincidentes

![Exposure](https://assets.kitploit.com/production/public/readmes/55296/f80096a602e70e3b462c5d98ac4f04b0ebdc6c47c1efb055bd56f552d55823e4/0bfec2320b8e1f189bfd645a816444587f7fd056377e85ff2c1d34df12b1ab44-display-v1.webp)

<br>

**Detections** — el catálogo completo de analíticas registradas (tanto generadas por IA como importadas localmente), cada una con su estado de puerta estática/backtest/revisión y técnica MITRE

![Detections](https://assets.kitploit.com/production/public/readmes/55296/bbf5ddc849c368101e54def614a377ba8bcca705cecf65949dc7b93f1a9dea1f/75df6746fea32f7dac1a0f52b099142c3d48fcdd1dbfcea87b9d20306d178ccd-display-v1.webp)

<br>

**Settings** — controles de triaje con IA, monitoreo de estado de feeds, puntuaciones de confianza de fuentes y gestión de usuarios

![Settings](https://assets.kitploit.com/production/public/readmes/55296/af5be9150416723dd8d0bd311029cc530869c52d514c67f4974a9bbf3d699f99/5964908fc2ae52d0f88149bb6d040898addf7fe99ef154eb7598e1adc3fefda5-display-v1.webp)

---

## Arquitectura```
┌─────────────────────────────────────────┐
│  Next.js 16 frontend (port 3000)        │
│  Tailwind CSS · dark theme              │
└──────────────┬──────────────────────────┘
               │ REST API (Bearer token)
┌──────────────▼──────────────────────────┐
│  FastAPI backend (port 8000)            │
│  APScheduler · slowapi rate limiting    │
└──┬──────────┬──────────┬────────────┬───┘
   │          │          │            │
Postgres   AI provider  RunZero API  detections.ai
           (modular:    (asset sync)  (coming soon --
           Anthropic or                see Features below)
           Azure AI Foundry)

Backend (backend/) — Python 3.12 + FastAPI. Postgres para todo el almacenamiento (SQLite y Azure Blob Storage han sido completamente retirados). El proveedor de IA y el método de autenticación se seleccionan mediante variables de entorno, no están codificados de forma fija — ver más abajo.

Frontend (frontend/) — Next.js 16, JavaScript plano, Tailwind CSS. Detecta automáticamente el modo de autenticación desde el backend al cargar.

Infra (infra/) — Plantillas de Azure Bicep para Container Apps, Key Vault y Container Registry (apps.bicep + platform.bicep + app-stack.bicep, desplegadas mediante provision.ps1). Solo es relevante para el nivel de Azure + API.


Modos de autenticación

AZURE_AD_TENANT_ID establecido → Modo Entra: SSO de Microsoft Entra ID, roles por usuario (el primer inicio de sesión se convierte en administrador, todos los demás por defecto son visualizadores).

AZURE_AD_TENANT_ID no establecido → Modo local: una única LOCAL_API_KEY compartida otorga acceso de administrador a cualquiera que la tenga. Sin gestión de usuarios, sin dependencia de Azure. El frontend llama a GET /api/auth/mode al cargar y renderiza automáticamente la pantalla de inicio de sesión correspondiente — nada que configurar en el lado del frontend.

Ambos modos emiten el mismo tipo de JWT firmado por la aplicación después, por lo que todas las demás rutas (require_auth/require_admin) funcionan de forma idéntica independientemente de qué modo haya emitido el token.


Desarrollo local

Requisitos previos

  • Python 3.12+
  • Node.js 20+
  • Docker (para Postgres local — ver los scripts de configuración)

Ruta más rápida

Ejecuta scripts/setup-basic.sh o scripts/setup-basic-api.sh (ver Niveles de despliegue) — se encargan de Postgres y de la generación del .env por ti. Luego:```bash cd backend && pip install -r requirements.txt && uvicorn main:app --reload --port 8000 cd frontend && npm install && npm run dev

root@kitploit:~
### Configuración manual```bash
cd backend
python -m venv .venv
source .venv/bin/activate        # Windows: .venv\Scripts\activate
pip install -r requirements.txt
cp env.example .env              # fill in required values — see Environment Variables below
uvicorn main:app --reload --port 8000

4.2.2.3. get_network_connections

Recupera las conexiones de red activas del sistema.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
protocolstrNoNoneFiltrar por protocolo (tcp, udp, tcp6, udp6)
statestrNoNoneFiltrar por estado de la conexión (LISTEN, ESTABLISHED, etc.)
process_namestrNoNoneFiltrar por nombre del proceso
pidintNoNoneFiltrar por ID de proceso
local_portintNoNoneFiltrar por puerto local
remote_portintNoNoneFiltrar por puerto remoto
local_ipstrNoNoneFiltrar por dirección IP local
remote_ipstrNoNoneFiltrar por dirección IP remota
limitintNo100Número máximo de conexiones a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones y metadatos

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones TCP en escucha
result = mcp.get_network_connections(
    protocol="tcp",
    state="LISTEN"
)

# Obtener conexiones de un proceso específico
result = mcp.get_network_connections(
    process_name="nginx",
    limit=50
)

# Obtener conexiones a un puerto remoto específico
result = mcp.get_network_connections(
    remote_port=443,
    protocol="tcp"
)

Respuesta:

root@kitploit:~
{
  "connections": [
    {
      "protocol": "tcp",
      "local_address": "0.0.0.0:22",
      "remote_address": "0.0.0.0:0",
      "status": "LISTEN",
      "pid": 1234,
      "process_name": "sshd",
      "family": "AF_INET"
    }
  ],
  "total_count": 1,
  "filters_applied": {
    "protocol": "tcp",
    "state": "LISTEN"
  }
}

4.2.2.4. get_network_interfaces

Recupera información sobre las interfaces de red del sistema.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
interface_namestrNoNoneFiltrar por nombre de interfaz específico
include_statsboolNoTrueIncluir estadísticas de la interfaz
include_addressesboolNoTrueIncluir direcciones IP

Devuelve: Dict[str, Any] - Diccionario con interfaces y metadatos

Ejemplo:

root@kitploit:~
# Obtener todas las interfaces de red
result = mcp.get_network_interfaces()

# Obtener una interfaz específica sin estadísticas
result = mcp.get_network_interfaces(
    interface_name="eth0",
    include_stats=False
)

Respuesta:

root@kitploit:~
{
  "interfaces": [
    {
      "name": "eth0",
      "status": "up",
      "mtu": 1500,
      "speed": 1000,
      "addresses": [
        {
          "family": "AF_INET",
          "address": "192.168.1.100",
          "netmask": "255.255.255.0",
          "broadcast": "192.168.1.255"
        }
      ],
      "stats": {
        "bytes_sent": 1234567,
        "bytes_recv": 7654321,
        "packets_sent": 12345,
        "packets_recv": 54321,
        "errors_in": 0,
        "errors_out": 0,
        "drops_in": 0,
        "drops_out": 0
      }
    }
  ],
  "total_count": 1
}

4.2.2.5. get_network_stats

Recupera estadísticas de red del sistema.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
per_interfaceboolNoFalseDevolver estadísticas por interfaz
include_errorsboolNoTrueIncluir estadísticas de errores

Devuelve: Dict[str, Any] - Diccionario con estadísticas de red

Ejemplo:

root@kitploit:~
# Obtener estadísticas de red agregadas
result = mcp.get_network_stats()

# Obtener estadísticas por interfaz
result = mcp.get_network_stats(per_interface=True)

Respuesta:

root@kitploit:~
{
  "total": {
    "bytes_sent": 123456789,
    "bytes_recv": 987654321,
    "packets_sent": 1234567,
    "packets_recv": 7654321,
    "errors_in": 0,
    "errors_out": 0,
    "drops_in": 0,
    "drops_out": 0
  },
  "per_interface": {
    "eth0": {
      "bytes_sent": 123456789,
      "bytes_recv": 987654321,
      "packets_sent": 1234567,
      "packets_recv": 7654321
    }
  }
}

4.2.2.6. get_network_io_counters

Recupera contadores de E/S de red del sistema.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
per_nicboolNoFalseDevolver contadores por NIC
nic_namestrNoNoneFiltrar por nombre de NIC específico

Devuelve: Dict[str, Any] - Diccionario con contadores de E/S de red

Ejemplo:

root@kitploit:~
# Obtener contadores de E/S de red agregados
result = mcp.get_network_io_counters()

# Obtener contadores de una NIC específica
result = mcp.get_network_io_counters(
    per_nic=True,
    nic_name="eth0"
)

Respuesta:

root@kitploit:~
{
  "total": {
    "bytes_sent": 123456789,
    "bytes_recv": 987654321,
    "packets_sent": 1234567,
    "packets_recv": 7654321,
    "errin": 0,
    "errout": 0,
    "dropin": 0,
    "dropout": 0
  },
  "per_nic": {
    "eth0": {
      "bytes_sent": 123456789,
      "bytes_recv": 987654321,
      "packets_sent": 1234567,
      "packets_recv": 7654321,
      "errin": 0,
      "errout": 0,
      "dropin": 0,
      "dropout": 0
    }
  }
}

4.2.2.7. get_network_connections_summary

Recupera un resumen de las conexiones de red del sistema.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
group_bystrNo"protocol"Agrupar por (protocol, state, process, port)
include_listeningboolNoTrueIncluir puertos en escucha

Devuelve: Dict[str, Any] - Diccionario con resumen de conexiones

Ejemplo:

root@kitploit:~
# Obtener resumen agrupado por protocolo
result = mcp.get_network_connections_summary()

# Obtener resumen agrupado por proceso
result = mcp.get_network_connections_summary(
    group_by="process"
)

Respuesta:

root@kitploit:~
{
  "summary": {
    "tcp": {
      "total": 25,
      "listening": 5,
      "established": 20
    },
    "udp": {
      "total": 10,
      "listening": 8,
      "established": 2
    }
  },
  "total_connections": 35,
  "group_by": "protocol"
}

4.2.2.8. get_network_connections_by_process

Recupera conexiones de red agrupadas por proceso.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
process_namestrNoNoneFiltrar por nombre de proceso
pidintNoNoneFiltrar por ID de proceso
include_listeningboolNoTrueIncluir puertos en escucha
limitintNo100Número máximo de procesos a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones agrupadas por proceso

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones agrupadas por proceso
result = mcp.get_network_connections_by_process()

# Obtener conexiones de un proceso específico
result = mcp.get_network_connections_by_process(
    process_name="nginx"
)

Respuesta:

root@kitploit:~
{
  "processes": [
    {
      "pid": 1234,
      "process_name": "nginx",
      "connections": [
        {
          "protocol": "tcp",
          "local_address": "0.0.0.0:80",
          "remote_address": "0.0.0.0:0",
          "status": "LISTEN"
        }
      ],
      "connection_count": 1
    }
  ],
  "total_processes": 1,
  "total_connections": 1
}

4.2.2.9. get_network_connections_by_port

Recupera conexiones de red agrupadas por puerto.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
portintNoNoneFiltrar por número de puerto específico
protocolstrNoNoneFiltrar por protocolo
include_listeningboolNoTrueIncluir puertos en escucha
limitintNo100Número máximo de puertos a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones agrupadas por puerto

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones agrupadas por puerto
result = mcp.get_network_connections_by_port()

# Obtener conexiones en un puerto específico
result = mcp.get_network_connections_by_port(
    port=443,
    protocol="tcp"
)

Respuesta:

root@kitploit:~
{
  "ports": [
    {
      "port": 443,
      "protocol": "tcp",
      "connections": [
        {
          "local_address": "0.0.0.0:443",
          "remote_address": "0.0.0.0:0",
          "status": "LISTEN",
          "pid": 1234,
          "process_name": "nginx"
        }
      ],
      "connection_count": 1
    }
  ],
  "total_ports": 1,
  "total_connections": 1
}

4.2.2.10. get_network_connections_by_state

Recupera conexiones de red agrupadas por estado.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
statestrNoNoneFiltrar por estado específico
protocolstrNoNoneFiltrar por protocolo
limitintNo100Número máximo de estados a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones agrupadas por estado

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones agrupadas por estado
result = mcp.get_network_connections_by_state()

# Obtener conexiones en estado ESTABLISHED
result = mcp.get_network_connections_by_state(
    state="ESTABLISHED"
)

Respuesta:

root@kitploit:~
{
  "states": [
    {
      "state": "ESTABLISHED",
      "connections": [
        {
          "protocol": "tcp",
          "local_address": "192.168.1.100:54321",
          "remote_address": "93.184.216.34:443",
          "pid": 5678,
          "process_name": "firefox"
        }
      ],
      "connection_count": 1
    }
  ],
  "total_states": 1,
  "total_connections": 1
}

4.2.2.11. get_network_connections_by_address

Recupera conexiones de red agrupadas por dirección.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
addressstrNoNoneFiltrar por dirección IP específica
address_typestrNo"local"Tipo de dirección (local, remote)
limitintNo100Número máximo de direcciones a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones agrupadas por dirección

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones agrupadas por dirección local
result = mcp.get_network_connections_by_address()

# Obtener conexiones a una dirección remota específica
result = mcp.get_network_connections_by_address(
    address="93.184.216.34",
    address_type="remote"
)

Respuesta:

root@kitploit:~
{
  "addresses": [
    {
      "address": "93.184.216.34",
      "address_type": "remote",
      "connections": [
        {
          "protocol": "tcp",
          "local_address": "192.168.1.100:54321",
          "remote_address": "93.184.216.34:443",
          "status": "ESTABLISHED",
          "pid": 5678,
          "process_name": "firefox"
        }
      ],
      "connection_count": 1
    }
  ],
  "total_addresses": 1,
  "total_connections": 1
}

4.2.2.12. get_network_connections_by_family

Recupera conexiones de red agrupadas por familia de direcciones.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
familystrNoNoneFiltrar por familia (AF_INET, AF_INET6)
limitintNo100Número máximo de familias a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones agrupadas por familia

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones agrupadas por familia
result = mcp.get_network_connections_by_family()

# Obtener conexiones IPv6
result = mcp.get_network_connections_by_family(
    family="AF_INET6"
)

Respuesta:

root@kitploit:~
{
  "families": [
    {
      "family": "AF_INET",
      "connections": [
        {
          "protocol": "tcp",
          "local_address": "192.168.1.100:54321",
          "remote_address": "93.184.216.34:443",
          "status": "ESTABLISHED",
          "pid": 5678,
          "process_name": "firefox"
        }
      ],
      "connection_count": 1
    }
  ],
  "total_families": 1,
  "total_connections": 1
}

4.2.2.13. get_network_connections_by_type

Recupera conexiones de red agrupadas por tipo.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
connection_typestrNoNoneFiltrar por tipo (stream, dgram, raw)
limitintNo100Número máximo de tipos a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones agrupadas por tipo

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones agrupadas por tipo
result = mcp.get_network_connections_by_type()

# Obtener conexiones de tipo stream
result = mcp.get_network_connections_by_type(
    connection_type="stream"
)

Respuesta:

root@kitploit:~
{
  "types": [
    {
      "type": "stream",
      "connections": [
        {
          "protocol": "tcp",
          "local_address": "192.168.1.100:54321",
          "remote_address": "93.184.216.34:443",
          "status": "ESTABLISHED",
          "pid": 5678,
          "process_name": "firefox"
        }
      ],
      "connection_count": 1
    }
  ],
  "total_types": 1,
  "total_connections": 1
}

4.2.2.14. get_network_connections_by_status

Recupera conexiones de red agrupadas por estado.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
statusstrNoNoneFiltrar por estado específico
limitintNo100Número máximo de estados a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones agrupadas por estado

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones agrupadas por estado
result = mcp.get_network_connections_by_status()

# Obtener conexiones en estado TIME_WAIT
result = mcp.get_network_connections_by_status(
    status="TIME_WAIT"
)

Respuesta:

root@kitploit:~
{
  "statuses": [
    {
      "status": "TIME_WAIT",
      "connections": [
        {
          "protocol": "tcp",
          "local_address": "192.168.1.100:54321",
          "remote_address": "93.184.216.34:443",
          "pid": 5678,
          "process_name": "firefox"
        }
      ],
      "connection_count": 1
    }
  ],
  "total_statuses": 1,
  "total_connections": 1
}

4.2.2.15. get_network_connections_by_protocol

Recupera conexiones de red agrupadas por protocolo.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
protocolstrNoNoneFiltrar por protocolo específico
limitintNo100Número máximo de protocolos a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones agrupadas por protocolo

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones agrupadas por protocolo
result = mcp.get_network_connections_by_protocol()

# Obtener conexiones TCP
result = mcp.get_network_connections_by_protocol(
    protocol="tcp"
)

Respuesta:

root@kitploit:~
{
  "protocols": [
    {
      "protocol": "tcp",
      "connections": [
        {
          "local_address": "192.168.1.100:54321",
          "remote_address": "93.184.216.34:443",
          "status": "ESTABLISHED",
          "pid": 5678,
          "process_name": "firefox"
        }
      ],
      "connection_count": 1
    }
  ],
  "total_protocols": 1,
  "total_connections": 1
}

4.2.2.16. get_network_connections_by_local_address

Recupera conexiones de red agrupadas por dirección local.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
local_addressstrNoNoneFiltrar por dirección local específica
limitintNo100Número máximo de direcciones a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones agrupadas por dirección local

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones agrupadas por dirección local
result = mcp.get_network_connections_by_local_address()

# Obtener conexiones desde una dirección local específica
result = mcp.get_network_connections_by_local_address(
    local_address="192.168.1.100"
)

Respuesta:

root@kitploit:~
{
  "local_addresses": [
    {
      "local_address": "192.168.1.100",
      "connections": [
        {
          "protocol": "tcp",
          "local_address": "192.168.1.100:54321",
          "remote_address": "93.184.216.34:443",
          "status": "ESTABLISHED",
          "pid": 5678,
          "process_name": "firefox"
        }
      ],
      "connection_count": 1
    }
  ],
  "total_addresses": 1,
  "total_connections": 1
}

4.2.2.17. get_network_connections_by_remote_address

Recupera conexiones de red agrupadas por dirección remota.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
remote_addressstrNoNoneFiltrar por dirección remota específica
limitintNo100Número máximo de direcciones a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones agrupadas por dirección remota

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones agrupadas por dirección remota
result = mcp.get_network_connections_by_remote_address()

# Obtener conexiones hacia una dirección remota específica
result = mcp.get_network_connections_by_remote_address(
    remote_address="93.184.216.34"
)

Respuesta:

root@kitploit:~
{
  "remote_addresses": [
    {
      "remote_address": "93.184.216.34",
      "connections": [
        {
          "protocol": "tcp",
          "local_address": "192.168.1.100:54321",
          "remote_address": "93.184.216.34:443",
          "status": "ESTABLISHED",
          "pid": 5678,
          "process_name": "firefox"
        }
      ],
      "connection_count": 1
    }
  ],
  "total_addresses": 1,
  "total_connections": 1
}

4.2.2.18. get_network_connections_by_local_port

Recupera conexiones de red agrupadas por puerto local.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
local_portintNoNoneFiltrar por puerto local específico
limitintNo100Número máximo de puertos a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones agrupadas por puerto local

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones agrupadas por puerto local
result = mcp.get_network_connections_by_local_port()

# Obtener conexiones desde un puerto local específico
result = mcp.get_network_connections_by_local_port(
    local_port=54321
)

Respuesta:

root@kitploit:~
{
  "local_ports": [
    {
      "local_port": 54321,
      "connections": [
        {
          "protocol": "tcp",
          "local_address": "192.168.1.100:54321",
          "remote_address": "93.184.216.34:443",
          "status": "ESTABLISHED",
          "pid": 5678,
          "process_name": "firefox"
        }
      ],
      "connection_count": 1
    }
  ],
  "total_ports": 1,
  "total_connections": 1
}

4.2.2.19. get_network_connections_by_remote_port

Recupera conexiones de red agrupadas por puerto remoto.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
remote_portintNoNoneFiltrar por puerto remoto específico
limitintNo100Número máximo de puertos a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones agrupadas por puerto remoto

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones agrupadas por puerto remoto
result = mcp.get_network_connections_by_remote_port()

# Obtener conexiones hacia un puerto remoto específico
result = mcp.get_network_connections_by_remote_port(
    remote_port=443
)

Respuesta:

root@kitploit:~
{
  "remote_ports": [
    {
      "remote_port": 443,
      "connections": [
        {
          "protocol": "tcp",
          "local_address": "192.168.1.100:54321",
          "remote_address": "93.184.216.34:443",
          "status": "ESTABLISHED",
          "pid": 5678,
          "process_name": "firefox"
        }
      ],
      "connection_count": 1
    }
  ],
  "total_ports": 1,
  "total_connections": 1
}

4.2.2.20. get_network_connections_by_pid

Recupera conexiones de red agrupadas por ID de proceso.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
pidintNoNoneFiltrar por ID de proceso específico
limitintNo100Número máximo de PIDs a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones agrupadas por PID

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones agrupadas por PID
result = mcp.get_network_connections_by_pid()

# Obtener conexiones de un PID específico
result = mcp.get_network_connections_by_pid(
    pid=5678
)

Respuesta:

root@kitploit:~
{
  "pids": [
    {
      "pid": 5678,
      "process_name": "firefox",
      "connections": [
        {
          "protocol": "tcp",
          "local_address": "192.168.1.100:54321",
          "remote_address": "93.184.216.34:443",
          "status": "ESTABLISHED"
        }
      ],
      "connection_count": 1
    }
  ],
  "total_pids": 1,
  "total_connections": 1
}

4.2.2.21. get_network_connections_by_process_name

Recupera conexiones de red agrupadas por nombre de proceso.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
process_namestrNoNoneFiltrar por nombre de proceso específico
limitintNo100Número máximo de nombres de proceso a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones agrupadas por nombre de proceso

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones agrupadas por nombre de proceso
result = mcp.get_network_connections_by_process_name()

# Obtener conexiones de un proceso específico
result = mcp.get_network_connections_by_process_name(
    process_name="nginx"
)

Respuesta:

root@kitploit:~
{
  "process_names": [
    {
      "process_name": "nginx",
      "connections": [
        {
          "protocol": "tcp",
          "local_address": "0.0.0.0:80",
          "remote_address": "0.0.0.0:0",
          "status": "LISTEN",
          "pid": 1234
        }
      ],
      "connection_count": 1
    }
  ],
  "total_process_names": 1,
  "total_connections": 1
}

4.2.2.22. get_network_connections_by_command

Recupera conexiones de red agrupadas por línea de comandos.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
commandstrNoNoneFiltrar por línea de comandos específica
limitintNo100Número máximo de comandos a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones agrupadas por comando

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones agrupadas por comando
result = mcp.get_network_connections_by_command()

# Obtener conexiones de un comando específico
result = mcp.get_network_connections_by_command(
    command="nginx: worker process"
)

Respuesta:

root@kitploit:~
{
  "commands": [
    {
      "command": "nginx: worker process",
      "connections": [
        {
          "protocol": "tcp",
          "local_address": "0.0.0.0:80",
          "remote_address": "0.0.0.0:0",
          "status": "LISTEN",
          "pid": 1234
        }
      ],
      "connection_count": 1
    }
  ],
  "total_commands": 1,
  "total_connections": 1
}

4.2.2.23. get_network_connections_by_user

Recupera conexiones de red agrupadas por usuario.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
usernamestrNoNoneFiltrar por nombre de usuario específico
limitintNo100Número máximo de usuarios a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones agrupadas por usuario

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones agrupadas por usuario
result = mcp.get_network_connections_by_user()

# Obtener conexiones de un usuario específico
result = mcp.get_network_connections_by_user(
    username="www-data"
)

Respuesta:

root@kitploit:~
{
  "users": [
    {
      "username": "www-data",
      "connections": [
        {
          "protocol": "tcp",
          "local_address": "0.0.0.0:80",
          "remote_address": "0.0.0.0:0",
          "status": "LISTEN",
          "pid": 1234,
          "process_name": "nginx"
        }
      ],
      "connection_count": 1
    }
  ],
  "total_users": 1,
  "total_connections": 1
}

4.2.2.24. get_network_connections_by_group

Recupera conexiones de red agrupadas por grupo.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
groupnamestrNoNoneFiltrar por nombre de grupo específico
limitintNo100Número máximo de grupos a devolver

Devuelve: Dict[str, Any] - Diccionario con conexiones agrupadas por grupo

Ejemplo:

root@kitploit:~
# Obtener todas las conexiones agrupadas por grupo
result = mcp.get_network_connections_by_group()

# Obtener conexiones de un grupo específico
result = mcp.get_network_connections_by_group(
    groupname="www-data"
)

Respuesta:

root@kitploit:~
{
  "groups": [
    {
      "groupname": "www-data",
      "connections": [
        {
          "protocol": "tcp",
          "local_address": "0.0.0.0:80",
          "remote_address": "0.0.0.0:0",
          "status": "LISTEN",
          "pid": 1234,
          "process_name": "nginx"
        }
      ],
      "connection_count": 1
    }
  ],
  "total_groups": 1,
  "total_connections": 1
}

4.2.2.25. get_network_connections_by_service

Recupera conexiones de red agrupadas por servicio.

Parámetros:

ParámetroTipoObligatorioPor defectoDescripción
`service_name````bash
cd frontend
npm install
cp env.local.example .env.local # set NEXT_PUBLIC_API_URL=http://localhost:8000
npm run dev
root@kitploit:~
### Docker Compose (ambos servicios)```bash
cp backend/env.example backend/.env   # fill in required values
docker compose up --build

Frontend → http://localhost:3000 Backend API docs → http://localhost:8000/docs


Variables de entorno

Copia backend/env.example a backend/.env y complétalo. Agrupadas según qué tier las necesita:

Siempre requeridas:

VariableDescripción
PG_DSNCadena de conexión de Postgres
JWT_SECRET_KEYSecreto para firmar los tokens de sesión de la app (python -c "import secrets; print(secrets.token_hex(32))")

Auth — elige un modo:

VariableDescripción
LOCAL_API_KEYModo local: clave compartida que otorga acceso de administrador. Deja AZURE_AD_TENANT_ID sin definir para activar este modo
AZURE_AD_TENANT_IDModo Entra: ID de tenant para SSO. Definir esto activa el modo Entra
AZURE_AD_CLIENT_IDModo Entra: client ID del registro de aplicación
AZURE_AD_CLIENT_SECRETModo Entra: secreto del registro de aplicación (solo frontend)
NEXTAUTH_SECRETModo Entra: secreto de cifrado de sesión de NextAuth (solo frontend)

Triaje con IA — opcional, elige un proveedor (omite ambos para ejecutar con el triaje deshabilitado):

VariableDescripción
AI_PROVIDERanthropic (por defecto) o azure
ANTHROPIC_API_KEYClave de API directa de Anthropic
AZURE_FOUNDRY_ENDPOINTEndpoint de Azure AI Foundry, p. ej. https://<resource>.services.ai.azure.com/anthropic
AZURE_FOUNDRY_API_KEYClave de API de Azure AI Foundry
AZURE_FOUNDRY_DEPLOYMENTNombre del deployment de Foundry (por defecto claude-haiku-4-5)
AZURE_FOUNDRY_API_VERSIONVersión de la API de Foundry (por defecto 2025-05-01)

Opcionales:

VariableDescripción
RUNZERO_API_TOKENHabilita la sincronización y correlación de activos de RunZero
ALLOWED_ORIGINSLista de permitidos CORS separada por comas (por defecto http://localhost:3000)
ENABLE_SCHEDULEREstablece false para deshabilitar el poller de feeds en segundo plano (por defecto true)
ARCHIVE_AFTER_DAYSUmbral de archivado automático en días (por defecto 90)
PG_POOL_MIN / PG_POOL_MAX / PG_POOL_TIMEOUTAjuste del pool de conexiones de Postgres (por defecto 1 / 10 / 30)
LOCAL_IMPORT_DIRHabilita la Importación de detecciones locales — ruta absoluta en el sistema de archivos del backend a la que queda confinada cada importación. Sin definir, deshabilita la funcionalidad por completo (su pestaña muestra un mensaje de "no configurado")

Frontend (frontend/.env.local o frontend/env.local.example):

VariableDescripción
NEXT_PUBLIC_API_URLURL del backend tal como la ve el navegador. Se incorpora al bundle de JS en tiempo de compilación. Déjala sin definir para enrutar las llamadas a la API a través del proxy integrado del mismo origen (frontend/pages/api/[...proxy].js) — necesario siempre que el backend no tenga ingress público (p. ej. el Container App de solo uso interno del tier Azure + API)
BACKEND_URLURL del backend tal como la ve el propio servidor de Next.js. La usa el intercambio de login de NextAuth y, cuando NEXT_PUBLIC_API_URL no está definida, el proxy del mismo origen que reenvía del lado del servidor cada petición del navegador a /api/*

Orquestador de detections.ai — próximamente (aún no forma parte de esta versión pública; documentado aquí para cuando se publique. Tier Azure + API, desplegable por separado — consulta backend/detection_pipeline/orchestrator.py):

VariableDescripción
DETECTIONS_AI_API_KEYRequerida para ejecutar el orquestador en absoluto
SENTINEL_WORKSPACE_IDCustomer ID (GUID) del workspace de Log Analytics, para backtesting. Opcional
PIPELINE_BATCH_SIZEEntradas por ejecución (por defecto 5)
PIPELINE_DRY_RUNtrue para reclamar y registrar sin llamar a la API
PIPELINE_LANGUAGELenguaje de consulta de detecciones (por defecto kql)

Sincronización de Sentinel Hunts (opcional, desactivada por defecto — consulta Settings > API Settings para el modo on/off/manual/auto):

VariableDescripción
SENTINEL_HUNTING_SYNC_ENABLEDtrue para permitir cualquier intento de sincronización de hunts en absoluto. Sin definir/false es un no-op puro — cero llamadas a ARM
AZURE_SUBSCRIPTION_IDSuscripción que contiene el workspace de Sentinel
AZURE_RESOURCE_GROUPGrupo de recursos que contiene el workspace de Sentinel
SENTINEL_WORKSPACE_NAMEEl nombre del workspace, no su customer ID — un valor distinto del SENTINEL_WORKSPACE_ID de arriba, que en su lugar usa el cliente del plano de datos de backtesting

Despliegue en Azure

El IaC real y actual es infra/apps.bicep + infra/platform.bicep + infra/app-stack.bicep, desplegado mediante infra/provision.ps1 (o el wrapper ligero scripts/setup-azure.ps1). Aprovisiona Container Apps, secretos respaldados por Key Vault e identidades administradas — Postgres en sí no lo aprovisiona este repositorio; apunta PG_DSN (almacenado como el secreto pg-dsn de Key Vault) a cualquier servidor Postgres accesible.```powershell ./scripts/setup-azure.ps1

or directly:

cd infra cp migration.psd1.example migration.psd1 # fill in your resource group, apps, etc. ./provision.ps1

root@kitploit:~
`provision.ps1` es idempotente — es seguro volver a ejecutarlo después de editar el manifiesto. Consulta su propio comentario de encabezado para ver el paso a paso completo (plataforma → pila de aplicaciones → secretos → Easy Auth → importación de imágenes → aplicaciones → comprobaciones posteriores).

El orquestador de detections.ai (un Container Apps Job programado controlado por un bloque `Orchestrator` en `migration.psd1` — consulta `migration.psd1.example` para ver la forma, y almacena tu clave como el secreto `DETECTIONSAIAPIKEY` de Key Vault) aún no forma parte de esta versión pública — consulta [Two detections-related features](#two-detections-related-features) más arriba.

---

## Estructura del proyecto```
├── backend/
│   ├── main.py                  # FastAPI app, all endpoints
│   ├── db.py                    # Postgres queries
│   ├── pgcompat.py              # connection pool + SQLite-style placeholder translation
│   ├── feed_manager.py          # RSS polling, AI triage (provider-modular), scheduler
│   ├── enrichment.py            # IOC extraction, KEV cache, stack rematch
│   ├── runzero_sync.py          # RunZero asset sync and correlation engine
│   ├── dedup.py                 # CVE deduplication logic
│   ├── auth.py                  # Entra ID SSO + local API-key auth, app JWT sign/verify
│   ├── ioc_export.py            # STIX 2.1 and CSV export
│   ├── stack_presets.py         # Pre-built tech stack templates
│   ├── detection_pipeline/      # detections.ai orchestrator, MITRE alignment-check,
│   │                            # Sentinel hunts/analytics-rules sync + tuning,
│   │                            # audit log, local_import.py (Local Detections Import)
│   └── tests/                   # pytest test suite, incl. fixtures/local_import/
├── frontend/
│   ├── pages/
│   │   ├── index.js              # Main app shell + tab routing
│   │   └── login.js              # Entra ID or local API-key login, auto-detected
│   ├── lib/
│   │   ├── authMode.js           # GET /api/auth/mode, cached per page load
│   │   ├── authFetch.js          # Bearer auth + 401-retry wrapper
│   │   └── authSession.js        # token storage, JWT decode/expiry helpers
│   └── components/
│       ├── layout/                # TopBar, Sidebar, TabBar, TopFilterBar, TimeRangeToggle
│       ├── feed/                  # FeedList, FeedCard
│       ├── integrations/          # IntegrationsPanel, ExposurePanel, RunZeroPanel,
│       │                          # RunZeroMatchesPanel, RunZeroMetricsPanel
│       ├── detections/            # DetectionsPanel (tab shell) + one component per
│       │                          # sub-tab: DetectionsCatalogPanel, AlignmentReviewPanel,
│       │                          # DispositionAlertsPanel, HuntsPanel, SentinelHuntsPanel,
│       │                          # SentinelAnalyticsRulesPanel, LocalDetectionsPanel,
│       │                          # AuditPanel, plus shared TuningSuggestionBadge
│       ├── settings/              # SettingsPanel, CadencePicker, SeverityCards
│       └── mitre/                 # MitreMatrix
├── infra/                       # Azure Bicep templates + provision.ps1
├── scripts/                     # Tiered setup scripts (see Deployment tiers)
└── docker-compose.yml

Fuentes de feeds

63 feeds en tres niveles:

  • Nivel 1 — CISA, Cisco Talos, Fortinet Threat Signal, ESET WeLiveSecurity, Microsoft Security Blog, SentinelOne Labs, Google Project Zero, Zero Day Initiative, Check Point Research, Talos Intelligence Blog, The DFIR Report, Oracle
  • Nivel 2 — Recorded Future, Malpedia, SANS ISC, Securelist, Unit42, Proofpoint TI, Malwarebytes TI, Wiz Blog, Datadog Security Labs, ReversingLabs, Sekoia, Cyble, ANY.RUN Blog, y más
  • Nivel 3 — BleepingComputer, Krebs on Security, Schneier on Security, The Hacker News, Dark Reading, CrowdStrike Blog, Snyk, Semgrep, y más

Seguridad

  • Todos los endpoints de la API requieren Authorization: Bearer <token>
  • Comparación de tokens segura contra ataques de temporización (secrets.compare_digest) para la clave de autenticación local
  • SQL parametrizado en todo el código — sin interpolación de cadenas en las consultas
  • CORS restringido a una lista explícita de orígenes permitidos
  • Entradas del LLM saneadas antes de las llamadas al proveedor de IA; salidas validadas antes del almacenamiento
  • Los contenedores se ejecutan como no root con todas las capacidades de Linux eliminadas
  • Sin secretos incrustados en las imágenes — se cargan en tiempo de ejecución desde .env / Azure Key Vault

Licencia

MIT — ver LICENSE.

Descargar herramienta