Threat Hunting با Zeek
نویسنده: یاسین عابدینی · دسته: Blue-Team · تاریخ انتشار: ۱۴۰۵/۳/۲۶
Zeek Forensic و Threat Hunting
مقدمه
در تحلیل ترافیک شبکه، شواهد دیجیتال به سه دسته اصلی تقسیم میشوند:
| دسته | توضیح | مثال |
|---|---|---|
| Full Packet Capture (FPC) | کاملترین نوع شواهد — تمام ترافیک raw ذخیره میشود | فایلهای .pcap |
| Service Log | لاگهای native سرویسها | access.log Apache، bind.log |
| Zeek Log | لاگ structured و پروتکلمحور از ترافیک شبکه | http.log، dns.log، conn.log |
چرا Zeek؟
FPC حجم ذخیرهسازی بسیار بالایی نیاز دارد. Service Log فقط یک سرویس را پوشش میدهد. Zeek یک نمای structured و قابل جستجو از تمام پروتکلهای عبوری از شبکه ارائه میدهد.
بخش اول: Forensic پروتکلها
۱. DNS Forensic
فیلدهای کلیدی dns.log
| فیلد | توضیح |
|---|---|
query |
نام دامنه درخواست شده |
qtype_name |
نوع رکورد (A، AAAA، TXT، CNAME و ...) |
query_len |
طول query — در DNS Tunneling حیاتی است |
answers |
پاسخ دریافتی از سرور |
TTL |
مدت اعتبار پاسخ |
rcode_name |
وضعیت پاسخ (NOERROR، NXDOMAIN و ...) |
id.orig_h |
IP کلاینت |
id.resp_h |
IP سرور DNS |
نمونه لاگ
FPC (Wireshark)
Domain Name System (response)
Transaction ID: 0x1a2b
Flags: 0x8180 Standard query response, No error
Queries: www.example.com: type A, class IN
Answers: www.example.com: type A, addr 93.184.216.34
dns.log
ts uid id.orig_h id.resp_h query qtype_name rcode_name answers TTLs
1691097612.536 CcKqLb3VyCJ62HbzI9 192.168.1.10 8.8.8.8 example.com A NOERROR 93.184.216.34 3600.0
سناریو: DNS Tunneling
موقعیت: شبکه یک سازمان تحت نظر است. یک سیستم داخلی به طور مداوم DNS query ارسال میکند اما ترافیک مستقیم به اینترنت ندارد. تیم SOC میخواهد بداند آیا داده از طریق DNS به خارج میرود؟
مکانیسم حمله:
[سیستم آلوده]
|
| query: aGVsbG8gd29ybGQ=.c2server.com ← داده رمزشده در subdomain
↓
[DNS Resolver سازمان]
|
| recursive query به سمت اینترنت
↓
[سرور c2server.com] ← مهاجم داده را decode میکند
|
| پاسخ از طریق TXT record ← دستور بازگشتی
↓
[سیستم آلوده]
شاخصهای مشکوک:
- طول query بیش از ۴۰ کاراکتر
- تعداد بالای query به یک دامنه در بازه کوتاه
- محتوای شبیه base64 یا hex در subdomain
- رکوردهای TXT با محتوای binary
- TTL بسیار پایین
شناسایی با Splunk:
index=zeek sourcetype="zeek:dns"
| eval query_len = length(query)
| where query_len > 40
| stats count by query, query_len, qtype_name, id.orig_h, id.resp_h
| sort - query_len
DoH و DoT
DNS over HTTPS (DoH):
درخواستهای DNS از طریق HTTPS رمزنگاری میشوند. مهاجمان از آن برای دور زدن DNS filtering سازمان استفاده میکنند.
index=zeek (uri="/dns-query" OR server_name IN ("dns.google", "cloudflare-dns.com", "doh.opendns.com"))
| stats count by id.orig_h, server_name, uri
| sort - count
DNS over TLS (DoT):
مشابه DoH اما روی پورت اختصاصی 853. شناسایی سادهتری دارد.
index=zeek id.resp_p=853
| stats count by id.orig_h, id.resp_h
۲. HTTP Forensic
فیلدهای کلیدی http.log
| فیلد | توضیح |
|---|---|
method |
HTTP method (GET، POST، PUT و ...) |
host |
هاست مقصد |
uri |
مسیر درخواست |
user_agent |
مشخصات نرمافزار کلاینت |
status_code |
کد پاسخ HTTP |
request_body_len |
حجم داده ارسالی |
response_body_len |
حجم داده دریافتی |
resp_mime_types |
نوع MIME فایل پاسخ |
cookie |
اطلاعات session و احراز هویت |
نمونه لاگ
http.log
ts uid id.orig_h id.resp_h method host uri status_code req_body_len resp_body_len user_agent resp_mime_types
1722750400.112 Cxk2Ls3pRq1AbT8z 192.168.1.50 185.220.101.5 POST evil.c2server.com /upload.php 200 524288 128 python-requests/2.28.0 application/json
سناریو: Data Exfiltration
موقعیت: تیم امنیت متوجه شده یکی از سیستمهای داخلی ترافیک خروجی غیرمعمولی دارد. باید مشخص شود آیا داده به بیرون ارسال میشود؟
گام ۱: بررسی حجم کلی ترافیک خروجی
index=zeek sourcetype=zeek:http method=POST request_body_len>0
| stats sum(request_body_len) as total_sent by id.orig_h, id.resp_h
| eval total_sent_mb = round(total_sent/1024/1024, 2)
| sort - total_sent_mb
| table id.orig_h, id.resp_h, total_sent_mb
گام ۲: تحلیل HTTP Method
index=zeek sourcetype=zeek:http
| stats sum(request_body_len) as total_sent by method
| eval total_sent_mb = round(total_sent/1024/1024, 2)
| sort - total_sent_mb
متد PUT در سناریوهای exfiltration و WebDAV-based attacks قابل توجه است.
گام ۳: شناسایی User-Agent های مشکوک
User-Agent های مخرب معمولاً یا جعلی هستند، یا وجود ندارند، یا تعداد بسیار کمی در شبکه دیده میشوند.
index=zeek sourcetype=zeek:http
| stats count by user_agent
| where count < 5
| sort count
index=zeek sourcetype=zeek:http
| stats sum(request_body_len) as total_sent by user_agent, method
| eval total_sent_mb = round(total_sent/1024/1024, 2)
| sort - total_sent_mb
گام ۴: شناسایی MIME Type های مشکوک
index=zeek sourcetype=zeek:http
| search resp_mime_types{}="application/x-dosexec"
OR resp_mime_types{}="application/x-msdownload"
OR resp_mime_types{}="application/octet-stream"
OR resp_mime_types{}="application/x-php"
| table _time, id.orig_h, id.resp_h, method, uri, resp_mime_types, response_body_len
۳. SMB Forensic
مقدمه
پروتکل SMB در اکثر محیطهای Windows به صورت پیشفرض فعال است و در حملات داخلی، بهویژه در Lateral Movement، نقش محوری دارد.
فایلهای لاگ SMB در Zeek
| فایل | محتوا |
|---|---|
smb_cmd.log |
دستورات SMB مانند CREATE، READ، WRITE |
smb_files.log |
اطلاعات دسترسی به فایلها |
smb_mapping.log |
اتصال به shared folder ها (DISK یا PIPE) |
dce_rpc.log |
فراخوانیهای DCE-RPC مانند SAMR، LSARPC |
نکته مهم
اگر در
smb_files.logمقدار فیلدdata_len_reqیاsizeبرابر صفر باشد، به این معناست که فایل از طریق شبکه مستقیماً اجرا شده و روی دیسک نوشته نشده است. این الگو در حملات fileless malware بسیار رایج است.
نمونه لاگها
smb_cmd.log
ts uid id.orig_h id.resp_h command status
1722750303.643 CpZD5A2XLb12m0pvl 192.168.1.10 192.168.1.20 SMB2_CREATE NT_STATUS_OK
1722750303.644 CpZD5A2XLb12m0pvl 192.168.1.10 192.168.1.20 SMB2_WRITE NT_STATUS_OK
1722750305.014 Fa9cpR2DFkd3lBpNj 192.168.1.11 192.168.1.20 SMB2_TREE_CONNECT NT_STATUS_OK
smb_files.log
{"ts":1754284142.799,"uid":"CrmzTt","id.orig_h":"172.16.245.129","id.resp_h":"172.16.245.147","id.resp_p":445,
"action":"SMB::FILE_OPEN","path":"\\\\172.16.245.147\\downloads","name":"payload.exe","size":0}
size: 0— فایل از طریق شبکه اجرا شده، روی دیسک نوشته نشده است.
smb_mapping.log
{"ts":1754284124.514,"uid":"C8I2Rz","id.orig_h":"172.16.245.129","id.resp_h":"172.16.245.147","id.resp_p":445,
"path":"\\\\172.16.245.147\\IPC$","share_type":"PIPE"}
{"ts":1754284142.798,"uid":"CrmzTt","id.orig_h":"172.16.245.129","id.resp_h":"172.16.245.147","id.resp_p":445,
"path":"\\\\172.16.245.147\\downloads","share_type":"DISK"}
اتصال به
IPC$باshare_type: PIPEبرای اجرای RPC call استفاده میشود. این الگو در ابزارهایی مانند PsExec و Impacket بسیار رایج است.
dce_rpc.log
{"ts":1754284124.520,"uid":"C8I2Rz","id.orig_h":"172.16.245.129","id.resp_h":"172.16.245.147",
"named_pipe":"\\PIPE\\srvsvc","endpoint":"srvsvc","operation":"NetrShareEnum"}
سناریو: Lateral Movement — جابهجایی مهاجم در شبکه
موقعیت: سازمانی به یکی از پرسنل خود به نام علی مشکوک شده بود که اطلاعات را به بیرون ارسال میکند. تصمیم گرفته شد به مدت ۸ ساعت پورت سیستم او SPAN گرفته شود و کل ترافیک capture شود. دوربینهای مداربسته هم ضبط شدهاند که مدل لپتاپ Dell است.
گام ۱: بررسی تمام اتصالات SMB از سیستم علی
index=zeek sourcetype="zeek:smb_mapping" id.orig_h="172.16.245.129"
| table _time, id.orig_h, id.resp_h, path, share_type
| sort _time
گام ۲: بررسی عملیات RPC برای Discovery
NetrShareEnum لیست share های سیستم هدف را بازمیگرداند — اولین قدم در reconnaissance داخلی.
index=zeek sourcetype="zeek:dce_rpc" id.orig_h="172.16.245.129"
| table _time, id.orig_h, id.resp_h, named_pipe, endpoint, operation
| sort _time
گام ۳: ردیابی فایلهای دسترسی یافته
index=zeek sourcetype="zeek:smb_files" id.orig_h="172.16.245.129"
| table _time, id.orig_h, id.resp_h, action, path, name, size
| sort _time
گام ۴: شناسایی اجرای فایل از راه دور (fileless)
index=zeek sourcetype="zeek:smb_files" id.orig_h="172.16.245.129" action="SMB::FILE_OPEN" size=0
| table _time, id.orig_h, id.resp_h, path, name
گام ۵: ترکیب لاگها برای timeline کامل
index=zeek (sourcetype="zeek:smb_files" OR sourcetype="zeek:dce_rpc" OR sourcetype="zeek:smb_mapping")
id.orig_h="172.16.245.129"
| eval event_type=sourcetype
| table _time, event_type, id.orig_h, id.resp_h, action, operation, path, name, size
| sort _time
نگاشت عملیات DCE-RPC به MITRE ATT&CK
| عملیات RPC | Endpoint | تاکتیک MITRE | توضیح |
|---|---|---|---|
NetrShareEnum |
srvsvc |
Discovery | لیست share های سیستم هدف |
NetrWkstaGetInfo |
wkssvc |
Discovery | اطلاعات workstation |
OpenSCManager |
svcctl |
Execution | باز کردن Service Manager |
CreateService |
svcctl |
Persistence / Execution | ایجاد سرویس جدید |
StartService |
svcctl |
Execution | اجرای سرویس |
SchRpcRun |
ITaskSchedulerService |
Persistence / Execution | اجرا از طریق Task Scheduler |
SamrEnumUsersInDomain |
samr |
Discovery | لیست کاربران دامین |
LsarEnumTrustedDomains |
lsarpc |
Discovery | شناسایی trust های دامین |
DRSGetNCChanges |
drsuapi |
Credential Access | DCSync — سرقت hash از Domain Controller |
۴. Phishing Forensic
فایلهای لاگ مرتبط
| فایل | محتوا |
|---|---|
smtp.log |
اطلاعات ایمیل (فرستنده، گیرنده، موضوع) |
smtpurl_links.log |
لینکهای استخراجشده از متن ایمیل (نیاز به پلاگین) |
files.log |
فایلهای منتقلشده روی شبکه با hash و MIME type |
http.log |
درخواستهای HTTP برای تأیید کلیک کاربر |
conn.log |
اطلاعات پایه اتصال برای ردیابی با UID |
نمونه لاگها
smtp.log
{"uid":"CPOKWC4c50Oq3eHR2c","id.orig_h":"192.168.1.170","id.resp_h":"188.40.30.30","id.resp_p":25,
"mailfrom":"user1@nooranet.com","rcptto":["user2@nooranet.com"],"subject":"Fwd: visa promotion",
"fuids":["FASzhBqT8OVafVyLa"]}
smtpurl_links.log
{"uid":"CPOKWC4c50Oq3eHR2c","host":"apply.uk.gov.student.applily.io",
"url":"http://apply.uk.gov.student.applily.io/nitol.exe"}
files.log
{"fuid":"FhXgKZHzBLS6VmK95","uid":"CsSvT24rVVHfYR0hHa","mime_type":"application/x-dosexec",
"filename":"nitol.exe","seen_bytes":1196032,
"md5":"62c20b2be38c375d179ea9689c2dd98c","sha1":"3d5a2781bfbba48b19a49f11f3254229a684bba0"}
http.log (تأیید کلیک کاربر)
{"uid":"CY3av9Q9kTJqhDGJj","id.orig_h":"192.168.1.170","method":"GET",
"host":"apply.uk.gov.student.applily.io","uri":"/nitol.exe",
"status_code":200,"response_body_len":1196032,"resp_mime_types":["application/x-dosexec"]}
سناریو ۱: لینک مخرب در ایمیل
موقعیت: گزارش شده یک کاربر ایمیل مشکوکی دریافت کرده است. باید مشخص شود آیا روی لینک کلیک کرده؟
گام ۱: شناسایی ارتباطات SMTP در conn.log
index=zeek sourcetype="zeek:conn" id.resp_p=25
| table _time, uid, id.orig_h, id.resp_h, orig_bytes, resp_bytes
| sort - _time
گام ۲: ردیابی UID در smtp.log
index=zeek sourcetype="zeek:smtp" uid="CPOKWC4c50Oq3eHR2c"
| table _time, mailfrom, rcptto, subject, fuids
گام ۳: استخراج لینک از smtpurl_links.log
index=zeek sourcetype="zeek:smtpurl_links" uid="CPOKWC4c50Oq3eHR2c"
| table _time, host, url
دامنه
apply.uk.gov.student.applily.ioبا subdomain سازی تلاش میکند یک سایت دولتی بریتانیا به نظر برسد اما domain اصلیapplily.ioاست. این تکنیک را Subdomain Spoofing مینامند.
گام ۴: تأیید کلیک کاربر در http.log
index=zeek sourcetype="zeek:http" host="apply.uk.gov.student.applily.io"
| table _time, id.orig_h, method, uri, status_code, response_body_len, resp_mime_types
وجود رکورد GET با
resp_mime_types: application/x-dosexecتأیید میکند که کاربر فایل اجرایی را دانلود کرده است.
سناریو ۲: ضمیمه مخرب در ایمیل
موقعیت: کاربری ایمیلی با پیوست دریافت کرده. باید هویت فایل و آلودگی احتمالی بررسی شود.
گام ۱: شناسایی SMTP با حجم بالا
index=zeek sourcetype="zeek:conn" id.resp_p=25
| where orig_bytes > 100000
| table _time, uid, id.orig_h, id.resp_h, orig_bytes
| sort - orig_bytes
حجم بالای
orig_bytes(بیش از ۱ مگابایت) نشانه وجود attachment است.
گام ۲: ردیابی UID در smtp.log
index=zeek sourcetype="zeek:smtp" uid="CsSvT24rVVHfYR0hHa"
| table mailfrom, rcptto, subject, fuids
گام ۳: استخراج اطلاعات فایل از files.log
index=zeek sourcetype="zeek:files" uid="CsSvT24rVVHfYR0hHa"
| table fuid, filename, mime_type, seen_bytes, md5, sha1
گام ۴: بررسی Hash با CTI
MD5 و SHA1 استخراجشده را در پلتفرمهای زیر جستجو کنید:
- VirusTotal: بررسی آنتیویروسهای متعدد
- MalwareBazaar: پایگاه داده نمونههای بدافزار
- OTX AlienVault: بررسی IOC در threat intelligence
۵. C2 در ترافیک رمزنگاریشده (TLS)
مقدمه
زمانی که ارتباط C2 از طریق TLS رمزنگاری میشود، محتوای ترافیک قابل خواندن نیست. اما در TLS Handshake، بستههای Client Hello و Server Hello رمزنگاری نمیشوند و حاوی اطلاعات ارزشمندی هستند.
فیلدهای TLS Handshake قابل استخراج
Client Hello:
├── TLS Version
├── Cipher Suites (لیست الگوریتمهای رمزنگاری پیشنهادی)
├── Extensions (SNI، Elliptic Curves، Compression Methods و ...)
└── → JA3 Hash (fingerprint کلاینت)
Server Hello:
├── TLS Version انتخابی
├── Cipher Suite انتخابی
├── Extensions
└── → JA3S Hash (fingerprint سرور)
JA3 Fingerprinting
JA3 یک fingerprint منحصربهفرد از فیلدهای Client Hello است. این hash برای هر نرمافزار یا کتابخانهای که TLS را پیادهسازی میکند متفاوت است.
چرا JA3 در شناسایی C2 مفید است؟
بدافزارهایی که از TLS برای ارتباط C2 استفاده میکنند، JA3 hash ثابتی دارند. اگر یک JA3 hash در شبکه بسیار بیشتر از سایرین دیده شود، یا در پایگاه داده JA3 های مخرب شناختهشده باشد، نشانهی فعالیت C2 است.
نکته: JA4 نسخه جدیدتر JA3 است که مقاومتر و دقیقتر است اما مفهوم پایه مشابه است.
نمونه لاگ
ssl.log
ts uid id.orig_h id.resp_h server_name version cipher ja3 ja3s
1722750500.001 CxTls1Rq5Ab9z2Lk 192.168.1.50 185.220.101.5 - TLSv12 TLS_AES_256_GCM_SHA384 51c64c77e60f3980eea90869b68c58a8 ec74a5c51106f0419184d0dd08fb05bc
1722750501.002 CyTls2Mw6Bc0a3Np 192.168.1.51 185.220.101.5 - TLSv12 TLS_AES_256_GCM_SHA384 51c64c77e60f3980eea90869b68c58a8 ec74a5c51106f0419184d0dd08fb05bc
1722750502.003 CzTls3Nv7Cd1b4Oq 192.168.1.52 185.220.101.5 - TLSv12 TLS_AES_256_GCM_SHA384 51c64c77e60f3980eea90869b68c58a8 ec74a5c51106f0419184d0dd08fb05bc
یک JA3 hash یکسان از سه IP داخلی مختلف به یک سرور خارجی — الگوی کلاسیک C2 beaconing.
سناریو: شناسایی C2 در ترافیک TLS
موقعیت: ترافیک رمزنگاریشده غیرمعمولی از چند سیستم داخلی به یک IP خارجی مشاهده شده. محتوای ترافیک قابل خواندن نیست. باید با fingerprinting TLS فعالیت C2 شناسایی شود.
گام ۱: شناسایی JA3 های پرتکرار (Splunk)
index=zeek sourcetype="zeek:ssl"
| stats count by ja3, id.orig_h, id.resp_h, server_name
| sort - count
| where count > 10
گام ۲: شناسایی ارتباطات بدون SNI
ابزارهای C2 معمولاً SNI ندارند (فیلد server_name خالی است).
index=zeek sourcetype="zeek:ssl" server_name="-" OR server_name=""
| stats count by ja3, id.orig_h, id.resp_h
| sort - count
گام ۳: بررسی JA3 در پایگاه دادههای Threat Intelligence
index=zeek sourcetype="zeek:ssl"
| stats dc(id.orig_h) as unique_clients, count by ja3, id.resp_h
| where unique_clients > 3
| sort - unique_clients
گام ۴: شناسایی با ELK (Kibana)
GET zeek-*/_search
{
"aggs": {
"ja3_hashes": {
"terms": { "field": "ja3.keyword", "size": 20 },
"aggs": {
"clients": { "cardinality": { "field": "id_orig_h.keyword" } }
}
}
}
}
بخش دوم: پلاگینهای Zeek
BZAR (Bro/Zeek ATT&CK-based Analytics and Reporting)
چیست؟
BZAR یک پلاگین Zeek است که فعالیتهای مرتبط با SMB و DCE-RPC را به صورت خودکار تحلیل میکند و آنها را به تاکتیکها و تکنیکهای MITRE ATT&CK نگاشت میدهد. خروجی آن در notice.log ثبت میشود.
چه کاری انجام میدهد؟
- نظارت بر
dce_rpc.logدر real-time - شناسایی عملیاتهای حساس مانند
CreateService،DRSGetNCChanges،SchRpcRun - تولید alert در
notice.logبا برچسب MITRE ATT&CK - شناسایی الگوهایی مانند pass-the-hash، DCSync، remote execution
نصب
# نصب از طریق Zeek Package Manager
zkg install bzar
# تأیید نصب
zkg list | grep bzar
# فعالسازی در Zeek
zeekctl deploy
نمونه خروجی در notice.log
ts uid note msg
1722750303.643 CpZD5A2XLb12m0pvl BZAR::Lateral_Movement_and_Execution ATT&CK T1021.002 Remote Services: SMB - CreateService detected from 172.16.245.129 to 172.16.245.147
1722750305.014 Fa9cpR2DFkd3lBpNj BZAR::Credential_Access_DCSync ATT&CK T1003.006 DCSync: DRSGetNCChanges from 172.16.245.130 to DC 172.16.245.1
smtp-url-analysis
چیست؟
پلاگینی برای استخراج و تحلیل لینکهای موجود در ایمیلهای SMTP و ثبت آنها در smtpurl_links.log.
نصب
zkg install smtp-url-analysis
zeekctl deploy
Zeek Intelligence Framework
چیست؟
یک framework داخلی Zeek برای تطبیق خودکار ترافیک شبکه با IOC های Threat Intelligence و ثبت موارد مطابقت در intel.log.
نصب و راهاندازی
# نصب فیدهای آماده
zkg install zeek-intelligence-feeds
# در فایل local.zeek
@load policy/frameworks/intel/seen
@load policy/frameworks/intel/do_notice
redef Intel::read_files += {
"/opt/zeek/share/zeek/site/intel/indicators.txt"
};
فرمت فایل IOC
#fields indicator indicator_type meta.source meta.desc
185.220.101.5 Intel::ADDR ThreatFox Known C2 Server
evil.c2server.com Intel::DOMAIN MISP Malware distribution
62c20b2be38c375d179ea9689c2dd98c Intel::FILE_HASH VirusTotal Nitol botnet
نمونه intel.log
{"ts":1722750500.001,"uid":"CxTls1Rq5Ab9z2Lk","id.orig_h":"192.168.1.50","id.resp_h":"185.220.101.5",
"seen.indicator":"185.220.101.5","seen.indicator_type":"Intel::ADDR",
"matched":["Intel::ADDR"],"sources":["ThreatFox"]}
جستجو در Splunk
index=zeek sourcetype="zeek:intel"
| table _time, id.orig_h, id.resp_h, seen.indicator, seen.indicator_type, sources
| sort - _time
جمعبندی: زنجیره تحلیل با Zeek
ترافیک شبکه (SPAN / TAP)
|
↓
[Zeek]
|
┌────┴─────────────────────────────────┐
│ فایلهای لاگ │
├─────────────────────────────────────┤
│ conn.log dns.log http.log │
│ ssl.log smtp.log files.log │
│ smb_*.log dce_rpc.log intel.log │
└────────────────────────────────────┘
|
┌────┴──────────────────┐
│ پلاگینها │
├──────────────────────┤
│ BZAR (SMB/RPC → ATT&CK) │
│ smtp-url-analysis │
│ Intel Framework │
└──────────────────────┘
|
↓
[SIEM: Splunk / ELK]
|
↓
Threat Hunting / Forensic