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

Forensic artifact — log, memory, disk আর timeline বানানো

Forensic Artifacts — Logs, Memory, Disk & Building a Timeline

Taught in Bangla, this lesson surveys Windows, Linux, web, application and cloud artifacts and what each cannot show, mtime, atime, ctime and MACB pitfalls, memory analysis and deleted-data concepts, super timeline building with UTC and clock correction, a full fictional web server timeline with Bash log merging, hypothesis testing, analyst bias and confidence-rated findings.

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

  • Windows, Linux, web, application আর cloud-এর প্রধান artifact, আর প্রতিটির সীমা
  • mtime, atime, ctime, MACB আর কেন timestamp অবিশ্বাস্য হতে পারে
  • Memory analysis আর deleted ডেটা উদ্ধারের ধারণা
  • Super timeline বানানো, UTC-তে আনা, ঘড়ির অমিল ঠিক করা আর log-এর ফাঁক ধরা
  • একটি কাল্পনিক web server-এর পুরো timeline, pivoting আর hypothesis যাচাই
  • Analyst bias এড়িয়ে confidence level-সহ finding লেখা

১ · Artifact-এর চিন্তা — একটি সিস্টেম কী কী মনে রাখে

একটি সরকারি অফিসের কথা ভাবুন। দারোয়ানের রেজিস্টার খাতায় আছে কে কখন ঢুকলেন। ফাইলের ওপর পোস্ট অফিসের সিলমোহরে আছে চিঠি কবে এলো। চায়ের দোকানের বাকির খাতায় আছে কে সন্ধ্যায় ছিলেন। কেউ এগুলো তদন্তের জন্য লেখেননি। তবু তিনটি মেলালে একটি সন্ধ্যার গল্প দাঁড়িয়ে যায়।

কম্পিউটারও তাই। Forensic artifact হলো সিস্টেমের স্বাভাবিক কাজের ফলে থেকে যাওয়া চিহ্ন। Windows প্রোগ্রাম দ্রুত খুলতে একটি file রাখে। File system হিসাব রাখতে সময় লেখে। Web server সমস্যা ধরতে log লেখে। Digital forensics-এর কাজ হলো এই চিহ্নগুলো থেকে অতীতের ঘটনা সাবধানে গড়ে তোলা।

সীমারেখা: এই পর্বের কাজ শুধু সেই প্রমাণে করবেন, যা পরীক্ষার লিখিত অনুমতি আপনার আছে। অন্যের কম্পিউটার, ফোন বা account-এ অনুমতি ছাড়া ঢুকে “প্রমাণ খোঁজা” অপরাধ, উদ্দেশ্য যত ভালোই হোক। সন্দেহভাজন ঠিকানায় scan বা পাল্টা যোগাযোগও তদন্ত নয়। আইনের বিস্তারিত পর্ব ০৬-এ। এখানকার সব log, নাম আর ঠিকানা নমুনা, কাল্পনিক। ঠিকানাগুলো documentation-এর জন্য সংরক্ষিত (203.0.113.0/24, 198.51.100.0/24), তাই বাস্তব কারও নয়।

প্রতিটি artifact পড়ার সময় চারটি প্রশ্ন করুন:

চার প্রশ্নের অভ্যাস

কে লিখেছে? Kernel, app, না user? কখন লেখা হয়? ঘটনার সময়, নাকি পরে? কী প্রমাণ করে, আর কী করে না? File থাকা মানে প্রোগ্রাম চলা নয়। কতদিন টেকে? এটি কি overwrite হয়, মুছে যায়, না retention শেষে বাতিল হয়?

শেষ প্রশ্নটি সংগ্রহের ক্রম ঠিক করে। RFC 3227 (২০০২, Brezinski ও Killalea) বলে, যা দ্রুত হারায় তা আগে সংগ্রহ করুন। একে order of volatility বলে। ধারণাটি পর্ব ৬৩-তে এসেছে। এখানে দেখুন কোন স্তরে কোন artifact থাকে।

প্রমাণ কত দ্রুত হারায়

Order of volatility, based on RFC 3227 section 2.1

Order of volatility-র ছয়টি স্তর CPU register, cacheমুহূর্তেই বদলায় RAM: process, network সংযোগবিদ্যুৎ গেলে বা restart হলে যায় Temporary file systemঅনেক সিস্টেমে restart-এ মুছে যায় Disk: file, MFT, local logOverwrite না হওয়া পর্যন্ত থাকতে পারে দূরের log, cloud auditRetention যতদিন, ততদিন Backup, archiveসবচেয়ে টেকসই, তবে পুরোনো অবস্থা দেখায়
ছবি ৬৪.১ — ওপরের স্তর আগে হারায়। তীরের দিকে প্রমাণ টেকসই হয়, কিন্তু সেই মুহূর্তের খুঁটিনাটি কমে।

২ · Windows artifact — কোনটি কী বলে, কোনটি বলে না

Windows-এ artifact অনেক। শুরুতে নিচের কয়েকটি চিনলেই চলবে। এগুলো সবই সিস্টেমের নিজের প্রয়োজনে তৈরি, তাই Microsoft-এর নথি বা স্বীকৃত গবেষণা মিলিয়ে অর্থ যাচাই করুন। Windows version বদলালে আচরণও বদলাতে পারে।

Artifactকী জানায়সীমা
Security event logLogon, logon ব্যর্থতা, account বদল। যেমন Event ID 4624, 4625, 4720. Log মুছলে 1102 লেখা হয়।Process-এর log (4688) আর task-এর log audit policy-র ওপর নির্ভরশীল। আকার সীমিত, পুরোনো ঘটনা overwrite হতে পারে।
Prefetchপ্রোগ্রাম চলার ইঙ্গিত, শেষ কয়েকবারের সময়, কোন file ছুঁয়েছে।Windows Server-এ সাধারণত বন্ধ থাকে। তাই না থাকা মানে “চলেনি” নয়।
AmcacheExecutable-এর path, আকার, সাধারণত SHA-1 hash-এর মতো metadata.একা চলার প্রমাণ নয়। আধুনিক Windows-এ এতে শুধু স্ক্যান হওয়া file-ও থাকতে পারে।
Run key (registry)User logon করলে কোন program চলবে। Key-এর শেষ লেখার সময়ও পাওয়া যায়।বহু বৈধ software এটি ব্যবহার করে। তাই entry থাকা মানেই ক্ষতিকর নয়।
Scheduled taskকোন কাজ কখন চলবে, কে বানিয়েছে। Audit চালু থাকলে 4698 event পাওয়া যায়।Windows নিজেও বহু task রাখে। Baseline ছাড়া নতুনটি চেনা কঠিন।
MFT ($MFT)Volume-এর প্রতিটি file-এর নাম, আকার, সময়। মুছে যাওয়া file-এর record-ও কিছুদিন থাকতে পারে।Record আবার ব্যবহার হয়। সময় ভুল হতে পারে (অংশ ৬)।
USN journalকোন file বা folder-এ কী বদল হয়েছে তার বিবরণ।আকার সীমিত, পুরোনো অংশ বাদ পড়ে। বদলের ভেতরের লেখা এতে নেই।
Browser historyকোন URL কখন খোলা হয়েছে, download-এর উৎস।কে বসে ছিলেন তা বলে না। ব্যক্তিগত তথ্য থাকে, তাই scope মেনে দেখুন।

Run key-এর পথ Microsoft-এর নথিতে আছে: HKLM\Software\Microsoft\Windows\CurrentVersion\Run আর একই পথ HKCU-এর নিচে। Persistence খুঁজতে এই জায়গাগুলো প্রথম দিকেই দেখা হয়। Windows-এর audit কীভাবে চালু করবেন, তা পর্ব ৩১-এ আছে। Sysmon আর EDR থাকলে process-এর ইতিহাস আরও ভালো পাওয়া যায়।

Amcache আর Prefetch-এর পার্থক্য ভাবুন এভাবে। গুদামের তালিকায় একটি মালের নাম থাকা মানে মালটি গুদামে এসেছিল, ব্যবহার হয়েছে এমন নয়। আর রান্নাঘরে এঁটো থালা মানে খাওয়া হয়েছে। কোন চিহ্ন “ছিল” বলে আর কোন চিহ্ন “ব্যবহার হয়েছে” বলে, সেটি গুলিয়ে ফেলা নতুনদের সবচেয়ে সাধারণ ভুল।

৩ · Linux artifact — log, history, cron আর তিনটি সময়

Linux-এ বেশিরভাগ artifact সাধারণ লেখার file. তবে distribution ভেদে পথ আলাদা। নিচের তালিকা প্রচলিত ধরন, নিশ্চিত নিয়ম নয়।

Artifactপ্রচলিত জায়গাকী জানায়, কোথায় সীমা
Auth log/var/log/auth.log (Debian ধারা), /var/log/secure (RHEL ধারা)SSH login, sudo, session. প্রচলিত syslog format-এ সময়ে বছর আর timezone থাকে না।
systemd journaljournalctl দিয়ে পড়া হয়Service-এর কাঠামোবদ্ধ log. কিছু সিস্টেমে এটি restart-এ মুছে যায়, configuration দেখুন।
Shell history~/.bash_historyUser-এর কমান্ডের সূত্র। সুবিধার জন্য রাখা, নিরাপত্তার জন্য নয়। সাধারণত shell বন্ধের সময় লেখা হয়, ডিফল্টে সময় থাকে না, আর user নিজেই বদলাতে পারেন। তাই এটি অসম্পূর্ণ বলে ধরুন।
cron/etc/crontab, /etc/cron.d/, user-এর crontab, আর log-এর CRON সারিনিয়মিত কাজ আর persistence-এর পরিচিত জায়গা। আধুনিক সিস্টেমে systemd timer-ও দেখুন।
Package log/var/log/dpkg.log, /var/log/apt/, /var/log/dnf.logকী কখন install বা upgrade হয়েছে। স্বয়ংক্রিয় update-ও এখানে থাকে।

Shell history-র সীমা থেকেই একটি প্রতিরক্ষার শিক্ষা আসে। কমান্ডের ভরসাযোগ্য হিসাব চাইলে আগে থেকে auditd চালু করে log অন্য জায়গায় পাঠাতে হয় (পর্ব ৩০)। ঘটনার পর সেই প্রস্তুতি নেওয়া যায় না।

mtime, atime, ctime

প্রতিটি file-এর inode-এ সময় রাখা থাকে। নামগুলো বিভ্রান্তিকর। বিশেষ করে ctime মানে “created” নয়, “changed”. পরীক্ষাতেও এই ভুলটিই ধরা হয়।

কাজmtime (content)atime (access)ctime (metadata)
File-এ লেখা যোগ করাবদলায়নয়বদলায়
chmod বা chownনয়নয়বদলায়
File পড়ানয়হয়তো, নিচে দেখুননয়
File-এর নাম বদলনয়নয়সাধারণত বদলায়

atime কেন প্রায়ই কাজে আসে না: প্রতিবার পড়ায় disk-এ লেখা ব্যয়বহুল। তাই Linux ২.৬.৩০ থেকে ডিফল্ট আচরণ relatime. এতে atime মূলত তখনই বদলায়, যখন আগের মান mtime বা ctime-এর চেয়ে পুরোনো, অথবা প্রায় এক দিনের বেশি পুরোনো। noatime থাকলে একেবারেই বদলায় না। সুতরাং “atime পুরোনো, তাই কেউ পড়েনি” বলা যায় না। আধুনিক ext4-এ জন্মের সময়ও থাকে, stat তা Birth নামে দেখাতে পারে।

৪ · Web, application আর cloud log

Web server log বলে কে কোন পথে কী অনুরোধ করেছিল, উত্তরের status কত। সাধারণ combined format-এ থাকে IP, সময়, request line, status, আকার, referrer আর user-agent. তিনটি সীমা মনে রাখুন:

  • POST-এর ভেতর থাকে না। সাধারণ log দেখায় কোথায় পাঠানো হয়েছে, কী পাঠানো হয়েছে তা নয়।
  • IP মানেই মানুষ নয়। Proxy, CDN বা NAT-এর পেছনে আসল ঠিকানা আলাদা হতে পারে। User-agent লেখা বদলানোও সহজ।
  • সময়ের অর্থ tool ভেদে আলাদা। Apache-র নথি অনুযায়ী %t হলো অনুরোধ পাওয়ার সময়। nginx log লেখে অনুরোধ শেষে। তাই বড় upload-এর nginx সারি শুরুর সময় দেখায় না।

Application log ব্যবসার ভাষায় কথা বলে: কোন user login করলেন, কে কোন report export করলেন। Web log যা বলতে পারে না, এটি অনেক সময় তা বলে। তবে কী লেখা হবে, তা ডেভেলপার ঠিক করেছেন। ভালো application log কেমন হয়, পর্ব ৫৫-এ দেখেছেন।

Cloud audit log cloud-এর সবচেয়ে গুরুত্বপূর্ণ artifact, কারণ সেখানে disk হাতে নেওয়া প্রায়ই সম্ভব নয়। এটি বলে কোন identity কোন API call করল, কোথা থেকে, ফল কী। কয়েকটি বাস্তব সীমা:

প্রশ্নকী মনে রাখবেন
সব কি ডিফল্টে লেখা হয়?না। AWS CloudTrail ডিফল্টে management event লেখে, data event নয়। Google Cloud-এ Admin Activity log সবসময় চালু, কিন্তু Data Access log বেশিরভাগ service-এ ডিফল্টে বন্ধ। Provider-এর বর্তমান নথি দেখুন।
কতদিন থাকে?ডিফল্ট দেখার সময়সীমা ছোট হতে পারে। দীর্ঘদিন রাখতে আলাদা account-এর storage-এ পাঠান।
কখন পৌঁছায়?ঘটনার কিছু পরে। তাই লেখা সময় আর পৌঁছানোর সময় আলাদা। তদন্তে ঘটনার সময়টি ব্যবহার করুন।
কে করেছে?Role বা token দেখা যায়। পেছনের মানুষটিকে চিনতে identity log মেলাতে হয়।

বিস্তারিত নকশা Centralized logging পর্বে আছে। মোদ্দা কথা, যে data event লেখা হয়নি, তদন্তে তা তৈরি করা যায় না।

৫ · Memory আর মুছে যাওয়া ডেটা

Memory analysis: সেই মুহূর্তের ছবি

Disk হলো অফিসের আলমারি। RAM হলো টেবিল, যেখানে এই মুহূর্তের কাজ ছড়ানো। Memory forensics মানে RAM-এর একটি কপি নিয়ে পরে বিশ্লেষণ করা। Volatile data কয়েকটি প্রশ্নের উত্তর দিতে পারে, যা disk পারে না:

Process

কোন process চলছিল, কে কাকে শুরু করেছে, কোন command line. Disk-এ file না থাকলেও process থাকতে পারে।

কী চলছিল

Network সংযোগ

কোন process কোন ঠিকানার সাথে যুক্ত ছিল। Flow log ঠিকানা বলে, memory বলতে পারে কোন process.

কার সাথে কথা

খোলা অবস্থার ডেটা

Decrypt হওয়া লেখা, key, session তথ্য। Full disk encryption থাকলে এটি খুব কাজের।

সাবধানে রাখুন

Memory-র সীমাও আছে। এটি একটি মুহূর্তের ছবি, ইতিহাস নয়। কপি নেওয়ার কাজটিও সিস্টেমে সামান্য বদল ঘটায়, তাই কী করলেন তা নোট করুন। এতে password আর ব্যক্তিগত ডেটা থাকতে পারে, তাই কপিটি প্রমাণের মতোই গোপনে রাখুন। Volatility-র মতো open source framework গবেষণা ও প্রশিক্ষণে পরিচিত একটি উদাহরণ। আর server বন্ধ করা বা restart দেওয়ার আগে ভাবুন, কারণ এই প্রমাণ তখনই হারায়।

File carving: সূচি ছাড়া ডেটা খোঁজা

File “মুছলে” সাধারণত ডেটা সঙ্গে সঙ্গে মোছে না। File system শুধু জায়গাটিকে খালি বলে চিহ্নিত করে। বইয়ের সূচি থেকে একটি অধ্যায়ের নাম কেটে দিলেও পাতাগুলো বইয়ে থাকে, পরে হয়তো অন্য লেখা বসে। এই জায়গাকে unallocated space বলে।

File carving সূচির ওপর নির্ভর না করে raw byte-এ file-এর চেনা গঠন খোঁজে। যেমন JPEG ছবি শুরু হয় FF D8 FF দিয়ে, শেষ হয় FF D9 দিয়ে। এর সীমা স্পষ্ট:

  • নাম, folder আর সময় সাধারণত হারায়। তাই উদ্ধার করা file timeline-এ বসানো কঠিন।
  • File টুকরো টুকরো থাকলে জোড়া ভুল হতে পারে। Garfinkel-এর ২০০৭ সালের DFRWS গবেষণাপত্রে এই সমস্যা নিয়ে কাজ আছে।
  • SSD-তে TRIM মুছে দেওয়া জায়গা পরিষ্কার করে ফেলতে পারে, তাই উদ্ধার অনেক সময় সম্ভব হয় না।
  • Encryption থাকলে raw byte-এ চেনা গঠন পাওয়া যায় না।
  • অপ্রাসঙ্গিক ব্যক্তিগত ডেটাও উঠে আসতে পারে। Scope আর গোপনীয়তার নিয়ম মানুন।

কাজটি সবসময় মূল disk-এ নয়, forensic image-এর কপিতে করুন, আর hash মিলিয়ে রাখুন (পর্ব ৬৩)। Chain of custody ভাঙলে ভালো বিশ্লেষণও দুর্বল হয়ে যায়।

৬ · Timestamp — সবচেয়ে দরকারি, সবচেয়ে ভুল-প্রবণ

File-এর সময়গুলোকে একসাথে MACB বলে: Modified, Accessed, Changed (metadata), Born. NTFS-এ একই ধারণাকে অনেক সময় MACE লেখা হয়। NTFS-এ একটি file-এর সময় $STANDARD_INFORMATION আর $FILE_NAME, দুই জায়গায় থাকে। এই দুইয়ের অমিল একটি সূত্র, কিন্তু একা প্রমাণ নয়।

সময় ভুল বা বিভ্রান্তিকর হয় বেশিরভাগ ক্ষেত্রে কোনো দুষ্ট উদ্দেশ্য ছাড়াই:

কারণকী ঘটেকী করবেন
Timezoneএকই host-এ কোনো log +0600, কোনোটি UTC. প্রচলিত syslog সারিতে timezone লেখাই থাকে না।প্রতিটি উৎসের timezone আগে নথিতে লিখুন।
Clock skewঘড়ি কয়েক সেকেন্ড বা মিনিট আগে-পিছে। NTP নষ্ট থাকলে আরও বেশি।সংগ্রহের সময় reference ঘড়ির সাথে পার্থক্য নোট করুন (RFC 3227 এটি বলে)।
File কপি বা archiveকপি বা unzip পুরোনো mtime রেখে দিতে পারে। Windows-এ কপি করা file-এ তৈরির সময় পরিবর্তনের সময়ের চেয়ে নতুন দেখাতে পারে।“ফাইলটি কীভাবে এলো” আগে ভাবুন।
Backup restoreপুরো folder-এ নতুন ctime, কিন্তু পুরোনো mtime.পাশের file আর deploy log দেখুন।
File system-এর নিজের নিয়মFAT-এ mtime ২ সেকেন্ডের ধাপে। NTFS tunneling নতুন file-কে অল্প আগের মুছে ফেলা file-এর তৈরির সময় দিতে পারে।Precision জেনে হিসাব করুন।

ইচ্ছাকৃত বদলও সম্ভব, একে timestomping বলে (MITRE ATT&CK T1070.006). তদন্তকারীর জন্য এর শিক্ষা একটিই: timestamp অবিশ্বাস্য হতে পারে, তাই correlate করুন। File system-এর সময়, journal, log, অন্য host-এর log আর network রেকর্ড আলাদা জায়গায় থাকে। একসাথে সবগুলো মিলে গেলে ভরসা বাড়ে। না মিললে সেটি ব্যাখ্যা করতে হয়।

হিসাবের নিয়ম

UTC = স্থানীয় সময় − offset   আর   আসল সময় = host-এর সময় + host ঘড়ি যত পিছিয়ে।
উদাহরণ: nginx সারি 10/Mar/2026:02:14:07 +0600. প্রথমে ৬ ঘণ্টা বাদ: 2026-03-09 20:14:07Z. Host ঘড়ি ৯৪ সেকেন্ড পিছিয়ে, তাই যোগ: ২০:১৪:০৭ + ১ মিনিট ৩৪ সেকেন্ড = 20:15:41Z. লক্ষ্য করুন, তারিখও এক দিন পিছিয়েছে।

৭ · Super timeline — সব উৎস এক ক্রমে

একটি উৎস পড়লে গল্পের এক টুকরো মেলে। Super timeline হলো file system, log, registry, browser, সব ঘটনাকে এক সময়-ক্রমে সাজানো। ধারণাটি জনপ্রিয় হয় Kristinn Guðjónsson-এর ২০১০ সালের SANS গবেষণাপত্র “Mastering the Super Timeline With log2timeline” থেকে। পরে Plaso নামে এর Python রূপ তৈরি হয়। এটি একটি উদাহরণমাত্র। Spreadsheet, SIEM বা নিজের script দিয়েও ছোট timeline বানানো যায়।

Plaso-র নথিতে প্রচলিত ব্যবহার এমন। কমান্ড দুটি আপনার অনুমোদিত image-এর কপিতে চালানোর জন্য, আর option version-ভেদে বদলাতে পারে:

# উদাহরণ: নিজের অনুমোদিত image-এর কপিতে, মূল প্রমাণে নয়
log2timeline.py --storage-file timeline.plaso /PATH/image.E01
psort.py -w timeline.csv timeline.plaso

প্রথম কমান্ড ঘটনা বের করে একটি storage file বানায়। দ্বিতীয়টি তা থেকে সাজানো ফল দেয়। ফল প্রায়ই লাখ লাখ সারি, তাই সময়ের জানালা আর সূত্র ধরে ছাঁকতে হয়। Timesketch-এর মতো tool দলবদ্ধ বিশ্লেষণে সাহায্য করে। হাতে বানানোর ধাপগুলো দেখলে tool-এর কাজ বোঝা সহজ হবে।

  1. সংগ্রহকপি, hash
  2. UTCtimezone
  3. অসঙ্গতিক্রম অসম্ভব
  4. ঘড়িskew ঠিক
  5. Timelineএক ক্রম
কাঁচা নমুনাতিন উৎস, তিন ধরন
web : [10/Mar/2026:02:14:07 +0600]
      POST
auth: 2026-03-09T20:24:51Z
      Accepted
fw  : 1773087984 ALLOW to :22
UTC-তে আনাএখনো ঘড়ি ঠিক হয়নি
web : 20:14:07Z POST
auth: 20:24:51Z Accepted
fw  : 20:26:24Z ALLOW to :22
ক্রম পরীক্ষাঅসম্ভব ক্রম
20:24:51Z auth login সফল
20:26:24Z fw   সংযোগের অনুমতি
সংযোগের আগে login হতে পারে না
পার্থক্য: 93 s
ঘড়ি ঠিক করাhost + 94 s
web : 20:14:07Z  >  20:15:41Z
auth: 20:24:51Z  >  20:26:25Z
fw  : 20:26:24Z  (বদল নেই)
চূড়ান্ত ক্রমনোটসহ
20:15:41Z web  POST /admin/upload
20:26:24Z fw   ALLOW 198.51.100.77 to :22
20:26:25Z auth Accepted publickey deploy
note: host clock 94 s behind, ±few s
  1. সংগ্রহ। তিনটি উৎসের কপি নেওয়া হলো, hash লেখা হলো, মূল file ছোঁয়া হলো না। সময় তিন রকম: web log-এ +0600, auth log-এ UTC, firewall log-এ epoch সেকেন্ড। এই নমুনায় ধরা হয়েছে যে web container Asia/Dhaka-তে, আর rsyslog UTC-তে লেখে।
  2. UTC-তে আনা। Web log থেকে ৬ ঘণ্টা বাদ গেল, ফলে তারিখও ৯ মার্চ হলো। Firewall-এর 1773087984 হলো 20:26:24Z. এই কাজকে normalization বলে।
  3. অসঙ্গতি। সাজাতেই একটি অসম্ভব ক্রম ধরা পড়ল। Login সফল ২০:২৪:৫১-তে, অথচ সংযোগের অনুমতি ২০:২৬:২৪-এ। সংযোগের ৯৩ সেকেন্ড আগে login হতে পারে না। অর্থাৎ দুই ঘড়ি এক নয়।
  4. ঘড়ি ঠিক করা। সংগ্রহের সময় নোট ছিল, server-এর ঘড়ি reference থেকে ৯৪ সেকেন্ড পিছিয়ে। তাই host-এর সব সময়ে ৯৪ সেকেন্ড যোগ হলো। Firewall-এর ঘড়ি NTP-তে মেলানো, তাই সেটি বদলাল না। এখন login হলো 20:26:25Z, সংযোগের ১ সেকেন্ড পরে, যা স্বাভাবিক।
  5. এক ক্রম। এখন ক্রমটি যুক্তিসঙ্গত। সবশেষে একটি সৎ নোট যোগ হলো: skew অনুমান, কয়েক সেকেন্ড এদিক-ওদিক হতে পারে, আর ধরা হয়েছে যে এই কয়েক ঘণ্টায় তা বদলায়নি। মূল log অপরিবর্তিত থাকল, শুধু বিশ্লেষণের কপিতে সময় ঠিক হলো।

এবার একই কাজ Bash-এ। নিচের block নিজেই তিনটি নমুনা log বানায়। শুধু UTC-তে আনে আর sort করে। সারিগুলো ছোট করা হয়েছে, আসল combined format-এ আরও ঘর থাকে।

# নমুনা log: block নিজেই বানায়, host-এর কোনো ডেটা পড়ে না
d=$(mktemp -d); cd "$d"
cat > web.log <<'EOF'
203.0.113.45 - - [10/Mar/2026:02:14:07 +0600] "POST /admin/upload" 200
203.0.113.45 - - [10/Mar/2026:02:16:33 +0600] "GET /uploads/img_7731.php" 200
EOF
cat > auth.log <<'EOF'
2026-03-09T20:24:51Z sshd: Accepted publickey for deploy from 198.51.100.77
2026-03-09T20:27:12Z crontab: (deploy) REPLACE (deploy)
EOF
cat > fw.log <<'EOF'
1773087984 ALLOW 198.51.100.77 to shop-web-01:22
EOF
utc() { date -u -d "$1" +%Y-%m-%dT%H:%M:%SZ; }
{
  while read -r ip _ _ ts tz rest; do
    t=${ts#[}; day=${t%%:*}; clock=${t#*:}
    printf '%s web  %s %s\n' "$(utc "${day//\// } $clock ${tz%]}")" "$ip" "$rest"
  done < web.log
  while read -r t rest; do
    printf '%s auth %s\n' "$t" "$rest"
  done < auth.log
  while read -r e rest; do
    printf '%s fw   %s\n' "$(utc "@$e")" "$rest"
  done < fw.log
} | sort
cd /; rm -rf "$d"

আসল আউটপুটের প্রথম সারি 2026-03-09T20:14:07Z web 203.0.113.45 "POST /admin/upload" 200. দেখুন, +0600 থেকে তারিখ ৯ মার্চে নেমেছে। চতুর্থ সারি 2026-03-09T20:26:24Z fw ALLOW 198.51.100.77 to shop-web-01:22, আর তৃতীয় সারিতে 20:24:51Z সময়ের Accepted publickey. অর্থাৎ sort নির্ভুলভাবে একটি অসম্ভব ক্রম দেখাচ্ছে। Tool ভুল করেনি, ঘড়ি ভুল। সব সারি একই UTC ধরনে আসার পরই লেখা হিসেবে sort নিরাপদ। মিশ্র timezone-এ এটি ভুল ক্রম দেবে (অনুশীলন ২)।

পরের block বেশি উৎস নিয়ে উৎস-ভিত্তিক timezone আর ঘড়ির সংশোধন যোগ করে। প্রতিটি সারিতে আগের ঘটনা থেকে কত সেকেন্ড পরে, সেটিও দেখায়।

// toy নমুনা: সব ডেটা কাল্পনিক। উৎস ভেদে timezone আর ঘড়ি আলাদা
const sources = {
  web:  { offsetMin: 360, fixSec: 94 }, // +0600, host ঘড়ি 94 s পিছিয়ে
  app:  { offsetMin: 360, fixSec: 94 },
  auth: { offsetMin: 0,   fixSec: 94 }, // UTC, কিন্তু একই host ঘড়ি
  file: { offsetMin: 0,   fixSec: 94 },
  fw:   { offsetMin: 0,   fixSec: 0  }, // UTC, ঘড়ি NTP-তে মেলানো
};
const raw = [
  ['fw',   '2026-03-09T20:44:02', '198.51.100.77 out 48211900 B'],
  ['auth', '2026-03-09T20:27:12', 'crontab REPLACE (deploy)'],
  ['web',  '2026-03-10T02:14:07', 'POST /admin/upload 200'],
  ['file', '2026-03-09T20:19:40', 'authorized_keys mtime'],
  ['app',  '2026-03-10T02:13:40', 'session staff-04 203.0.113.45'],
  ['fw',   '2026-03-09T20:26:24', 'ALLOW 198.51.100.77 to :22'],
  ['web',  '2026-03-10T02:16:33', 'GET /uploads/img_7731.php 200'],
  ['auth', '2026-03-09T20:24:51', 'Accepted publickey deploy'],
  ['file', '2026-03-09T20:14:08', 'img_7731.php ctime'],
  ['app',  '2026-03-10T02:41:18', 'export customers rows=1842'],
];
function toUtcMs(src, stamp) {
  const s = sources[src];
  const asIfUtc = Date.parse(stamp + 'Z');
  return asIfUtc - s.offsetMin * 60000 + s.fixSec * 1000;
}
const rows = raw.map(([src, stamp, msg]) => ({ src, msg, ms: toUtcMs(src, stamp) }));
rows.sort((a, b) => a.ms - b.ms);
let prev = null;
for (const r of rows) {
  const clock = new Date(r.ms).toISOString().slice(11, 19) + 'Z';
  const delta = prev === null ? '' : ' +' + (r.ms - prev) / 1000 + 's';
  console.log(clock, r.src.padEnd(4), r.msg + delta);
  prev = r.ms;
}

এলোমেলো ১০টি সারি থেকে আসল আউটপুট শুরু হয় 20:15:14Z app session staff-04 203.0.113.45 দিয়ে, শেষ হয় 20:44:02Z fw 198.51.100.77 out 48211900 B +70s দিয়ে। Delta ঘরটি পড়ুন। POST /admin/upload 200 +27s-এর পরেই img_7731.php ctime +1s. আর ALLOW 198.51.100.77 to :22 +310s-এর পরেই Accepted publickey deploy +1s. ঘনিষ্ঠ সময় সম্পর্কের ইঙ্গিত দেয়, কিন্তু একা কারণ প্রমাণ করে না। Date.parse-এর কাজ এখানে শুধু লেখাকে সংখ্যায় আনা। সংশোধন স্পষ্টভাবে sources টেবিলে আছে, যাতে অন্য কেউ যাচাই করতে পারেন। ভালো timeline-এর নিয়মও তাই।

৮ · একটি পুরো timeline — ছোট web server-এর কাল্পনিক ঘটনা

পটভূমি (নমুনা): একটি কাল্পনিক অনলাইন বাজারের একটি server shop-web-01. ১০ মার্চ সকালে বাইরের firewall রিপোর্টে আগের রাতে অস্বাভাবিক বড় outbound transfer দেখা গেল। Hosting কর্মীরা ততক্ষণে server restart দিয়েছেন, তাই memory-র প্রমাণ নেই। দলের হাতে আছে disk image, local log, কেন্দ্রীয় log server-এর কপি, firewall log আর release-এর নথি। সব সময় ঘড়ি ঠিক করা UTC-তে। ঘটনার কৌশল নয়, শুধু প্রমাণের পথ দেখানো হচ্ছে।

কাল্পনিক ঘটনার timeline (নমুনা)

Corrected UTC, 9 March 2026, fictional server shop-web-01

কাল্পনিক web server ঘটনার এগারোটি ধাপ 20:15:14app: staff-04 session 20:15:41web: POST /admin/upload 20:15:42file: নতুন img_7731.php 20:18:07web: GET img_7731.php 20:21:14file: authorized_keys বদল 20:26:24fw: :22 সংযোগের অনুমতি 20:26:25auth: publickey login, deploy 20:28:46auth: crontab বদল 20:42:52app: customers export 20:44:02fw: প্রায় 48 MB বাইরে 21:04:18central: SSH login (local-এ নেই)
ছবি ৬৪.২ — রং উৎস বোঝায়। সব ডেটা নমুনা। একই গল্পে পাঁচটি আলাদা উৎস মিলেছে, এটিই তার শক্তি।

Pivoting: এক সূত্র থেকে পরের সূত্রে

Pivoting মানে হাতের তথ্য থেকে পাশের উৎসে যাওয়া। হাতিয়ার চারটি: সময়, ঠিকানা, account, আর file path. দল শুরু করল web log-এর একটি অদ্ভুত সারি থেকে।

  1. Web logঅদ্ভুত path
  2. Auth logসময় ধরে
  3. File eventaccount ধরে
  4. Firewallঠিকানা ধরে
  5. নতুন প্রশ্নকী অজানা
web log (নমুনা)শুরুর সূত্র
20:18:07Z 203.0.113.45
GET /uploads/img_7731.php 200
uploads-এ ছবি থাকার কথা, script নয়
auth log (নমুনা)20:15Z থেকে 20:35Z
20:26:25Z sshd: Accepted publickey
for deploy from 198.51.100.77
এই ঠিকানা আগে কখনো দেখা যায়নি
file event (নমুনা)deploy-এর home
/home/deploy/.ssh/authorized_keys
mtime 20:21:14Z  ctime 20:21:14Z
login-এর 5 min 11 s আগে বদলেছে
firewall log (নমুনা)198.51.100.77
20:26:24Z ALLOW in  to :22
20:44:02Z out 48211900 B, same IP
NTP-তে মেলানো, আলাদা যন্ত্র
তদন্তের নোটএরপর কী
জানা   : ঘটনার ক্রম
অনুমান : দুই ঠিকানা একই পক্ষ
অজানা  : staff-04 session কীভাবে গেল
অজানা  : file-এর ভেতরের request
  1. Web log. uploads folder-এ .php file, আর তাতে সফল অনুরোধ। এটি অদ্ভুত, কারণ এখানে ছবি থাকার কথা। সূত্র পাওয়া গেল সময় 20:18:07Z. এখনো এটি শুধু সন্দেহ, কারণ log বলে অনুরোধ এসেছিল, ভেতরে কী ঘটেছিল বলে না।
  2. সময় ধরে auth log. ওই সময়ের চারপাশের জানালায় একটি SSH login মিলল: deploy account, publickey পদ্ধতি, নতুন ঠিকানা 198.51.100.77. Web log-এর ঠিকানা ছিল অন্য। তাই ঠিকানা ধরে খুঁজলে এই সারি পাওয়া যেত না, সময় ধরে পাওয়া গেল।
  3. Account ধরে file event. Publickey login মানে deploy-এর authorized_keys-এ একটি key থাকতে হবে। Image-এ দেখা গেল file-টি ২০:২১:১৪-তে বদলেছে, login-এর ৫ মিনিট ১১ সেকেন্ড আগে। Key-টি কোনো কর্মীর তালিকায় নেই। এই সাইটের app-ও deploy account-এ চলত, যা একটি নকশাগত দুর্বলতা।
  4. ঠিকানা ধরে firewall. নতুন ঠিকানা নিয়ে firewall log খোঁজা হলো। ভেতরে SSH সংযোগ, আর ২০:৪৪:০২-তে একই ঠিকানায় প্রায় ৪৮ MB বাইরে। Firewall আলাদা যন্ত্র, তাই server-এর log বদলালেও এই রেকর্ড টিকে থাকে।
  5. নতুন প্রশ্ন। ভালো pivot উত্তরের সাথে নতুন প্রশ্নও আনে। staff-04-এর session কীভাবে অন্যের হাতে গেল, তা কোনো log-এ নেই। সেটি “অজানা” হিসেবেই লেখা হলো, অনুমানে ভরাট করা হলো না।

Timestamp-এর দ্বন্দ্ব: দ্বিতীয় উৎস কীভাবে মেটায়

একজন সদস্য আপত্তি তুললেন, “img_7731.php-এর mtime তো ২০২৩ সালের। এটি পুরোনো file, এই ঘটনার নয়।” দ্বন্দ্বটি নিচের ধাপে মিটল।

stat-এর ধাঁচে নমুনাদাবি
File : uploads/img_7731.php
mtime: 2023-06-12 08:41:02
দাবি: file-টি ২০২৩ থেকেই আছে
stat-এর ধাঁচে নমুনাদ্বন্দ্ব
mtime: 2023-06-12 08:41:02
ctime: 2026-03-09 20:15:42Z
Birth: 2026-03-09 20:15:42Z
একই file, দুটি গল্প
নির্দোষ ব্যাখ্যা যাচাইRestore কি হয়েছিল?
পাশের file-এর ctime (নমুনা):
img_7729.jpg  2026-02-26
img_7730.jpg  2026-03-04
Restore হলে সব এক সময়ে থাকত
স্বাধীন উৎসদ্বিতীয় সূত্র
web     : 20:15:41Z POST /admin/upload
release : শেষ release 2026-02-26
manifest: img_7731.php নেই
Finding-এ লেখাসিদ্ধান্ত
Arrived: 2026-03-09 ~20:15:42Z
Confidence: high
mtime 2023: not relied on,
cause not established
  1. দাবি। শুধু mtime দেখলে file-টি প্রায় তিন বছরের পুরোনো। আপত্তিটি যুক্তিসঙ্গত, তাই সেটি যাচাই না করে উড়িয়ে দেওয়া যায় না।
  2. দ্বন্দ্ব। একই file-এর ctime আর Birth ২০২৬-এর ৯ মার্চ, ঘড়ি ঠিক করে ২০:১৫:৪২Z. Birth বলছে এই inode তখনই তৈরি। কিন্তু নতুন ctime একা কিছুই প্রমাণ করে না, কারণ নির্দোষ ব্যাখ্যাও আছে।
  3. নির্দোষ ব্যাখ্যা যাচাই। Backup restore হলে পুরো folder-এ প্রায় একই ctime থাকত। পাশের file-গুলোর ctime আলাদা আলাদা দিনের। তাই এই ব্যাখ্যা দুর্বল হলো। একে বাদ দেওয়ার জন্যই খোঁজা হয়েছে, নিজের ধারণা প্রমাণের জন্য নয়।
  4. স্বাধীন উৎস। Web log-এ এক সেকেন্ড আগে POST /admin/upload. Release-এর নথি অনুযায়ী শেষ release ২৬ ফেব্রুয়ারি, আর তার manifest-এ এই file নেই। তিনটি উৎস আলাদা জায়গায় থাকে, আর সবাই একই দিকে দেখাচ্ছে।
  5. সিদ্ধান্ত। File-টি সম্ভবত ৯ মার্চ ২০:১৫:৪২Z-এ এসেছে, confidence উচ্চ। পুরোনো mtime-এর কারণ অজানা, কারণ archive থেকে বের করলেও এমন হতে পারে। তাই “কেউ ইচ্ছা করে বদলেছে” লেখা হলো না। শুধু লেখা হলো, এই সময়ের ওপর নির্ভর করা হয়নি।

Log-এর ফাঁক খোঁজা

Log gap মানে যে সময়ে log থাকার কথা, অথচ নেই। শান্ত server-ও cron-এর কারণে নিয়মিত কিছু লেখে। তাই লম্বা নীরবতা একটি সূত্র। নিচের block local auth.log-এ ফাঁক খোঁজে, আর একই host থেকে কেন্দ্রীয় server-এ পাঠানো কপির সাথে মেলায়। এই দুটি log ঘড়ি-ঠিক-করা নয়, দুই কপিই host-এর ঘড়ির সময়।

// toy নমুনা: একই host-এর log, disk-এর কপি আর কেন্দ্রীয় কপি
const toSec = t => { const [h, m, s] = t.split(':').map(Number); return h * 3600 + m * 60 + s; };
const fmt = s => [s / 3600 | 0, (s % 3600) / 60 | 0, s % 60].map(n => String(n).padStart(2, '0')).join(':');
const LIMIT = 15 * 60;   // cron প্রতি 10 মিনিটে লেখে, তাই 15 মিনিট নীরব মানে সন্দেহ

const localLog = ['20:30:01 CRON', '20:40:01 CRON', '20:46:12 sshd session closed',
  '23:10:03 CRON', '23:20:01 CRON'];
const centralLog = ['20:30:01 CRON', '20:40:01 CRON', '20:46:12 sshd session closed',
  '20:50:01 CRON', '21:00:01 CRON', '21:02:44 sshd Accepted publickey deploy',
  '21:10:01 CRON', '21:20:01 CRON', '21:30:01 CRON', '21:40:01 CRON', '21:50:01 CRON',
  '22:00:01 CRON', '22:10:01 CRON', '22:20:01 CRON', '22:30:01 CRON', '22:40:01 CRON',
  '22:50:01 CRON', '23:00:01 CRON', '23:10:03 CRON', '23:20:01 CRON'];

function gaps(log) {
  const out = [];
  for (let i = 1; i < log.length; i++) {
    const a = toSec(log[i - 1].slice(0, 8)), b = toSec(log[i].slice(0, 8));
    if (b - a > LIMIT) out.push([a, b]);
  }
  return out;
}
console.log('local   gaps:', gaps(localLog).length, '| central gaps:', gaps(centralLog).length);
for (const [a, b] of gaps(localLog)) {
  const mins = ((b - a) / 60).toFixed(1);
  console.log(`local silent ${fmt(a)} to ${fmt(b)} (${mins} min)`);
  const inside = centralLog.filter(l => { const t = toSec(l.slice(0, 8)); return t > a && t < b; });
  console.log('central has', inside.length, 'lines inside; non-CRON lines:');
  inside.filter(l => !l.includes('CRON')).forEach(l => console.log('  ' + l));
}

আসল আউটপুট: local gaps: 1 | central gaps: 0, তারপর local silent 20:46:12 to 23:10:03 (143.8 min). কেন্দ্রীয় কপিতে সেই সময়ের 15টি সারি আছে, যার একটি 21:02:44 sshd Accepted publickey deploy. ঘড়ি ঠিক করলে এটি ২১:০৪:১৮Z. বাকি ১৪টি cron-এর সারি, আর হিসাবও মেলে: ১৪৩.৮ মিনিটে ১০ মিনিট পরপর প্রায় ১৪টি। সাবধান, ফাঁক মানেই log মোছা নয়। আগে দেখুন rotation-এর file (auth.log.1), disk পূর্ণ হওয়া, service restart. এই নমুনায় rotation-এ সারিগুলো মেলেনি। তাই finding: “local কপিতে সারি নেই, কারণ অজানা।” Append-only কেন্দ্রীয় log কেন লাগে, এই উদাহরণই তার উত্তর।

৯ · Hypothesis, bias আর confidence দিয়ে finding লেখা

Timeline ঘটনা সাজায়, ব্যাখ্যা দেয় না। ব্যাখ্যার জন্য একাধিক সম্ভাবনা লিখতে হয়। Richards Heuer তাঁর Psychology of Intelligence Analysis (১৯৯৯) বইয়ে Analysis of Competing Hypotheses (ACH) পদ্ধতি বর্ণনা করেন। মূল কথা: প্রিয় ব্যাখ্যার পক্ষে প্রমাণ না গুনে, প্রতিটি প্রমাণ কোন ব্যাখ্যার বিপক্ষে যায় সেটি দেখুন। কারণ একই প্রমাণ অনেক ব্যাখ্যার সাথে মিলতে পারে, আর একটি শক্ত বিরোধী প্রমাণ একটি ব্যাখ্যাকে বাদ দিতে পারে।

নিচের toy tracker চারটি ব্যাখ্যা আর সাতটি প্রমাণ মেলায়। এখানে dpkg log-এর একটি সারিও আছে: openssl upgrade, ঠিক ঘটনার রাতে। শুরুতে এটি ভয়ের মনে হয়েছিল।

// toy নমুনা: ACH ধাঁচের hypothesis tracker. '+' পক্ষে, '-' বিপক্ষে
const hypotheses = {
  H1: 'entry through the upload feature',
  H2: 'SSH password guessing on deploy',
  H3: 'routine deployment by staff',
  H4: 'intruder installed a package',
};
const evidence = [
  ['E1 POST then new file 1 s later',        { H1: '+' }],
  ['E2 img_7731.php not in release manifest', { H1: '+', H3: '-' }],
  ['E3 key added before first SSH login',    { H1: '+' }],
  ['E4 0 failed logins in 7 days of log',    { H2: '-' }],
  ['E5 no ticket, no release that night',    { H3: '-' }],
  ['E6 openssl upgrade by nightly timer',    { H4: '-' }],
  ['E7 same upgrade job ran on 30 past days', { H4: '-' }],
];
const result = Object.keys(hypotheses).map(id => {
  const marks = evidence.filter(([, m]) => m[id]);
  const pro = marks.filter(([, m]) => m[id] === '+').map(([e]) => e.split(' ')[0]);
  const con = marks.filter(([, m]) => m[id] === '-').map(([e]) => e.split(' ')[0]);
  const status = con.length >= 2 ? 'REJECTED' : con.length === 1 ? 'WEAK' : 'STANDING';
  return { id, pro, con, status };
});
// Heuer-এর মূল কথা: কত প্রমাণ পক্ষে নয়, কত প্রমাণ বিপক্ষে, সেটি দেখুন
result.sort((a, b) => a.con.length - b.con.length);
for (const r of result) {
  console.log(`${r.id} ${r.status.padEnd(8)} ${hypotheses[r.id]}`);
  console.log(`   for: ${r.pro.join(' ') || '-'} | against: ${r.con.join(' ') || '-'}`);
}

আসল আউটপুটের প্রথম সারি H1 STANDING entry through the upload feature, পাশে for: E1 E2 E3 | against: -. H3 REJECTED আর H4 REJECTED দুটোরই বিপক্ষে ২টি করে প্রমাণ। H4-এর ঘটনাটি দেখুন: সন্দেহজনক রাতের package upgrade আসলে নিয়মিত timer-এর কাজ, গত ৩০ দিনও একইভাবে চলেছে। একটি ব্যাখ্যা বাদ গেল, এটিও ফল। আর H2 WEAK, পুরো বাতিল নয়, কারণ E4-এর log মাত্র ৭ দিনের। Status-এর নিয়মটি শুধু শেখানোর জন্য বানানো। বাস্তবে প্রমাণ গোনা নয়, ওজন করা হয়। একটি মাত্র শক্ত প্রমাণও কোনো ব্যাখ্যা বাদ দিতে পারে। H1 “STANDING” মানে প্রমাণিত নয়, শুধু এখনো টিকে আছে।

Analyst bias: আপনার মনও একটি উৎস

Anchoring

Ticket-এ প্রথম লেখা “ransomware” চোখে আটকে যায়। পরের সব কিছু সেই চোখে দেখা হয়।

প্রতিকার: শুরুতেই ৩টি ব্যাখ্যা লিখুন

Confirmation bias

নিজের ধারণার পক্ষের সারি খোঁজা, আর বাকিটা “গোলমাল” বলে ফেলে দেওয়া।

প্রতিকার: নিজেকেই জিজ্ঞেস করুন, কী দেখলে ভুল প্রমাণ হবে

সময়ের ঘনিষ্ঠতা

পরপর ঘটলেই কারণ ধরে নেওয়া। openssl upgrade-এর উদাহরণ মনে করুন।

প্রতিকার: Baseline দেখুন

যা আছে শুধু তাই দেখা

Memory নেই বলে সেই সম্ভাবনাকে ভুলে যাওয়া। না থাকা প্রমাণও নথিতে থাকা দরকার।

প্রতিকার: “যা দেখা হয়নি” তালিকা

Confidence-সহ finding

“হ্যাকার ডেটা চুরি করেছে” একটি বাক্য, finding নয়। ভালো finding-এ থাকে দাবি, প্রমাণ, confidence level, আর বিকল্প ব্যাখ্যা। মার্কিন গোয়েন্দা সংস্থার ICD 203 নির্দেশিকা একটি দরকারি পার্থক্য করে: ঘটনাটি কতটা সম্ভব, আর আপনার প্রমাণ কতটা শক্ত, এই দুটি আলাদা কথা। তিন স্তরের অর্থ দলে আগে ঠিক করে নিন। একটি প্রচলিত ব্যবহার নিচে দেওয়া হলো, এটি কোনো সার্বজনীন মান নয়।

Finding (নমুনা)প্রমাণConfidenceসীমা
img_7731.php ৯ মার্চ upload পথে এসেছেWeb log, ctime ও Birth, manifestউচ্চ: স্বাধীন উৎস মিলেছেUpload-এর ভেতরের লেখা log-এ নেই, তবে file image-এ আছে
বাইরের একটি key দিয়ে deploy-এ SSH হয়েছেAuth log, firewall, authorized_keysউচ্চKey কে বানিয়েছেন, তা অজানা
গ্রাহকের ডেটা বাইরে গিয়ে থাকতে পারেExport log ১,৮৪২ সারি, ৭০ সেকেন্ড পরে ৪৮ MB outboundমাঝারি: ভেতরের লেখা দেখা যায়নিFlow log শুধু আকার বলে। Memory নেই।
দুটি ঠিকানার পেছনে একই পক্ষশুধু সময়ের কাছাকাছি হওয়ানিম্নঠিকানা কোনো ব্যক্তিকে শনাক্ত করে না

সবশেষে আলাদা করে লিখুন অজানা: staff-04 session কীভাবে গেল, local log-এর ফাঁকের কারণ, আর memory না থাকায় কী দেখা যায়নি। “কোনো প্রমাণ পাইনি” আর “ঘটেনি” এক কথা নয়। এই লেখাই পরে incident response-এর সিদ্ধান্ত, গ্রাহককে জানানো আর আইনি কাজে ব্যবহার হয়। তাই অনুমানকে তথ্যের ভাষায় লিখবেন না। প্রতিরক্ষার শিক্ষাগুলোও লিখুন: uploads folder-এ script চলা বন্ধ (পর্ব ৪২), app-এর আলাদা কম-অধিকারের account, NTP নজরদারি, আর কেন্দ্রীয় log.

আরও গভীরে: NIST SP 800-86 (২০০৬) forensic কাজকে সংগ্রহ, পরীক্ষা, বিশ্লেষণ আর রিপোর্ট, এই চার ধাপে ভাগ করে আর incident response-এর সাথে জুড়তে বলে। ISO/IEC 27037 ডিজিটাল প্রমাণ শনাক্ত ও সংগ্রহের নির্দেশনা দেয়। Windows-এ Amcache নিয়ে ANSSI-র গবেষণা দেখায়, এর ব্যাখ্যা জটিল আর version-নির্ভর। তাই যেকোনো artifact-এর অর্থ নিজের OS version-এ পরীক্ষা করে নিশ্চিত হন। Hash-এর ক্ষেত্রেও সাবধান: গবেষণায় দেখা গেছে Amcache-এর SHA-1 বড় file-এ শুধু শুরুর অংশের ওপর হতে পারে।

পরীক্ষা ও ইন্টারভিউতে:

  • mtime আর ctime-এর পার্থক্য? mtime content বদলের সময়, ctime inode বদলের সময়। ctime তৈরির সময় নয়।
  • Super timeline কী? বহু artifact-এর ঘটনা UTC-তে এনে এক ক্রমে সাজানো তালিকা, Plaso যার একটি উদাহরণ tool.
  • Log-এ ফাঁক পেলে প্রথম কাজ? Rotation, restart, disk পূর্ণ আগে দেখা, তারপর অন্য কপি বা উৎসে মেলানো।
  • Prefetch না পেলে কী বলবেন? কিছুই প্রমাণ হয় না। আগে দেখুন সেই সিস্টেমে এটি চালু ছিল কি না।
  • Timestomping সন্দেহ হলে? একটি সময়ে আটকে না থেকে journal, log আর অন্য host-এ correlate করা।

১০ · AI-এর যুগে forensic বিশ্লেষণ

AI লম্বা log সংক্ষেপ করতে, artifact-এর অর্থ বোঝাতে আর parser লিখতে সাহায্য করে। কিন্তু forensic কাজে ভুল বাক্যের দাম বেশি। একটি ভুল সময় বা বানানো event মানুষের চাকরি, গ্রাহকের কাছে ঘোষণা বা আইনি সিদ্ধান্তে প্রভাব ফেলতে পারে।

AI-এর সাধারণ ভুলকীভাবে ধরবেন
ভুল বা বানানো Event ID, CVE বা registry পথ বলাMicrosoft-এর নথি, NVD বা মূল উৎসে মেলান
Timezone ধরে নেওয়া, offset বাদ দেওয়া৩টি সারি হাতে হিসাব করে মেলান
“ফাইল আছে” থেকে “চলেছে” লিখে ফেলাপ্রতিটি দাবির পাশে artifact আর তার সীমা চান
অতিরিক্ত আত্মবিশ্বাসে attribution, “অমুক দল”প্রমাণ দেখতে চান। ঠিকানা থেকে পক্ষ বলা যায় না।
লম্বা log-এ সারি বাদ দেওয়া বা বানিয়ে উদ্ধৃত করাউদ্ধৃত প্রতিটি সারি মূল file-এ grep করুন
পুরোনো পরামর্শ, যেমন প্রমাণের জন্য MD5-কে একমাত্র hash রাখাআপনার দলের পদ্ধতি আর SHA-256 ব্যবহার করুন
ভুল ঠিক করতে যাচাই বন্ধ করা, যেমন chmod 777প্রমাণের কপি শুধু-পড়ার রাখুন, diff দেখুন

নিচের prompt-এ নকল বা মাস্ক করা timeline দিন, আসল গ্রাহকের ডেটা নয়। লক্ষ্য করুন, AI-কে সিদ্ধান্ত নিতে নয়, অসঙ্গতি খুঁজতে বলা হয়েছে।

তুমি একজন সতর্ক defensive forensic reviewer. নিচে আমার নিজের প্রতিষ্ঠানের অনুমোদিত তদন্তের একটি মাস্ক করা timeline আছে। ঠিকানা আর নাম বদলানো। [এখানে মাস্ক করা timeline পেস্ট করুন] ১. প্রতিটি সারির সময় UTC কি না, আর ক্রমে কোনো অসম্ভব ঘটনা আছে কি না বলো। ২. আমার ব্যাখ্যা: [এখানে লিখুন]। কোন সারি এই ব্যাখ্যার বিপক্ষে যায়? ৩. অন্তত দুটি বিকল্প ব্যাখ্যা দাও, নির্দোষ ব্যাখ্যাসহ। ৪. আর কোন artifact দেখলে যাচাই হবে বলো, আর প্রতিটির সীমা বলো। ৫. কোনো Event ID, CVE বা নথির কথা বললে নিশ্চিত না হলে "যাচাই করা দরকার" লেখো। কোনো সারি বানিও না। কাউকে দায়ী কোরো না।

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

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

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

প্র ০১৭৫ সেন্টের হিসাবের অমিল থেকে একটি আন্তর্জাতিক তদন্ত — এই পুরোনো ঘটনা আজকের timeline সম্পর্কে কী শেখায়?

১৯৮৬ সালে Lawrence Berkeley Laboratory-তে জ্যোতির্বিজ্ঞানী থেকে সিস্টেম প্রশাসক হওয়া Clifford Stoll দেখলেন, দুটি হিসাব-ব্যবস্থার মধ্যে ৭৫ সেন্টের অমিল। বেশিরভাগ মানুষ এটি উপেক্ষা করতেন। তিনি করলেন না। সেই সূত্র ধরে শেষ পর্যন্ত একটি দীর্ঘ অনুপ্রবেশ ধরা পড়ে, যার গল্প তাঁর ১৯৮৯ সালের বই The Cuckoo's Egg-এ আছে।

এখান থেকে তিনটি শিক্ষা আজও সত্য।

  • দুটি স্বাধীন রেকর্ডের অমিলই সূত্র। ৭৫ সেন্ট নিজে কিছু নয়। দুটি ব্যবস্থা এক কথা না বলাটাই সূত্র। আমাদের উদাহরণে local log আর কেন্দ্রীয় log-এর অমিল ঠিক একই জিনিস।
  • অনুপ্রবেশকারীর নাগালের বাইরের রেকর্ড সবচেয়ে দামি। Stoll সংযোগের কার্যকলাপ printer-এ কাগজে তুলে রাখতেন, যা দূর থেকে বদলানো যেত না। আজ একই ভূমিকা নেয় append-only কেন্দ্রীয় log আর আলাদা account-এর storage.
  • লিখে রাখা অভ্যাস। তাঁর খুঁটিনাটি নোট পরে অন্য সংস্থাকে বোঝাতে কাজে লাগে। তদন্ত শেষে স্মৃতি নয়, নথিই কথা বলে।

আরেকটি কথা। অমিলের নির্দোষ ব্যাখ্যাও থাকতে পারত, যেমন হিসাবের গোল করা। তাই সূত্র মানেই দোষ নয়। ছোট অসঙ্গতি উপেক্ষা না করা, আবার সেটিকে বড় সিদ্ধান্তে না লাফানো, দুটোই দরকার। আজকের সিস্টেমে log-এর পরিমাণ বিশাল, তাই মানুষের চোখে সব ধরা পড়ে না। এজন্যই স্বয়ংক্রিয় মিলিয়ে দেখা কাজ যেমন heartbeat আর log volume নজরদারি দরকার।

মূল উপলব্ধি: তদন্ত সাধারণত নাটকীয় alert থেকে নয়, দুটি রেকর্ডের ছোট অমিল থেকে শুরু হয়। স্বাধীন রেকর্ড আগেই তৈরি রাখলে সেই অমিল দেখা সম্ভব হয়।

প্র ০২Timestamp যদি বদলানো যায় আর নিজে থেকেও ভুল হয়, তাহলে forensic timeline-এর কি কোনো দাম আছে?

আছে, তবে timeline-এর দাম একটি সময়ে নয়, বহু উৎসের সঙ্গতিতে। একটি মাত্র সময় দুর্বল। পাঁচটি স্বাধীন উৎস একই ক্রম বললে সেটি জাল করা বা কাকতালীয় হওয়া অনেক কঠিন।

ভুলের উৎস যে বেশিরভাগ ক্ষেত্রেই নির্দোষ, তা মনে রাখা দরকার। কিছু উদাহরণ:

  • NTFS tunneling: Windows Internals-এ বর্ণিত এই আচরণে কোনো file মুছে অল্প সময়ের মধ্যে একই নামে নতুন file বানালে নতুনটি পুরোনোর তৈরির সময় পেতে পারে। ডিফল্ট সময়সীমা প্রায় ১৫ সেকেন্ড বলে বর্ণিত। পুরোনো application-এর “নিরাপদ save”-এর জন্য এটি রাখা হয়েছিল, কোনো গোপন কৌশল হিসেবে নয়।
  • Timezone-এর ইতিহাস: বাংলাদেশে ২০০৯ সালে কয়েক মাস daylight saving চালু ছিল, ঘড়ি এক ঘণ্টা এগিয়ে। পুরোনো log-কে সবসময় +0600 ধরলে সেই সময়ের হিসাব ভুল হবে। সঠিক timezone database দরকার।
  • Precision: FAT-এর mtime ২ সেকেন্ডের ধাপে। তাই দুটি ঘটনার ১ সেকেন্ডের পার্থক্য সেখানে অর্থহীন হতে পারে।
  • লেখার সময় বনাম ঘটনার সময়: nginx অনুরোধ শেষে লেখে। Cloud log পরে পৌঁছায়। Shell history shell বন্ধের সময় লেখা হয়।

তাই বিশ্লেষক প্রতিটি সময়ের পাশে উৎস, timezone আর সম্ভাব্য ভুলের পরিমাণ রাখেন। দুটি ঘটনার ক্রম যদি ভুলের সীমার ভেতরে পড়ে, তাহলে লেখা উচিত “প্রায় একই সময়ে”, “আগে-পরে” নয়। আপনি আদালতে বা ব্যবস্থাপনার সামনে বলতে পারবেন কীভাবে সংখ্যাটি পেলেন, এটিই আসল শক্তি।

মূল উপলব্ধি: Timeline কোনো নিখুঁত ঘড়ি নয়। এটি যাচাই করা যায় এমন একটি যুক্তি, যার প্রতিটি সারির উৎস দেখানো যায়।

প্র ০৩Memory এত মূল্যবান হলে সব ঘটনায় আগে memory কপি করা হয় না কেন?

কারণ forensic কাজ শূন্যে হয় না। এটি একটি চলমান ব্যবসার ভেতরে হয়, যেখানে ক্ষতি থামানো, খরচ, আইন আর মানুষের গোপনীয়তা, সবকিছুর সাথে ভারসাম্য রাখতে হয়।

Memory-র গুরুত্ব নিয়ে সন্দেহ নেই। ২০০৮ সালে Halderman ও সহকর্মীদের “Lest We Remember” গবেষণাপত্র দেখায়, বিদ্যুৎ যাওয়ার পরও RAM-এ ডেটা অল্প সময় টিকে থাকতে পারে, আর disk encryption-এর key সেখানে থাকে। এটি দেখায় RAM-এ কতটা সংবেদনশীল ডেটা থাকে, আর “memory শুধু সাময়িক” ধারণাটি কতটা সরল।

তবু কয়েকটি বাধা আছে:

  • পর্যবেক্ষণ নিজেই বদল ঘটায়। কপি নেওয়ার tool নিজেও memory ব্যবহার করে। তাই কাজটি নথিতে লিখে, অনুমোদিত tool-এ, যতটা সম্ভব কম ছাপ রেখে করতে হয়।
  • Containment-এর চাপ। Ransomware ছড়ালে এক মিনিট দামি। পৃথক network-এ রেখে চালু রাখা ভালো, কিন্তু সবসময় সম্ভব নয়। Containment-এর সিদ্ধান্ত পর্ব ৬২-এর বিষয়।
  • পরিসর আর ক্ষমতা। হাজার server-এর RAM কপি করা, রাখা আর পড়া সহজ নয়। অনেক দল গুরুত্বপূর্ণ কয়েকটি host বেছে নেয়। EDR কিছু volatile তথ্য আগে থেকেই ধরে রাখে, যদিও পূর্ণ কপির বিকল্প নয়।
  • গোপনীয়তা। Memory-তে password, ব্যক্তিগত ডেটা, বার্তা থাকতে পারে। কপিটি সবচেয়ে সংবেদনশীল প্রমাণের একটি। Encrypted অবস্থায় রাখা আর সীমিত হাতে দেওয়া দরকার।
  • Cloud-এ ভিন্নতা। ক্ষণস্থায়ী container কয়েক মিনিটে হারিয়ে যায়। তাই সেখানে আগে থেকে log পাঠানো আর snapshot-এর পরিকল্পনাই বেশি বাস্তব।

তাই উত্তর একটি নিয়ম নয়, একটি প্রস্তুতি। Playbook-এ আগে ঠিক করুন, কোন ধরনের ঘটনায়, কোন host-এ, কে, কোন tool-এ memory নেবেন। আমাদের উদাহরণে restart আগে হয়ে যাওয়ায় সেই সুযোগ হারিয়েছিল।

মূল উপলব্ধি: Memory সংগ্রহের সিদ্ধান্ত ঘটনার রাতে নয়, শান্ত সময়ে নিতে হয়। আর যা করা হলো, যা করা গেল না, দুটোই নথিতে থাকে।

প্র ০৪অভিজ্ঞ বিশেষজ্ঞও কি পক্ষপাতে ভুল করেন? ডিজিটাল forensic দল কীভাবে এটি কমাতে পারে?

হ্যাঁ, আর অভিজ্ঞতা একা এর প্রতিষেধক নয়। প্রথাগত forensic বিজ্ঞান থেকে একটি শিক্ষণীয় ঘটনা আছে। ২০০৪ সালের Madrid ট্রেন বোমা হামলার তদন্তে FBI একটি আঙুলের ছাপ ভুলভাবে একজন নিরপরাধ মানুষের সাথে মিলিয়েছিল। মার্কিন বিচার বিভাগের Inspector General-এর ২০০৬ সালের রিপোর্ট এই ভুলের পর্যালোচনা করে, আর বিভিন্ন প্রতিবেদনে অতিরিক্ত আত্মবিশ্বাসের কারণে সতর্কবার্তা উপেক্ষার কথা এসেছে।

মনোবিজ্ঞানী Itiel Dror-এর গবেষণাও এই দিকেই দেখায়। Dror ও Charlton-এর ২০০৬ সালের একটি ছোট পরীক্ষায় দেখা যায়, প্রসঙ্গ বদলালে অভিজ্ঞ বিশেষজ্ঞরাও কিছু ক্ষেত্রে নিজের আগের সিদ্ধান্তের সাথে অমিল সিদ্ধান্ত দিয়েছেন। পরীক্ষাটি ছোট ছিল, তাই সংখ্যাকে নয়, প্রবণতাটিকে নিন: প্রসঙ্গ আমাদের দেখার ধরন বদলায়।

ডিজিটাল forensic-এ এই প্রসঙ্গ খুব শক্তিশালী। Ticket-এ “ex-employee করেছেন” লেখা থাকলে সেই নামের সব সারি সন্দেহজনক লাগে। প্রতিকারগুলো বেশিরভাগই প্রক্রিয়াগত:

  • শুরুতে একাধিক ব্যাখ্যা লেখা, নির্দোষ ব্যাখ্যাসহ।
  • প্রথমে প্রমাণ, পরে গল্প: সন্দেহভাজনের নাম জানার আগে timeline বানানো গেলে ভালো।
  • স্বাধীন পুনর্মূল্যায়ন: দ্বিতীয় বিশ্লেষক প্রথমজনের সিদ্ধান্ত না জেনে মূল ডেটা থেকে দেখবেন।
  • বিরোধী সন্ধান: “কী থাকলে আমার ধারণা ভুল হবে” লিখে সেটি খোঁজা।
  • পুনরুৎপাদনযোগ্য কাজ: Query, script আর hash নথিতে রাখা, যাতে অন্য কেউ একই ফল পান।

ACH-এর মতো কাঠামো এখানে কাজে লাগে, কারণ এটি মনকে বিপক্ষের প্রমাণ দেখতে বাধ্য করে। AI যোগ হলে নতুন ঝুঁকি আসে: আত্মবিশ্বাসী সংক্ষেপ নিজেই একটি নোঙর হয়ে যায়।

মূল উপলব্ধি: পক্ষপাত চরিত্রের দোষ নয়, মনের স্বাভাবিক আচরণ। তাই সদিচ্ছায় নয়, প্রক্রিয়া দিয়ে এটি কমাতে হয়।

প্র ০৫“কোনো প্রমাণ পাওয়া যায়নি” বললে কি বোঝায় ঘটনাটি ঘটেনি?

না। এই বাক্যের অর্থ নির্ভর করে আপনি কী দেখার ক্ষমতা রাখতেন তার ওপর। যে জায়গায় রেকর্ডই নেই, সেখানে খালি ফল কিছু প্রমাণ করে না। তাই আগে দুটি প্রশ্ন করুন: এই ঘটনা ঘটলে কোন artifact-এ চিহ্ন থাকত? আর সেই artifact কি ওই সময়ে চালু ও সম্পূর্ণ ছিল?

কিছু উদাহরণ এই পর্বেই পেয়েছেন। Windows Server-এ Prefetch না থাকা। Data event লেখা না থাকলে cloud storage থেকে file পড়ার রেকর্ড না থাকা। ৭ দিনের retention-এ ৮ দিন আগের password চেষ্টার চিহ্ন না থাকা। Memory না নিলে file ছাড়া চলা কোডের চিহ্ন না থাকা।

বাস্তব ঘটনাতেও এটি দেখা গেছে। ২০১৭ সালের Equifax ঘটনার প্রকাশিত সরকারি রিপোর্ট অনুযায়ী, encrypted traffic পরীক্ষার একটি যন্ত্রের certificate দীর্ঘদিন মেয়াদোত্তীর্ণ ছিল। ফলে সেই সময় ওই পথের traffic পরীক্ষা হয়নি। অর্থাৎ নজরদারি থাকার ধারণা ছিল, বাস্তবে দেখার ক্ষমতা ছিল না। Certificate ঠিক করার পরই সন্দেহজনক traffic চোখে পড়ে বলে রিপোর্টে এসেছে।

এর একটি আইনি ও নৈতিক দিকও আছে। গ্রাহকের ডেটা গেছে কি না, এই প্রশ্নের উত্তর যদি “log নেই, তাই জানি না” হয়, তাহলে “কিছু যায়নি” বলা অসৎ। উপাত্ত সুরক্ষা আইন আর চুক্তির দায় সেই পরিস্থিতিতে আলাদাভাবে ভাবতে হয়। আইনি পরামর্শের জন্য যোগ্য আইনজীবীর সাহায্য নিন।

ভালো রিপোর্টের ভাষা তাই এমন: “৯ মার্চ ২০:০০ থেকে ২৪:০০ UTC পর্যন্ত firewall log-এ অন্য কোনো ঠিকানায় বড় transfer দেখা যায়নি। তবে server-এর ভেতরের ফাইল পড়ার রেকর্ড নেই, আর memory সংগ্রহ করা যায়নি।” এতে পাঠক জানেন কোথায় ভরসা করা যায়, আর পরের ঘটনার আগে কোন log চালু করতে হবে।

মূল উপলব্ধি: “দেখা যায়নি” বলার সাথে সবসময় বলুন “কোথায় দেখেছি, আর কোথায় দেখার উপায় ছিল না।” ঘটনার পর সবচেয়ে কাজের শিক্ষা প্রায়ই নতুন log, নতুন retention আর ভালো প্রস্তুতি।

অনুশীলন

সব ডেটা নমুনা। কমান্ড শুধু নিজের file-এ চালাবেন।

  1. সময়ের হিসাব: একটি নমুনা nginx সারির সময় 12/Mar/2026:03:05:10 +0600. সংগ্রহের সময় দেখা গেছে host ঘড়ি ২ মিনিট ৩০ সেকেন্ড পিছিয়ে। ঘটনার সংশোধিত UTC সময় কত?

    প্রথমে offset বাদ: ০৩:০৫:১০ − ৬ ঘণ্টা = আগের দিনের ২১:০৫:১০, অর্থাৎ 2026-03-11 21:05:10Z. Host ঘড়ি পিছিয়ে, তাই যোগ: ২১:০৫:১০ + ২:৩০ = 21:07:40Z. উত্তর ২০২৬-০৩-১১ ২১:০৭:৪০ UTC. তারিখ বদলানো ভুলবেন না। Finding-এ skew-এর উৎসও লিখুন।

  2. আউটপুট অনুমান করুন: t.log file-এ দুটি নমুনা সারি আছে: 2026-03-10T02:14:07+06:00 upload আর 2026-03-09T20:20:00Z login. sort t.log কোন ক্রমে দেখাবে? আসল ঘটনার ক্রম কী?

    sort লেখা হিসেবে তুলনা করে, সময় হিসেবে নয়। 2026-03-09… আগে আসে, তাই আউটপুট:

    2026-03-09T20:20:00Z login
    2026-03-10T02:14:07+06:00 upload

    কিন্তু upload-এর UTC সময় ২০:১৪:০৭, যা login-এর ৫ মিনিট ৫৩ সেকেন্ড আগে। তাই আসল ক্রম উল্টো: upload, তারপর login. আগে সব UTC-তে আনুন, তারপর sort করুন।

  3. Finding সমালোচনা: একজন লিখেছেন: “হ্যাকার 203.0.113.45 থেকে ঢুকে সব গ্রাহকের ডেটা চুরি করেছে। Log মুছে প্রমাণ নষ্ট করেছে। ১০০% নিশ্চিত।” ভুলগুলো ধরুন, আর একটি ভালো রূপ লিখুন।

    সমস্যা: ঠিকানা থেকে ব্যক্তি বা পক্ষ ধরে নেওয়া। “সব গ্রাহক” কোন প্রমাণে? Flow log শুধু আকার বলে। Log-এর ফাঁক মানেই মোছা নয়। “১০০%” আছে, অথচ সীমা বা বিকল্প ব্যাখ্যা নেই।

    ভালো রূপ: “203.0.113.45 ঠিকানা থেকে staff-04 session দিয়ে upload হয়েছে (confidence উচ্চ)। ২০:৪২:৫২Z-এ ১,৮৪২ সারির customers export-এর ৭০ সেকেন্ড পরে 198.51.100.77-এ প্রায় ৪৮ MB গেছে। গ্রাহকের ডেটা বাইরে গিয়ে থাকতে পারে (confidence মাঝারি), ভেতরের লেখা দেখা যায়নি। Local auth log-এ ২০:৪৬:১২ থেকে ২৩:১০:০৩ (host সময়) সারি নেই, কারণ অজানা। Session কীভাবে গেছে, তা অজানা।”

  4. নিজের file-এ পরীক্ষা: নিজের Linux সিস্টেমে একটি নতুন file বানিয়ে তিনটি কাজ করুন: echo hi > note.txt, stat note.txt; এরপর echo more >> note.txt; এরপর chmod 600 note.txt. প্রতিবার stat দেখুন। আগে অনুমান করুন, শেষ কাজের পর কোন সময়টি বদলাবে?

    লেখা যোগ করলে mtime আর ctime দুটোই বদলাবে, কারণ আকারও inode-এ থাকে। chmod-এর পর শুধু ctime বদলাবে, mtime আগের মতো থাকবে। stat-এর Change সারি হলো ctime. Birth file system আর tool version-এর ওপর নির্ভর করে, তাই হয়তো দেখাবে না। এই অনুশীলনটি নিজের file-এই সীমিত রাখুন।

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

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

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

  1. অনুমোদন নিশ্চিত করে প্রমাণের কপি আর hash নেওয়া
  2. প্রতিটি উৎসের timezone আর ঘড়ির পার্থক্য নোট করা
  3. সব সময় UTC-তে এনে ঘড়ি সংশোধন করা
  4. এক ক্রমে সাজিয়ে অসঙ্গতি আর ফাঁক খোঁজা
  5. একাধিক hypothesis যাচাই করা
  6. Confidence-সহ finding লেখা

একটি Linux file-এ শুধু chmod চালানো হলো। কোন সময়টি বদলাবে?

  • mtime
  • ctime
  • atime
  • Birth time

একটি Windows Server-এ কোনো প্রোগ্রামের Prefetch file পাওয়া গেল না। সবচেয়ে সঠিক সিদ্ধান্ত কোনটি?

  • প্রোগ্রামটি কখনো চলেনি
  • কেউ প্রমাণ মুছে ফেলেছে
  • এটি থেকে কিছু বলা যায় না, Prefetch চালু ছিল কি না আর অন্য artifact দেখতে হবে
  • Disk নষ্ট হয়েছে

একটি log-এর সময় 2026-03-10 02:14:07 +0600. Host ঘড়ি ৯৪ সেকেন্ড পিছিয়ে। সংশোধিত UTC সময় কত?

  • 2026-03-09 20:15:41Z
  • 2026-03-09 20:12:33Z
  • 2026-03-10 02:15:41Z
  • 2026-03-10 08:15:41Z

তদন্তে একটি file-এর mtime খুব পুরোনো, কিন্তু ctime ঘটনার রাতের। সবচেয়ে ভালো পরের ধাপ কোনটি?

  • সঙ্গে সঙ্গে লেখা যে কেউ ইচ্ছা করে সময় বদলেছে
  • পুরোনো mtime ধরে file-টিকে ঘটনার বাইরে রাখা
  • মূল file-এর সময় ঠিক করে দেওয়া
  • পাশের file, deploy নথি আর web log-এর মতো অন্য উৎসে correlate করা

Local auth.log-এ ১৪৪ মিনিটের ফাঁক পাওয়া গেল। সবচেয়ে সঠিক প্রথম কাজ কোনটি?

  • Log মুছে ফেলা হয়েছে বলে রিপোর্ট করা
  • Rotation, restart, disk পূর্ণ হওয়া দেখে কেন্দ্রীয় কপির সাথে মেলানো
  • কয়েক ঘণ্টা তেমন গুরুত্বপূর্ণ নয়, তাই উপেক্ষা করা
  • Server restart করে দেখা log আবার আসে কি না

Analysis of Competing Hypotheses (ACH) পদ্ধতির মূল কৌশল কোনটি?

  • প্রিয় ব্যাখ্যার পক্ষে সবচেয়ে বেশি প্রমাণ জড়ো করা
  • অভিজ্ঞতম বিশ্লেষকের একটি ব্যাখ্যা বেছে নেওয়া
  • একাধিক ব্যাখ্যা পাশাপাশি রেখে দেখা কোন প্রমাণ কোনটির বিপক্ষে যায়
  • Tool-এর স্বয়ংক্রিয় score দিয়ে সিদ্ধান্ত নেওয়া

শব্দকোষ

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

মনে রাখুন

  1. Artifact পড়ার সময় জিজ্ঞেস করুন: কে লিখেছে, কখন, কী প্রমাণ করে, আর কতদিন টেকে।
  2. ctime মানে তৈরির সময় নয়। একটি timestamp-এ ভরসা নয়, correlate করুন।
  3. Timeline-এ আগে UTC, তারপর ঘড়ির সংশোধন, তারপর ক্রম আর ফাঁক খোঁজা।
  4. সময়, ঠিকানা, account আর path ধরে pivot করুন, আর ব্যাখ্যা বাদ দিতে বিপক্ষের প্রমাণ খুঁজুন।
  5. Finding-এ প্রমাণ, confidence আর অজানা আলাদা লিখুন। “দেখা যায়নি” মানে “ঘটেনি” নয়।

পরের পর্বে: এতক্ষণ কাল্পনিক ঘটনা দেখলেন। পর্ব ৬৫-তে প্রকাশিত বাস্তব breach-এর রিপোর্ট থেকে দেখবেন প্রতিরক্ষায় কী ব্যর্থ হয়েছিল, আর কী তা ঠেকাতে পারত।

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

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