
Console centrale per i collector di Douglas-042 HEADQUARTERS. Analizza una flotta, correla i risultati tra gli host e gestisce i feed IOC e la consegna al SIEM da un unico posto.
Scansiona una flotta di host Windows e Linux alla ricerca di segni di compromissione, decidi cosa conta davvero e agisci di conseguenza — da un'unica console, con un solo comando per host.

Una caccia non è una scansione. Douglas raccoglie gli artefatti che un analista raccoglierebbe a mano — processi, servizi, attività pianificate, autorun, connessioni, account, driver, log eventi, cron, systemd, cronologia shell, web root — ed esegue 201 detection integrate su di essi, più le tue regole Sigma, YARA e personalizzate.
Poi fa le parti che la maggior parte degli strumenti lascia a te: dice quali risultati richiedono ancora una decisione, quale dei sessanta indirizzi esterni guardare per primo, e ti permette di fare qualcosa al riguardo senza aprire una sessione RDP.
deploy one command ──▶ hunt ──▶ findings appear live
│
┌──────────────────────┼──────────────────────┐
▼ ▼ ▼
IOC feed match reputation score response actions
"this is a known C2" "92/100, 340 reports" isolate · kill · collect
Gli ambienti che hanno più bisogno di essere cacciati sono spesso quelli senza un EDR: qualche decina di server, nessun budget per agent e un incidente iniziato tre giorni fa. La scelta è di solito tra una piattaforma commerciale che nessuno ha approvato e una cartella di script PowerShell che qualcuno esegue a mano.
Douglas si colloca tra i due. Nulla viene installato sull'host che stai investigando — il collector viene eseguito una volta e termina — e ogni risultato finisce in un'unica console che puoi consegnare a chiunque riprenda in mano l'incidente successivamente.
I risultati sono facili da produrre e costosi da leggere. Questa schermata esiste per mantenere la coda abbastanza corta che qualcuno la stia ancora leggendo al terzo passaggio.
Tre esiti, e la differenza tra loro conta sei mesi dopo:
| Decisione | Cosa fa |
|---|---|
| Confermato | Reale. Rimane nel punteggio di rischio, l'host rimane rosso. |
| Falso positivo | Esce dal punteggio solo per quell'host. |
| Soppressione | Una regola permanente che nasconde lo stesso risultato in ogni scansione futura. |
Nulla viene mai eliminato. Ritira una soppressione e tutto ciò che ha nascosto ritorna. Regole più rumorose si trova in fondo perché metterle a punto libera la coda più velocemente che lavorarla risultato per risultato.
Tutte le 201 detection sono raggruppate in 15 categorie — disattivabili una alla volta o un'intera famiglia in una volta. Clicca su qualsiasi regola per leggere cosa verifica, come si attiva legittimamente e cosa fare dopo.
La distinzione che la schermata chiarisce, perché sbagliarla è comune:
Disattivare una regola non è la stessa cosa che sopprimerla. Disattivata significa che il collector non esegue mai il controllo — nulla viene prodotto e non c'è nulla da rivedere. Una soppressione registra il risultato e lo contrassegna come una decisione che qualcuno ha preso, con una motivazione allegata.
Usa disattivata per una famiglia di rumore che hai accettato. Usa soppressione per un pattern specifico su un host specifico.
Un trattino sotto Attivata è di solito la risposta sana: DGL-014 si attiva solo quando un log sembra cancellato. La lista è ciò che lo strumento verifica, non ciò che è sbagliato.
Il modulo è più veloce per la tua prima regola e più lento per la ventesima. Quindi le regole possono anche essere scritte come testo — verificate mentre digiti, rispetto a 11 tabelle di artefatti e 13 operatori.
Il riquadro sottostante svolge due funzioni. Quando la regola è sbagliata indica la riga, non la regola:
line 7: Condition 1: 'is_maybe' is not an operator.
Quando è corretta, dice cosa corrisponderà effettivamente la regola — perché una regola che si convalida e poi corrisponde a qualcosa di diverso da ciò che il suo autore intendeva è il fallimento che vale la pena cogliere:
Valida — ACME-001 Legge Services e corrisponde quando Signed è false e PathName non contiene 'Program Files' e PathName non contiene 'System32'
Importa ed esporta in JSON, YAML o CSV. Il round-trip è garantito — la nostra stessa esportazione supera il nostro stesso validatore in tutti e tre i formati.
| Domanda | Quando | Risultato | |
|---|---|---|---|
| Feed IOC | C'è qualcosa da questa lista C2 sui miei host? | Durante la caccia | DGL-IOC — una corrispondenza confermata, non un punteggio |
| Arricchimento | Questo host ha comunicato con 60 indirizzi — quali per primi? | Dopo la caccia | 92/100, 340 segnalazioni, C2 Cobalt Strike noto |
Quindici fonti di feed sono pronte all'uso — Feodo, ThreatFox, URLhaus, TweetFeed, USOM, SSL Blacklist, Emerging Threats, OpenPhish, MISP — più un Feed personalizzato che legge qualsiasi URL che restituisca dati a forma di indicatore.
Quattro provider di reputazione: AbuseIPDB, VirusTotal, ThreatFox (livelli gratuiti) e GreyNoise (a pagamento, disattivato per impostazione predefinita). I verdetti non vengono mai fusi in un unico numero — AbuseIPDB conta le segnalazioni, VirusTotal conta i motori, ThreatFox conosce l'infrastruttura, e una media di questi è una cifra che nessuno di loro difenderebbe. Il badge mostra il verdetto peggiore con il provider che l'ha fornito.
I livelli gratuiti sono protetti: risultati in cache per 12 ore, 40 indirizzi per esecuzione e un contatore giornaliero che si ferma prima del provider. Gli indirizzi privati non vengono mai inviati.
Undici azioni in tre gruppi — osserva, agisci, contieni. Le cinque di sola lettura sono contrassegnate diversamente dalle sei che modificano l'host, e ogni azione mutante richiede una motivazione scritta.
L'isolamento mantiene la console raggiungibile di proposito: un host tagliato fuori dal proprio
agent non può essere rilasciato da remoto, e qualcuno dovrebbe camminare fino ad esso.
I target che romperebbero la macchina invece di contenere l'intrusione —
lsass.exe, systemd, pid 1, Administrator, /bin/bash — vengono rifiutati, non
avvisati, perché il momento in cui questo viene usato è il momento in cui nessuno sta leggendo
gli avvisi.
L'output ritorna come schede strutturate anziché come un dump del terminale, e le righe sono azionabili: una lista di processi ha un pulsante Kill per riga, un indirizzo ha Reputation.
| Windows | Linux | |
|---|---|---|
| Sigma | Event Log + Sysmon | auditd execve + auth/cron/syslog |
| YARA | contenuto file | contenuto file |
Le regole Sigma Linux la cui sorgente di log non può essere letta vengono rifiutate al caricamento con una motivazione, anziché caricate e lasciate non attivarsi mai — un risultato vuoto da una regola che non poteva essere eseguita appare esattamente come un host pulito.
L'agent Linux verifica se auditd è installato, in esecuzione e ha regole
caricate, poi dice cosa manca e quanto costa:
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
Undici destinazioni in tre gruppi:
Le destinazioni di chat e paging mostrano una frase anziché un record, e limitano quanti risultati vanno in un singolo messaggio: un canale in cui vengono incollate cento righe è un canale che le persone silenziano.
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
Oppure con Docker:
docker compose up -d
Login predefinito
Username:
adminPassword:douglasLa console forza un cambio di password al primo accesso — un valore predefinito integrato in un pacchetto non deve sopravvivere inosservato. Imposta
DOUGLAS_CONSOLE_PASSWORDin.envprima del primo avvio se preferisci scegliere la tua.
.envviene letto solo mentre il database è vuoto. Dopo il primo avvio, reimposta conpython3 -m app.manage passwd admin.
All'avvio ottieni il token di registrazione per il passaggio successivo:
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 → scegli la piattaforma → copia un comando.
Windows — PowerShell con privilegi elevati:
iex (irm 'http://console:8000/api/v1/reports/deploy/script?token=YOUR_TOKEN')
Linux — come root:
curl -sSL 'http://console:8000/api/v1/reports/deploy/script?token=YOUR_TOKEN&platform=linux' | sudo bash
Sei passaggi scorrono nel terminale: download, registrazione, recupero del collector, installazione del servizio, conferma che è attivo, primo check-in. Se la registrazione fallisce, nulla viene installato, e lo dice.
| # | Schermata | Fai questo | Ottieni |
|---|---|---|---|
| 1 | Feed IOC | Aggiungi Feodo Tracker, premi Refresh | Rilevamento C2 — nessuna regola da scrivere |
| 2 | Threat intel | Incolla una chiave AbuseIPDB gratuita, premi Test | Ordine di triage sul grafo |
| 3 | Flotta | Seleziona un host, Avvia caccia | Risultati, in tempo reale |
| 4 | Log ed eventi | Cerca errori dei moduli | Se la scansione ha potuto effettivamente guardare |
| 5 | Triage | Lavora la coda, metti a punto le regole più rumorose | Una lista che qualcuno legge ancora |
| 6 | Le mie regole | Carica i 6 esempi, aprine uno | Come scrivere le tue |
| 7 | Integrazioni | Webhook Slack, soglia a HIGH | Ne vieni a conoscenza senza guardare |
┌──────────────────────────────────────────────────────────┐
│ Console — FastAPI + SQLite, one process, no queue │
│ triage · findings · graph · rules · response · reports │
└───────────────▲──────────────────────────────────────────┘
│ agents poll: heartbeat 20s, actions 5s
┌───────────────┴──────────────────────────────────────────┐
│ Agent (PowerShell / shell) │
│ └── Collector — runs, reports, exits │
│ 201 built-in rules + Sigma + YARA + your rules │
└──────────────────────────────────────────────────────────┘
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
Integrità della raccolta · Autorun e avvio · Processi e rete · Servizi e attività · Meccanismi di persistenza · Postura di sicurezza · Driver e kernel · Evidenze di esecuzione · Autenticazione e account · Accesso remoto · Sysmon, Kerberos e AD · File, webshell ed esfiltrazione · Attività utente e fiducia · Rootkit e memoria · Corrispondenze di indicatori
Entrambi: account e gruppi locali · processi in esecuzione con firme e hash · connessioni TCP ed endpoint esterni · servizi · file scritti di recente · codice in memoria · web root e pattern di webshell
Windows: log eventi · attività pianificate · autorun · persistenza nel registro · sottoscrizioni WMI · driver · condivisioni SMB · Prefetch · archivi di certificati
Linux: cron · unità systemd · file di avvio della shell · LD_PRELOAD · binari setuid · authorized_keys e configurazione sshd · cronologia shell · log di autenticazione · taint del kernel · WordPress
Console: Python 3.11+, sei dipendenze (FastAPI, uvicorn, SQLAlchemy, pydantic, python-multipart, PyYAML). Funziona su una VM da 1 GB.
Host Windows: PowerShell 5.1+, amministratore. Nient'altro.
Host Linux: bash e curl. python3 abilita il progresso in tempo reale e le regole sul
contenuto dei file; auditd abilita le detection di esecuzione. La console ti dice
quali mancano su quale host.
0600 — una chiave
fissa inclusa in un pacchetto sarebbe condivisa da tutti coloro che l'hanno scaricato.📄 Technical Report (PDF) — 14 pagine che coprono l'architettura, ogni schermata della console, tutti i 37 moduli del collector, il modello di detection, le azioni di risposta e il modello di sicurezza.
Concesso in licenza sotto la MIT License. Vedi LICENSE.