پیادهسازی 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 مبدا/مقصد، پورت، مدت، byteshttp.log— method, host, URI, user-agent, status codefiles.log— فایل منتقلشده، hash MD5/SHA1/SHA256ssl.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 میکند — یعنی بدون ارسال هیچ پکتی، از ترافیک عبوری اطلاعات سرویسها را استخراج میکند.
نحوه کار
- پروتکل Application Layer را شناسایی میکند (DPD - Dynamic Protocol Detection)
- banner و version سرویس را استخراج میکند
- اطلاعات را در
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
| مقدار | معنا | توضیح |
|---|---|---|
SF | Normal SYN-FIN | Connection کامل و سالم برقرار و بسته شد |
S0 | Connection attempt, no reply | SYN ارسال شد، پاسخی نیامد |
S1 | Connection established, not closed | Connection برقرار شد اما close نشد |
S2 | Originator closed, responder didn't | فرستنده FIN زد، گیرنده جواب نداد |
S3 | Responder closed, originator didn't | گیرنده FIN زد، فرستنده جواب نداد |
RSTO | Originator reset | Connection توسط فرستنده با RST بسته شد |
RSTR | Responder reset | Connection توسط گیرنده با RST بسته شد |
RSTOS0 | RST after SYN | بعد از SYN بلافاصله RST آمد |
RSTRH | Half-open reset | Responder RST زد بدون SYN قبلی |
SH | SYN-SYNACK-no-final-ACK | Half-open connection |
SHR | SYN-SYNACK-RST | SYN/SYNACK شد سپس RST |
OTH | Other | هیچ 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) |
|---|---|---|---|
S | SYN | s | SYN |
F | FIN | f | FIN |
R | RST | r | RST |
A | ACK | a | ACK |
D | Data payload | d | Data payload |
G | Gap (packet missed) | g | Gap |
مثالهای مهم 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_checksum | checksum غلط | احتمال دستکاری پکت |
connection_originator_SYN_ack | SYN-ACK بدون SYN قبلی | scan یا spoofing |
excess_RPC | RPC calls بیش از حد | exploit attempt |
HTTP_version_mismatch | نسخه HTTP ناسازگار | tool مخرب یا evasion |
illegal_crlf_sequence | CRLF injection | web attack |
no_reply_from_responder | پاسخی از سرور نیامد | ارتباط یکطرفه |
partial_connection | connection ناقص | scan یا evasion |
truncated_header | header ناقص | malformed traffic |
unescaped_special_URI_char | کاراکتر خاص در URI | web 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