ARP欺骗学习以及mj的hook代码还原
文章作者:zhuwg
信息来源:邪恶八进制信息安全团队( www.eviloctal.com)
ARP协议是建立在信任局域网内所有结点的基础上的,它很高效,但却不安全。它是无状态的协议,不会检查自己是否发过请求包,也不管(其实也不知道)是否是合法的应答,只要收到目标MAC是自己的ARP reply包或arp广播包(包括ARP request和ARP reply),都会接受并缓存。这就为ARP欺骗提供了可能,恶意节点可以发布虚假的ARP报文从而影响网内结点的通信,甚至可以做“中间人”。
1、假冒ARP reply包(单播)
XXX,I have IP YYY and my MAC is ZZZ!
2、假冒ARP reply包(广播)
Hello everyone! I have IP YYY and my MAC is ZZZ!
向所有人散布虚假的IP/MAC
3、假冒ARP request(广播)
I have IP XXX and my MAC is YYY.
Who has IP ZZZ? tell me please!
表面为找IP ZZZ的MAC,实际是广播虚假的IP、MAC映射(XXX,YYY)
4、假冒ARP request(单播)
已知IP ZZZ的MAC
Hello IP ZZZ! I have IP XXX and my MAC is YYY.
5、假冒中间人
欺骗主机(MAC为MMM)上启用包转发
向主机AAA发假冒ARP Reply:
AAA,I have IP BBB and my MAC is MMM,
向主机BBB发假冒ARP Reply:
BBB,I have IP AAA and my MAC is MMM
其中中间人欺骗可以在交换型的网络监听目标的数据包,欺骗其他机器把网关地址指向自己的mac
如果欺骗目标把网关指向1个不存在的地方可以实现切断网络的作用 网络执法官就是这么实现的,其他类型的聚生网管 网络剪刀手原理一样
关于arpreply和arprequest
在arp 攻击中,reply包和request包效果是一样的,但要注意正常情况下reply包是点对点的(但我们在攻击欺骗时也可以广播),所以我们只能监听到发往自己的arp raply包或者是我们自己发往别人的reply包,但要注意,并不是本机接收到任何arp request包都会更新自己的arp缓存表(这一点不同于arp reply包),对于收到reply包的主机一定会更新本机的arp缓存,而收到request包的主机只有当该request包的目的ip地址(target ip address)和本机ip地址一致时才会更新本机的arp缓存。
最简单的防护手段事绑定网关mac 或者划分VLAN
有1个小工具可以实现这个功能ARPGuard-自动默认网关IP 和网关的MAC绑定(使用DeleteIpNetEntry和CreateIpNetEntry修改ARP Cache表项)
来看看我们需要的数据结构
把上面定义的两种结构封装成1个结构方便后面使用
下面我们需要的是按照要求填充这个结构,然后把这个数据发给目标机器,这样就起到作用了
然后就可以直接用SendPacket(ARPPacket,sizeof(ARPPacket))把这个包发出去,另外说1下,winpcap确实是1个不错的工具,在测试网络数据包的时候是很方便的,安装了winpcap之后,一些依赖winpcap工作的抓包软件就有选择网卡设备的选项了,可以看见,网络设备都是/Device/NPF_后面一堆GUID数据,mj0011里面就有判断创建设备的时候设备名前面是否是/Device/NPF_ 如果是就hook他的irp_mj_write,就是在网卡接受到数据之前先处理,之所以网络执法官宣称一般的软件防火墙无法防御ARP攻击,其原因就是 ARP包是属于底层包,单纯的上层防护是不起作用的,必须深入驱动,有了驱动以后可以直接在网卡数据处理之前拦截,才能发挥其保护作用
从这个原理 我们来看看mj的hook代码
真正关心的部分应该是那个mac和对应的ip地址,作为比较 ,需要首先有1个正确的网关ip和mac
mj0011是从应用层传输过来的,然后从接受到的包中处理mac并且检测是否为arp攻击包
首先可以判断ip是否为网关,然后看看mac是否为正确的网关
不过也可以直接判断mac是否为正确的网关,因为一切企图改变网关ip地址与其mac的都是攻击行为
个人认为其关键就是确保网关正确的mac不被非法修改,这一点保证了,arp攻击问题就解决了1大半了
信息来源:邪恶八进制信息安全团队( www.eviloctal.com)
ARP协议是建立在信任局域网内所有结点的基础上的,它很高效,但却不安全。它是无状态的协议,不会检查自己是否发过请求包,也不管(其实也不知道)是否是合法的应答,只要收到目标MAC是自己的ARP reply包或arp广播包(包括ARP request和ARP reply),都会接受并缓存。这就为ARP欺骗提供了可能,恶意节点可以发布虚假的ARP报文从而影响网内结点的通信,甚至可以做“中间人”。
1、假冒ARP reply包(单播)
XXX,I have IP YYY and my MAC is ZZZ!
2、假冒ARP reply包(广播)
Hello everyone! I have IP YYY and my MAC is ZZZ!
向所有人散布虚假的IP/MAC
3、假冒ARP request(广播)
I have IP XXX and my MAC is YYY.
Who has IP ZZZ? tell me please!
表面为找IP ZZZ的MAC,实际是广播虚假的IP、MAC映射(XXX,YYY)
4、假冒ARP request(单播)
已知IP ZZZ的MAC
Hello IP ZZZ! I have IP XXX and my MAC is YYY.
5、假冒中间人
欺骗主机(MAC为MMM)上启用包转发
向主机AAA发假冒ARP Reply:
AAA,I have IP BBB and my MAC is MMM,
向主机BBB发假冒ARP Reply:
BBB,I have IP AAA and my MAC is MMM
其中中间人欺骗可以在交换型的网络监听目标的数据包,欺骗其他机器把网关地址指向自己的mac
如果欺骗目标把网关指向1个不存在的地方可以实现切断网络的作用 网络执法官就是这么实现的,其他类型的聚生网管 网络剪刀手原理一样
关于arpreply和arprequest
在arp 攻击中,reply包和request包效果是一样的,但要注意正常情况下reply包是点对点的(但我们在攻击欺骗时也可以广播),所以我们只能监听到发往自己的arp raply包或者是我们自己发往别人的reply包,但要注意,并不是本机接收到任何arp request包都会更新自己的arp缓存表(这一点不同于arp reply包),对于收到reply包的主机一定会更新本机的arp缓存,而收到request包的主机只有当该request包的目的ip地址(target ip address)和本机ip地址一致时才会更新本机的arp缓存。
最简单的防护手段事绑定网关mac 或者划分VLAN
有1个小工具可以实现这个功能ARPGuard-自动默认网关IP 和网关的MAC绑定(使用DeleteIpNetEntry和CreateIpNetEntry修改ARP Cache表项)
来看看我们需要的数据结构
Copy code
//定义一个以太网头部
typedef struct ehhdr
{
UCHAR eh_dst[6]; /* destination ethernet addrress */
UCHAR eh_src[6]; /* source ethernet addresss */
USHORT eh_type; /* ethernet pachet type */
}EHHEADR, *PEHHEADR;
//28字节的ARP请求/应答
typedef struct arphdr
{
USHORT arp_hrd; /* format of hardware address */
USHORT arp_pro; /* format of protocol address */
UCHAR arp_hln; /* length of hardware address */
UCHAR arp_pln; /* length of protocol address */
USHORT arp_op; /* ARP/RARP operation */
UCHAR arp_sha[6]; /* sender hardware address */
ULONG arp_spa; /* sender protocol address */
UCHAR arp_tha[6]; /* target hardware address */
ULONG arp_tpa; /* target protocol address */
}ARPHEADR, *PARPHEADR;
把上面定义的两种结构封装成1个结构方便后面使用
Copy code
typedef struct arpPacket
{
EHHEADR ehhdr;
ARPHEADR arphdr;
} ARPPACKET, *PARPPACKET
下面我们需要的是按照要求填充这个结构,然后把这个数据发给目标机器,这样就起到作用了
Copy code
ARPPACKET ARPPacket;
ARPPacket.ehhdr.eh_type=htons(0x0806); //数据类型ARP请求或应答
ARPPacket.arphdr.arp_hrd = htons(0x0001); //硬件地址为0x0001表示以太网地址
ARPPacket.arphdr.arp_pro = htons(0x0800); //协议类型字段为0x0800表示IP地址
ARPPacket.ehhdr.eh_dst=0x0041d842c674 //被欺骗机的MAC
ARPPacket.ehhdr.eh_src=0x00005e030104 //我自己机的源MAC
ARPPacket.arphdr.arp_hln = 6;
ARPPacket.arphdr.arp_pln = 4;
ARPPacket.arphdr.arp_op = htons(0x0002); //ARP应答值为2
ARPPacket.arphdr.arp_spa = 0x0x0041d842c674 //伪造的MAC,在这里我自己机的,如果把这个改成1个不存在的地址 比如FFFFFFFFFF 那么就会有断网作用了
ARPPacket.arphdr.arp_tha = 0x00005e030104 //
ARPPacket.arphdr.arp_spa =inet_addr("10.22.218.254"); //要伪造的IP地址,一般就是网关
//如果要实现IP冲突 这里可以写成被欺骗的机器的ip 但是上面的mac一定不能和被欺骗机器真实man一样 这样就会提示ip冲突,不过仅仅2k会不停弹出提示,xp和2k3都只有右下的气泡提示了
ARPPacket.arphdr.arp_tpa = inet_addr("10.22.218.180"); //被欺骗机的IP地址
SendPacket(ARPPacket,sizeof(ARPPacket));
然后就可以直接用SendPacket(ARPPacket,sizeof(ARPPacket))把这个包发出去,另外说1下,winpcap确实是1个不错的工具,在测试网络数据包的时候是很方便的,安装了winpcap之后,一些依赖winpcap工作的抓包软件就有选择网卡设备的选项了,可以看见,网络设备都是/Device/NPF_后面一堆GUID数据,mj0011里面就有判断创建设备的时候设备名前面是否是/Device/NPF_ 如果是就hook他的irp_mj_write,就是在网卡接受到数据之前先处理,之所以网络执法官宣称一般的软件防火墙无法防御ARP攻击,其原因就是 ARP包是属于底层包,单纯的上层防护是不起作用的,必须深入驱动,有了驱动以后可以直接在网卡数据处理之前拦截,才能发挥其保护作用
从这个原理 我们来看看mj的hook代码
真正关心的部分应该是那个mac和对应的ip地址,作为比较 ,需要首先有1个正确的网关ip和mac
mj0011是从应用层传输过来的,然后从接受到的包中处理mac并且检测是否为arp攻击包
Copy code
int checkarp(int DeviceObject,PIRP Irp,PVOID SystemBuffer)
{
ARPPACKET ARPBuffer;
ARPBuffer=(ARPPACKET )SystemBuffer;
if ARPBuffer.ehhdr.eh_type==htons(0x0806) //数据类型ARP请求或应答
{if ARPBuffer.arphdr.arp_hrd == htons(0x0001)//硬件地址为0x0001表示以太网地址
{if ARPBuffer.arphdr.arp_pro == htons(0x0800) //协议类型字段为0x0800表示IP地址
{ if ARPBuffer.arphdr.arp_hln == 6
{ if ARPBuffer.arphdr.arp_pln == 4
//好了 到这里了 可以开始判断mac或者ip是不是合法包还是欺骗包了
首先可以判断ip是否为网关,然后看看mac是否为正确的网关
不过也可以直接判断mac是否为正确的网关,因为一切企图改变网关ip地址与其mac的都是攻击行为
个人认为其关键就是确保网关正确的mac不被非法修改,这一点保证了,arp攻击问题就解决了1大半了
Copy code
if (IsMacGateWay(ARPBuffer.ehhdr.eh_src)!=1)
{Irp->IoStatus.Status=STATUS_INVALID_PARAMETER;
IofCompleteRequest(Irp,0);
return 0;
}
}
}
}
_asm
{
push Irp
push DeviceObject
call RealWriteDispatch
}
return 0;