分类: LINUX
2010-05-11 22:10:54
p2p终结者工作原理分析:
原因:
这几天局域网貌似被arp欺骗攻击了,百思不得其解,所以想弄清楚到底怎么回事。于是下了一个最新版的p2p终结者,开了一台虚拟机,模拟攻击自己的虚拟机,本人一般不干坏
事:(。并用winpcap听包。
环境:
192.168.1.1 00:1e:58:8e:6a:8e (Dlink路由器,网关)
192.168.1.101 00:24:8c:15:76:34 (我的机器)
192.168.1.99 00:0c:29:5e:01:ff(被攻击的机器,vmware虚拟机)
部分包入下:(注意00:1e:58:8e:6a:90 也就是 D-Link_8e:6a:90 这个是我的机器虚拟出的假mac地址)
1649 233.810563 D-Link_8e:6a:90 D-Link_8e:6a:8e ARP Who has 192.168.1.1? Tell 0.0.0.0
1650 233.810906 D-Link_8e:6a:8e D-Link_8e:6a:90 ARP 192.168.1.1 is at 00:1e:58:8e:6a:8e (duplicate use of 192.168.1.1 detected!)
这两个包挺奇怪,我觉得主要是用来让路由器生成对这个D-Link_8e:6a:90地址的端口映射关系。具体分析下:
1. 从D-Link_8e:6a:90 到 D-Link_8e:6a:8e的arp请求,这个包是我的机器生成的,它的源mac填的是假mac。目标是路由器(这样这个请求只有路由器会收到了)。 Who has
192.168.1.1? Tell 0.0.0.0请求路由器的mac地址。至于0.0.0.0这个ip地址应该是告诉路由器不要生成假mac和某个ip地址的arp缓存条目。
附:根据路由器的端口学习功能,比如当路由器从端口3收到源地址是假mac的请求时,路由器会建立该假mac和端口3的映射关系。以后有发往假mac的数据帧时,会自动发给3号端
口。
2. 从D-Link_8e:6a:8e 到 D-Link_8e:6a:90的arp响应,这个数据帧应该只有我的机器才能收到,因为路由器已经有了该假mac对应的端口号信息了。
附:我觉得第2步作用不大,我的机器可能会忽略掉该数据帧。关键在第一步在路由器上建立了假mac到端口号的映射关系。
1632 232.355676 00:24:8c:15:76:34 D-Link_8e:6a:8e ARP 192.168.1.99 is at 00:1e:58:8e:6a:90 (duplicate use of 192.168.1.1 detected!)
1631 232.355535 D-Link_8e:6a:90 Vmware_5e:01:ff ARP 192.168.1.1 is at 00:1e:58:8e:6a:90
这两个包是欺骗的关键所在。具体分析如下:
1. 从00:24:8c:15:76:34到D-Link_8e:6a:8e的arp响应。伪造的arp响应,更新了路由器的ip=99的arp缓存(这个是最让人头痛的事情,我用的dlink好像不支持路由器端的ip mac
绑定,静态arp缓存,所以没法破arp攻击)
2. 从D-Link_8e:6a:90 到 Vmware_5e:01:ff的arp响应。伪造的arp响应,更新了被攻击机器的路由器arp缓存(这个可以通过arp防火墙或者什么ip mac绑定的来解决,但是由于上
面一步已经污染了路由器的arp缓存了,所以这个即使防住了好像也没有什么作用)。
综上所述:就是欺骗路由器和被攻击者机器的arp缓存。让被攻击者机器的所有发给网关的数据全部发送给假mac,网关从外面接受的所有数据也都发给假mac。由于假mac就是我的
机器,所以我可以收到从被攻击者出去的所有数据(出去主要就是发给网关的数据了啊,ip=192.168.1.1)。并且收到所有外网发给被攻击者的数据,路由器外网卡收到数据时,
会通过nat之类的转换发给内网的机器。
叙述一下具体的详细的变态的步骤把:
1.被攻击者浏览网页
2.忽略dns解析等。。。
3.被攻击者要发给一个tcp同步请求给比如 1.2.3.4(google的ip地址)
4.组装ip数据包, tcp部分(源端口:6666,目标端口:80),ip部分(源ip=192.168.1.99 目标ip=1.2.3.4)
5.组装数据帧,根据目标ip=1.2.3.4,知道该数据包不在局域网内,所以发给默认网关192.168.1.1(当然也有可能根据路由表什么的发给其他的机器)。由于路由器的arp缓存是
假mac。所以构造的数据帧的源mac=00:0c:29:5e:01:ff, 目标mac=00:1e:58:8e:6a:90。
6.将该数据帧发送到网卡上。
7.路由器收到了该数据帧。(比如是2号端口收到了该数据帧,见23)检查到目标mac不是自己的mac(因为是假mac了啊)。路由器便认为该数据帧是局域网内的数据帧需要转发。直接根据目标的mac地址查找相应的映射端
口号。由于假mac已经成功的在路由器上建立了mac和端口的映射关系了。所以路由器会直接将该数据帧发送给端口3。(有一点又比较奇怪了,据我理解,即使路由上没有该假mac和
端口的映射的话,路由器就会把该数据帧发送到所有端口上,只要我的机器用这个假mac响应路由器也会学习到,并且建立该假mac与端口号的映射关系的,好像也行)
8.我的机器收到了该数据帧。发现目标mac是假mac(嘿嘿,原来是我被我攻击的一个家伙啊)。是割是阉,悉听尊便了。这里假设我放过它了(一般是不会的)。于是我的机器要帮
它在转发给真正的路由器。
9.修改数据帧的源mac=假mac,目标mac=00:1e:58:8e:6a:8e(真正的路由器mac)。ip包体等不变(源ip=192.168.1.99 目标ip=1.2.3.4)。发送到网卡。
10.路由器收到了该数据帧。发现目标mac是自己的,ohyeah!进入到了ip处理单元。发现目标ip不是局域网内(192.168.1.0)。ok,是时候转发给外网卡了。
11.路由器修改ip数据包。tcp部分(源端口=7777,通过nat转换之类的,目标端口=80),ip部分(源ip=180.110.39.144,电信分的。目地ip=1.2.3.4。)
12.封装外网的链路层数据帧。(不太清楚了,没接触过,应该类似于以太网的东西但是绝对不是以太网)
13.将该包发送到外网卡。
14.google的盛情处理。发送了一个syn+ack包回来了。
15.路由器外网卡收到了该数据包。tcp部分(源端口=80,目标端口=7777),ip部分(源ip=1.2.3.4,目地ip=180.110.39.144电信分的)
16.通过nat转换,发现7777的数据应该转发给内网的192.168.1.99:6666。
17.修改该ip数据包。tcp部分(源端口=80,目标端口=6666),ip部分(源ip=1.2.3.4,目地ip=192.168.1.99)
18.封装内网的以太网数据帧。根据arp缓存得到192.168.1.99的mac地址是假mac。(源mac=路由器的mac,目标mac=假mac)
19.根据端口和mac的映射关系,直接发到3号端口上。
20.我的机器收到了该数据帧。发现了目标mac=假mac(嘿嘿,是被我攻击的小子的数据)。是割是阉,悉听尊便了。这里假设我又放过它了(一般还是不会的)。于是我的机器要帮它转发给被攻击的家伙。
21.修改数据帧。源mac=假mac,目标mac=00:0c:29:5e:01:ff(终于出现被攻击者的真实的mac地址了,好像是配角噢,说这么多了才露脸一次唉)。
22.将数据帧发送到网卡。
23.路由器收到了该数据帧。检查到目标mac不是自己的mac(因为是假mac了啊)。路由器便认为该数据帧是局域网内的数据帧需要转发。直接根据这个目标mac的端口映射关系。发送给了被攻击者的所在端口(比如是2号端口).
24.被攻击者收到了该数据帧。
25.被攻击者收到了数据包。tcp部分(源端口=80,目标端口=6666),ip部分(源ip=1.2.3.4,目地ip=192.168.1.99)。恩,跟发出去的时候对应的。google的响应不错,关键扎的就这么慢了- -。(这么多的步骤打字都要打个个把小时的,当然慢了haha~~)
附:这个时候被攻击者收到了服务器响应的syn+ack,由于是收到了ack,所以connect函数这个时候也就返回了,顺便复习一下网络编程:)
注意:如果被攻击者机器使用了arp防火墙,或者静态的ip mac绑定的话。那么7~9步就是不通的了。我就不能监测到被攻击的家伙到底往外发了什么了。但是从外网发给被攻击的家伙的数据还是需要经过我的(路由器端并没有设置ip mac绑定,但是我的dlink不支持设置,郁闷)
结束语:
关键是虚拟一个mac,同时使用arp欺骗网关和被攻击的机器。from:hjlin.cublog.cn