راهنمای جامع تشخیص ترافیک DoH (DNS-over-HTTPS) با استفاده از Zeek و Splunk Stream

ترافیک DNS-over-HTTPS (DoH) با رمزگذاری درخواست‌های DNS درون ترافیک وب HTTPS، نظارت و کنترل سنتی بر DNS را برای تیم‌های امنیتی به یک چالش جدی تبدیل کرده است. بدافزارها، ابزارهای نفوذ و حتی مرورگرهای استاندارد از این تکنیک برای دور زدن سیاست‌های امنیتی و پنهان کردن فعالیت‌های خود استفاده می‌کنند. این راهنما به صورت جامع به شما نشان می‌دهد چگونه با استفاده از دو ابزار قدرتمند Zeek و Splunk Stream این ترافیک پنهان را شناسایی کنید.

اصول کلیدی شناسایی ترافیک DoH

قبل از پرداختن به ابزارها، باید بدانیم به دنبال چه سرنخ‌هایی هستیم. شناسایی موفق DoH بر پایه‌ی ترکیبی از شاخص‌های زیر استوار است:

1. سرورهای مقصد شناخته‌شده: اتصال به IPها یا دامنه‌هایی که به عنوان ارائه‌دهنده‌ی عمومی DoH شناخته می‌شوند (مانند Cloudflare, Google, Quad9).
2. پورت استاندارد: ترافیک DoH تقریباً همیشه از پورت استاندارد HTTPS یعنی 443/tcp استفاده می‌کند.
3. مسیر URI خاص: درخواست‌های DoH معمولاً به مسیرهای URI مشخصی مانند /dns-query یا /resolve ارسال می‌شوند.
4. هدرهای HTTP: وجود هدر Content-Type: application/dns-message در درخواست‌های POST یک شاخص بسیار قوی است.
5. متادیتای TLS:
و SNI نام دامنه‌ای که کلاینت قصد اتصال به آن را دارد و حتی در ترافیک رمزگذاری‌شده نیز قابل مشاهده است.
فینگرپرینت JA3/JA3S: اثر انگشت منحصر به فرد کلاینت و سرور TLS که می‌تواند برای شناسایی ابزارها یا بدافزارهای خاص استفاده شود.



بخش اول: تشخیص DoH با Zeek

و Zeek با تحلیل عمیق پروتکل‌ها، ابزاری ایده‌آل برای این کار است. به جای تکیه بر اسکریپت‌های آماده، بهترین رویکرد، ایجاد یک اسکریپت سفارشی برای تولید لاگ‌های ساختاریافته و اختصاصی است.

رویکرد حرفه‌ای: ایجاد لاگ اختصاصی doh.log

این رویکرد به جای چاپ خروجی در کنسول، یک فایل لاگ جداگانه و تمیز به نام doh.log ایجاد می‌کند که تحلیل و یکپارچه‌سازی آن با سایر ابزارها (مانند SIEM) را بسیار آسان می‌سازد.

اسکریپت detect-doh.zeek:

این اسکریپت را در مسیر site/ یا local.zeek خود بارگذاری کنید.


# file: site/detect-doh.zeek

1. تعریف ماژول و ساختار لاگ اختصاصی
module DOH;

export {
تعریف نوع داده برای نگهداری اطلاعات رویداد DoH
type Info: record {
ts: time &log; زمان دقیق رویداد
uid: string &log; شناسه یکتای اتصال برای ارتباط با سایر لاگ‌ها
id: conn_id &log; اطلاعات کامل اتصال (IPها و پورت‌ها)
method: string &log; متد HTTP (GET/POST)
host: string &log &optional; هدر هاست از درخواست HTTP
uri: string &log; URI کامل درخواست
user_agent: string &log &optional; User-Agent کلاینت
ja3: string &log &optional; فینگرپرینت TLS کلاینت (از ssl.log)
};

2. ایجاد یک جریان لاگ جدید به نام doh.log
const log_file = "doh.log";
global log_stream: Log::Stream = Log::create_stream(DOH::log_file, [$columns=Info]);
}

3. پردازش رویدادهای HTTP برای شناسایی الگو
event http_request(c: connection, method: string, original_URI: string, unescaped_URI: string, version: string)
{
# شرط اصلی: پورت 443 و URIهای شناخته‌شده
if ( c$id$resp_p == 443/tcp &&
( "/dns-query" in unescaped_URI || "/resolve" in unescaped_URI ) )
{
# ساختن رکورد لاگ با اطلاعات استخراج شده
local doh_info: Info;
doh_info$ts = network_time();
doh_info$uid = c$uid;
doh_info$id = c$id;
doh_info$method = method;
doh_info$host = c$http$host;
doh_info$uri = unescaped_URI;
doh_info$user_agent = c$http$user_agent;

# اگر اتصال TLS بوده، فینگرپرینت JA3 را اضافه کن
if ( c$ssl?$ja3 ) {
doh_info$ja3 = c$ssl$ja3;
}

4. نوشتن رکورد نهایی در فایل doh.log
Log::write(DOH::log_stream, doh_info);
}
}


تحلیل خروجی

پس از اجرای Zeek با این اسکریپت، فایل
logs/current/doh.log شما حاوی رکوردهایی ساختاریافته خواهد بود. شما می‌توانید با استفاده از فیلد uid، هر رویداد DoH را به لاگ‌های دیگر مانند ssl.log (برای تحلیل عمیق TLS) و conn.log` (برای مشاهده حجم داده و مدت زمان اتصال) مرتبط کنید.



بخش دوم: تشخیص DoH با Splunk Stream


انتهای بخش اول

آکادمی روزبه
دوره CISSP
واتس اپ و بله 09902857290

Comments

Be the first to add a comment