
Consola central para los recolectores de Douglas-042 HEADQUARTERS. Rastrea una flota, correlaciona resultados entre hosts y gestiona feeds de IOC y la entrega a SIEM desde un único lugar.
Recorre una flota de hosts Windows y Linux en busca de indicios de compromiso, decide qué importa realmente y actúa en consecuencia — desde una sola consola, con un solo comando por host.

Una búsqueda no es un escaneo. Douglas recopila los artefactos que un analista recopilaría a mano — procesos, servicios, tareas programadas, autoruns, conexiones, cuentas, controladores, registros de eventos, cron, systemd, historial de shell, raíces web — y ejecuta 201 detecciones integradas sobre ellos, además de tus propias reglas Sigma, YARA y personalizadas.
Después hace las partes que la mayoría de las herramientas te dejan a ti: dice qué hallazgos aún necesitan una decisión, cuál de las sesenta direcciones externas mirar primero, y te permite hacer algo al respecto sin abrir una sesión RDP.
desplegar un comando ──▶ búsqueda ──▶ los hallazgos aparecen en vivo
│
┌──────────────────────┼──────────────────────┐
▼ ▼ ▼
coincidencia en feed IOC puntuación de reputación acciones de respuesta
"esto es un C2 conocido" "92/100, 340 reportes" aislar · matar · recopilar
Los entornos que más necesitan búsqueda de amenazas suelen ser los que no tienen un EDR: unos pocos servidores, sin presupuesto para agentes, y un incidente que comenzó hace tres días. La elección suele estar entre una plataforma comercial que nadie aprobó y una carpeta de scripts de PowerShell que alguien ejecuta a mano.
Douglas se sitúa entre ambos. No se instala nada en el host que estás investigando — el recopilador se ejecuta una vez y sale — y cada resultado llega a una sola consola que puedes entregar a quien retome el incidente después.
Los hallazgos son fáciles de producir y costosos de leer. Esta pantalla existe para mantener la cola lo suficientemente corta como para que alguien siga leyéndola en la tercera pasada.
Tres resultados, y la diferencia entre ellos importa seis meses después:
| Decisión | Qué hace |
|---|---|
| Confirmado | Real. Permanece en la puntuación de riesgo, el host sigue en rojo. |
| Falso positivo | Se elimina de la puntuación solo para ese host. |
| Supresión | Una regla permanente que oculta el mismo hallazgo en cada escaneo futuro. |
Nunca se elimina nada. Retira una supresión y todo lo que ocultaba vuelve. Reglas más ruidosas está abajo porque ajustarlas despeja la cola más rápido que trabajarla hallazgo por hallazgo.
Las 201 detecciones están agrupadas en 15 categorías — desactivables una a una o toda una familia a la vez. Haz clic en cualquier regla para leer qué comprueba, cómo se activa legítimamente y qué hacer a continuación.
La distinción que la pantalla deja clara, porque equivocarse es común:
Desactivar una regla no es lo mismo que suprimirla. Desactivada significa que el recopilador nunca ejecuta la comprobación — no se produce nada y no hay nada que revisar. Una supresión registra el hallazgo y lo marca como una decisión que alguien tomó, con un motivo adjunto.
Usa desactivar para una familia de ruido que has aceptado. Usa supresión para un patrón específico en un host específico.
Un guion bajo Fired suele ser la respuesta saludable: DGL-014 solo se activa cuando un registro parece borrado. La lista es lo que la herramienta comprueba, no lo que está mal.
El formulario es más rápido para tu primera regla y más lento para la vigésima. Por eso las reglas también pueden escribirse como texto — verificadas mientras escribes, contra 11 tablas de artefactos y 13 operadores.
El cuadro de abajo cumple dos funciones. Cuando la regla es incorrecta, nombra la línea, no la regla:
line 7: Condition 1: 'is_maybe' is not an operator.
Cuando es correcta, dice qué coincidirá realmente la regla — porque una regla que valida y luego coincide con algo distinto de lo que su autor pretendía es el fallo que vale la pena detectar:
Valid — ACME-001 Reads Services and matches when Signed is false and PathName does not contain 'Program Files' and PathName does not contain 'System32'
Importa y exporta en JSON, YAML o CSV. El ida y vuelta está garantizado — nuestra propia exportación pasa nuestro propio validador en los tres formatos.
| Pregunta | Cuándo | Resultado | |
|---|---|---|---|
| Feed IOC | ¿Hay algo de esta lista de C2 en mis hosts? | Durante la búsqueda | DGL-IOC — una coincidencia confirmada, no una puntuación |
| Enriquecimiento | Este host habló con 60 direcciones — ¿cuál primero? | Después de la búsqueda | 92/100, 340 reportes, C2 de Cobalt Strike conocido |
Quince fuentes de feeds vienen listas para usar — Feodo, ThreatFox, URLhaus, TweetFeed, USOM, SSL Blacklist, Emerging Threats, OpenPhish, MISP — más un Feed personalizado que lee cualquier URL que devuelva datos con forma de indicador.
Cuatro proveedores de reputación: AbuseIPDB, VirusTotal, ThreatFox (niveles gratuitos) y GreyNoise (de pago, desactivado por defecto). Los veredictos nunca se combinan en un solo número — AbuseIPDB cuenta quejas, VirusTotal cuenta motores, ThreatFox conoce infraestructura, y un promedio de esos es una cifra que ninguno de ellos defendería. La insignia muestra el peor veredicto con el proveedor que lo dio.
Los niveles gratuitos están protegidos: resultados en caché 12 horas, 40 direcciones por ejecución, y un contador diario que se detiene antes que el proveedor. Las direcciones privadas nunca se envían.
Once acciones en tres grupos — mirar, actuar, contener. Las cinco de solo lectura se marcan de forma distinta a las seis que cambian el host, y cada acción que modifica requiere un motivo escrito.
El aislamiento mantiene la consola accesible a propósito: un host aislado de su propio
agente no puede liberarse de forma remota, y alguien tendría que caminar hasta él.
Los objetivos que romperían la máquina en lugar de contener la intrusión —
lsass.exe, systemd, pid 1, Administrator, /bin/bash — se rechazan, no se
advierten, porque el momento en que esto se usa es el momento en que nadie está leyendo
las advertencias.
La salida vuelve como tarjetas estructuradas en lugar de un volcado de terminal, y las filas son accionables: una lista de procesos tiene un botón Kill por fila, una dirección tiene Reputation.
| Windows | Linux | |
|---|---|---|
| Sigma | Registro de eventos + Sysmon | auditd execve + auth/cron/syslog |
| YARA | contenido de archivos | contenido de archivos |
Las reglas Sigma de Linux cuya fuente de registro no puede leerse se rechazan al subirlas con un motivo, en lugar de cargarse y dejarse sin activarse nunca — un resultado vacío de una regla que no pudo ejecutarse se parece exactamente a un host limpio.
El agente de Linux comprueba si auditd está instalado, en ejecución, y tiene reglas
cargadas, y luego dice qué falta y qué cuesta:
Detection capabilities on this host
auditd : NOT RUNNING
Nothing records what executes on this host, so execution
rules cannot fire and a clean result only means the sweep
could not look. Install it:
apt install auditd && systemctl enable --now auditd
Once destinos en tres grupos:
Los destinos de chat y paginación muestran una frase en lugar de un registro, y limitan cuántos hallazgos van en un solo mensaje: un canal en el que se pegan cien líneas es un canal que la gente silencia.
git clone https://github.com/YOURNAME/douglas-042.git
cd douglas-042
pip install -r requirements.txt
uvicorn app.main:app --host 0.0.0.0 --port 8000
O con Docker:
docker compose up -d
Inicio de sesión por defecto
Usuario:
adminContraseña:douglasLa consola obliga a cambiar la contraseña en el primer inicio de sesión — una contraseña por defecto integrada en un paquete no debe sobrevivir sin que nadie se dé cuenta. Define
DOUGLAS_CONSOLE_PASSWORDen.envantes del primer arranque si prefieres elegir la tuya.
.envsolo se lee mientras la base de datos está vacía. Después del primer arranque, restablécelo conpython3 -m app.manage passwd admin.
Al arrancar obtienes el token de enrolamiento para el siguiente paso:
Created the initial admin account: admin
The default password is still in use. Change it at first sign-in.
Enrollment token ready: dgl-enroll-xBAk8...
Douglas-042 console 1.0 ready
Deploy → elige la plataforma → copia un comando.
Windows — PowerShell con privilegios elevados:
iex (irm 'http://console:8000/api/v1/reports/deploy/script?token=YOUR_TOKEN')
Linux — como root:
curl -sSL 'http://console:8000/api/v1/reports/deploy/script?token=YOUR_TOKEN&platform=linux' | sudo bash
Seis pasos se muestran en el terminal: descarga, enrolamiento, obtención del recopilador, instalación del servicio, confirmación de que está vivo, primer registro. Si el enrolamiento falla, no se instala nada, y lo dice.
| # | Pantalla | Haz esto | Obtienes |
|---|---|---|---|
| 1 | Feeds IOC | Añade Feodo Tracker, pulsa Refresh | Detección de C2 — sin regla que escribir |
| 2 | Threat intel | Pega una clave gratuita de AbuseIPDB, pulsa Test | Orden de triaje en el grafo |
| 3 | Fleet | Selecciona un host, Launch hunt | Hallazgos, en vivo |
| 4 | Logs & events | Busca errores de módulos | Si el recorrido pudo realmente mirar |
| 5 | Triaje | Trabaja la cola, ajusta las reglas más ruidosas | Una lista que alguien sigue leyendo |
| 6 | My rules | Carga los 6 ejemplos, abre uno | Cómo escribir las tuyas |
| 7 | Integrations | Webhook de Slack, umbral en HIGH | Te enteras sin estar mirando |
┌──────────────────────────────────────────────────────────┐
│ Consola — FastAPI + SQLite, un proceso, sin cola │
│ triaje · hallazgos · grafo · reglas · respuesta · informes│
└───────────────▲──────────────────────────────────────────┘
│ los agentes consultan: heartbeat 20s, acciones 5s
┌───────────────┴──────────────────────────────────────────┐
│ Agente (PowerShell / shell) │
│ └── Recopilador — se ejecuta, informa, sale │
│ 201 reglas integradas + Sigma + YARA + tus reglas│
└──────────────────────────────────────────────────────────┘
Dashboard · Cases · Fleet · Hunts · Response · Findings · Triage · Frequency · Graph · MITRE matrix · Timeline · Diff · Built-in rules · My rules · Sigma · YARA · IOC feeds · Threat intel · Integrations · Schedules · Users · Deploy · Logs & events
Integridad de la recopilación · Autoruns y arranque · Procesos y red · Servicios y tareas · Mecanismos de persistencia · Postura de seguridad · Controladores y kernel · Evidencia de ejecución · Autenticación y cuentas · Acceso remoto · Sysmon, Kerberos y AD · Archivos, webshells y exfiltración · Actividad del usuario y confianza · Rootkit y memoria · Coincidencias de indicadores
Ambos: cuentas y grupos locales · procesos en ejecución con firmas y hashes · conexiones TCP y endpoints externos · servicios · archivos escritos recientemente · código en memoria · raíces web y patrones de webshell
Windows: registros de eventos · tareas programadas · autoruns · persistencia en el registro · suscripciones WMI · controladores · recursos compartidos SMB · Prefetch · almacenes de certificados
Linux: cron · unidades systemd · archivos de inicio del shell · LD_PRELOAD · binarios setuid · authorized_keys y configuración de sshd · historial del shell · registros de autenticación · taint del kernel · WordPress
Consola: Python 3.11+, seis dependencias (FastAPI, uvicorn, SQLAlchemy, pydantic, python-multipart, PyYAML). Se ejecuta en una VM de 1 GB.
Hosts Windows: PowerShell 5.1+, administrador. Nada más.
Hosts Linux: bash y curl. python3 habilita el progreso en vivo y las reglas de
contenido de archivos; auditd habilita las detecciones de ejecución. La consola te dice
cuáles faltan en qué host.
0600 — una clave fija
incluida en un paquete sería compartida por todos los que lo descargaran.📄 Informe técnico (PDF) — 14 páginas que cubren la arquitectura, cada pantalla de la consola, los 37 módulos del recopilador, el modelo de detección, las acciones de respuesta y el modelo de seguridad.
Licenciado bajo la Licencia MIT. Consulta LICENSE.