arp协议报文格式和arp欺骗 详细分析

一、ARP协议简介

ARP,全称Address Resolution Protocol,中文名为地址解析协议,它工作在数据链路层,在本层和硬件接口联系,同时对上层提供服务。

IP数据包常通过以太网发送,以太网设备并不识别32位IP地址,它们是以48位以太网地址传输以太网数据包。因此,必须把IP目的地址转换成以太网目的地址。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。ARP协议用于将网络中的IP地址解析为的硬件地址(MAC地址),以保证通信的顺利进行。

1. ARP和RARP报头结构

ARP和RARP使用相同的报头结构,如图1所示。


(图1 ARP/RARP报头结构)

硬件类型字段:指明了发送方想知道的硬件接口类型,以太网的值为1;

协议类型字段:指明了发送方提供的高层协议类型,IP为0800(16进制);
硬件地址长度和协议长度:指明了硬件地址和高层协议地址的长度,这样ARP报文就可以在任意硬件和任意协议的网络中使用;

操作字段:用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4;

发送方的硬件地址(0-3字节):源主机硬件地址的前3个字节;

发送方的硬件地址(4-5字节):源主机硬件地址的后3个字节;

发送方IP(0-1字节):源主机硬件地址的前2个字节;

发送方IP(2-3字节):源主机硬件地址的后2个字节;

目的硬件地址(0-1字节):目的主机硬件地址的前2个字节;

目的硬件地址(2-5字节):目的主机硬件地址的后4个字节;

目的IP(0-3字节):目的主机的IP地址。

用c描述:

typedef struct arphdr //arp头
{
unsigned short arp_hdr; //硬件类型
unsigned short arp_pro; //协议类型
unsigned char arp_hln; //硬件地址长度
unsigned char arp_pln; //协议地址长度
unsigned short arp_opt; //
unsigned char arp_sha[6]; //发送端以太网地址
unsigned long arp_spa; //发送端ip地址
unsigned char arp_tha[6]; //接收端以太网地址
unsigned long arp_tpa; //接收端ip地址
}ARPHDR,*PARPHDR;

2. ARP和RARP的工作原理

ARP的工作原理如下:

1. 首先,每台主机都会在自己的ARP缓冲区 (ARP Cache)中建立一个 ARP列表,以表示IP地址和MAC地址的对应关系。

2. 当源主机需要将一个数据包要发送到目的主机时,会首先检查自己 ARP列表中是否存在该 IP地址对应的MAC地址,如果有﹐就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。

3. 网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个 ARP响应数据包,告诉对方自己是它需要查找的MAC地址;
4.   源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

RARP的工作原理:

1. 发送主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址;

2. 本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址;

3. 如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用;

4. 如果不存在,RARP服务器对此不做任何的响应;

5. 源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败。

二、解码详解

了解了ARP和RARP协议的报头结构和工作原理后,我们使用科来网络分析系统抓取ARP包,其详细解码,如图2,

(图2 科来网络分析系统中ARP请求包详细解码)

图2显示是一个ARP的请求包的解码,下面我们来详细说明:

硬件类型:1,表示硬件借口类型为以太网类型

协议类型:0x0800,表示发送方提供的高层协议类型是IP

硬件地址长度:表示硬件地址长度为6字节=48位

协议地址长度:表示IP地址长度为4字节=32位

操作类型:1,表示ARP请求

源物理地址:00:14:85:CA:F5:22

源IP地址:192.168.0.92

目标物理地址:00:00:00:00:00:00

目标IP地址:192.168.0.208

ARP回应包和RARP的包类似,我们在这里就不再重复说明。


结构e t h e r _ h e a d e r定义了以太网帧首部;结构a r p h d r定义了其后的5个字段,其信息
用于在任何类型的介质上传送A R P请求和回答; e t h e r _ a r p结构除了包含a r p h d r结构外,
还包含源主机和目的主机的地址。

定义常量

#define EPT_IP   0x0800    /* type: IP */
#define EPT_ARP   0x0806    /* type: ARP */
#define EPT_RARP 0x8035    /* type: RARP */
#define ARP_HARDWARE 0x0001    /* Dummy type for 802.3 frames */
#define ARP_REQUEST 0x0001    /* ARP request */
#define ARP_REPLY 0x0002    /* ARP reply */

定义以太网首部
typedef struct ehhdr
{
unsigned char eh_dst[6];   /* destination ethernet addrress */
unsigned char eh_src[6];   /* source ethernet addresss */
unsigned short eh_type;   /* ethernet pachet type */
}EHHDR, *PEHHDR;

定义以太网arp字段
typedef struct arphdr
{
//arp首部
unsigned short arp_hrd;    /* format of hardware address */
unsigned short arp_pro;    /* format of protocol address */
unsigned char arp_hln;    /* length of hardware address */
unsigned char arp_pln;    /* length of protocol address */
unsigned short arp_op;     /* ARP/RARP operation */

unsigned char arp_sha[6];    /* sender hardware address */
unsigned long arp_spa;    /* sender protocol address */
unsigned char arp_tha[6];    /* target hardware address */
unsigned long arp_tpa;    /* target protocol address */
}ARPHDR, *PARPHDR;

定义整个arp报文包,总长度42字节
typedef struct arpPacket
{
EHHDR ehhdr;
ARPHDR arphdr;
} ARPPACKET, *PARPPACKET;

实例分析下,先看一个请求包

我把原始数据考了过来

0000   ff   ff    ff    ff   ff   ff 00 0c f1 d4 d9 60 08 06 00 01 ...........`....
0010   08 00 06 04 00 01 00 0c f1 d4 d9 60 c0 a8 01 0f ...........`....
0020   00 00 00 00 00 00 c0 a8 01 02                              ..........
根据定义
头6个字节是以太网目的地址 ff ff ff ff ff ff 这是一个广播地址,全网下的所有终端都能接受到

紧跟着的6个字节是以太网源地址就是发送者的mac地址 00 0c f1 d4 d9 60 是我的mac地址

真类型占两个字节 所以是 08 06 到这里以太网头就完了,08 06指的是后面的数据是属于arp包的

接着分析arp包。头两个字节是硬件类型 00 01 接着两个字节是协议类型arp使用的是ip协议代号08 00

硬件地址长度协议地址长度分别是6和4.这与arp报文格式是对应的(更详细信息可以参考TCP-IP详解卷1)

后面的2个字节op指的是这是一个请求包还是应答包,分别对应的值是0x0001和0x0002,原始数据里是  

00 01 所以这是一个请求包,然后6个字节又是发送者mac地址00 0c f1 d4 d9 60 ,后面4个字节是发送者ip

地址c0 a8 01 0f ,换成比较容易理解的10进制格式就是192 168 1 15,这是我的ip,然后的6个字节留空00

00 00 00 00 00 在arp请求包里也可以是其他数据 因为等会 ip地址为c0 a8 01 02 (192.168.1.2)会把自己的mac地址填充那6个字节,


填充完后,arp包里的     发送者硬件地址|目标硬件地址   和 以太网首部的
                                       以太网目的地址|以太网源地址    对调(我把他们对齐了就是上下两个地址对调)

然后在把这个包发送出去,这样一次来回就可以让两台终端互相知道对方的ip和mac。

接着在看下应答数据包

头6个字节是本地的mac地址(00 0c f1 d4 d9 60)。

接着的6个字节就是对方的mac地址(00 40 d0 92 7c 1f),这样就知道了对方地址。加进缓存表

仔细看可以发现应答包比请求包对了18个字节,应答包有60个字节,后面的18个字节是填充字节,构造应答包是不用管,只是把arp包的op(操作类型选择)填充0x0002就可以了

未完待续......

......

继续分析下arp欺骗,这几天的研究成果。

先构造下网络环境 网关:192.168.1.1 mac: aa aa aa aa aa
主机B:192.168.1.2 mac:bb bb bb bb bb    主机c:192.168.1.15   cc cc cc cc cc(破坏者)

arp欺骗有3种基本方式 1. 主机C冒充网关欺骗主机B,
                                       2. 主机c冒充主机B欺骗网关。
                                      3.主机C同时欺骗主机B和网关,实现数据中转,并监听到所有主机B的数据)
详细信息参考收藏的另几篇文章,有详细说明。

==========================================================================

http://www.51cto.com/art/200510/8409.htm               从arp原理到绑定详细配图,经典好文章

http://netsecurity.51cto.com/art/200806/78013.htm ARP协议及欺骗原理

http://netsecurity.51cto.com/art/200803/68429.htm    ARP病毒发起欺骗攻击解决方法

http://www.sudu.cn/info/html/edu/network_security/20040410/178461.html    详谈调用winpcap驱动写arp多功能工具,编者注:WinpCap开发包可以到以下两个网址下载: (1)http://winpcap.polito.it/ , (2)VC知识库工具栏目 )

http://publish.it168.com/2008/0513/20080513001301.shtml      
(编程)另类ARP用法 探测网络中的黑客软件sniffer)

http://netsecurity.51cto.com/art/200710/57667.htm 基于ARP欺骗的网络攻击程序源码

http://www.sudu.cn/info/html/edu/network_security/20040410/178460.html    再谈突破TCP-IP过滤/防火墙进入内网(icmp篇)

http://www.anqn.com/jiamijiemi/3264/2007-09-27/a0987233.shtml arp欺骗DIY编程 (非常精彩的文章)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值