ARP协议为IP地址到硬件地址提供动态映射。 ARP欺骗<==>ARP spoofing<==>ARP病毒<==>ARP poisoning<==>ARP攻击。
|--14字节的以太网头部--|--28字节的ARP请求/应答--|
0~1字节:硬件类型
2~3字节:协议类型
4字节:硬件地址长度
5字节:协议地址长度
6~7字节:操作字段op
8~13字节:sender_MAC
14~17字节:sender_IP
18~23字节:target_MAC
24~27字节:target_IP
op=1是arp 请求报文,target_MAC无效,为0,MAC层广播报文,MAC层的target_MAC 全ff:ff:ff:ff:ff:ff;
op=2是arp 响应报文;
ARP缓存表用于存储其它主机或网关的IP地址与MAC地址的对应关系,每台主机、网关都有一个ARP缓存表,ARP缓存表里存储的每条记录实际上就是一个IP地址与MAC地址对,它可以是静态的,也可以是动态的。如果是静态的,那么该条记录不能被ARP应答包修改;如果是动态的,那么该条记录可以被ARP应答包修改。
主机在实现ARP缓存表的机制中存在一个缺陷,当主机收到一个ARP应答包后,它并不会去验证自己是否发送过这个ARP请求,而是直接将应答包里的MAC地址与IP对应的关系替换掉原有的ARP缓存表里的相应信息.
ARP欺骗的网络现象有:网络频繁掉线;网速突然变慢;甚至上不去网;检测ARP欺骗的方法有下面3种:
snort的arp欺骗检测插件使用的检测方法是方法3:根据IP与MAC地址的绑定关系,判断arp reply中的sender_IP和sender_MAC是否匹配;
void SetupARPspoof(void);是该插件对外提供的唯一接口,
调用 ARPspoofInit() ARPspoofHostInit()
static void ARPspoofInit(struct _SnortConfig sc, char args);
在snort预处理插件链表上挂载 arpspoof检测函数DetectARPattacks(); 这样每一个数据包都会经过该函数处理一次。
并调用 ParseARPspoofArgs()
static void ParseARPspoofArgs(ArpSpoofConfig config, char args);
解析arpspoof 插件的参数,目前仅有一个有效参数 -unicast,是否监控分析单播的arp request包;
static void ARPspoofHostInit(struct _SnortConfig sc, char args);
初始化被监控(保护)的主机列表,读取IP和MAC的绑定关系;
调用 ParseARPspoofHostArgs()
static void ParseARPspoofHostArgs(IPMacEntryList ipmel, char args);
从命令行终端以 如下格式读取IP和MAC的绑定关系
arpspoof_detect_host: 10.10.10.10 29:a2:9a:29:a2:9a
static void DetectARPattacks (Packet p, void context);
这是检测ARP欺骗的核心函数,它对数据包p的处理如下:
1)对于ARP REQUEST 单播包
判断ethernet层 dst MAC 和 ARP层的 target MAC 是否匹配?
2)对于ARP REQUEST 广播包 判断ethernet层src MAC 和 ARP 层的sender MAC是否匹配?
3)对ARP REPLY包
首先判断 ethernet层的src MAC和ARP层的sender MAC是否匹配?
其次判断 ethernet层的dst MAC和ARP层的target MAC是否匹配?
4)根据该数据包p的 sender IP在 IP-MAC绑定关系链表中 查询 right_sender_MAC
判断right_sender_MAC 和数据包p的ethernet层的src MAC是否匹配?
判断right_sender_MAC 和数据包p的ARP层的sender MAC是否匹配?
上述判断匹配步骤,如有一步匹配失败,就报出相应错误,直接返回,不再向下执行。