VulnCity

پیاده‌سازی Zeek برای مانیتورینگ

نویسنده: یاسین عابدینی · دسته: Tools · تاریخ انتشار: ۱۴۰۵/۳/۱۴

مقاله جامع Zeek Network Security Monitor

۱. چرا Zeek؟ محدودیت‌های Syslog و FPC

مشکل Syslog

Syslog یکی از قدیمی‌ترین مکانیزم‌های جمع‌آوری لاگ در شبکه است، اما در محیط‌های امنیتی مدرن دچار محدودیت‌های جدی است:

  • ناقص بودن دید شبکه: Syslog صرفاً رویدادهایی را ثبت می‌کند که دستگاه‌ها (سرور، روتر، فایروال) خودشان تولید می‌کنند. اگر ارتباطی بین دو host برقرار شود که از دید فایروال مجاز باشد، هیچ لاگی ایجاد نمی‌شود.
  • عدم آگاهی از محتوا: Syslog از payload ترافیک شبکه هیچ اطلاعاتی ندارد. User-Agent، DNS query، TLS certificate، SMB share name — هیچ‌کدام در Syslog نیستند.
  • وابستگی به دستگاه: لاگ‌ها به تنظیمات هر vendor بستگی دارند و یکنواختی ندارند.

مشکل Full Packet Capture (FPC)

FPC ایده‌آل‌ترین روش از نظر جزئیات است — تمام ترافیک شبکه ضبط می‌شود — اما در عمل با چالش‌های بزرگی روبروست:

  • حجم ذخیره‌سازی عظیم: در یک شبکه ۱ گیگابیتی با ترافیک متوسط، روزانه چندین ترابایت pcap تولید می‌شود. در شبکه‌های enterprise این عدد به ده‌ها ترابایت می‌رسد.
  • هزینه زیرساخت: نگهداری، indexing و جستجو در pcap‌های حجیم نیاز به storage گران‌قیمت و سیستم‌های پیچیده دارد.
  • سرعت تحلیل پایین: جستجو در فایل‌های pcap کند است و برای incident response فوری مناسب نیست.
  • مسائل Privacy و Compliance: ذخیره محتوای کامل ترافیک (رمزهای عبور، داده‌های کاربری) در بسیاری از سازمان‌ها از نظر قانونی و امنیتی مشکل‌ساز است.

راه‌حل: Zeek و رویکرد Metadata

مقایسه رویکردها
Syslog FPC Zeek
دید شبکه محدود کامل خوب
حجم داده کم بسیار زیاد کم
جزئیات پروتکل ندارد کامل خوب
سرعت جستجو سریع کند سریع
هزینه کم زیاد متوسط
Context ندارد کامل خوب

۲. Zeek چیست و چه Metadata‌ای جمع‌آوری می‌کند؟

Zeek (که قبلاً Bro نام داشت) یک Network Security Monitor است، نه یک IDS کلاسیک. Zeek ترافیک شبکه را در لایه‌های مختلف تحلیل می‌کند و به جای ذخیره کل packet، Metadata معنادار از هر connection استخراج می‌کند.

Zeek چه چیزی می‌سازد؟

وقتی یک HTTP request از شبکه رد می‌شود، Zeek موارد زیر را استخراج و ذخیره می‌کند:

  • conn.log — زمان، IP مبدا/مقصد، پورت، مدت، bytes
  • http.log — method, host, URI, user-agent, status code
  • files.log — فایل منتقل‌شده، hash MD5/SHA1/SHA256
  • ssl.log — (اگر HTTPS باشد) certificate info, cipher suite

این رویکرد یعنی با ۱٪ از حجم FPC، شما ۸۰-۹۰٪ از اطلاعات مورد نیاز برای تحقیق و threat hunting را دارید.

خروجی‌های کلیدی Zeek از Metadata پکت‌ها

لایه اطلاعات استخراج‌شده
Network IP src/dst, پروتکل، TTL، TCP flags
Transport پورت‌ها، TCP state، bytes، duration
Application پروتکل شناسایی‌شده، headers، commands
File نام فایل، hash، MIME type، اندازه
Behavioral الگوهای ارتباطی، anomaly، weird events

۳. معماری Zeek: Standalone vs Cluster

Standalone

مناسب برای:

  • محیط‌های آزمایشگاهی و تست
  • شبکه‌های کوچک (زیر ۱ گیگابیت)
  • یادگیری و توسعه

در این حالت یک instance واحد تمام وظایف capture، تحلیل و لاگ‌نویسی را انجام می‌دهد.

┌─────────────────────────┐
│      Zeek Standalone    │
│  ┌───────────────────┐  │
│  │ Capture+Analyze   │  │
│  │ + Write Logs      │  │
│  └───────────────────┘  │
│         eth0 (tap)      │
└─────────────────────────┘

Cluster

مناسب برای:

  • شبکه‌های enterprise با ترافیک بالا
  • محیط‌هایی که نیاز به High Availability دارند
  • ترافیک بالای ۱ گیگابیت
┌──────────────────────────────────────────────────────────┐
│                    Zeek Cluster                           │
│                                                           │
│  ┌──────────┐    ┌──────────┐    ┌──────────────────┐   │
│  │ Worker 1 │    │ Worker 2 │    │    Worker N       │   │
│  │(capture) │    │(capture) │    │   (capture)       │   │
│  └────┬─────┘    └────┬─────┘    └────────┬─────────┘   │
│       │               │                    │              │
│       └───────────────┼────────────────────┘              │
│                       │                                   │
│               ┌───────┴───────┐                           │
│               │    Proxy      │                           │
│               │(coordination) │                           │
│               └───────┬───────┘                           │
│                       │                                   │
│          ┌────────────┼────────────┐                      │
│          │            │            │                      │
│    ┌─────┴──┐   ┌─────┴──┐  ┌─────┴──┐                  │
│    │Logger 1│   │Logger 2│  │Manager │                  │
│    └────────┘   └────────┘  └────────┘                  │
└──────────────────────────────────────────────────────────┘

۴. Node‌ها و نقش هر کدام

Worker (مهم‌ترین بخش)

نقش: Capture و تحلیل ترافیک شبکه

Worker اصلی‌ترین و سنگین‌ترین بخش Zeek است. وظایف آن:

  • Packet Capture: مستقیماً از interface شبکه پکت می‌گیرد (libpcap یا AF_PACKET)
  • Protocol Analysis: پروتکل‌ها را شناسایی و parse می‌کند (DPD - Dynamic Protocol Detection)
  • Script Execution: اسکریپت‌های Zeek را روی هر connection اجرا می‌کند
  • Event Generation: رویدادهای شبکه تولید می‌کند که توسط script engine پردازش می‌شوند

هر worker روی یک interface یا یک بخش از ترافیک (با load balancing) کار می‌کند. در cluster، چندین worker به صورت موازی کار می‌کنند.

نکته عملکردی: هر worker یک CPU core کامل مصرف می‌کند. اگر یک worker نتواند پکت‌ها را به اندازه کافی سریع پردازش کند، packet drop اتفاق می‌افتد.

Logger

نقش: نوشتن لاگ‌های دریافتی از Worker‌ها روی دیسک

  • لاگ‌های تولیدشده توسط Worker‌ها را دریافت می‌کند
  • آن‌ها را روی دیسک به فرمت TSV یا JSON می‌نویسد
  • مدیریت rotation و archiving لاگ‌ها را بر عهده دارد
  • در Cluster، چند Logger می‌توانند بار نوشتن را تقسیم کنند

Proxy

نقش: هماهنگی و انتقال داده بین Worker‌ها

  • واسط بین Worker‌ها و Manager است
  • داده‌های مشترک بین Worker‌ها (مثل tables و sets) را synchronize می‌کند
  • در Cluster‌های بزرگ، چند Proxy می‌تواند وجود داشته باشد
  • بار ارتباطات شبکه داخلی cluster را کاهش می‌دهد

Manager

نقش: کنترل و هماهنگی کل Cluster

  • نقطه مرکزی مدیریت cluster است
  • Policy‌ها و configuration را به تمام Node‌ها توزیع می‌کند
  • وضعیت تمام Node‌ها را مانیتور می‌کند
  • رویدادهای سطح بالا و هشدارها را جمع‌آوری می‌کند
  • zeekctl با Manager ارتباط برقرار می‌کند

۵. نصب Zeek

پیش‌نیازها

# Ubuntu/Debian
sudo apt-get install -y cmake make gcc g++ flex libfl-dev bison \
  libpcap-dev libssl-dev python3 python3-dev swig zlib1g-dev

# CentOS/RHEL
sudo yum install -y cmake make gcc gcc-c++ flex bison \
  libpcap-devel openssl-devel python3 python3-devel swig zlib-devel

روش ۱: نصب از Package Manager (توصیه‌شده)

# Ubuntu 20.04/22.04
echo 'deb http://download.opensuse.org/repositories/security:/zeek/xUbuntu_22.04/ /' \
  | sudo tee /etc/apt/sources.list.d/security:zeek.list

curl -fsSL https://download.opensuse.org/repositories/security:zeek/xUbuntu_22.04/Release.key \
  | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/security_zeek.gpg > /dev/null

sudo apt update
sudo apt install zeek-6.0

# اضافه کردن به PATH
echo 'export PATH=/opt/zeek/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
# CentOS/RHEL 8
cd /etc/yum.repos.d/
sudo wget https://download.opensuse.org/repositories/security:zeek/CentOS_8/security:zeek.repo
sudo yum install zeek

روش ۲: نصب از Source

git clone --recurse-submodules https://github.com/zeek/zeek
cd zeek

./configure --prefix=/opt/zeek
make -j$(nproc)
sudo make install

echo 'export PATH=/opt/zeek/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

نکات مهم نصب

۱. تنظیم Interface برای Capture

sudo ethtool -K eth0 rx off tx off sg off tso off ufo off gso off gro off lro off

۲. دسترسی Capture بدون root

sudo setcap cap_net_raw,cap_net_admin=eip /opt/zeek/bin/zeek
sudo setcap cap_net_raw,cap_net_admin=eip /opt/zeek/bin/capstats

۳. بهینه‌سازی Buffer شبکه

echo 'net.core.rmem_max=536870912' | sudo tee -a /etc/sysctl.conf
echo 'net.core.rmem_default=536870912' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

۴. تنظیم BPF Filter (اختیاری)

# در zeekctl.cfg
FilterCommand = "not host <zeek_management_ip>"

۶. پیکربندی: node.cfg و zeekctl

فایل اصلی تنظیم topology در مسیر /opt/zeek/etc/node.cfg قرار دارد.

پیکربندی Standalone

# /opt/zeek/etc/node.cfg

[zeek]
type=standalone
host=localhost
interface=eth0

# اگر می‌خواهید از چند CPU استفاده کنید:
# lb_method=pf_ring
# lb_procs=4

پیکربندی Cluster

# /opt/zeek/etc/node.cfg

[manager]
type=manager
host=192.168.1.10

[proxy-1]
type=proxy
host=192.168.1.10

[logger-1]
type=logger
host=192.168.1.10

[worker-1]
type=worker
host=192.168.1.11
interface=eth0
lb_method=pf_ring
lb_procs=4

[worker-2]
type=worker
host=192.168.1.12
interface=eth0
lb_method=pf_ring
lb_procs=4

فایل zeekctl.cfg

# /opt/zeek/etc/zeekctl.cfg

LogDir = /opt/zeek/logs
SpoolDir = /opt/zeek/spool
LogRotationInterval = 3600
MailTo = admin@company.com
BrokerPort = 9999/tcp

تنظیم networks.cfg

این فایل شبکه‌های داخلی سازمان را مشخص می‌کند — بسیار مهم برای تشخیص درست ترافیک:

# /opt/zeek/etc/networks.cfg
192.168.0.0/16    شبکه داخلی
10.0.0.0/8        شبکه VPN
172.16.0.0/12     شبکه DMZ

۷. دستورات ZeekCTL

zeekctl رابط مدیریت اصلی Zeek است.

# ورود به shell تعاملی zeekctl
zeekctl

# یا اجرای مستقیم دستورات
zeekctl <command>

دستورات اصلی

# راه‌اندازی Zeek
zeekctl deploy      # اعمال تغییرات config و راه‌اندازی مجدد (مهم‌ترین دستور)
zeekctl start       # راه‌اندازی بدون اعمال تغییرات
zeekctl stop        # توقف Zeek
zeekctl restart     # راه‌اندازی مجدد

# بررسی وضعیت
zeekctl status      # نمایش وضعیت تمام Node‌ها
zeekctl top         # نمایش real-time resource usage هر Node

# مدیریت لاگ‌ها
zeekctl rotate      # rotate کردن فوری لاگ‌ها
zeekctl cleanup     # پاک کردن فایل‌های موقت
zeekctl cron        # اجرای وظایف دوره‌ای

# بررسی پیکربندی
zeekctl check       # بررسی صحت تنظیمات بدون راه‌اندازی
zeekctl install     # نصب پیکربندی جدید روی Node‌ها

# اطلاعات و آمار
zeekctl df          # نمایش مصرف دیسک
zeekctl netstats    # آمار شبکه و packet capture
zeekctl capstats    # آمار capture (پکت‌های دریافتی/dropped)
zeekctl nodes       # نمایش لیست Node‌ها

# عیب‌یابی
zeekctl diag        # نمایش اطلاعات diagnostic برای یک Node
zeekctl stderr      # نمایش خطاهای stderr
zeekctl stdout      # نمایش خروجی stdout

مثال خروجی zeekctl status

Name         Type    Host           Status    Pid    Started
manager      manager localhost      running   12345  04 Jun 10:00:00
proxy-1      proxy   localhost      running   12346  04 Jun 10:00:01
logger-1     logger  localhost      running   12347  04 Jun 10:00:01
worker-1     worker  localhost      running   12348  04 Jun 10:00:02

نکته مهم: deploy vs start

zeekctl start  → فقط Zeek را راه می‌اندازد
zeekctl deploy → config را check می‌کند، نصب می‌کند و راه‌اندازی می‌کند

هر بار که local.zeek یا node.cfg را تغییر دادید، از deploy استفاده کنید.

تنظیم Crontab

# اجرای zeekctl cron هر ۵ دقیقه
*/5 * * * * /opt/zeek/bin/zeekctl cron

۸. سیستم لاگ‌گیری Zeek

محل ذخیره لاگ‌ها

/opt/zeek/logs/
├── current/          ← لاگ‌های جاری (در حال نوشتن)
│   ├── conn.log
│   ├── http.log
│   ├── dns.log
│   └── ...
├── 2026-06-04/       ← آرشیو روزانه
│   ├── conn.XX:XX-XX:XX.log.gz
│   ├── http.XX:XX-XX:XX.log.gz
│   └── ...
└── 2026-06-03/
    └── ...

چرخه Rotation لاگ

هر ۳۶۰۰ ثانیه (۱ ساعت) — قابل تنظیم در zeekctl.cfg

نام فایل آرشیو شامل بازه زمانی است:

conn.10:00:00-11:00:00.log.gz

خواندن لاگ‌ها

# خواندن لاگ جاری
cat /opt/zeek/logs/current/conn.log

# خواندن با zeek-cut (ابزار اختصاصی Zeek)
zeek-cut ts id.orig_h id.resp_h id.resp_p proto < conn.log

# خواندن لاگ فشرده
zcat /opt/zeek/logs/2026-06-04/conn.10:00:00-11:00:00.log.gz | zeek-cut ts id.orig_h

# فیلتر با grep
grep "192.168.1.100" /opt/zeek/logs/current/conn.log

# جستجو در همه لاگ‌ها
zgrep "suspicious.domain.com" /opt/zeek/logs/*/dns.log.gz

۹. فایل پیکربندی local.zeek

این فایل قلب سفارشی‌سازی Zeek است و در مسیر /opt/zeek/share/zeek/site/local.zeek قرار دارد.

##! /opt/zeek/share/zeek/site/local.zeek

# ============================================================
# بارگذاری پایه‌ای
# ============================================================
@load base/protocols/conn
@load base/protocols/dns
@load base/protocols/http
@load base/protocols/ftp
@load base/protocols/smtp
@load base/protocols/ssh
@load base/protocols/ssl
@load base/protocols/rdp
@load base/protocols/smb
@load base/protocols/dcerpc
@load base/protocols/krb
@load base/protocols/mysql
@load base/frameworks/files/hash
@load base/frameworks/files/extract
@load base/frameworks/notice

# ============================================================
# اطلاعات سرویس و دارایی‌ها
# ============================================================
@load policy/protocols/conn/known-services
@load policy/protocols/conn/known-hosts
@load policy/protocols/ssl/known-certs

# ============================================================
# تشخیص ناهنجاری‌ها
# ============================================================
@load policy/misc/scan
@load policy/protocols/ssl/heartbleed
@load policy/protocols/ssl/ja3
@load policy/protocols/http/detect-MHR

# ============================================================
# خروجی JSON
# ============================================================
@load policy/tuning/json-logs

# ============================================================
# تنظیمات Hash فایل
# ============================================================
redef FileExtract::prefix = "/opt/zeek/extracted_files/";
redef FileAnalysis::enable_md5 = T;
redef FileAnalysis::enable_sha1 = T;
redef FileAnalysis::enable_sha256 = T;

# ============================================================
# تنظیم شبکه‌های داخلی
# ============================================================
redef Site::local_nets = {
    192.168.0.0/16,
    10.0.0.0/8,
    172.16.0.0/12
};

# ============================================================
# تنظیمات Notice Framework
# ============================================================
redef Notice::mail_dest = "security@company.com";
redef Scan::Thresh = 25;

# ============================================================
# Intel Framework
# ============================================================
@load frameworks/intel/seen
@load frameworks/intel/do_notice
redef Intel::read_files += { "/opt/zeek/intel/indicators.dat" };

# ============================================================
# SSH Brute Force Detection
# ============================================================
@load policy/protocols/ssh/detect-bruteforcing

۱۰. خروجی JSON

برای ارسال لاگ‌ها به SIEM مثل Elasticsearch, Splunk یا Chronicle، JSON فرمت استاندارد است.

فعال‌سازی JSON

@load policy/tuning/json-logs

مقایسه خروجی TSV و JSON

TSV (پیش‌فرض):

1748995200.123456  CHhAvVGS1DHFjwGM9  192.168.1.100  45123  93.184.216.34  80  tcp  http  1.250  523  1024  SF  -  -  0  ShADadFf  1  575  1  1076

JSON:

{
  "ts": 1748995200.123456,
  "uid": "CHhAvVGS1DHFjwGM9",
  "id.orig_h": "192.168.1.100",
  "id.orig_p": 45123,
  "id.resp_h": "93.184.216.34",
  "id.resp_p": 80,
  "proto": "tcp",
  "service": "http",
  "duration": 1.25,
  "orig_bytes": 523,
  "resp_bytes": 1024,
  "conn_state": "SF",
  "history": "ShADadFf"
}

ارسال به Elasticsearch با Filebeat

# /etc/filebeat/filebeat.yml
filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /opt/zeek/logs/current/*.log
    fields:
      source: zeek
    json.keys_under_root: true
    json.add_error_key: true

output.elasticsearch:
  hosts: ["https://elasticsearch:9200"]
  index: "zeek-%{+yyyy.MM.dd}"

۱۱. Banner Grabbing و Known Services

یکی از قابلیت‌های جالب Zeek این است که به‌صورت passive اقدام به banner grabbing می‌کند — یعنی بدون ارسال هیچ پکتی، از ترافیک عبوری اطلاعات سرویس‌ها را استخراج می‌کند.

نحوه کار

  1. پروتکل Application Layer را شناسایی می‌کند (DPD - Dynamic Protocol Detection)
  2. banner و version سرویس را استخراج می‌کند
  3. اطلاعات را در software.log و known_services.log ذخیره می‌کند

known_services.log

{
  "ts": 1748995200.0,
  "host": "192.168.1.50",
  "port_num": 22,
  "port_proto": "tcp",
  "service": ["SSH"]
}

software.log

{
  "ts": 1748995200.0,
  "host": "192.168.1.50",
  "host_p": 22,
  "software_type": "SERVER",
  "name": "OpenSSH",
  "version.major": 8,
  "version.minor": 2,
  "unparsed_version": "OpenSSH_8.2p1 Ubuntu-4ubuntu0.5"
}

کاربرد امنیتی: تشخیص نسخه‌های قدیمی نرم‌افزار با آسیب‌پذیری‌های شناخته‌شده.

zeek-cut host name version.major version.minor < software.log | \
  grep -E "Apache|nginx|OpenSSH" | sort -u

۱۲. بررسی کامل انواع لاگ‌ها

۱۲.۱ conn.log — اولین و مهم‌ترین لاگ

این لاگ پایه و اساس تحلیل است. هر TCP/UDP/ICMP connection یک رکورد در این فایل دارد.

{
  "ts": 1748995200.123456,
  "uid": "CHhAvVGS1DHFjwGM9",
  "id.orig_h": "192.168.1.100",
  "id.orig_p": 45123,
  "id.resp_h": "93.184.216.34",
  "id.resp_p": 80,
  "proto": "tcp",
  "service": "http",
  "duration": 1.25,
  "orig_bytes": 523,
  "resp_bytes": 1024,
  "conn_state": "SF",
  "local_orig": true,
  "local_resp": false,
  "missed_bytes": 0,
  "history": "ShADadFf",
  "orig_pkts": 5,
  "orig_ip_bytes": 875,
  "resp_pkts": 6,
  "resp_ip_bytes": 1376
}

فیلد conn_state — وضعیت connection

مقدار معنا توضیح
SFNormal SYN-FINConnection کامل و سالم برقرار و بسته شد
S0Connection attempt, no replySYN ارسال شد، پاسخی نیامد
S1Connection established, not closedConnection برقرار شد اما close نشد
S2Originator closed, responder didn'tفرستنده FIN زد، گیرنده جواب نداد
S3Responder closed, originator didn'tگیرنده FIN زد، فرستنده جواب نداد
RSTOOriginator resetConnection توسط فرستنده با RST بسته شد
RSTRResponder resetConnection توسط گیرنده با RST بسته شد
RSTOS0RST after SYNبعد از SYN بلافاصله RST آمد
RSTRHHalf-open resetResponder RST زد بدون SYN قبلی
SHSYN-SYNACK-no-final-ACKHalf-open connection
SHRSYN-SYNACK-RSTSYN/SYNACK شد سپس RST
OTHOtherهیچ SYN/FIN ندیده، میانه connection
# پورت اسکن: تعداد زیاد S0 از یک IP
zeek-cut id.orig_h conn_state < conn.log | grep "S0" | \
  awk '{print $1}' | sort | uniq -c | sort -rn | head -20

فیلد history — تاریخچه TCP Flags

حرف بزرگ معنا (originator) حرف کوچک معنا (responder)
SSYNsSYN
FFINfFIN
RRSTrRST
AACKaACK
DData payloaddData payload
GGap (packet missed)gGap

مثال‌های مهم history

ShADadFf
ارتباط TCP کامل و سالم — S=SYN, h=SYNACK, A=ACK, D=Data(orig), a=ACK(resp), d=Data(resp), F=FIN, f=FIN
S0
فقط SYN، پاسخی نیامد — احتمالاً port scan
^D*d
⚠️ احتمال Reverse Shell — ^ یعنی ارتباط قبل از capture شروع شده، D* یعنی داده زیاد از originator (commands)، d یعنی output برمی‌گردد
D
فقط داده یک‌طرفه از originator — احتمال data exfiltration
^*d
داده زیاد یک‌طرفه از responder — احتمال دریافت malware/backdoor
# جستجو برای pattern‌های مشکوک reverse shell
zeek-cut ts id.orig_h id.resp_h id.resp_p duration orig_bytes resp_bytes history < conn.log | \
  awk '$9 ~ /^[Dd\^]/ && $5 > 60'

# پورت‌های رایج reverse shell
zeek-cut ts id.orig_h id.resp_h id.resp_p history conn_state < conn.log | \
  awk '$4 ~ /444[34]|1234|31337/'

۱۲.۲ dns.log

{
  "ts": 1748995300.0,
  "uid": "CpQfkh2VcNfOsXi0j",
  "id.orig_h": "192.168.1.100",
  "id.resp_h": "8.8.8.8",
  "id.resp_p": 53,
  "proto": "udp",
  "query": "evil.c2server.com",
  "qtype_name": "A",
  "rcode_name": "NOERROR",
  "answers": ["1.2.3.4"],
  "TTLs": [300.0]
}
# تشخیص DNS Tunneling - query‌های بسیار طولانی
zeek-cut query < dns.log | awk 'length($1) > 50' | sort | uniq -c | sort -rn

# تشخیص DNS Exfiltration
zeek-cut query < dns.log | \
  awk -F. '{print $(NF-1)"."$NF}' | sort | uniq -c | sort -rn | head -20

# NXDOMAIN زیاد
zeek-cut id.orig_h rcode_name < dns.log | grep "NXDOMAIN" | \
  awk '{print $1}' | sort | uniq -c | sort -rn

۱۲.۳ http.log

{
  "ts": 1748995400.0,
  "id.orig_h": "192.168.1.100",
  "id.resp_h": "203.0.113.50",
  "id.resp_p": 80,
  "method": "GET",
  "host": "evil-site.com",
  "uri": "/malware/payload.exe",
  "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
  "request_body_len": 0,
  "response_body_len": 45056,
  "status_code": 200,
  "resp_mime_types": ["application/octet-stream"]
}
# تشخیص دانلود فایل‌های مشکوک
zeek-cut id.orig_h host uri resp_mime_types < http.log | \
  grep -E "application/octet-stream|application/x-dosexec"

# User-Agent های غیرمعمول
zeek-cut id.orig_h user_agent < http.log | \
  grep -v "Mozilla\|Chrome\|Safari\|Firefox" | sort | uniq -c

# POST سنگین به خارج
zeek-cut id.orig_h method host request_body_len < http.log | \
  awk '$2 == "POST" && $4 > 10000'

۱۲.۴ ssl.log / tls.log

{
  "ts": 1748995500.0,
  "id.orig_h": "192.168.1.100",
  "id.resp_h": "104.21.45.67",
  "id.resp_p": 443,
  "version": "TLSv13",
  "cipher": "TLS_AES_256_GCM_SHA384",
  "server_name": "legitimate-site.com",
  "established": true,
  "subject": "CN=legitimate-site.com",
  "issuer": "CN=DigiCert TLS RSA SHA256 2020 CA1",
  "validation_status": "ok",
  "ja3": "a0e9f5d64349fb13191bc781f81f42e1",
  "ja3s": "ec74a5c51106f0419184d0dd08fb05bc"
}
# گواهی‌های self-signed
zeek-cut id.orig_h id.resp_h server_name validation_status < ssl.log | \
  grep "self signed"

# TLS روی پورت‌های غیراستاندارد
zeek-cut id.orig_h id.resp_h id.resp_p established < ssl.log | \
  awk '$3 != 443 && $3 != 8443 && $4 == "true"'

۱۲.۵ smtp.log

{
  "ts": 1748995600.0,
  "id.orig_h": "192.168.1.200",
  "id.resp_p": 25,
  "mailfrom": "user@company.com",
  "rcptto": ["external@gmail.com"],
  "subject": "Confidential Data",
  "tls": true
}
# ایمیل به خارج با attachment
zeek-cut id.orig_h mailfrom rcptto fuids < smtp.log | \
  awk 'NF > 3 && $3 !~ /company\.com/'

۱۲.۶ smb_files.log / smb_mapping.log

{
  "ts": 1748995700.0,
  "id.orig_h": "192.168.1.100",
  "id.resp_h": "192.168.1.50",
  "id.resp_p": 445,
  "action": "SMB::FILE_READ",
  "path": "\\\\SERVER\\C$\\Users\\Admin\\Documents\\passwords.txt",
  "name": "passwords.txt"
}
# دسترسی به share های مدیریتی
zeek-cut id.orig_h id.resp_h path action < smb_files.log | \
  grep -E "ADMIN\$|C\$|IPC\$"

# کپی فایل‌های مشکوک
zeek-cut id.orig_h path name action < smb_files.log | \
  grep -E "FILE_WRITE\|FILE_CREATE" | \
  grep -iE "\.exe|\.dll|\.ps1|\.bat"

۱۲.۷ ssh.log

{
  "ts": 1748995900.0,
  "id.orig_h": "192.168.1.100",
  "id.resp_h": "10.0.0.30",
  "id.resp_p": 22,
  "version": 2,
  "auth_success": true,
  "auth_attempts": 5,
  "client": "SSH-2.0-OpenSSH_8.4",
  "server": "SSH-2.0-OpenSSH_7.4",
  "cipher_alg": "chacha20-poly1305@openssh.com"
}
# brute force SSH
zeek-cut id.orig_h id.resp_h auth_success auth_attempts < ssh.log | \
  awk '$3 == "false" && $4 > 3' | awk '{print $1}' | sort | uniq -c | sort -rn

# موفقیت بعد از تلاش زیاد
zeek-cut id.orig_h id.resp_h auth_success auth_attempts < ssh.log | \
  awk '$3 == "true" && $4 > 5'

۱۲.۸ files.log

{
  "ts": 1748996000.0,
  "fuid": "FiJt4j1XMHK2fghij",
  "tx_hosts": ["203.0.113.50"],
  "rx_hosts": ["192.168.1.100"],
  "source": "HTTP",
  "mime_type": "application/x-dosexec",
  "seen_bytes": 45056,
  "md5": "44d88612fea8a8f36de82e1278abb02f",
  "sha1": "3395856ce81f2b7382dee72602f798b642f14d8",
  "sha256": "275a021bbfb6489e54d471899f7db9d1663fc695ec2fe2a2c4538aabf651fd0f",
  "extracted": "/opt/zeek/extracted_files/FiJt4j1X.exe"
}
# پیدا کردن PE فایل‌ها
zeek-cut tx_hosts rx_hosts source mime_type sha256 < files.log | \
  grep "application/x-dosexec"

۱۲.۹ kerberos.log

{
  "ts": 1748996200.0,
  "id.orig_h": "192.168.1.100",
  "id.resp_h": "192.168.1.10",
  "id.resp_p": 88,
  "request_type": "TGS",
  "client": "administrator/DOMAIN",
  "service": "cifs/server01.domain.local",
  "success": true,
  "cipher": "aes256-cts-hmac-sha1-96"
}
# تشخیص Kerberoasting - استفاده از RC4 در محیط‌های مدرن
zeek-cut id.orig_h client service cipher < kerberos.log | \
  awk '$4 == "rc4-hmac"'

۱۲.۱۰ weird.log — رویدادهای غیرعادی

weird.log یکی از ارزشمندترین لاگ‌ها برای تشخیص ناهنجاری است. Zeek تمام رفتارهای خارج از استاندارد پروتکل را اینجا ثبت می‌کند.

{
  "ts": 1748996300.0,
  "id.orig_h": "192.168.1.100",
  "id.resp_h": "10.0.0.50",
  "id.resp_p": 80,
  "name": "unexpected_server_appended_data",
  "addl": "length=1024",
  "peer": "worker-1"
}
نوع معنا اهمیت امنیتی
bad_TCP_checksumchecksum غلطاحتمال دستکاری پکت
connection_originator_SYN_ackSYN-ACK بدون SYN قبلیscan یا spoofing
excess_RPCRPC calls بیش از حدexploit attempt
HTTP_version_mismatchنسخه HTTP ناسازگارtool مخرب یا evasion
illegal_crlf_sequenceCRLF injectionweb attack
no_reply_from_responderپاسخی از سرور نیامدارتباط یک‌طرفه
partial_connectionconnection ناقصscan یا evasion
truncated_headerheader ناقصmalformed traffic
unescaped_special_URI_charکاراکتر خاص در URIweb attack
# آمار weird‌ها بر اساس نوع
zeek-cut name < weird.log | sort | uniq -c | sort -rn | head -20

# weird‌های مربوط به یک IP خاص
zeek-cut id.orig_h name < weird.log | grep "192.168.1.100"

۱۲.۱۱ notice.log

{
  "ts": 1748996400.0,
  "id.orig_h": "192.168.1.100",
  "note": "Scan::Port_Scan",
  "msg": "192.168.1.100 scanned at least 25 unique ports of host 10.0.0.1 in 0m0s",
  "src": "192.168.1.100",
  "dst": "10.0.0.1",
  "n": 25,
  "actions": ["Notice::ACTION_LOG"]
}

۱۲.۱۲ intel.log

{
  "ts": 1748996500.0,
  "id.orig_h": "192.168.1.100",
  "id.resp_h": "1.2.3.4",
  "seen.indicator": "1.2.3.4",
  "seen.indicator_type": "Intel::ADDR",
  "seen.where": "Conn::IN_RESP",
  "matched": ["Intel::ADDR"],
  "sources": ["ThreatIntel-Feed-1"]
}

۱۳. عیب‌یابی رایج

مشکل ۱: Zeek شروع نمی‌کند

# بررسی لاگ خطا
zeekctl diag
cat /opt/zeek/logs/current/reporter.log

# بررسی syntax فایل local.zeek
zeek -i lo /opt/zeek/share/zeek/site/local.zeek

# بررسی دسترسی به interface
tcpdump -i eth0 -c 10
sudo setcap cap_net_raw,cap_net_admin=eip /opt/zeek/bin/zeek

مشکل ۲: Packet Drop

# بررسی آمار drop
zeekctl capstats

# در node.cfg برای افزایش worker:
[worker-1]
type=worker
host=localhost
interface=eth0
lb_method=pf_ring
lb_procs=4

مشکل ۳: لاگ‌ها تولید نمی‌شوند

# بررسی که Zeek در حال اجراست
zeekctl status

# بررسی فضای دیسک
df -h /opt/zeek/logs/

# بررسی خطاهای اسکریپت
cat /opt/zeek/logs/current/reporter.log

مشکل ۴: ترافیک شناسایی نمی‌شود

# بررسی که ترافیک به interface می‌رسد
tcpdump -i eth0 -n -c 100

# بررسی BPF filter
zeekctl print FilterCommand

مشکل ۵: مصرف CPU بالا

# بررسی کدام worker مشکل دارد
zeekctl top

مشکل ۶: خطای Cluster Initialization

# بررسی ارتباط شبکه بین Node‌ها
ping worker-1-ip
telnet manager-ip 9999

# بررسی SSH passwordless
ssh worker-1-ip "echo ok"

# تنظیم SSH key
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
ssh-copy-id worker-1-ip

Zeek ابزاری است که فاصله بین لاگ‌های ضعیف Syslog و حجم عظیم FPC را پر می‌کند. با درک عمیق از لاگ‌هایی مثل conn.log و مفاهیمی مثل conn_state و history و استفاده هوشمندانه از local.zeek و weird.log می‌توانید دید کاملی از امنیت شبکه خود داشته باشید.

در مقاله بعدی، به چگونگی استفاده از این لاگ‌ها برای Threat Hunting حرفه‌ای خواهیم پرداخت.