পাঠ ০৯ · ৬০-এর মধ্যে · মডিউল ২
Home / Courses / Cybersecurity & Ethical Hacking / MITM, ARP ও DNS স্পুফিং

নেটওয়ার্ক অ্যাটাক — MITM, ARP ও DNS স্পুফিং

Network attacks — MITM, ARP & DNS spoofing
৯ মিনিট পড়া শুরু · Beginner Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • MITM অ্যাটাকের মূল ধারণা — দুই পক্ষের মধ্যে "অদৃশ্য" তৃতীয় পক্ষ
  • ARP স্পুফিং ঠিক কীভাবে লোকাল নেটওয়ার্কে কাজ করে
  • DNS স্পুফিং/কেশ পয়জনিং কী এবং কেন এটি বিপজ্জনক
  • এই অ্যাটাকগুলো ঠেকানোর জন্য প্রতিরক্ষামূলক কৌশল ও ডিটেকশন লজিক

১ · Man-in-the-Middle (MITM) — মূল ধারণা

Man-in-the-Middle (MITM)MITMএকজন আক্রমণকারী দুই পক্ষের মধ্যে যোগাযোগ গোপনে রিলে বা পরিবর্তন করে, যখন উভয় পক্ষ বিশ্বাস করে তারা সরাসরি একে অপরের সাথে কথা বলছে। একটি ছাতা-শব্দ যা এমন যেকোনো অ্যাটাককে বোঝায় যেখানে আক্রমণকারী দুই পক্ষের মাঝখানে বসে ট্র্যাফিক পড়ে, রেকর্ড করে, বা পরিবর্তন করে দেয় — অথচ দুই পক্ষই মনে করে তারা সরাসরি একে অপরের সাথে যোগাযোগ করছে। L07-এ VPN যে সমস্যা সমাধান করে, MITM ঠিক সেই সমস্যাটিই তৈরি করে। নিচে দুটি সবচেয়ে সাধারণ MITM কৌশল দেখব — ARP স্পুফিং (লোকাল নেটওয়ার্কে) ও DNS স্পুফিং (নাম-রেজোলিউশনে)।

২ · ARP স্পুফিং — লোকাল নেটওয়ার্কে ট্র্যাফিক চুরি

একটি লোকাল নেটওয়ার্কে (যেমন একটি অফিস বা বাসার ওয়াইফাই), ডিভাইসগুলো ARP (Address Resolution Protocol)ARPএকটি IP ঠিকানাকে সংশ্লিষ্ট MAC (হার্ডওয়্যার) ঠিকানায় ম্যাপ করার প্রোটোকল, লোকাল নেটওয়ার্কে ব্যবহৃত হয়। ব্যবহার করে একটি IP ঠিকানাকে একটি MAC (হার্ডওয়্যার) ঠিকানায় ম্যাপ করে, যাতে জানা যায় কোন ফিজিক্যাল ডিভাইসে ডেটা পাঠাতে হবে। ARP স্পুফিং-এ আক্রমণকারী ভুয়া ARP রিপ্লাই পাঠিয়ে দাবি করে "এই IP-টি আমার MAC ঠিকানার" — যদি অন্য ডিভাইসগুলো এই মিথ্যা তথ্য বিশ্বাস করে নেয় (ARP-তে কোনো বিল্ট-ইন যাচাইকরণ নেই), তখন সেই IP-এর উদ্দেশ্যে পাঠানো ট্র্যাফিক আসলে আক্রমণকারীর ডিভাইসে চলে যায়।

৩ · DNS স্পুফিং / কেশ পয়জনিং

DNS স্পুফিংDNS Spoofing / Cache Poisoningএকজন আক্রমণকারী একটি ভুয়া DNS রেসপন্স প্রদান করে, একটি ডোমেইন নামকে একটি ম্যালিশাস IP ঠিকানায় পুনর্নির্দেশিত করে। একই ধরনের বিশ্বাস-ভঙ্গের কৌশল, কিন্তু ভিন্ন স্তরে — এখানে আক্রমণকারী একটি ভুয়া DNS রেসপন্স দেয় (যেমন "example.com মানে 198.51.100.66" যদিও প্রকৃত IP ভিন্ন), যাতে ভিকটিমের ব্রাউজার সঠিক ডোমেইন নাম টাইপ করা সত্ত্বেও একটি ম্যালিশাস সার্ভারে পৌঁছে যায়। এটি বিশেষভাবে বিপজ্জনক কারণ ভিকটিম কিছুই ভুল করেনি — ঠিকানা বারে সঠিক ডোমেইনই টাইপ করেছে।

৪ · প্রতিরক্ষা — এই অ্যাটাকগুলো কীভাবে ঠেকানো যায়

HTTPS/TLS
পুরো ট্র্যাফিক এনক্রিপ্টেড থাকলে একজন passive MITM কনটেন্ট পড়তে পারে না — যদিও redirection পুরোপুরি ঠেকে না।
Static ARP এন্ট্রি
গুরুত্বপূর্ণ ডিভাইসের জন্য ARP ম্যাপিং ম্যানুয়ালি ফিক্সড রাখলে ভুয়া ARP রিপ্লাই দিয়ে ওভাররাইট করা যায় না।
DNSSEC
DNS রেসপন্সে ডিজিটাল স্বাক্ষর যোগ করে, যাতে একটি জাল রেসপন্স যাচাই করে প্রত্যাখ্যান করা যায় (L36-এর সিগনেচার ধারণার প্রয়োগ)।
VPN
L07-এর এনক্রিপ্টেড টানেল একটি লোকাল নেটওয়ার্ক-স্তরের MITM-কে অর্থহীন করে দেয়, কারণ ট্র্যাফিক আগেই এনক্রিপ্টেড।

৫ · সিমুলেশন — ARP স্পুফিং ও ডিটেকশন

নিচের কোড সেলে আমরা একটি সরল ইন-মেমরি ARP টেবিল সিমুলেট করছি। প্রথমে দেখব কীভাবে একটি ভুয়া এন্ট্রি টেবিলে "স্পুফ" হয়ে যায়, তারপর একটি defensive detection ফাংশন দেখব যা একটি বিশ্বস্ত baseline টেবিলের সাথে তুলনা করে অসঙ্গতি ধরে ফেলে — এটিই বাস্তবে ARP-স্পুফিং-ডিটেকশন টুলের মূল লজিক।

Python
# সিমুলেটেড ARP টেবিল — ইন-মেমরি dict, বাস্তব নেটওয়ার্ক ইন্টারফেস নয়
arp_table = {
    "192.168.1.1": "AA:AA:AA:AA:AA:01",   # রাউটার/গেটওয়ে
    "192.168.1.10": "BB:BB:BB:BB:BB:10",  # ফাইল সার্ভার
}

# একটি বিশ্বস্ত baseline — নেটওয়ার্ক স্বাভাবিক অবস্থায় থাকাকালীন রেকর্ড করা
known_good_table = dict(arp_table)

def spoof_arp_entry(table, target_ip, attacker_mac):
    """আক্রমণকারী একটি ভুয়া ARP রিপ্লাই পাঠিয়ে এন্ট্রি ওভাররাইট করছে (সিমুলেশন)।"""
    table[target_ip] = attacker_mac
    return table

def detect_arp_spoofing(table, baseline):
    """ডিফেন্সিভ ডিটেকশন: বর্তমান টেবিলকে বিশ্বস্ত baseline-এর সাথে তুলনা করা।"""
    mismatches = []
    for ip, mac in table.items():
        if ip in baseline and baseline[ip] != mac:
            mismatches.append((ip, baseline[ip], mac))
    return mismatches

print("স্পুফিংয়ের আগে:", arp_table)

# আক্রমণকারী গেটওয়ের IP-কে নিজের MAC-এর সাথে যুক্ত করার চেষ্টা করছে
spoof_arp_entry(arp_table, "192.168.1.1", "EE:EE:EE:EE:EE:66")
print("স্পুফিংয়ের পরে: ", arp_table)
print()

findings = detect_arp_spoofing(arp_table, known_good_table)
if findings:
    for ip, expected_mac, actual_mac in findings:
        print(f"সতর্কতা! {ip}-এর জন্য প্রত্যাশিত MAC {expected_mac}, "
              f"কিন্তু বর্তমানে {actual_mac} — সম্ভাব্য ARP স্পুফিং!")
else:
    print("কোনো অসঙ্গতি পাওয়া যায়নি — টেবিল বিশ্বস্ত।")

    
মূল কথা · Key takeaway

detect_arp_spoofing() ফাংশনটি একটি সাধারণ কিন্তু শক্তিশালী প্যাটার্ন প্রদর্শন করে — বর্তমান অবস্থাকে একটি বিশ্বস্ত baseline-এর সাথে তুলনা করা। এই একই প্যাটার্ন পরে L34-এ রুটকিট-পার্সিস্টেন্স ডিটেকশনেও ব্যবহৃত হবে — অনেক ডিফেন্সিভ সিকিউরিটি টুল আসলে এই একই মৌলিক ধারণার উপর ভিত্তি করে তৈরি: "স্বাভাবিক অবস্থা কী ছিল, এখন কী আছে, পার্থক্য কী প্রকাশ করে।"

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

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

প্র ০১ ARP স্পুফিং কেন শুধুমাত্র একটি লোকাল নেটওয়ার্কের (যেমন একই অফিস বা ওয়াইফাই-এর) মধ্যে কাজ করে, ইন্টারনেটজুড়ে নয়?

ARP একটি লোকাল-নেটওয়ার্ক-স্তরের প্রোটোকল — এটি শুধু একই সাবনেটে/সেগমেন্টে থাকা ডিভাইসগুলোর মধ্যে IP-কে MAC-এ ম্যাপ করে। একটি ARP রিপ্লাই রাউটারের বাইরে যায় না। তাই একজন আক্রমণকারীকে ARP স্পুফিং করতে হলে ভিকটিমের সাথে একই লোকাল নেটওয়ার্কে থাকতে হবে — এই কারণেই পাবলিক ওয়াইফাই এই অ্যাটাকের জন্য একটি সাধারণ লক্ষ্যস্থল।

প্র ০২ HTTPS একটি MITM অ্যাটাককে সম্পূর্ণ অকার্যকর করে দেয় না কেন — এটি ঠিক কী রক্ষা করে আর কী করে না?

HTTPS ট্র্যাফিকের কন্টেন্ট এনক্রিপ্ট করে, তাই একজন passive MITM (শুধু পড়ছে) কিছু বুঝতে পারে না। কিন্তু HTTPS একজন আক্রমণকারীকে ট্র্যাফিক রুট করা থেকে আটকায় না (যেমন ARP/DNS স্পুফিং দিয়ে redirection এখনো ঘটতে পারে) — যদিও ভিকটিমের ব্রাউজার ভুয়া সার্টিফিকেট নিয়ে একটি সতর্কতা দেখাবে (L37-এর PKI trust chain এখানে কাজ করে), যা সতর্ক ব্যবহারকারীকে সাবধান করে।

প্র ০৩ উপরের কোড সেলে known_good_table কেন arp_table-এর সাথে একই object না হয়ে একটি আলাদা কপি (dict(arp_table)) হিসেবে তৈরি করা হয়েছে?

যদি known_good_table = arp_table লেখা হতো (কপি না করে), দুটি ভ্যারিয়েবল একই dict object-কে নির্দেশ করত — তখন arp_table পরিবর্তন করলে known_good_table-ও স্বয়ংক্রিয়ভাবে পরিবর্তিত হয়ে যেত, এবং কখনোই কোনো অসঙ্গতি ধরা পড়ত না। dict() দিয়ে একটি স্বাধীন কপি তৈরি করাই নিশ্চিত করে যে baseline-টি "জমাট" থাকে এবং পরবর্তী পরিবর্তনের সাথে তুলনা করা যায়।

অনুশীলন

  1. চিন্তা করুন: একটি অফিস নেটওয়ার্কে static ARP এন্ট্রি ব্যবহার করা সাধারণত শুধু গুরুত্বপূর্ণ কিছু ডিভাইসের (যেমন গেটওয়ে, সার্ভার) জন্য করা হয়, প্রতিটি ডিভাইসের জন্য নয় কেন?

    Static ARP এন্ট্রি ম্যানুয়ালি কনফিগার ও রক্ষণাবেক্ষণ করতে হয় — একটি বড় নেটওয়ার্কে প্রতিটি ডিভাইসের জন্য এটি করা ব্যবহারিকভাবে অসম্ভব ও প্রায়ই ডিভাইস পরিবর্তনের সাথে ভেঙে যায় (মেইনটেন্যান্স ওভারহেড)। তাই সবচেয়ে গুরুত্বপূর্ণ, সবচেয়ে বেশি আক্রমণ-লক্ষ্য ডিভাইসগুলোতে (গেটওয়ে, ডোমেইন কন্ট্রোলার) এটি প্রয়োগ করাই ব্যবহারিক সমাধান — একটি ঝুঁকি-ভিত্তিক ট্রেড-অফ।

  2. পরীক্ষা করুন: উপরের কোড সেলে spoof_arp_entry কল করার আগে detect_arp_spoofing(arp_table, known_good_table) চালান এবং ফলাফল লক্ষ্য করুন, তারপর স্পুফিংয়ের পরে আবার চালিয়ে পার্থক্য দেখুন।

    স্পুফিংয়ের আগে detect_arp_spoofing একটি খালি তালিকা ফেরত দেবে, কারণ তখনও arp_table ও known_good_table অভিন্ন। স্পুফিংয়ের পরে একই ফাংশন 192.168.1.1-এর জন্য একটি অসঙ্গতি রিপোর্ট করবে — এটি স্পষ্টভাবে দেখায় ডিটেকশন লজিকটি আসলে কাজ করছে, শুধু তাত্ত্বিক নয়।

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

আগের পাঠ
প্যাকেট অ্যানালাইসিস ও Wireshark বেসিকস