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.
| Proyecto | Herramienta | Categoria | Splunk Sourcetype |
|---|---|---|---|
| Auditing_with_PowerShell | ps_security_audit | System | powershell:audit |
| wifi-marauder-viewer | wifi_marauder_scan | System | wifi:marauder |
| Visualizacion_extendida_M5StickPlus2 | m5stick_networks | System | m5stick: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
- Siempre:
index_scan_event()envia metadata del scan (scan_id, tool, target, status, elapsed) - 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
| Sourcetype | Procedencia | Busqueda SPL tipica |
|---|---|---|
_json | Metadata de scans/pipelines (default) | index=sec_dashboard sourcetype=_json |
powershell:audit | PS Security Audit (1 evento por modulo) | index=sec_dashboard sourcetype=powershell:audit module=02_Usuarios |
wifi:marauder | WiFi Marauder Scan (redes M5StickC) | index=sec_dashboard sourcetype=wifi:marauder |
m5stick:networks | M5Stick Plus 2 networks + clients | index=sec_dashboard sourcetype=m5stick:networks |
Cambios realizados en sec-dashboard
1. backend/splunk.py (modificado)
_send_to_splunk()ahora aceptasourcetypeopcional (override del default)- Nuevo:
RICH_JSON_TOOLSdict ” 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.jsondesde wifi-marauder-viewerm5stick_networks(target)” GET/api/networks.jsondesde 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_TOOLSconinput_type: text(URL input)
4. backend/scanner.py (modificado)
- Import de
wifi_marauder_scanym5stick_networksdesdebackend.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á enRICH_JSON_TOOLSy tuvo exito:- PS audit: llama
index_audit_modules()con los resultados por modulo - WiFi: llama
index_full_results()con el JSON completo
- PS audit: llama
Auditing_with_PowerShell (ps_security_audit)
| Aspecto | Detalle |
|---|---|
| Repo | https://github.com/HOSTNAME/Auditing_with_PowerShell |
| Clonado en | C:\Users\you\Auditing_with_PowerShell |
| Script | Invoke-SecurityAudit.ps1 (68KB) |
| Modulos | 10 (sistema, usuarios, procesos, red, logs, ficheros, registro, servicios, LOLBAS, drivers) |
| Input | Ninguno (click y ejecuta) |
| Timeout | 600s (10 min) |
| Splunk | 1 evento por modulo, sourcetype powershell:audit |
| Requisito | Windows + PowerShell 5.1+ (admin recomendado) |
| Wrapper | backend/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)
| Aspecto | Detalle |
|---|---|
| Repo | https://github.com/HOSTNAME/wifi-marauder-viewer |
| Hardware | M5StickC + firmware Marauder (o ESP32 Marauder) |
| Flask app | app.py en puerto 5000 |
| API | /api/scan.json |
| Input | URL del viewer (default: http://127.0.0.1:5000) |
| Timeout | 30s |
| Splunk | 1 evento con todas las redes, sourcetype wifi:marauder |
| Wrapper | backend/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:5000Luego 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.pyVisualizacion_extendida_M5StickPlus2 (m5stick_networks)
| Aspecto | Detalle |
|---|---|
| Repo | https://github.com/HOSTNAME/Visualizacion_extendida_M5StickPlus2 |
| Hardware | M5Stick Plus 2 + firmware Evil-M5Project |
| Flask app | src/app.py en puerto 5000 |
| API | /api/networks.json |
| Input | URL del viewer (default: http://127.0.0.1:5000) |
| Timeout | 30s |
| Splunk | 1 evento con redes + clientes, sourcetype m5stick:networks |
| Wrapper | backend/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:5000Luego 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.pyExport JSON standalone
python src/log_to_csv.py -i wifi_scan_evil.log --json -o resultado.jsonConfiguracion 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 POSTVia 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.pyPS audit: “Invoke-SecurityAudit.ps1 not found”
El repo no está clonado. Ver Integracion Auditing with PowerShell
Splunk no recibe eventos
- Verificar que Splunk está habilitado:
GET /api/splunk←’enabled: true - Test de conexión:
POST /api/splunk/test - Revisar credenciales y URL
- 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 5001Y 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