sec-dashboard - Integracion Hardware + Splunk Export

Integración de 3 proyectos de hardware/scripting en sec-dashboard con export automático de resultados JSON a Splunk.

ProyectoHerramientaCategoriaSplunk Sourcetype
Auditing_with_PowerShellps_security_auditSystempowershell:audit
wifi-marauder-viewerwifi_marauder_scanSystemwifi:marauder
Visualizacion_extendida_M5StickPlus2m5stick_networksSystemm5stick:networks

Total herramientas en sec-dashboard: 35 (antes 32, ahora +3)


Arquitectura del Splunk Export

sec-dashboard (FastAPI :8444)
       |
       |-- POST /api/tools/{id}/run
       |         |
       |    scanner.py -> handler()
       |         |
       |    tool ejecuta y devuelve JSON
       |         |
       |    main.py: _run_scan()
       |         |
       |    ├── splunk.index_scan_event()          # metadata (siempre)
       |    └── splunk.index_full_results()         # JSON completo (solo RICH_JSON_TOOLS)
       |         └── splunk.index_audit_modules()   # 1 evento por modulo (PS audit)
       |
       v
    Splunk (REST API :8089)
       index=sec_dashboard

Flujo de export

  1. Siempre: index_scan_event() envia metadata del scan (scan_id, tool, target, status, elapsed)
  2. Solo RICH_JSON_TOOLS: despues del metadata, se envia el JSON completo:
  • PS audit: index_audit_modules() ” un evento Splunk por cada modulo (01_Sistema, 02_Usuarios, etc.) para busqueda granular
  • WiFi tools: index_full_results() ” un evento con todo el JSON de redes detectadas

Sourcetypes en Splunk

SourcetypeProcedenciaBusqueda SPL tipica
_jsonMetadata de scans/pipelines (default)index=sec_dashboard sourcetype=_json
powershell:auditPS Security Audit (1 evento por modulo)index=sec_dashboard sourcetype=powershell:audit module=02_Usuarios
wifi:marauderWiFi Marauder Scan (redes M5StickC)index=sec_dashboard sourcetype=wifi:marauder
m5stick:networksM5Stick Plus 2 networks + clientsindex=sec_dashboard sourcetype=m5stick:networks

Cambios realizados en sec-dashboard

1. backend/splunk.py (modificado)

  • _send_to_splunk() ahora acepta sourcetype opcional (override del default)
  • Nuevo: RICH_JSON_TOOLS dict ” mapea tool_id a sourcetype
  • Nuevo: index_full_results(tool, data, sourcetype) ” envia JSON completo como 1 evento
  • Nuevo: index_audit_modules(scan_id, tool, results, audit_folder) ” envia 1 evento por modulo del PS audit

2. backend/tools/wifi.py (nuevo, 120 lineas)

Modulo con 2 handlers que hacen polling a las Flask apps de los dispositivos M5Stick:

  • wifi_marauder_scan(target) ” GET /api/scan.json desde wifi-marauder-viewer
  • m5stick_networks(target) ” GET /api/networks.json desde M5Stick Plus 2 viewer

Ambos:

  • Aceptan URL base como target (default: http://127.0.0.1:5000)
  • Retornan JSON estructurado con redes + summary (avg_rssi, channels, etc.)
  • Mensajes de error claros si la Flask app no está corriendo (con hint de como arrancarla)

3. backend/config.py (modificado)

  • 2 herramientas nuevas en TOOLS:
    • wifi_marauder_scan (icon: WF, timeout: 30s)
    • m5stick_networks (icon: M5, timeout: 30s)
  • 2 entradas nuevas en SPECIAL_TOOLS con input_type: text (URL input)

4. backend/scanner.py (modificado)

  • Import de wifi_marauder_scan y m5stick_networks desde backend.tools.wifi
  • Handler mapping para ambas herramientas
  • Los WiFi tools NO estan en system_tools (reciben URL como target)

5. backend/main.py (modificado)

  • Tras index_scan_event(), si el tool está en RICH_JSON_TOOLS y tuvo exito:
    • PS audit: llama index_audit_modules() con los resultados por modulo
    • WiFi: llama index_full_results() con el JSON completo

Auditing_with_PowerShell (ps_security_audit)

AspectoDetalle
Repohttps://github.com/HOSTNAME/Auditing_with_PowerShell
Clonado enC:\Users\you\Auditing_with_PowerShell
ScriptInvoke-SecurityAudit.ps1 (68KB)
Modulos10 (sistema, usuarios, procesos, red, logs, ficheros, registro, servicios, LOLBAS, drivers)
InputNinguno (click y ejecuta)
Timeout600s (10 min)
Splunk1 evento por modulo, sourcetype powershell:audit
RequisitoWindows + PowerShell 5.1+ (admin recomendado)
Wrapperbackend/tools/audit.py

JSON de salida del script

Auditoria_<timestamp>/
  01_Sistema/
    *.json
    *.csv
  02_Usuarios/
    *.json
    *.csv
  ... (10 modulos)
  auditoria.log

El wrapper lee los JSON de cada subcarpeta y los devuelve estructurados.

Ejemplo de evento Splunk

{
  "event": "sec_dashboard_ps_audit_module",
  "timestamp": "2026-06-26T19:30:00",
  "scan_id": 42,
  "tool": "ps_security_audit",
  "module": "02_Usuarios",
  "audit_folder": "C:\\Users\\...\\Auditoria_20260626_193000",
  "data": { ... }
}

Busqueda SPL: index=sec_dashboard sourcetype=powershell:audit module=02_Usuarios


wifi-marauder-viewer (wifi_marauder_scan)

AspectoDetalle
Repohttps://github.com/HOSTNAME/wifi-marauder-viewer
HardwareM5StickC + firmware Marauder (o ESP32 Marauder)
Flask appapp.py en puerto 5000
API/api/scan.json
InputURL del viewer (default: http://127.0.0.1:5000)
Timeout30s
Splunk1 evento con todas las redes, sourcetype wifi:marauder
Wrapperbackend/tools/wifi.py:wifi_marauder_scan()

JSON de la API

{
  "scan_time": "2026-06-26T18:00:00+00:00",
  "total_networks": 2,
  "networks": [
    {
      "channel": 6,
      "rssi": -73,
      "bssid": "d4:f8:29:a7:17:b0",
      "essid": "MiFibra-17B0",
      "first_seen": "2026-06-26T17:55:01+00:00",
      "last_seen": "2026-06-26T18:00:00+00:00"
    }
  ]
}

Setup

git clone https://github.com/HOSTNAME/wifi-marauder-viewer.git
cd wifi-marauder-viewer
pip install -r requirements.txt
python app.py
# Abrir http://127.0.0.1:5000

Luego en sec-dashboard: System ←’ WiFi Marauder Scan ←’ Run (URL default funciona)

Splunk HEC directo (alternativo)

El viewer tambien soporta HEC propio via env vars:

$env:SPLUNK_HEC_URL = "https://127.0.0.1:8088/services/collector"
$env:SPLUNK_HEC_TOKEN = "tu-token"
python app.py

Visualizacion_extendida_M5StickPlus2 (m5stick_networks)

AspectoDetalle
Repohttps://github.com/HOSTNAME/Visualizacion_extendida_M5StickPlus2
HardwareM5Stick Plus 2 + firmware Evil-M5Project
Flask appsrc/app.py en puerto 5000
API/api/networks.json
InputURL del viewer (default: http://127.0.0.1:5000)
Timeout30s
Splunk1 evento con redes + clientes, sourcetype m5stick:networks
Wrapperbackend/tools/wifi.py:m5stick_networks()

JSON de la API

{
  "scan_time": "2026-06-26T18:00:00+00:00",
  "total_networks": 2,
  "total_clients": 5,
  "networks": [
    {
      "ssid": "MOVISTAR_9C29",
      "bssid": "4c:ab:fb:33:54:b7",
      "channel": 6,
      "n_clients": 3,
      "last_seen": "18:00:01.234"
    }
  ]
}

Setup

git clone https://github.com/HOSTNAME/Visualizacion_extendida_M5StickPlus2.git
cd Visualizacion_extendida_M5StickPlus2
pip install -r requirements.txt
 
# 1. Capturar serial (otra terminal)
python src/serial_logger.py -b 115200 -o wifi_scan_evil.log
 
# 2. Dashboard web
python src/app.py
# Abrir http://127.0.0.1:5000

Luego en sec-dashboard: System ←’ M5Stick Networks ←’ Run (URL default funciona)

Splunk HEC directo (alternativo)

$env:SPLUNK_HEC_URL = "https://127.0.0.1:8088/services/collector"
$env:SPLUNK_HEC_TOKEN = "tu-token"
python src/app.py

Export JSON standalone

python src/log_to_csv.py -i wifi_scan_evil.log --json -o resultado.json

Configuracion de Splunk en sec-dashboard

Via API

# Configurar
$body = @{ enabled = $true; url = "https://127.0.0.1:8089"; username = "admin"; password = "tu-pass"; index = "sec_dashboard"; sourcetype = "_json"; verify_ssl = $false } | ConvertTo-Json
Invoke-WebRequest -Uri "http://127.0.0.1:8444/api/splunk" -Method POST -Body $body -ContentType "application/json"
 
# Test
Invoke-WebRequest -Uri "http://127.0.0.1:8444/api/splunk/test" -Method POST
 
# Export masivo (historico)
Invoke-WebRequest -Uri "http://127.0.0.1:8444/api/splunk/export-all" -Method POST

Via UI

Dashboard ←’ Settings ←’ Splunk ←’ configurar URL, credenciales, index ←’ Enable ←’ Test


Estructura de archivos modificados

sec-dashboard/
  backend/
    splunk.py           # +50 lineas (RICH_JSON_TOOLS, index_full_results, index_audit_modules)
    config.py           # +20 lineas (2 tools, 2 SPECIAL_TOOLS)
    scanner.py          # +4 lineas (import, 2 handlers)
    main.py             # +10 lineas (full results export tras scan)
    tools/
      wifi.py           # NUEVO (120 lineas, 2 handlers)
      audit.py          # sin cambios (ya existia)

Troubleshooting

WiFi tools: “Cannot connect to 127.0.0.1:5000”

La Flask app del dispositivo no está corriendo. Iniciarla:

# Marauder
cd wifi-marauder-viewer; python app.py
 
# M5Stick Plus 2
cd Visualizacion_extendida_M5StickPlus2; python src/app.py

PS audit: “Invoke-SecurityAudit.ps1 not found”

El repo no está clonado. Ver Integracion Auditing with PowerShell

Splunk no recibe eventos

  1. Verificar que Splunk está habilitado: GET /api/splunk ←’ enabled: true
  2. Test de conexión: POST /api/splunk/test
  3. Revisar credenciales y URL
  4. Si el scan tiene exito pero Splunk no recibe, el JSON puede ser demasiado grande ” Splunk REST tiene limite de ~1MB por evento

Puerto conflicto (5000)

Ambas Flask apps usan puerto 5000 por defecto. Si se ejecutan simultaneamente:

# Una de ellas en otro puerto
python app.py --port 5001

Y en sec-dashboard, introducir http://127.0.0.1:5001 como URL.


Notas

  • Los WiFi tools son polling (no streaming): cada ejecución hace un GET a la API y devuelve el snapshot actual
  • Para monitorización continua, usar el HEC directo de cada viewer (env vars SPLUNK_HEC_URL + SPLUNK_HEC_TOKEN)
  • El PS audit envia 1 evento por modulo a Splunk (no 1 evento gigante) para busqueda granular
  • Los sourcetypes personalizados (wifi:marauder, m5stick:networks, powershell:audit) permiten filtrar fácilmente en SPL
  • Ver tambien: Project Overview, Guía de uso, Integracion Auditing with PowerShell