e股脑电脑教程网
  • 首 页
  • 操作系统
  • 应用软件
  • 下载工具
  • 影音视频
  • 办公软件
  • 媒体制作
  • 网站建设
  • 平面设计
  • 数据库
  • 程序开发
  • 视频教程
编辑推荐: | 文章搜索:
您现在的位置: e股脑 >> 操作系统 >> FreeBSD教程 >> ARP地址解析协议详解及其漏洞分析. --保存 >> 教程正文
 
教程搜索
 
 
相关教程
  • 开始接触FREEBSD
  • FreeBSD下Console功能设置
  • 达到 ipnat 180万的极致点
  • FreeBSD内存管理系统理解(一)
  • How do I use a console resolution o
  • apache压缩技术与配置
  • OpenBSD 内核 PPPoE 补丁
  • FreeBSD代码同步手记
  • port安装php+apche+mysql
  • ARP地址解析协议详解及其漏洞分析. --
  • isc dhcpd 3.0 快速安装实例 . --保存
  • 也做一块网卡多个IP的配置
  • RH下的透明代理及带宽分配
  • freebsd安装笔记
  • 转《善加利用與管理你的ports / packa
  • Apache +tomcat安装配置
 
 

图文教程


  • Windows抢了谁的饭碗 非主流操作系统To

  • 地球还是火星 平常心看“非主流”

  • 综合运用Office 2007批量制作奖状

  • 没有系统盘如何才能修复受损系统?

  • 巧妙运用Excel中边界的附加功能!
 
 
赞 助 商
 
 
ARP地址解析协议详解及其漏洞分析. --保存
  • 来源:e股脑
  • 点击次数:
  • 更新时间:2007-8-17

*

* 以太网解释协议(ARP). 文件名:/sys/netinet/if_ether.c

* 注释:xie_minix

*一,函数入口:

*

* 以太网解释协议(ARP). 文件名:/sys/netinet/if_ether.c

* 注释:xie_minix

*一,函数入口:

* ARP有两个入口:1

* 由ether_input发出一软中断(见我的ethernet网络代码详解一文),arpintr中断例程被调用,检查完数据后

* 该中断例程调用in_arpinput函数.

* 入口2:

* 由ether_output函数在查询输出的硬件地址时,调用arpresolve函数进行地址解析.

* 所以,ARP基本上是和ether网输出密切相关的.

*二,相关的结构:

* 关于他使用的结构方面,llinfo_arp是和路由相关的一个结构,ether_arp结构是一个遵循RFC826的一个ARP包的结构.

*三,学习顺序:

* 在看本文的时候,一般从函数arpintr(中断例程)开始看,紧接着看in_arpinput函数.再看看支撑函数arplookup后停止,这是第一入口.

* arpresolve是第二入口的开始,他是解析地址的函数,如果解析不了,调用arprequest函数发送一ARP请求包,第二入口结束.

* 关于arp_rtrequest函数和路由函数相关,作用是添加或删除一ARP节点.如果看不懂,可到以后的路由函数讲解时再了解.

*四,ARP欺骗的核心内实现:

* 在整个程序中,有hack------是我加入的代码,一直到end------结束,大概有十来段这样的代码,是用来实现ARP欺骗,下面我简要的讲一

* 讲他的实现原理:

* 在我们开机后,系统初始化阶段,确切的说是在arp_ifinit初始函数被调用时,将发送一免费ARP,所谓免费,是指要寻找的IP地址是我自

* 己的IP地址,那么网络上如果有和我相同的IP地址的机器(IP地址冲突),他就会根据我的这个ARP包中的发送源硬件地址应答一个ARP

* 包给我,我的接收函数就能判断是否有人和我的IP设置的是一样的.初始化函数不但在开机后初始化时实行,而且在你执行ifconfig改变

* IP地址时也会调用,如果要进行ARP欺骗,那么你就不能发送一免费ARP包,要不然对方的机器会记录下你的欺骗.这一点是其他的关于

* ARP欺骗方式在用户区域所不能达到的.在你的机器冒充另外一台机器期间,会遇见两种情况,第一种是:被冒充的机器发送一个ARP

* 请求,因为是广播发送,所以你也接到了该请求,被请求的机器会应答一ARP,这时我们也要应答一ARP,不过要比真正的那台机器晚一点

* (在程序中我用的是DELAY延迟500毫秒,该数据可以进行调整,以适合你本地网络中较慢的机器),他就在被冒充的机器上进行覆盖前

* 一个回应,使得被冒充的机器认为你就是他要找的机器,当然被冒充的机器紧接着将发送IP包给你的机器,由于你的IP层会判断包的目的


* IP地址(肯定目的IP不对,因为被欺骗了),所以IP层会将他抛弃.第二种情况是:有其他的机器想和被欺骗的机器相联系,其他机器也将广播

* 一ARP请求,目的IP是被欺骗机器的IP,首先被欺骗主机会回应一ARP,我们也和被欺骗主机一样回应一ARP,覆盖被欺骗主机的回应.

* 五,漏洞的分析:

* 目前,我所见到的BSD类操作系统都可能被欺骗,其原因是没有判断ARP请求方的目的硬件地址是否是来之于广播地址,而我们进行的

* 所有欺骗都是进行单播方式的请求.

*六,解决方案:

* 在程序中的patch到patch end部分是我的解决方案.主要是对ARP请求部分的目的硬件地址是否是广播地址进行判断,如果要使用,请

* 把注释去掉就行了.

*七,编译:

*对于FreeBSD4.4版本,可直接拷贝覆盖/sys/net/if_ether.c文件,对于当前版本,只要把hack-----到end-----之间的段粘贴到相应的地方.

*本程序在4.4下已经编译通过,由于实验条件不行,实验没有在两台以上机器进行过,在这里希望网友能帮忙测试,测试的方法是:

*1.覆盖原文件后,进行核心编译.

*2.重启动后,执行:

* arp -d -a

* sysctl net.link.ether.inet.ctrlhack=1

* ifconfig vr0 192.168.0.4 255.255.255.0

* ^ ^ ^

* 你的卡 你要冒充的IP 掩码

* 最好是把上面几个命令放到批执行文件中执行.

*3.用被冒充的机器去PING 其他机器,这时候有可能ICMP包能发出几个,但应该立即没有反应.

*4.如果有什么问题,大家可以把他记录,并发布到BBS上,更希望能多测试几种系统.

*

*/

#include "opt_inet.h" /*2个头文件由编译器在编译操作系统核心时产生的一些常量*/

#include "opt_bdg.h"

#include <sys/param.h>

#include <sys/kernel.h>

#include <sys/queue.h> /*队列操作*/

#include <sys/sysctl.h>

#include <sys/systm.h>

#include <sys/mbuf.h> /*缓冲管理*/

#include <sys/malloc.h> /*分配缓冲*/

#include <sys/socket.h> /*主要是sockaddr_in结构要用到*/

#include <sys/syslog.h> /*LOG宏用到,即日志记录*/

#include <net/if.h> /*硬件接口使用的一些结构,if的意思是interface*/


#include <net/if_dl.h> /*链路层的一些数据结构*/

#include <net/if_types.h>

#include <net/route.h> /*和路由相关的函数*/

#include <net/netisr.h> /*注册中断向量用到的函数*/

#include <net/if_llc.h>

#ifdef BRIDGE /*如果定义了桥转发*/

#include <net/ethernet.h>

#include <net/bridge.h>

#endif

#include <netinet/in.h>

#include <netinet/in_var.h>

#include <netinet/if_ether.h>

#include <net/iso88025.h>

/*hack:------------------------*/

#include <machine/clock.h> /*因为要使用DELAY()延迟函数*/

static int arphacklock=0; /*全局变量用的锁*/

struct in_addr gatewayip; /*网关IP*/

struct in_addr oldip; /*我机器老的IP地址*/

static int trueip=0; /*是否使用冒充IP发送ARP请求*/

static u_char ithardaddr[6];/*要冒充机器的硬件地址,在转移到临时缓冲之前由锁来控制其写*/

static int fromsubr=100; /*实验用,看看本机发出ARP请求是那个函数*/

/*end-------------------------*/

#define SIN(s) ((struct sockaddr_in *)s) /*强制转化成sockaddr_in结构,即Internet地址结构,其中s一般是sockaddr结构*/

#define SDL(s) ((struct sockaddr_dl *)s)/*强制转化成sockaddr_dl结构,即ethernet地址结构,其中s一般是sockaddr结构*/

SYSCTL_DECL(_net_link_ether);/*用于sysctl 用法如下:sysctl net.link.ether....=XXX,

SYSCTL_DECL是申明下面的SYSCTL_NODE将继承的节点*/

SYSCTL_NODE(_net_link_ether, PF_INET, inet, CTLFLAG_RW, 0, "");/**/

/*

hack:

static int hackarp=0;

SYSCTL_INT(_net_link_ether_inet, OID_AUTO, ctrlhack, CTLFLAG_RW,&hackarp, 0, "");


/*这方便你在用户区可控制核心变量,用法如下:sysctl net.link.ether.inet.ctlhackarp=1 那么变量hackarp就为1了.

下面的程序会根据hack的真假判断来进行欺骗

*/

/* 一些记时器的值 */

static int arpt_prune = (5*60*1); /* 每5分钟过一遍列表,这个变量是由计时器使用,看看有没有超时ARP结点,有就删除他 */

static int arpt_keep = (20*60); /* 一旦解析了, 保持 20 分钟 */

static int

1 2 3 4 5 6 7 8 9 10 下一页
  • 上一篇教程: isc dhcpd 3.0 快速安装实例 . --保存
  • 下一篇教程: port安装php+apche+mysql
  •  

    关于本站 | 广告联系 | 版权声明 | 使用帮助

    Copyright © 2004-2008 www.egunao.com All rights reserved.