ARP欺骗学习以及mj的hook代码还原

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表项)

来看看我们需要的数据结构
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; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值