সরাসরি পর্বে যান
পর্ব ৫৮ · ৮০-এর মধ্যে · মডিউল ৯

Threat hunting — hypothesis, ATT&CK আর log-এ খোঁজা

Threat Hunting — Hypotheses, ATT&CK & Searching Your Own Logs

Taught in Bangla, this lesson explains how hunting differs from alerting and what it needs first. It covers the Sqrrl loop, Hunting Maturity Model, PEAK and TaHiTI, testable hypotheses from ATT&CK, stacking, long tail, baselines and time series, and five hunts on toy logs: rare process pairs, beaconing, new admins, unusual logons and data spikes, then documentation, new rules, cloud hunting and privacy.

এই পর্বে যা শিখবেন

  • Alerting আর hunting-এর পার্থক্য, assume breach আর hunting-এর পূর্বশর্ত
  • Sqrrl hunting loop, Hunting Maturity Model, PEAK আর TaHiTI কাঠামো
  • ATT&CK, threat intelligence আর anomaly থেকে যাচাইযোগ্য hypothesis বানানো
  • Stacking, long tail, least frequency, baseline, clustering আর time series
  • নিজের log-এ পাঁচটি hunt: বিরল process জোড়া, beaconing, নতুন admin, অস্বাভাবিক logon সময় আর data spike
  • Hunt-এর নথি, hunt থেকে detection rule, cloud-এ hunting আর privacy-র সীমা

১ · অ্যালার্ম আর তল্লাশি — alerting বনাম hunting

একটি পোশাক কারখানার গুদাম ভাবুন। দরজায় অ্যালার্ম আছে। তালা ভাঙলে ঘণ্টা বাজবে। কিন্তু কেউ যদি নকল পরিচয়পত্র নিয়ে স্বাভাবিকভাবে ঢোকে, ঘণ্টা বাজবে না। তাই মাসে একবার হিসাবরক্ষক রেজিস্টার খাতা, গেটের স্লিপ আর গুদামের মাল মিলিয়ে দেখেন। কোনো ঘণ্টা বাজেনি, তবুও তিনি খোঁজেন। কারণ তাঁর প্রশ্ন আলাদা: “ঘণ্টা বাজেনি বলে কি সব ঠিক আছে?”

Detection rule হলো ওই ঘণ্টা। আর threat hunting হলো হিসাব মেলানোর কাজ। TaHiTI নথির সংজ্ঞায় hunting হলো IT পরিকাঠামোতে, বর্তমান ও অতীত দুই সময়েই, এমন ক্ষতিকর কাজের চিহ্ন সক্রিয়ভাবে খোঁজা, যা চালু প্রতিরক্ষাকে এড়িয়ে গেছে। মূল কথাটি হলো মানুষ প্রশ্ন তোলেন, আর tool সেই প্রশ্নের উত্তর খুঁজতে সাহায্য করে।

দিকAlertingThreat hunting
কীভাবে শুরুRule মিললে নিজে থেকেইমানুষের তোলা প্রশ্ন বা hypothesis থেকে
কী ধরেআগে থেকে জানা ধরনযা এখনো কোনো rule ধরেনি
ধরে নেওয়া অবস্থাঘণ্টা না বাজা পর্যন্ত স্বাভাবিকAssume breach: কেউ হয়তো ভেতরে আছে
ফলএকটি alert, যা triage হবেঘটনা, log-এর ফাঁক, নতুন rule বা পরিবেশ সম্পর্কে নতুন জ্ঞান
সময়ের সম্পর্কএখনকার ঘটনায়, দ্রুতঅতীতের log-ও দেখে, সময় নিয়ে

Hunting কেন দরকার? কারণ আক্রমণকারী যত কম শব্দ করে, dwell time তত বাড়ে। অর্থাৎ ঢোকা আর ধরা পড়ার মাঝের সময় লম্বা হয়। অনেক কাজ বৈধ account আর সাধারণ admin tool দিয়েই হয়, যাকে living off the land বলে। সেসব কাজে rule বসালে false positive-এর বন্যা নামে। পর্ব ০৫-এ এজন্যই বলা হয়েছিল, কিছু আচরণ alert নয়, hunting-এর জন্য রাখুন। David Bianco-র Pyramid of Pain অনুযায়ী TTP বদলানো আক্রমণকারীর জন্য সবচেয়ে কঠিন। Hunting মূলত সেই স্তরেই কাজ করে।

সীমারেখা: Threat hunting শুধু নিজের প্রতিষ্ঠানের log আর অনুমোদিত সিস্টেমে হয়। এখানে আপনি log পড়েন, অন্য কারও সিস্টেমে হাত দেন না। সন্দেহজনক ঠিকানায় নিজে scan করা বা “পাল্টা খোঁজ” নেওয়া hunting নয়। অনুমতি ছাড়া অন্যের সিস্টেমে প্রবেশ অপরাধ। বিস্তারিত পর্ব ০৬-এ।

সংজ্ঞায় মতভেদ আছে: কেউ বলেন, নতুন IOC নিয়ে পুরোনো log-এ খোঁজাও hunting. Hunting Maturity Model একে সবচেয়ে নিচের স্তরের hunting ধরে। অনেকে এটিকে শুধু “IOC sweep” বলেন, আর hunting বলতে আচরণভিত্তিক অনুসন্ধান বোঝেন। পরীক্ষায় বা ইন্টারভিউতে নিজের সংজ্ঞাটি বলে নেওয়াই ভালো।

২ · শুরুর আগে — log, baseline, মানুষ আর maturity

খাতা না থাকলে হিসাব মেলানো যায় না। Hunting-এর আগে তিনটি জিনিস লাগে:

Log আর telemetry

Process চালু হওয়া, logon, DNS, proxy, firewall, cloud audit. Retention এত লম্বা হতে হবে যাতে তুলনা করা যায়। কোন log কতদিন রাখবেন, সেটি পর্ব ৫৫-এর বিষয়।

যা নেই, তা খোঁজা যায় না

Baseline

স্বাভাবিক কেমন, সেটি জানা। কোন server কোন সময়ে কাকে ডাকে, কোন দল রাতে কাজ করে। Baseline ছাড়া “অস্বাভাবিক” কথাটির কোনো মানে নেই।

স্বাভাবিকের মাপ

প্রশিক্ষিত মানুষ

যিনি OS, network, আক্রমণের ধরন আর প্রতিষ্ঠানের ব্যবসা বোঝেন। Finance দলের মাসশেষের কাজ না জানলে স্বাভাবিক কাজকেও সন্দেহজনক মনে হবে।

Tool প্রশ্ন তোলে না

David Bianco-র তৈরি Hunting Maturity Model (HMM) প্রতিষ্ঠানের সক্ষমতা মাপে। Sqrrl-এর ২০১৫ সালের লেখায় এর বিবরণ আছে। এতে পাঁচটি স্তর আছে। স্তর ঠিক হয় ডেটার পরিমাণ ও মান, tool আর analyst-এর দক্ষতা দেখে।

স্তরনামকী বোঝায়
HM0Initialপ্রায় পুরোপুরি স্বয়ংক্রিয় alert-এর ওপর নির্ভর, নিয়মিত ডেটা সংগ্রহ সামান্য। এই স্তরকে hunting-সক্ষম ধরা হয় না।
HM1Minimalকিছু নিয়মিত ডেটা জমা হয়। Threat report থেকে indicator নিয়ে অতীত log-এ খোঁজা হয়।
HM2Proceduralঅন্যের লেখা hunting procedure নিয়মিত অনুসরণ করা হয়, সামান্য বদল করে। মূল লেখায় একে সক্রিয় দলগুলোর মধ্যে সবচেয়ে প্রচলিত স্তর বলা হয়েছে।
HM3Innovativeদল নিজেই নতুন procedure বানায় ও নথিভুক্ত করে। Procedure বেশি হলে হাতে করা কঠিন হয়ে পড়ে।
HM4LeadingHM3-এর সবকিছু, সঙ্গে automation. সফল procedure স্বয়ংক্রিয় detection হয়ে যায়, ফলে মানুষ নতুন প্রশ্নে সময় দিতে পারেন।

HM0 আর HM4 দুই জায়গাতেই automation আছে, কিন্তু অর্থ আলাদা। HM0-তে দল alert-এর জন্য বসে থাকে। HM4-এ দল নিজের আবিষ্কারকে automation-এ পরিণত করে এগিয়ে যায়। মূল লেখার ভাষায়, hunting মেশিনের সাহায্য নিতে পারে, কিন্তু তা analyst-চালিত, পুরোপুরি automate করা যায় না।

৩ · Hunting loop — একটি hunt-এর পুরো পথ

একবার খুঁজলেই নেটওয়ার্ক চিরকালের জন্য নিরাপদ হয়ে যায় না। তাই Sqrrl দল ২০১৫ সালে hunting-কে একটি চক্র হিসেবে আঁকে। একে hunting loop বলে। এর চারটি ধাপ:

Threat hunting loop

Sqrrl (2015): create hypotheses, investigate, uncover patterns and TTPs, inform and enrich analytics

Hunting loop-এর চারটি ধাপ ১ · Hypothesis তৈরিযাচাইযোগ্য অনুমান ২ · তদন্তTool আর কৌশলে ৩ · Pattern উন্মোচননতুন ধরন আর TTP ৪ · Analyticsজানানো ও সমৃদ্ধ করা প্রতি পাক শেষেdetection একটু ভালো
ছবি ৫৮.১ — Sqrrl-এর ধারণা থেকে আঁকা। চতুর্থ ধাপের ফল পরের hypothesis-এর জ্বালানি হয়।

এবার একটি কাল্পনিক অনলাইন বাজারের পুরো hunt দেখুন। সংখ্যাগুলো toy, কিন্তু ধাপগুলো বাস্তব। “পরে” চাপুন।

  1. Hypothesisঅনুমান
  2. Dataআছে তো?
  3. Stackগণনা
  4. Pivotসূত্র ধরে
  5. হস্তান্তরIR দল
  6. Ruleনতুন detection
hunt-০৭.mdশুরু
Hypothesis : গত ৩০ দিনে কোনো document app
             PowerShell চালিয়েছে
ATT&CK     : T1566.001 > T1204.002 > T1059.001
Data       : process creation log, ৪০টি PC
Time-box   : ৮ ঘণ্টা
data checkখোঁজার আগে যাচাই
PC reporting   : 40 / 40
Time range     : 30 days
Parent field   : present
Events (toy)   : 1,024
stack resultকম থেকে বেশি
count  hosts  pair
    1      1  winword.exe > powershell.exe
    3      2  excel.exe > splwow64.exe
    4      1  excel.exe > powershell.exe
   30      1  backup-agent.exe > cmd.exe
... আরও ৫টি সাধারণ জোড়া
pc-17 timelineকাল্পনিক ঘটনা
10:41  outlook.exe > winword.exe  (mail attachment)
10:41  winword.exe > powershell.exe
10:42  proxy: pc-17 > 203.0.113.50
10:47  proxy: pc-17 > 203.0.113.50
10:52  proxy: pc-17 > 203.0.113.50
handoverHypothesis প্রমাণিত
Verdict   : confirmed, open incident
Handed to : incident response team
Kept      : queries, timeline, evidence list
Do not    : log off, wipe, or alert the user yet
rule replay৯০ দিনের log-এ
First draft : 14 hits, 1 true   precision 7.1%
Finance job : 12 hits, reviewed, narrow filter
After filter:  2 hits, 1 true   precision 50.0%
  1. Hypothesis. বিভিন্ন প্রকাশিত রিপোর্টে দেখা যায়, mail attachment থেকে script চলা একটি পরিচিত ধরন। তাই দল লিখল, “গত ৩০ দিনে কোনো document app PowerShell চালিয়েছে।” এটি যাচাই করা যায়, আর সময় বাঁধা হলো ৮ ঘণ্টায়।
  2. Data আছে কি না। ৪০টি PC-র সব কটি log পাঠিয়েছে, parent process-এর ঘরও আছে, ৩০ দিনের ডেটাও আছে। আগে এটি না দেখলে “কিছু পেলাম না” কথাটির কোনো দাম থাকে না।
  3. Stacking. ১,০২৪টি ঘটনাকে parent আর child জোড়া ধরে গোনা হলো। মোট ৯ রকম জোড়া। সবচেয়ে বিরল সারিতে winword.exe > powershell.exe, মাত্র ১ বার, ১টি PC-তে।
  4. Pivoting. এই একটি সারি ধরে pivoting শুরু হলো, মানে এক তথ্য থেকে পাশের তথ্যে যাওয়া। pc-17-এ mail attachment খোলার ঠিক পরে PowerShell চলেছে। তারপর একই বাইরের ঠিকানায় ৫ মিনিট পরপর সংযোগ, যা beaconing-এর মতো।
  5. হস্তান্তর। এখন এটি আর hunt নয়, সম্ভাব্য incident. Hunter নিজে PC বন্ধ বা পরিষ্কার করেন না, কারণ তাতে প্রমাণ নষ্ট হতে পারে। পুরো নথি যায় incident response দলের কাছে (পর্ব ৬১)।
  6. নতুন rule. Rule-এর খসড়া ৯০ দিনের log-এ ১৪টি hit দিল: ১২টি finance-এর অনুমোদিত কাজ, ১টি IT পরীক্ষা, ১টি আসল। Precision ১/১৪ = ৭.১%. সরু filter-এর পর ২টি hit, ১টি আসল, তাই ১/২ = ৫০%. Loop-এর চতুর্থ ধাপ শেষ।

আরও গভীরে: PEAK (Prepare, Execute, and Act with Knowledge) ২০২৩ সালে Splunk SURGe-এর David Bianco ও Ryan Fetterman প্রকাশ করেন। এতে hunt তিন ধরনের: hypothesis-driven, baseline (exploratory data analysis) আর model-assisted (M-ATH). TaHiTI (Targeted Hunting integrating Threat Intelligence) ডাচ আর্থিক খাতের যৌথ পদ্ধতি, FI-ISAC NL ২০১৮ সালে প্রকাশ করে। এর তিন ধাপ Initiate, Hunt আর Finalize, আর ফল হতে পারে proven, disproven বা inconclusive. সব কাঠামোর মূল কথা এক: প্রস্তুতি, খোঁজা, আর ফলকে কাজে লাগানো।

৪ · ভালো hypothesis কীভাবে বানাবেন

Hunting hypothesis হলো এমন একটি অনুমান, যা log দেখে সত্য বা মিথ্যা বলা যায়। “হ্যাকার থাকতে পারে” কোনো hypothesis নয়, কারণ এটি কখনো ভুল প্রমাণ করা যায় না। TaHiTI-ও সতর্ক করে যে দুর্বল hypothesis ফলহীন বা ভুল সিদ্ধান্তে নিয়ে যেতে পারে।

একটি সহজ ছাঁচ

কে বা কী + কোন আচরণ + কোথায় + কোন সময়ে + কোন log-এ দেখা যাবে। যেমন: “গত ৬০ দিনে কোনো service account নতুন কোনো PC-তে interactive logon করেছে, আর এটি logon log-এ দেখা যাবে।”

Hypothesis সাধারণত তিন জায়গা থেকে আসে:

উৎসকীভাবে কাজে লাগেউদাহরণ
MITRE ATT&CKকোন technique-এ এখনো rule নেই, সেটি বেছে নেওয়া (detection gap)T1136 Create Account: বৈধ পথের বাইরে নতুন account
Threat intelligenceআপনার খাতে সক্রিয় ধরন জেনে, IOC নয়, আচরণ খোঁজা (পর্ব ৫৭)“আর্থিক খাতে remote support tool-এর অপব্যবহার বাড়ছে”, তাই অনুমোদিত তালিকার বাইরের tool খোঁজা
Anomaly আর অভিজ্ঞতাআগের incident, দুর্বল alert, red team রিপোর্ট বা anomaly“গত মাসে DNS query হঠাৎ বেড়েছে”, কারণ কী?
দুর্বলসমস্যাভালো রূপ
“Network-এ malware আছে কি না দেখি”কোন আচরণ, কোন log, কিছুই বলা নেই“গত ৩০ দিনে কোনো PC নিয়মিত বিরতিতে নতুন বাইরের domain-এ যোগাযোগ করেছে, proxy log-এ”
“Admin-রা কিছু ভুল করছে”মানুষকে সন্দেহ, আচরণ নয়“গত ৯০ দিনে change ticket ছাড়া admin group-এ সদস্য যোগ হয়েছে”
“T1059 খুঁজুন”Technique খুব চওড়া, সাধারণ কাজেও মিলবে“Web server process command shell চালিয়েছে, process log-এ”

একটি hypothesis বাছাইয়ের সময় তিনটি প্রশ্ন করুন: ঘটলে ক্ষতি কত, আমাদের log-এ দেখা যাবে কি, আর এখনকার rule এটি ধরে কি না? Sqrrl-এর লেখাও বলে, আগে দেখুন কোনটি alert-এ ইতিমধ্যে ধরা পড়ে, তারপর বাকিটা খুঁজুন।

৫ · Stacking আর long tail — বিরল জিনিস গুনে বের করা

বাজারের হিসাব ভাবুন। হাজারটি বিক্রি রশিদের মধ্যে বেশিরভাগ চাল, ডাল, তেল। কিন্তু একটি রশিদে লেখা “১টি অচেনা জিনিস, নগদে, রাত ১১টায়।” সব রশিদ পড়তে হবে না। শুধু জিনিস ধরে গুনে নিচের দিকের সারি দেখলেই হয়।

একেই বলে stacking বা stack counting: একটি বৈশিষ্ট্য ধরে ঘটনা গোনা। গুনে সাজালে সাধারণত অল্প কিছু সারিতে বেশিরভাগ ঘটনা থাকে। বাকি অনেক সারিতে থাকে সামান্য কিছু। এই সরু লেজটিকে long tail বলে, আর সেখানে নজর দেওয়াই long-tail analysis. এর পেছনের ধারণা least frequency of occurrence (LFO): আক্রমণকারীর কাজ সাধারণত অল্প জায়গায়, অল্পবার ঘটে, তাই নিচের সারিতে ভেসে ওঠে।

নিচের toy উদাহরণে parent-child process জোড়া stack করা হয়েছে। মানে কোন program কোন program-কে চালিয়েছে। Run চাপুন।

// toy: কাল্পনিক ৩০ দিনের process log, real নয়
const seed = [ // parent, child, ঘটনা, কয়টি PC-তে
  ['explorer.exe', 'chrome.exe', 412, 38],
  ['services.exe', 'svchost.exe', 240, 40],
  ['explorer.exe', 'outlook.exe', 180, 38],
  ['svchost.exe', 'updater.exe', 96, 40],
  ['explorer.exe', 'excel.exe', 58, 21],
  ['backup-agent.exe', 'cmd.exe', 30, 1],
  ['excel.exe', 'powershell.exe', 4, 1],
  ['excel.exe', 'splwow64.exe', 3, 2],
  ['winword.exe', 'powershell.exe', 1, 1],
];
const events = [];
for (const [p, c, n, h] of seed)
  for (let i = 0; i < n; i++)
    events.push({ host: 'pc-' + (i % h + 1), pair: p + ' > ' + c });

const stack = new Map();
for (const e of events) {
  const row = stack.get(e.pair) || { count: 0, hosts: new Set() };
  row.count++;
  row.hosts.add(e.host);
  stack.set(e.pair, row);
}
const rows = [...stack].sort((a, b) => a[1].count - b[1].count);
console.log('total events:', events.length, ' distinct pairs:', rows.length);
console.log('count    pct  hosts  pair');
for (const [pair, r] of rows) {
  const pct = (100 * r.count / events.length).toFixed(2);
  const mark = r.hosts.size <= 2 ? '  <- review' : '';
  console.log(String(r.count).padStart(5), pct.padStart(6),
    String(r.hosts.size).padStart(6), ' ' + pair + mark);
}

আসল আউটপুট শুরু হয় total events: 1024 distinct pairs: 9 দিয়ে। শেষ সারি 412 40.23 38 explorer.exe > chrome.exe, অর্থাৎ ৯ রকমের একটি জোড়াই ৪০.২৩% ঘটনা। প্রথম সারি 1 0.10 1 winword.exe > powershell.exe <- review. খেয়াল করুন 30 2.93 1 backup-agent.exe > cmd.exe সারিটিকে। সংখ্যা ৩০ হলেও এটি মাত্র ১টি PC-তে। তাই ঘটনার সংখ্যা আর PC-র সংখ্যা, দুটোই দেখতে হয়। Code-এ hosts.size <= 2 শর্তে মোট ৪টি সারি চিহ্নিত হয়েছে।

ফল পাওয়াই শেষ নয়, পড়তে জানতে হয়। “বিরল” মানেই “খারাপ” নয়। নিচে একই ফল সারি ধরে পড়া হলো।

1   1   1  winword.exe > powershell.exe2   3   2  excel.exe > splwow64.exe3   4   1  excel.exe > powershell.exe4  30   1  backup-agent.exe > cmd.exe5  58  21  explorer.exe > excel.exe6  96  40  svchost.exe > updater.exe7 180  38  explorer.exe > outlook.exe8 240  40  services.exe > svchost.exe9 412  38  explorer.exe > chrome.exe
Analyst-এর খাতা
দেখা হচ্ছে
যাচাইয়ের প্রশ্ন
সিদ্ধান্ত
  1. কাঠামো দেখা। তালিকা কম থেকে বেশি সাজানো। ৫৮ থেকে ৪১২ পর্যন্ত নিচের ৫টি সারি বহু PC-তে ঘটে, এগুলোই স্বাভাবিকের ছবি। মনোযোগ যাবে ওপরের ৪টি সারিতে, যেখানে PC-র সংখ্যা ২ বা তার কম।
  2. excel.exe > splwow64.exe, ৩ বার। Windows-এ 32-bit app থেকে print করার সময় এই সহায়ক process চলতে পারে। ২টি PC-র ব্যবহারকারী Excel থেকে print করেছেন কি না, সেটি মিলিয়ে নেওয়া হলো। বিরল, কিন্তু ব্যাখ্যা আছে।
  3. backup-agent.exe > cmd.exe, ৩০ বার। ১টি PC-তে ৩০ দিনে ৩০ বার, মানে দিনে একবার। Backup job-এর সূচির সঙ্গে সময় মিলল। মিল না থাকলে এটিই সন্দেহের কারণ হতো।
  4. excel.exe > powershell.exe, ৪ বার। ১টি finance PC, ৪ বারই মাসের শেষ দিকে। Finance দলের মালিক জানালেন, এটি অনুমোদিত report-এর কাজ। তবুও এখানে নিজের অনুমানে নয়, মালিকের সঙ্গে কথা বলে সিদ্ধান্ত হলো।
  5. winword.exe > powershell.exe, ১ বার। মাত্র ০.১০%, কোনো ব্যাখ্যা নেই, মালিকও জানেন না। এটি প্রমাণ নয়, একটি সূত্র। এখান থেকে আগে-পরের ঘটনা দেখতে pivot করা হয়।
  6. সারসংক্ষেপ। ৪টি চিহ্নিত সারির ৩টি ব্যাখ্যা পেল, ১টি তদন্তে গেল। ৩টি ব্যাখ্যাও hunt-এর ফসল, কারণ এগুলো নথিতে উঠল। পরের hunter জানবেন, এই সারিগুলো আগে দেখা হয়েছে।

একই কৌশল সাধারণ Unix tool দিয়েও হয়। নিচের Bash block একটি ছোট নমুনা proxy log নিজেই বানায়, তারপর user-agent ধরে stack করে। ব্যবস্থাটি আপনার নিজের অনুমোদিত log-এ একইভাবে কাজ করবে।

# toy proxy log: সময়, PC, user-agent (block নিজেই ফাইলটি বানায়)
cat > proxy.log <<'EOF'
09:01 pc-01 Chrome/130
09:02 pc-02 Chrome/130
09:03 pc-03 Edge/130
09:05 pc-04 Chrome/130
09:07 pc-01 Updater/3.1
09:07 pc-02 Updater/3.1
09:07 pc-03 Updater/3.1
09:07 pc-04 Updater/3.1
09:11 pc-02 Chrome/130
09:14 pc-03 Edge/130
09:20 pc-05 Chrome/130
09:21 pc-05 Updater/3.1
09:26 pc-06 Edge/130
09:31 pc-02 curl/8.5
09:33 pc-02 curl/8.5
09:34 pc-02 curl/8.5
09:38 pc-01 Chrome/130
09:40 pc-04 Edge/130
09:42 pc-06 PyClient/2.0
09:47 pc-05 Chrome/130
EOF
export LC_ALL=C
echo "== events per user-agent =="
cut -d' ' -f3 proxy.log | sort | uniq -c | sort -n
echo "== distinct PCs per user-agent =="
cut -d' ' -f2,3 proxy.log | sort -u | cut -d' ' -f2 | sort | uniq -c | sort -n
echo "== full lines of the rarest =="
grep 'PyClient' proxy.log

Pipeline-টি বাক্যের মতো পড়ুন: cut একটি ঘর কাটে, sort একই লেখা পাশাপাশি আনে, uniq -c গোনে, শেষ sort -n কম থেকে বেশি সাজায়। আসল আউটপুটে প্রথম ভাগের ওপরে 1 PyClient/2.0 আর 3 curl/8.5. দ্বিতীয় ভাগে দুটোই 1টি PC-তে। ঘটনা গুনলে curl/8.5 ৩ বার, কিন্তু PC মাত্র একটি, pc-02. শেষ ভাগ দেখায় 09:42 pc-06 PyClient/2.0. পরের প্রশ্ন: কে চালাচ্ছে, কোথায় যাচ্ছে? লক্ষ্য করুন, user-agent বদলানো সহজ, তাই এটি শুধু একটি সূত্র।

৬ · আরও কৌশল — baseline, clustering আর time series

কৌশলকী করেকখন ভালোসীমা
Stacking, LFOগুনে বিরল সারি বের করেProcess, service, user-agentবহু জায়গায় ছড়ানো ঘটনা লুকিয়ে থাকে
Frequency analysisসময়ের একক ধরে ঘটনার হার মাপেLogon ব্যর্থতা, API call-এর হারএকক ভুল হলে ধরন হারায়
Baseliningপ্রতি user বা host-এর নিজের স্বাভাবিকের সঙ্গে তুলনা করেLogon সময়, upload-এর পরিমাণBaseline-এ আগে থেকেই সমস্যা থাকলে সেটিও “স্বাভাবিক” হয়ে যায়
Clusteringমিল আছে এমন ঘটনাকে দলে ভাগ করে, একা পড়ে থাকা ঘটনা দেখায়Command line, host-এর আচরণপরিসংখ্যান জানা লাগে, ফল ব্যাখ্যা কঠিন
Time seriesসময়রেখায় spike, ধারা আর ছন্দ দেখেBeaconing, data spikeমৌসুমি কাজ (বেতন, ঈদের বিক্রি) ভুল সংকেত দেয়

মিলিয়ে ব্যবহার করুন। একটি কৌশল একটি সূত্র দেয়, প্রমাণ দেয় না। সূত্র মিললে আস্থা বাড়ে। Stacking-এ বিরল জোড়া, তার ওপর time series-এ নিয়মিত যোগাযোগ, দুটো একসঙ্গে অনেক শক্তিশালী ইঙ্গিত।

গোনার সময় একক ঠিক করুন: ঘটনা, host আর user, তিন রকম গোনার ফল আলাদা। ১টি PC থেকে ৩০ বার আর ৩০টি PC থেকে ১ বার করে, দুটোর গল্প এক নয়। রিপোর্টে সবসময় একক লিখুন।

৭ · নিজের log-এ পাঁচটি hunt

নিচের প্রতিটি hunt আপনার নিজের প্রতিষ্ঠানের log-এ, অনুমোদন নিয়ে করার জন্য। এখানে শুধু কী দেখবেন, সেটি বলা হয়েছে।

Hunt ১: বিরল parent-child process জোড়া

ATT&CK: T1059. Log: process creation (Windows Event 4688, Sysmon Event 1 বা EDR). Document app, web server বা database process থেকে shell চলা অস্বাভাবিক। উপরের stacking এই hunt-এরই উদাহরণ। ব্যাখ্যা ভালো করে দেয় process tree.

Hunt ২: Beaconing

ATT&CK: T1071. Log: proxy, DNS, flow record. মানুষ অনিয়মিতভাবে browse করেন। স্বয়ংক্রিয় program প্রায় সমান বিরতিতে যোগাযোগ করে। এই নিয়মিততা মাপা যায় coefficient of variation (CV) দিয়ে:

CV = standard deviation ÷ mean
সংযোগবিরতি (সেকেন্ড)MeanSDCV
pc-17 থেকে 203.0.113.50300, 301, 299, 300, 300, 301, 299, 300300.00.710.002
pc-05 থেকে 198.51.100.2012, 340, 45, 1800, 7, 620, 95, 210391.1567.01.45

CV শূন্যের কাছে মানে খুব নিয়মিত। তবে software update, antivirus, health check আর NTP-ও নিয়মিত যোগাযোগ করে। আবার সব ক্ষতিকর যোগাযোগ নিখুঁত ছন্দে চলে না। তাই CV-র সঙ্গে destination-এর বয়স, কতগুলো PC সেখানে যায়, আর কে সেখানে যায়, এসবও দেখতে হয়।

Hunt ৩: নতুন admin account

ATT&CK: T1098, T1136. Log: Windows Event 4728, 4732, identity provider-এর audit log. এখানে কৌশলটি first-seen analysis: আগে কখনো না দেখা জিনিস প্রথমবার দেখলেই নজর দেওয়া। সঙ্গে change ticket মিলিয়ে দেখলে সুযোগ আরও কমে।

// toy: admin group-এ সদস্য যোগের কাল্পনিক ঘটনা
const known = new Set(['it-lead', 'root-it']); // ৯০ দিনের baseline
const tickets = new Set(['CHG-1042']);        // অনুমোদিত change
const events = [
  { day: 4, actor: 'it-lead', member: 'helpdesk-2', ticket: 'CHG-1042' },
  { day: 9, actor: 'it-lead', member: 'it-lead', ticket: null },
  { day: 12, actor: 'helpdesk-2', member: 'svc-report', ticket: null },
  { day: 13, actor: 'root-it', member: 'db-admin-1', ticket: 'CHG-9999' },
  { day: 15, actor: 'helpdesk-2', member: 'svc-report', ticket: null },
];
let leads = 0;
for (const e of events) {
  let verdict;
  if (known.has(e.member)) {
    verdict = 'seen before, skip';
  } else if (e.ticket && tickets.has(e.ticket)) {
    verdict = 'FIRST SEEN, ticket ok, add to baseline';
    known.add(e.member); // শুধু অনুমোদিত হলেই baseline-এ
  } else {
    const why = e.ticket ? 'ticket not found' : 'no ticket';
    verdict = 'FIRST SEEN, ' + why + ' -> LEAD';
    leads++;
  }
  console.log(`day ${String(e.day).padStart(2)}  ${e.actor} added ` +
    `${e.member}: ${verdict}`);
}
console.log('leads for a human:', leads, ' of', events.length, 'events');
console.log('baseline now:', [...known].sort().join(', '));

আসল আউটপুটের শেষ দুই লাইন: leads for a human: 3 of 5 events আর baseline now: helpdesk-2, it-lead, root-it. helpdesk-2 ticket থাকায় baseline-এ ঢুকেছে। day 9-এর লাইনে seen before, skip, কারণ it-lead আগে থেকেই পরিচিত। day 13 লাইনে ticket not found, মানে ticket নম্বর লেখা থাকলেই চলবে না, সেটি আসলে আছে কি না দেখতে হবে। svc-report দুবার LEAD হয়েছে, কারণ যাচাই না হওয়া পর্যন্ত সেটি baseline-এ ঢোকে না। অনুমোদন ছাড়া baseline বাড়ালে আক্রমণকারীও একদিন “স্বাভাবিক” হয়ে যেত।

Hunt ৪: অস্বাভাবিক logon সময়

ATT&CK: T1078 Valid Accounts. Log: logon log, IdP sign-in log. সবার জন্য একই “অফিস সময়” ধরলে রাতের দল বারবার ধরা পড়ে। প্রতি user-এর নিজের baseline ধরা ভালো। ঘড়ি গোল, এটিও মনে রাখতে হয়।

// toy: প্রতি user-এর গত ৩০ দিনের logon ঘণ্টা (০–২৩)
const baseline = {
  'user-a': [9, 9, 10, 9, 10, 9, 11, 9, 10, 9, 18],
  'noc-1': [22, 23, 23, 0, 0, 1, 22, 23, 0, 1, 2],
  'user-b': [10, 11, 10, 19, 20, 19, 10, 11, 20, 19, 10],
};
// ঘড়ি গোল: 23 আর 0-র দূরত্ব 1, 23 নয়
const gap = (a, b) => { const d = Math.abs(a - b); return Math.min(d, 24 - d); };
const support = (hours, h) => hours.filter((x) => gap(x, h) <= 1).length;
const mean = (a) => a.reduce((s, x) => s + x, 0) / a.length;

const MIN_SUPPORT = 2; // কাছাকাছি সময়ে অন্তত ২ বার আগে দেখা চাই
const logons = [['user-a', 9], ['user-a', 3], ['noc-1', 1],
                ['user-b', 20], ['user-c', 10]];
console.log('naive mean hour of noc-1:', mean(baseline['noc-1']).toFixed(1));
console.log('user    hour  global-rule  per-user');
for (const [u, h] of logons) {
  const office = h >= 8 && h <= 19 ? 'ok' : 'FLAG';
  let mine;
  if (!baseline[u]) mine = 'no baseline, cannot judge';
  else {
    const s = support(baseline[u], h);
    mine = (s >= MIN_SUPPORT ? 'ok' : 'LEAD') + ' (support ' + s + ')';
  }
  console.log(u.padEnd(7), String(h).padStart(4), office.padStart(12), ' ' + mine);
}

প্রথম লাইন naive mean hour of noc-1: 10.6. সকাল ১০টার কাছে, অথচ এই user রাতে কাজ করেন। তাই ঘড়ির সময়ের সরল গড় এখানে ভুল। আসল টেবিলে noc-1 1 টায় global rule-এ FLAG, কিন্তু per-user-এ ok (support 6). user-b-ও তাই। আর user-a রাত ৩টায় দুই নিয়মেই ধরা পড়ে: LEAD (support 0). user-c-এর ফল no baseline, cannot judge, কারণ না জানলে “স্বাভাবিক” বলাও ঠিক নয়। সময়টি একটি সূত্র মাত্র। ছুটি, ভ্রমণ বা জরুরি কাজের কথাও ভাবতে হবে, আর ব্যক্তি নয়, account-এর আচরণ দেখতে হবে।

Hunt ৫: Data transfer spike

ATT&CK: T1041, T1567. Log: firewall, proxy, cloud storage. Exfiltration ধরতে প্রতি host থেকে বাইরে যাওয়া byte মাপুন। ধরুন আগের ১০ দিনের upload (MB): 120, 135, 110, 150, 125, 140, 130, 115, 145, 130. Mean ১৩০ MB, SD প্রায় ১২.২ MB. আজ 2,400 MB, অর্থাৎ ২,৪০০ ÷ ১৩০ ≈ ১৮.৫ গুণ। এটি স্পষ্ট spike, কিন্তু backup, ভিডিও সম্পাদনা বা নতুন cloud sync-ও হতে পারে। Upload-এর ডেটায় প্রায়ই অল্প কয়েকটি মান অনেক বড় হয় (skewed), তাই বাস্তবে mean-এর সঙ্গে median-ও দেখুন। এরপর প্রশ্ন: কোথায় গেল, কে পাঠাল, আগে কখনো সেখানে গিয়েছে কি না?

৮ · নথি, কিছু না পাওয়া আর hunt থেকে নতুন rule

লেখা না থাকলে hunt হারিয়ে যায়। একটি hunt report ছোট হতে পারে, কিন্তু এতে থাকা চাই: hypothesis, ATT&CK ID, data ও সময়সীমা, query, ফল, যা দেখা যায়নি, আর পরের কাজ। মূল প্রশ্ন হলো, ছয় মাস পরে অন্য কেউ কি hunt-টি আবার চালাতে পারবেন?

ক্ষতিকর কিছু না পাওয়া ব্যর্থতা নয়। TaHiTI ফলকে proven, disproven আর inconclusive এই তিন ভাগে রাখে। এমনকি প্রয়োজনীয় data না থাকলে hunt ব্যর্থ ধরা হলেও তা থেকে শেখা যায়। নিচের কাল্পনিক hunt-টি দেখুন।

Hunt-১২: বাইরের storage-এ অস্বাভাবিক upload (toy)
ধাপ
সময় খরচ
Proxy retention
bytes_out ঘর
Verdict
  1. Hypothesis. “গত ৩০ দিনে কোনো PC থেকে নতুন বাইরের storage-এ স্বাভাবিকের ১০ গুণের বেশি upload হয়েছে।” Time-box ৬ ঘণ্টা। শুরুতে proxy log নিয়ে কিছুই নিশ্চিত নয়।
  2. Data যাচাই। ২ ঘণ্টায় ধরা পড়ল, proxy log মাত্র ১৪ দিন থাকে, আর bytes_out ঘরটিই লেখা হয় না। অর্থাৎ ৩০ দিনের প্রশ্নের উত্তর এই log দিতে পারবে না।
  3. তদন্ত। Hunter হাল ছাড়েননি। Firewall flow record থেকে host ধরে মোট byte stack করা হলো। সবচেয়ে বড় সারিটি অনুমোদিত backup, মালিকও নিশ্চিত করলেন।
  4. ফল। ৬ ঘণ্টা শেষ, time-box মানা হলো। ক্ষতিকর কিছু পাওয়া যায়নি, কিন্তু domain আর byte একসঙ্গে দেখা যায়নি। তাই সৎ রায় “নেই” নয়, inconclusive.
  5. ফাঁক পূরণ। Log-এর মালিকের কাছে কাজ গেল: bytes_out যোগ, retention ৯০ দিন। Privacy দিকও যাচাই হলো। এটিই hunt-এর কাজে লাগার মতো ফল, একটি বন্ধ হওয়া detection gap.
  6. আবার hunt. তিন মাস পরে ৪ ঘণ্টায় একই hypothesis আবার চলল। এবার ক্ষতিকর কিছু মিলল না, রায় disproven, শুধু এই সময়সীমা আর data-র জন্য। সঙ্গে সঙ্গে ১০ গুণ শর্তের একটি নতুন rule-এর খসড়াও হলো।

সৎ ভাষা ব্যবহার করুন। “আক্রমণকারী নেই” কখনো লিখবেন না। লিখুন, “এই data, এই সময়সীমা আর এই পদ্ধতিতে প্রমাণ পাওয়া যায়নি।” False negative-এর ঝুঁকি সবসময় থাকে।

Hunt থেকে স্বয়ংক্রিয় detection

একই hunt বারবার হাতে করা সময়ের অপচয়। সফল query-কে detection rule বানালে মানুষ পরের প্রশ্নে যেতে পারেন। এই কাজের নাম detection engineering. Sigma নিয়ে বিস্তারিত পর্ব ৫৬-এ। নিচের উদাহরণটি আগের hunt থেকে বানানো একটি নমুনা rule, শুধু পড়ার জন্য। Filter সরু: একটি নির্দিষ্ট PC আর একটি নির্দিষ্ট ফাইল।

title: Document App Starts PowerShell
id: 5b7e2c1a-3f4d-4e8a-9c21-7d6f0a1b2c3d
status: experimental
description: A document app started PowerShell. Found by a hunt; review each hit.
author: Example SOC
date: 2026-10-31
tags:
  - attack.execution
  - attack.t1059.001
logsource:
  category: process_creation
  product: windows
detection:
  selection:
    ParentImage|endswith:
      - '\winword.exe'
      - '\excel.exe'
    Image|endswith: '\powershell.exe'
  filter_finance_report:
    Computer: 'pc-03'
    ParentCommandLine|contains: 'month-end-report.xlsm'
  condition: selection and not filter_finance_report
falsepositives:
  - Approved reporting macros, each with an owner and an expiry date
level: medium

Rule চালুর আগে চারটি কাজ করুন। এক, পুরোনো log-এ replay করে hit গুনুন। দুই, precision হিসাব করুন: ১/১৪ ≈ ৭.১%, filter-এর পরে ১/২ = ৫০%. তিন, প্রত্যাশিত চাপ দেখুন: ৯০ দিনে ২টি hit মানে মাসে প্রায় ০.৬৭টি alert, যা সামলানো যায়। চার, purple team বা একটি নিরীহ পরীক্ষা দিয়ে দেখুন, rule সত্যিই alert দেয় কি না। প্রতিটি rule exclusion-এর মালিক আর মেয়াদ থাকা চাই। সব hunt rule হয় না। যা খুব শব্দবহুল, সেটি নিয়মিত report বা পরের hunt-এর জন্য থাকুক।

৯ · Cloud-এ hunting, privacy-র সীমা আর time-box

Cloud-এ hunting

Cloud-এ process-এর চেয়ে identity আর API call বেশি গুরুত্বপূর্ণ। মূল উৎস cloud audit log, যেমন AWS CloudTrail, Azure Activity Log বা Google Cloud Audit Logs, আর IdP-র sign-in log. একই কৌশল এখানেও চলে: কোন identity কোন API কতবার ডেকেছে, সেটি stack করুন। প্রথমবার দেখা region, নতুন access key, হঠাৎ public হওয়া storage বা নতুন role grant, এসব ভালো সূত্র। সতর্কতা হলো, অনেক provider-এ data-স্তরের log আলাদা করে চালু করতে হয়, আর container খুব অল্প সময় বাঁচে। তাই log কেন্দ্রীয়ভাবে রাখুন (Centralized logging, Cloud security posture). পর্ব ৭২-এ cloud নিরাপত্তা বিস্তারে আসবে।

কর্মীর ডেটা আর privacy

Log-এর বড় অংশ মানুষের কাজের রেকর্ড। Hunt যেন নজরদারিতে না গড়ায়, সেজন্য কয়েকটি সীমা দরকার:

  • উদ্দেশ্যে বাঁধা: Hunt হবে নিরাপত্তার প্রশ্নে। কারও কাজের গতি মাপা বা ব্যক্তিগত ব্রাউজিং দেখা নয়।
  • Data minimization: Metadata দিয়ে কাজ চললে email বা chat-এর লেখা খোলা যাবে না। সম্ভব হলে নামের বদলে pseudonymization, অর্থাৎ ছদ্ম ID ব্যবহার করুন।
  • আগে থেকে নীতি: কর্মীদের জানানো, লিখিত নীতি আর আইনি পরামর্শ। Monitoring-এর সীমা প্রতিষ্ঠানের নীতিতে থাকা চাই।
  • রক্ষককেও পাহারা: Hunting tool-এর ব্যবহার নিজেও log হবে। কে কী খুঁজেছে, তা audit করা যাবে।
  • ব্যক্তিকে নিশানা নয়: কোনো কর্মীর ওপর সন্দেহ হলে hunter নিজে অনুসরণ করবেন না। বিষয়টি HR, আইন বিভাগ আর ঊর্ধ্বতনের অনুমোদিত প্রক্রিয়ায় যাবে (insider threat-এর ক্ষেত্রেও)।

GDPR-এর data minimization নীতি আর বাংলাদেশের ব্যক্তিগত উপাত্ত সুরক্ষা আইন, ২০২৬ (৬৩ নং) এখানে প্রাসঙ্গিক হতে পারে। আইনের কিছু ধারা পরে gazette-এর মাধ্যমে কার্যকর হবে। এই পর্ব আইনি পরামর্শ নয়। বিস্তারিত পর্ব ০৬ আর পর্ব ৭০-এ।

Time-box

Time-boxing মানে শুরুতেই সময় বেঁধে দেওয়া। ধরুন ৮ ঘণ্টা। সময় শেষে তিনটি পথ: ফল লিখে শেষ, স্পষ্ট কারণে সময় বাড়ানো, অথবা নতুন hunt হিসেবে backlog-এ রাখা। সন্দেহের কিছু পেলে time-box থামে না, ঘটনা incident response-এ যায়। সীমা না থাকলে hunt অনন্ত খননে পরিণত হয়, আর দল alert সামলানোর সময় হারায়।

পরীক্ষা ও ইন্টারভিউতে: Threat hunting আর SOC monitoring-এর পার্থক্য? Monitoring alert থেকে শুরু, hunting hypothesis থেকে। Hunting loop-এর ধাপ? Hypothesis, তদন্ত, pattern ও TTP উন্মোচন, analytics জানানো ও সমৃদ্ধ করা। Stacking কী? একটি বৈশিষ্ট্য ধরে গুনে বিরল সারি বের করা। Hunt-এ কিছু না পেলে? সীমাসহ নথি লেখা, log-এর ফাঁক আর পরের কাজ ঠিক করা। কোন log সবচেয়ে কাজের? প্রশ্নের ওপর নির্ভর করে, তবে process creation, logon, DNS আর proxy ভালো শুরু।

১০ · AI-এর যুগে threat hunting

AI hypothesis-এর খসড়া, query অনুবাদ আর রিপোর্টের সারাংশে দ্রুত সাহায্য করতে পারে। কিন্তু সে আপনার পরিবেশ চেনে না, আর ভুল উত্তরও আত্মবিশ্বাস নিয়ে দেয়। সিদ্ধান্ত থাকবে মানুষের হাতে।

AI-এর ভুলঝুঁকিযাচাই
ATT&CK ID, CVE বা standard বানিয়ে বলেনথিতে ভুল সূত্রMITRE-র সাইটে ID মিলিয়ে দেখা
Log-এ না থাকা field দিয়ে query লেখেQuery ফাঁকা ফল দেয়, মনে হয় “কিছু নেই”আগে একটি জানা ঘটনায় query পরীক্ষা করা
Stack দেখে “এটি malware” বলে দেয়নির্দোষ কর্মী বা কাজ সন্দেহের মুখেমালিক আর আগে-পরের ঘটনা মেলানো
শব্দ কমাতে পুরো rule বা field বাদ দিতে বলেনতুন অন্ধ জায়গাসরু filter, মালিক, মেয়াদ, replay
পুরোনো পরামর্শ দেয়, যেমন দুর্বল hash-কে নিরাপদ বলাভুল প্রতিকারপ্রাথমিক উৎস পড়া
Prompt-এ দেওয়া log, secret বা নাম ফাঁস হওয়ার পথ তৈরি করেPrivacy লঙ্ঘনToken, নাম, IP সরিয়ে নমুনা দেওয়া

Hunt-এর পরিকল্পনা যাচাই করতে নিচের prompt ব্যবহার করুন। এখানে কোনো আসল log, নাম বা secret নেই।

আমি নিজের প্রতিষ্ঠানে অনুমোদিত একটি threat hunt-এর পরিকল্পনা করছি। শুধু প্রতিরক্ষার কাজে সাহায্য করো, কোনো আক্রমণের ধাপ লিখো না। Hypothesis: [এখানে লিখুন] আমার log-এর field: [নাম, ডেটা ছাড়া] সময়সীমা: [যেমন ৩০ দিন] ১. Hypothesis-টি যাচাইযোগ্য কি না, দুর্বলতা বলো। ২. কোন ATT&CK technique প্রাসঙ্গিক হতে পারে, আর আমি কোথায় ID মিলিয়ে দেখব বলো। ৩. কী কী বৈধ কাজ একই রকম দেখাতে পারে, তালিকা দাও। ৪. কিছু না পেলে আমি কী সিদ্ধান্ত নিতে পারব, আর কী পারব না। ৫. কোন privacy-র সীমা মনে রাখা দরকার। যা নিশ্চিত নও, স্পষ্ট করে বলো। কোনো ID বা সংখ্যা বানিয়ে লিখো না।

AI ব্যবহারের চেকলিস্ট

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।

প্র ০১Hunt-এ ক্ষতিকর কিছু না পেলে কি সময় নষ্ট হলো? ব্যবস্থাপকের কাছে এর মূল্য কীভাবে দেখাবেন?

Sqrrl-এর ২০১৫ সালের লেখায় নতুন pattern আর TTP উন্মোচনকে hunt-এর চূড়ান্ত সফলতার মাপ বলা হয়েছিল। কিন্তু ওই লেখাতেই বলা আছে, hunting থেকে নিজের পরিবেশের তথ্য, যেমন network map আর software তালিকাও পাওয়া যায়। পরে TaHiTI আরও স্পষ্ট করে বলল, hunting-এর লাভের মধ্যে আছে দৃশ্যমানতার ফাঁক আর detection-এর ফাঁক খুঁজে পাওয়া, নতুন use case তৈরি আর প্রতিরোধের সুপারিশ। অর্থাৎ শুধু আক্রমণকারী পাওয়াকে সফলতা ধরলে মাপটি ভুল হবে।

কেন ভুল? ধরুন ভালো প্রতিরক্ষার একটি প্রতিষ্ঠানে আসলেই কেউ ঢোকেনি। সেখানে “পাওয়া ঘটনার সংখ্যা” শূন্য থাকবে, আর মাপটি শাস্তি দেবে ভালো কাজকে। উল্টো দিকে এই মাপ দলকে সহজ, শব্দবহুল ঘটনার দিকে ঠেলে দিতে পারে। তাই আরও ভালো মাপ হলো hunt-এর সংখ্যা, নতুন rule, বন্ধ হওয়া detection gap, ATT&CK-এ বাড়া detection coverage, আর একই ধরনের ঘটনা ধরতে কম সময় লাগা।

তবে একটি ফাঁদ আছে। “কিছু পাইনি” বললেই নিরাপদ বলা যায় না। যে log আসেইনি, সেখানে কিছু না পাওয়া ফাঁকা রায়। তাই রিপোর্টে সীমা লিখতে হয়: কোন data, কোন সময়, কোন পদ্ধতি। Stepper-এর hunt-এ প্রথম রায় ছিল inconclusive, কারণ bytes_out ছিল না। সেই একটি লাইনের জন্যই পরের ঘটনাগুলো ধরার ক্ষমতা তৈরি হলো।

মূল উপলব্ধি: Hunt-এর পণ্য শুধু ঘটনা নয়, জ্ঞান। ব্যবস্থাপককে দেখান কী শিখলেন, কী বদলালেন, আর কোন ঝুঁকিটি এখন আগের চেয়ে ভালোভাবে দেখা যায়।

প্র ০২AI আর automation থাকতে threat hunting কি পুরোপুরি স্বয়ংক্রিয় করা যাবে?

Sqrrl-এর ২০১৫ সালের লেখা স্পষ্ট বলেছিল, hunting মেশিনের সাহায্য নিতে পারে, কিন্তু analyst-চালিত, এটি পুরোপুরি automate করা যায় না। আট বছর পরে ২০২৩ সালে PEAK কাঠামোতে model-assisted hunt (M-ATH) একটি আলাদা ধরন হলো। অর্থাৎ machine learning এখন hunting-এর স্বীকৃত অংশ। তাহলে কি পুরোনো কথাটি ভুল?

ভুল নয়, কারণ দুই কথায় আলাদা জিনিস বলা হচ্ছে। Model যা ভালো পারে: বিশাল ডেটায় clustering, অস্বাভাবিকতার সারি বানানো, লম্বা log-এর সারাংশ, query-র খসড়া। কিন্তু একটি বিরল ঘটনা ক্ষতিকর কি না, সেটি বুঝতে দরকার ব্যবসার প্রসঙ্গ। Finance PC-তে মাসশেষের script স্বাভাবিক, এই জ্ঞান log-এর ভেতর লেখা নেই। মালিকের সঙ্গে কথা বলে সেটি জানতে হয়।

আরেকটি দিক হলো প্রশ্ন তোলা। যা বারবার করা যায়, সেটি automation-এ যায়, আর তখন সেটি আর hunt থাকে না, সেটি detection. HMM-এর HM4 ঠিক এই ছবিই দেখায়: সফল procedure স্বয়ংক্রিয় হয়, মানুষ নতুন প্রশ্নে যান। সীমান্তটি তাই সরতে থাকে। আজকের hunt আগামী দিনের rule, আর নতুন hunt আরও সামনে এগোয়।

ঝুঁকিও আছে। Model base rate-এর ফাঁদে পড়ে, আর আত্মবিশ্বাসী ভাষায় ভুল বলতে পারে। Staff data-য় স্বয়ংক্রিয় রায় দিলে ন্যায্যতার প্রশ্নও ওঠে। তাই মানুষকে প্রভাবিত করে এমন সিদ্ধান্তে মানুষের যাচাই থাকা দরকার।

মূল উপলব্ধি: Automation উত্তরের কাজ নেয়, প্রশ্ন তোলার দায়িত্ব নেয় না। ভালো hunter নিজের সফল কাজকে automation-এ দিয়ে দেন, আর নতুন প্রশ্নে যান।

প্র ০৩Least frequency of occurrence কেন কাজ করে, আর কখন একেবারেই কাজ করে না?

LFO একটি অনুমানের ওপর দাঁড়িয়ে: বেশিরভাগ কাজ বৈধ ও বহুল, আর ক্ষতিকর কাজ অল্প জায়গায় ঘটে। HMM-এর মূল লেখাতেও বলা হয়েছিল, প্রচলিত hunting procedure-এর বড় অংশ কোনো না কোনোভাবে least-frequency analysis-এর ওপর নির্ভর করে। লক্ষ্যভিত্তিক হামলার শুরুতে এটি প্রায়ই সত্য, কারণ অল্প কয়েকটি machine-এ অল্প কিছু কাজ হয়।

কিন্তু অনুমান ভাঙলে কৌশলও ভাঙে। প্রকাশিত রিপোর্ট অনুযায়ী SolarWinds ২০২০ ঘটনায় ক্ষতিকর কোড বৈধ, signed software update-এর ভেতর দিয়ে এসেছিল, আর প্রতিষ্ঠানটির filing অনুযায়ী ১৮,০০০-এর কম গ্রাহক সেই update বসিয়ে থাকতে পারেন। প্রভাবিত প্রতিষ্ঠানের ভেতরে বিশ্বস্ত update process সব জায়গায় একইভাবে দেখা যেত। তাই শুধু process নামের stack এটিকে বিরল হিসেবে দেখাত না। একইভাবে কোনো ক্ষতিকর program বহু PC-তে ছড়ালে সেটি “সাধারণ” সারিতে উঠে যায়।

আবার উল্টো সমস্যাও আছে। প্রতিষ্ঠান ছোট হলে অনেক বৈধ জিনিসই বিরল। Sample খুব ছোট হলে “১ বার” সারির ভিড় লেগে যায়। নতুন software চালুর সপ্তাহে সব তালিকা বদলে যায়। আর বেশি বিভক্ত field, যেমন পুরো command line, প্রায় প্রতিটিই আলাদা, ফলে stack অর্থহীন হয়।

তাই প্রতিকার হলো একাধিক অক্ষ দেখা। প্রকাশিত বিবরণ অনুযায়ী ওই ঘটনার তদন্তে একটি অস্বাভাবিক দ্বিতীয় MFA device নিবন্ধনের ঘটনা গুরুত্বপূর্ণ সূত্র ছিল। অর্থাৎ process-এর বদলে identity-র first-seen ঘটনা। Destination-এর বয়স আর নিজের ইতিহাসের সঙ্গে তুলনাও সাহায্য করে।

মূল উপলব্ধি: প্রতিটি কৌশল একটি অনুমানের ওপর দাঁড়ানো। অনুমানটি কী, সেটি জানলেই বোঝা যায় কৌশলটি কোথায় অন্ধ।

প্র ০৪Hunt করতে গিয়ে নিরাপত্তা দল কর্মীদের ওপর নজরদারি করছে কি না, সেই সীমা কোথায় টানবেন?

দুটি সত্য একসঙ্গে মানতে হয়। প্রতিষ্ঠানের দায়িত্ব নিজের সিস্টেম রক্ষা করা, আর সেজন্য log লাগে। আবার কর্মীও মানুষ, তাঁর ব্যক্তিগত তথ্য, স্বাস্থ্য বা বিশ্বাস-সংক্রান্ত ব্রাউজিং, ছুটির ধরন log থেকেই বোঝা যেতে পারে। Log ধরে কেউ অসুস্থ কি না, কখন ঘুমান, এসবও অনুমান করা যায়। তাই hunt-এর ক্ষমতা যত বাড়ে, তার সীমাও তত স্পষ্ট হওয়া চাই।

একটি ব্যবহারিক পরীক্ষা হলো চারটি প্রশ্ন। উদ্দেশ্য কি নিরাপত্তা? প্রশ্নটি কি account ও আচরণ নিয়ে, ব্যক্তিকে নিয়ে নয়? এর চেয়ে কম তথ্য দিয়ে কি একই উত্তর পাওয়া যেত? ফলাফল কর্মী জানলে কি দল সেটি ব্যাখ্যা করতে পারবে? উত্তর “না” হলে থামুন।

ধরুন logon-time hunt-এ একজন কর্মী বারবার রাতে কাজ করছেন। নিরাপত্তার প্রশ্ন হলো, account-টি কি অন্য কেউ ব্যবহার করছে? এটি যাচাইয়ের পর ফল বন্ধ হওয়া উচিত। এই তথ্য HR-কে উপস্থিতি মাপার জন্য দেওয়া হলে তা উদ্দেশ্যের বাইরে যাওয়া, যাকে purpose creep বলে। GDPR-এর purpose limitation আর data minimization নীতি এই চিন্তারই আইনি রূপ। বাংলাদেশের ক্ষেত্রে ব্যক্তিগত উপাত্ত সুরক্ষা আইন, ২০২৬ দেখতে হবে, যার কিছু ধারা পরে কার্যকর হবে, আর দরকার হলে আইনজীবীর পরামর্শ নিতে হবে।

কারিগরি প্রতিরক্ষাও আছে: ছদ্ম ID, সীমিত access, tool-এর নিজস্ব audit log, আর ফল সংরক্ষণের সময়সীমা। পর্ব ৫৪-এর দোষারোপহীন সংস্কৃতিও এখানে প্রাসঙ্গিক। কর্মীরা ভয় পেলে ভুল লুকান, আর রিপোর্ট কমে যায়।

মূল উপলব্ধি: Hunting-এর লক্ষ্য আক্রমণকারী, কর্মী নয়। যে দল এই সীমা মানে, সে কর্মীদের আস্থা পায়, আর সেই আস্থাই ভালো নিরাপত্তার ভিত্তি।

প্র ০৫ছোট প্রতিষ্ঠানে আলাদা hunt team নেই। তাহলে threat hunting কি শুধু বড়দের বিলাসিতা?

“Threat hunting team” শুনলে মনে হতে পারে এটি বড় ব্যাংকের কাজ। TaHiTI-ও এসেছিল ডাচ আর্থিক প্রতিষ্ঠানগুলোর যৌথ চেষ্টা থেকে। ওই নথি SANS-এর ২০১৭ সালের survey উদ্ধৃত করে বলে, hunting করা প্রতিষ্ঠানের মাত্র ৪.৬% প্রকাশিত বাইরের পদ্ধতি গ্রহণ করেছিল। অর্থাৎ তখন বড় প্রতিষ্ঠানগুলোও কাঠামো ছাড়াই কাজ করত। সংখ্যাটি পুরোনো, তবে শিক্ষাটি পরিষ্কার: কাঠামো সবার দরকার, কিন্তু সেটি বিরাট হতে হবে এমন নয়।

ছোট প্রতিষ্ঠানের জন্য প্রথম প্রশ্ন হলো, HMM-এ আপনি কোথায়? যদি ডেটাই না থাকে, তাহলে hunting-এর আগে log সংগ্রহই বেশি মূল্যবান। প্যাচ, MFA আর backup-এর মতো মৌলিক কাজ বাকি থাকলে সেগুলো আগে। কম সম্পদে সবচেয়ে বেশি ফল আসে ওই ভিত্তি থেকে।

ভিত্তি থাকলে শুরু করুন ছোট করে। মাসে একবার, ৪ ঘণ্টার একটি time-box, একজন system admin আর একটি প্রশ্ন। যেমন, “গত ৩০ দিনে admin group-এ কে যোগ হয়েছেন, আর প্রত্যেকের কারণ আছে কি?” এতে দামি tool লাগে না। Central log আর sort | uniq -c ধরনের চিন্তাই যথেষ্ট। ছোট প্রতিষ্ঠানের একটি সুবিধাও আছে, admin সবাইকে চেনেন, তাই ব্যবসার প্রসঙ্গ দ্রুত পাওয়া যায়।

সীমাও মানতে হবে। Alert সামলানোর সময় খেয়ে hunt করলে উল্টো ক্ষতি। আউটসোর্স করলে চুক্তিতে স্পষ্ট করতে হয়, কোন log দেখবে, ফল কীভাবে আসবে, আর privacy-র দায় কার। পর্ব ৭১ এই বিষয়ে কাজে আসবে।

মূল উপলব্ধি: Hunting কোনো পদ নয়, একটি অভ্যাস। ছোট, নিয়মিত, নথিভুক্ত প্রশ্নই শুরু, আর যা শিখলেন তা প্রথমে মৌলিক প্রতিরক্ষায় ফেরান।

অনুশীলন

সব কাজ শুধু toy ডেটা বা আপনার নিজের অনুমোদিত log-এ করুন।

  1. হিসাব: একটি নতুন rule ৬০ দিনের log-এ replay করলে ২৫টি hit পাওয়া গেল, এর ৫টি আসল। সরু filter ১৮টি ভুল hit সরিয়ে দিল, আসল কোনোটি হারাল না। (ক) আগের precision কত? (খ) পরের precision কত? (গ) পরে মাসে গড়ে কতটি alert? (ঘ) একটি সংযোগের বিরতি 60, 60, 61, 59 সেকেন্ড হলে population SD ধরে CV কত?

    (ক) ৫/২৫ = ২০%. (খ) বাকি hit ২৫ − ১৮ = ৭টি, তাই ৫/৭ ≈ ৭১.৪%. (গ) ৭ ÷ ২ = মাসে ৩.৫টি। (ঘ) Mean ৬০। বিচ্যুতির বর্গ ০, ০, ১, ১, যোগফল ২, ভাগ ৪ = ০.৫। SD = √০.৫ ≈ ০.৭১। CV = ০.৭১ ÷ ৬০ ≈ ০.০১২। খুব নিয়মিত, তবে কারণ জানতে তদন্ত লাগবে।

  2. আউটপুট অনুমান করুন: svc.log ফাইলে পাঁচটি লাইন: spooler, backupd, spooler, xhelper, spooler. এই command-এর আউটপুট কী হবে? sort svc.log | uniq -c | sort -n. Long tail কোনগুলো? শুধু uniq -c দিলে (আগে sort ছাড়া) কী ভুল হতো?
          1 backupd
          1 xhelper
          3 spooler

    দুটি count ১ হওয়ায় তাদের ক্রম sort-এর নিয়মে ঠিক হয়, এখানে পুরো লাইন তুলনায় backupd আগে। Long tail হলো backupd আর xhelper. uniq শুধু পাশাপাশি একই লাইন মেলায়। আগে sort না দিলে এখানে spooler তিনটি আলাদা সারিতে ১ করে আসত, ফলে এটিকেও বিরল মনে হতো।

  3. নকশা: একটি কাল্পনিক অনলাইন বাজারের জন্য “Web server থেকে কিছু খারাপ হচ্ছে কি না দেখি” কথাটিকে যাচাইযোগ্য hypothesis-এ বদলান। ATT&CK সূত্র, log, সময়সীমা, time-box, বৈধ ব্যাখ্যা আর সফলতার মাপ লিখুন।

    নমুনা উত্তর: “গত ৩০ দিনে web server process কোনো command shell চালিয়েছে।” ATT&CK: T1059, MITRE-তে যাচাই করে T1505.003-ও দেখা যেতে পারে। Log: server-এর process creation log, auditd বা EDR. Time-box: ৬ ঘণ্টা। বৈধ ব্যাখ্যা: deployment script, health check, image processing tool. ফলের মাপ: প্রতিটি parent-child জোড়ার ব্যাখ্যা নথিতে আছে, এবং দরকার হলে rule-এর খসড়া হয়েছে। Log না থাকলে সেটিই ফল, ফাঁক হিসেবে নথিভুক্ত হবে।

  4. সমালোচনা: একটি দল প্রস্তাব দিল: “সব কর্মীর email-এর লেখা আর browser history এক জায়গায় আনি, সন্দেহজনক কাউকে পেলে HR-কে নাম দেব। হাতে সময় থাকলে করব, কোনো সময়সীমা লাগবে না।” অন্তত চারটি সমস্যা বলুন, আর একটি ভালো রূপ দিন।

    সমস্যা: (১) কোনো hypothesis নেই, তাই এটি hunting নয়, ব্যাপক নজরদারি। (২) Data minimization ভঙ্গ, email-এর লেখা ও browser history খুবই সংবেদনশীল। (৩) ব্যক্তিকে নিশানা করা, আচরণকে নয়, আর ভুল সন্দেহে মানুষের ক্ষতি হতে পারে। (৪) Time-box নেই, ফলে কাজের শেষ নেই। (৫) নীতি, অনুমোদন আর কর্মীদের জানানোর উল্লেখ নেই।

    ভালো রূপ: “অনুমোদন নিয়ে গত ৩০ দিনের mail gateway metadata-তে দেখা হবে, কোনো mailbox-এ বাইরের ঠিকানায় নতুন auto-forward inbox rule তৈরি হয়েছে কি না। Time-box ৪ ঘণ্টা। লেখা পড়া হবে না। সন্দেহ হলে অনুমোদিত incident প্রক্রিয়ায় যাবে।”

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমএকটি threat hunt-এর ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. যাচাইযোগ্য hypothesis লেখা আর time-box ঠিক করা
  2. প্রয়োজনীয় log আছে কি না যাচাই করা
  3. Stacking বা অন্য কৌশলে data বিশ্লেষণ করা
  4. সূত্র ধরে pivot করা, আর দরকার হলে incident response-এ দেওয়া
  5. ফল, সীমা আর log-এর ফাঁক নথিভুক্ত করা
  6. সফল পদ্ধতিকে নতুন detection rule বানানো

Alerting আর threat hunting-এর মূল পার্থক্য কোনটি?

  • Hunting-এ SIEM ব্যবহার করা যায় না
  • Alert rule মিললে আসে, আর hunting মানুষের hypothesis থেকে সক্রিয়ভাবে খোঁজে
  • Hunting চালু হলে alert বন্ধ করে দেওয়া যায়
  • Hunting মানে আক্রমণকারীর সিস্টেমে ঢুকে দেখা

১,০০০টি process ঘটনার stack-এ একটি parent-child জোড়া মাত্র ১ বার, ১টি PC-তে দেখা গেল। সঠিক সিদ্ধান্ত কোনটি?

  • এটি নিশ্চিতভাবে malware, PC সাথে সাথে মুছে ফেলা
  • মাত্র ১ বার হয়েছে, তাই উপেক্ষা করা
  • এটি তদন্তের একটি সূত্র, প্রসঙ্গ দেখে pivot করা
  • তদন্ত ছাড়াই সরাসরি block rule চালু করা

একটি নতুন rule পুরোনো log-এ replay করলে ৪০টি hit পাওয়া গেল, যার ১০টি আসল। Precision কত?

  • ২৫%
  • ৪০%
  • ৭৫%
  • ১০০%

৩০ দিনের upload hunt-এ proxy log মাত্র ১৪ দিন পাওয়া গেল, আর বাইরে পাঠানো byte-এর ঘরটিও নেই। কিছুই মেলেনি। সঠিক রিপোর্ট কোনটি?

  • কোনো data exfiltration হয়নি, নেটওয়ার্ক নিরাপদ
  • Hunt ব্যর্থ, তাই রিপোর্ট লেখার দরকার নেই
  • তথ্য নেই, তাই ধরে নিতে হবে হামলা হয়েছে
  • ফল inconclusive, সীমা লিখে log-এর ঘর ও retention বাড়ানোর কাজ দেওয়া

Hunting Maturity Model অনুযায়ী যে দল অন্যের প্রকাশিত hunting procedure নিয়মিত অনুসরণ করে, কিন্তু নিজে নতুন procedure বানায় না, তারা কোন স্তরে?

  • HM0 Initial
  • HM1 Minimal
  • HM2 Procedural
  • HM3 Innovative

কর্মীদের logon-সময় নিয়ে একটি অনুমোদিত hunt চলছে। নিচের কোনটি privacy-র সীমা মেনে করা কাজ?

  • ফল HR-কে দেওয়া, যাতে কে দেরিতে আসেন তা জানা যায়
  • Account-এর সময়ের ধরন ছদ্ম ID দিয়ে দেখা, access সীমিত রাখা, আর উদ্দেশ্যের বাইরে ব্যবহার না করা
  • সন্দেহ দূর করতে সবার email-এর লেখাও পড়া
  • একজন কর্মীর ওপর সন্দেহ হলে নিজে থেকেই তাঁর সব কাজ অনুসরণ করা

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. Alert rule-এর অপেক্ষায় থাকে, hunting assume breach ধরে hypothesis নিয়ে খোঁজে।
  2. পূর্বশর্ত তিনটি: log, baseline, প্রশিক্ষিত মানুষ। HMM দেখায় আপনি HM0–HM4-এর কোথায়।
  3. Loop: hypothesis → তদন্ত → pattern ও TTP → analytics, তারপর আবার শুরু।
  4. Stacking বিরল সারি দেখায়, কিন্তু বিরল মানে সূত্র, প্রমাণ নয়। ঘটনা আর host দুটোই গুনুন।
  5. কিছু না পেলেও সীমাসহ নথি লিখুন, সফল hunt-কে rule বানান, time-box আর privacy-র সীমা মানুন।

পরের পর্বে: Hunting-এর সবচেয়ে সমৃদ্ধ ডেটা আসে endpoint থেকে। পর্ব ৫৯-এ দেখবেন EDR আর XDR কী telemetry দেয়, কীভাবে সাড়া দেয়, আর তাদের সীমা কোথায়।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান