分享

谈谈ARP欺骗那点破事

 astrotycoon 2014-08-03
(一)ARP工作原理、ARP攻击分析叙述:
随着网络设备在接入市场的应用也越来越多;同时遇到的问题也越来越多样,其中最让人头疼的就是ARP的问题。
众所周知,ARP的基本功能就是在以太网环境中,通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。但由于ARP的广播、动态学习等特性注定了它不是一种安全的协议,所以在实际应用中,会由于各种各样的原因使ARP学习失败,从而影响网络的互通性,并进而影响用户的业务稳定运行。
由于ARP处于数据链路层,处于整个OSI开放式七层模型的倒数第二层,所以除了HUB等极少数的、几乎所有跟以太网接口有关的设备,都涉及到ARP处理的问题。如果ARP问题处理不好,带来的影响也是非常巨大的。
在整个internet网络体系中,网络设备主要分为两类:一类就是安装有各种操作系统平台的PC、服务器等host;而另外一类就是负责网络互联的路由器、交换机、防火墙等数据通讯设备。这些设备由于自身所处的网络位置的不同、安全稳定程度的不同、服务的不同,在ARP机制的处理上也不尽相同,当然本文不是要全面阐述ARP的原理和实现,只是希望能够说明并解决或规避在我们的应用环境中出现的问题――我们考虑的范围是Win2K/XP主机和路由器、交换机。
1 ARP基础知识
一般的,正常的ARP过程只需ARP Request和ARP Response两个过程,简单的说就是一问一答,如下:
clip_image002
这记录了局域网内一台IP为192.168.19.180的PC与网关设备(IP为192.168.1.6)之间的ARP交互,该PC发送请求之后,在0.000434秒之后,网关设备做出了回应,此时路由器就学习到了对方的ARP信息:如下:
clip_image004
我们关注的是ARP的过程,而不是结果;来看一下ARP Request:
clip_image006
[Ethernet Header]可以看出,ARP请求的目标地市是全F,也就是广播地址;因为在请求之前,本PC不知道对方的MAC地址,为了确保ARP Request能够让对方收到,以广播形式方式是很自然的选择。在[ARP]中可以看到,发送的源IP和源MAC都是本PC的网卡设置值,这是已知参数;目的IP地址是我要请求的地址,而目的MAC地址是全0,用于表示本PC不知道该参数,暂时忽略/ignore。
网关设备在收到ARP Request之后,会首先读取Sender的IP和MAC地址,并在存入自己的缓冲中,以备后用。因为ARP请求毕竟是广播性质的,如果每次通讯都要完成一个ARP的流程,对于以太网的压力是非常巨大的,为了尽可能减少这种广播的负面影响,这里引入了缓冲机制,这就是ARP Table。
ARP Response又是怎样回应的呢?
clip_image008
先看[Ethernet Header],可以看到以太网目的MAC地址为PC的MAC地址,因为网关设备只要把回应的信息发送给请求者即可,局域网内的其他主机是没有必要同步知道的,这很好理解。在[ARP]中,网关设备把自己的MAC地址填充在ARP Response中,发送给原请求者。
当然收到ARP Response之后也会把这个ARP信息缓存下来,这样一个ARP的过程就完成了。从中可以看出,无论是哪方先发起ARP Request,最终双方都会得到对方的MAC地址信息的。这也是处于减少网络上不必要流量的考虑。
2 免费ARP
整个ARP的体系里基本上就是由ARP Request和Response组成的,从上面的描述中,可以看出Request就是告知对方“我要什么”,而Response是回答“我是什么”。但有些时候也会例外,他们虽然从形式上还是Request和Response的,但它们通常不会不是一问一答的,而是只有其中的一部分,所以通常被称为免费ARP或无为ARP(Gratuitous ARP)。
从作用而言,它们主要是可以分为两类:
1、以ARP Request的形式发送广播,请求自己的MAC地址,目的是探测局域网中是否有跟自己IP地址相同的主机,也就是常说的IP冲突,如下:
clip_image010
正常情况下,这样的报文是不会有回复的,如果有,则说明有冲突发生。
2、以ARP Response的形式发送广播,它通常只是为了把自己的ARP信息通告/更新给局域网全体,这种Response不需要别人请求,是自己主动发送的通告。报文结构如下。
clip_image012
这两种ARP帧虽然都是广播发送的,但目的不同,从帧结构上来说,前者注重的是Target Internet Address,而后者注重的是Sender Hardware Address和Sender Inteernet Address。
RG NBR系列路由器就采用上述第二种方式来发布自己的免费ARP,来防止网内PC机被其它中毒机器恶意修改其ARP Cache中保存的网关正确MAC地址信息;
3 触发ARP动作的事件
当然,如果windows的应用需要通过IP与别的IP地址进行通讯,而且本机ARP Table中没有对方的相应cache时,就会触发ARP自动学习。
另外,通过实验观察,我们发现Wind2K/XP在设置/修改IP、网卡禁用/启用、网线拔插、系统重启的时候,都会连续发送三次免费ARP Request,目的显然是为了判断网络上是否存在IP地址冲突。
对于RG Routers和Layer 3 Switch来说,如果存在上层IP通讯,那么自然需要触发ARP学习过程,这一点跟windows是完全相同的。
在以太网端口设置/修改IP时,路由器、Layer3 Switch会自动发送免费ARP Request报文来探测是否有IP冲突;而在端口shut/no shut、端口线缆拔插、系统重启的时候,路由器又会自动发送免费ARP Response报文,用以把自己的ARP信息通告全体主机。
同时,无论是那种免费ARP,路由器、Layer 3 Switch都只发送一次。
很显然,windows的ARP触发事件跟路由器、Layer 3 Switch是有差别的:
1、Windows/PC作为网络上的一个主机,它可能只是跟少数的几个PC进行信息交互,所以它在非必要情况下不(通过免费ARP Response)把自己的ARP信息广播给所有主机是合理、也是明智的。路由器、Layer 3 Switch虽然不直接参与应用层的处理,但它通常是一个局域网的网关,肩负则所有主机的数据转发任务,也就是说几乎所有的主机跟路由器、Layer 3 Switch之间都会存在ARP交互,与其被动的响应ARP请求,还不如主动的把自己的ARP信息广播给所有主机,这对于降低路由器、Layer 3 Switch的工作负荷、减少网络带宽占用都是有好处的。
2、从免费ARP报文的发送数量来看,Windows发送的免费ARP都是3次,这有利于确保对方成功收到,同时也有利于减少其他主机的免费ARP干扰;而RG路由器、Layer 3 Switch仅仅发送一次,而且任何情况都不再重复,这显然是不够的。
4 异常情况下的ARP处理机制
常见的局域网异常状况有:IP地址冲突、MAC地址冒用、ARP欺骗等,极端情况下还可能IP+MAC同时冒用,下面我们就来具体分析。
4.1 IP地址冲突
1、网关Router设置IP成某PC的地址
有些时候,如用户网络使用windows做代理(NAT),现在要用一个路由器 、Layer 3Switch(IP地址与网关windows相同)来替换当网关;当两者共存时,就会出现Windows IP地址与路由器、Layer 3 Switch冲突的情况。当然还有其他的可能性。
这里,如果路由器、Layer 3 Switch是调试完之后接入局域网的,按照前面的描述,RG路由器、Layer 3 Switch直接发送1个免费ARP Response,这样就强制局域网内的PC学习到路由器、Layer 3 Switch SVI接口的ARP信息,此时原有Windows网关没有任何响应,工作也正常;但此时局域网内的PC关于网关IP的ARP内容却发生了改变,路由器、Layer 3 Switch的SVI接口成为了实际意义上的网关。
clip_image014
如果路由器、Layer 3 Switch是接入局域网之后才开始配置和调试的,那么路由器、Layer3 Switch SVI接口设置IP之后会先发送1个免费ARP Request报文,探测有无地址冲突,如果有,则强制发送免费ARP Response;此时Windows主机提示地址冲突,网卡变为不可用状态,而路由器、Layer 3 Switch SVI接口则成为了实际的网关。
clip_image016
2、Windows设置IP成网关路由器、Layer 3 Switch SVI的IP地址
在网吧、企业网环境中,上点后,路由器工作正常,局域网中的PC学习到的网关ARP信息就是路由器、Layer 3 Switch对应端口的IP和MAC;假设此时内网中有一个Windows PC修改自己的IP地址,不慎和网关IP冲突,会发生什么呢?
clip_image018
从这个抓包情况看,PC修改IP之后,发送免费ARP Request,看是否有地址冲突,这显然是有的,从第二个包就可以看出来,RG Router、Layer 3 Switch SVI回复了一个ARP Response;此时PC桌面上提示IP地址冲突,网卡处于不正常工作状态,用户一般会修改IP地址再次尝试;
而紧随其后的是,路由器、Layer 3 Switch发送了1个免费ARP Request包,用来判断冲突是否继续存在?当然由于Windows对于网卡的管理,导致冲突自动消失,路由器、Layer 3 Switch也就不再有后续动作了。但如果此时冲突继续存在呢?从上面的实验来看,路由器、Layer 3 Switch会强制发送1次免费ARP Response,用以让局域网的主机确认,我才是真正的网关。
显然,应付普通的非恶意的IP地址冲突,路由器、Layer 3 Switch现行的机制应足够了。
4.2 MAC地址冒用
不管是处于什么目的,用户可能通过某种手段重新烧录自己网卡的MAC地址,如果这个地址正好和路由器、Layer 3 Switch的网关IP相同,会出现什么情况呢?
由于条件的限制,这个实验没有做成,但我们可以分析一下:
根据前面的分析,网络设备是通过发送免费ARP Request报文,查询自己IP的对应MAC地址来确认是否存在冲突的,在单纯的MAC地址冒用的情况下,上述机制是探测不到任何异常的。
但是当两个设备的MAC地址相同时,最直接的影响就是局域网交换机(通常为二层)的MAC Table中,有两个端口学习到的MAC地址是完全相同的,这有点类似环路发生的现象;但这确实不是环路,因为交换机生成树的BPDU报文不可能从其中的一个端口发出,从另外一个端口收到,所以STP是探测不出什么的,也就是说这两个端口还是会正常工作的。
此时交换机会做的就是,把发往该MAC地址的以太网帧同时发送到两个端口上,以求尽可能的数据丢失;这看起来有点象“端口镜像”。
看来,单纯的MAC地址冒用/冲突是不会到路由器、Layer 3 Switch造成什么直接的影响的,不过它会把所有经过网关路由器的流量复制一份到某个特定的端口,如果这个端口连接的某个主机别有所图的话,后果还是很严重的。不过这属于信息安全的范围了,这里不再详细讨论。
4.3 ARP欺骗
ARP自动学习的目的,就是通讯的双方主机互相请求/告知MAC地址,并以此完成二层的以太网帧交换,由于通讯的双向性,很显然如果任何一方的ARP信息是空或者错误的,那么通讯就会失败。而ARP欺骗的目的就是频繁的发送错误消息欺骗网络通信的任何一方,最终导致不能正常通信。
那么怎样防止ARP欺骗呢?从根本上说就是双方的IP-MAC地址对应信息要正确,之前我们说过,ARP是自动学习的,是通过ARP Request和Response报文的交互,由别人告知的,正是这个特性让ARP欺骗有了可乘之机,显然最有效的方法就是不采用“学习”机制,现在很多设备厂商都是这么实现的,但配置静态ARP工作量非常大,后期维护也极不方便,假设局域网内主机数量为N,那么最少要配置的ARP条目有N+(N-1)=2N-1个;如果N=200,也就是说最后总共要配置400条,这还不算原始IP、MAC地址信息的收集、校对和维护工作。如果要全网ARP绑定的话,总条目可达N(N-1),那就更惊人了。
是否可以避开静态ARP绑定这种烦琐的方式呢?对Windows主机是没有办法的;但我们可以从路由器、Layer 3 Switch上着手,要回答这个问题,首先要弄清ARP欺骗的具体过程,先看实验拓扑结构:
clip_image019
由于很难找到合适的病毒重现真正的ARP欺骗,我们采用安装聚生网管(也叫Netsense、P2P终结者)来模拟,其实现的基础就是进行ARP欺骗。
在这个环境中,使用路由器作为网关,进行NAT操作,内网中连接两个PC,其中一台安装聚生网管,进行ARP欺骗。开始时,PC的ARP表中192.168.1.6对应的MAC地址是正确的,然后启动聚生网管,来看看现象:
1、第一阶段,ARP Cheater会发送大量ARP Request来逐个扫描内网中的PC:
clip_image021
正常情况下局域网PC会回应ARP Request,ARP Cheater就是靠这个来确认并收集内网中已经启动的PC的,并在本地形成一个数据库。
2、第二阶段,Cheater就开始进行实质的欺骗了,其过程为就是向真实网关和PC同时发送免费ARP Response,强行更新其ARP Table。
其中,发送给PC的为:
clip_image023
显然,Cheater强行通告给PC的ARP内容是错误的,因为00-0D-60-8C-0D-C9和192.168.1.6分别是Cheater的MAC地址和路由器的网关IP。
其次,发给网关路由器的为:
clip_image025
在这个信息中,00-00-E2-58-AC-EA和192.168.1.158都是对应的普通PC,是一个正确的信息,Cheater代替PC向网关发送ARP强制更新信息,是为了确保通讯能够正常完成。
欺骗完成之后,局域网中的所有PC都根据错误的ARP信息把数据包发给ARP Cheater,Cheater再通过路由器转发到公网真正的服务器上;当数据包从公网返回到路由器之后,路由器会把数据包直接返回到PC,中间不再经过ARP Cheater(如果需要,也可以经过ARP Cheater),参阅前面的拓扑结构图。
这样,ARP欺骗就完成了,PC上面关于网关的ARP信息发生了改变;不过为了“巩固”成果,聚生网管每隔2秒再次进行欺骗。
clip_image027
当然,聚生网管不算是一种病毒、木马或者恶意程序,只是它利用了ARP欺骗,把所有的局域网所有的主机流量都导入的自己的网卡上,籍此,聚生网管就可以进行相应的过滤和限制了。
现在比较流行的窃取密码的木马程序就是按照这个原理来实现的,当然密码只是在用户登陆的时候才输入的,所以木马程序会故意让自己的网卡失效又立刻恢复,此时,内网的用户以为是网络质量不好掉线,接着就是重新登陆、输入密码……
上面两种情况虽然是ARP欺骗,但多数时间网络还是正常运行的;如果只是要让网络中断,那么ARP Cheater只需频繁发送免费ARP Response即可,当然里面包含的Sender Address是错误的。
4.4 如何应对ARP欺骗?
前面提到,ARP欺骗可能会欺骗网关路由器或者内网的PC,下面我们就分这两种情况来分析一下。
4.4.1 避免ARP欺骗PC
要找到应对方法,必须先识别出ARP欺骗的特点:
1、ARP欺骗发生时
无论出于什么目的, ARP欺骗最开始、也是最关键的一步就是通过免费ARP Response信息,发送错误的网关ARP信息给局域网主机,其方法不外乎两种:
n 在本网段首先发送大量的ARP Request扫描,通过Response报文收集当前活动的主机,随后给每个主机发送免费的ARP Response;在这种情况下,路由器只能看到从一个固定的MAC地址发出大量ARP请求广播,而且这个过程可能会周期性重复。
n 第二,ARP Cheater不需要逐个找局域网的主机IP,它直接冒充网关,通过免费ARP Response广播通告全网;在这种情况下,路由器上应该可以观察到免费ARP Response报文,其Sender Internet Addr信息就是自己的IP地址,而且从上面的实验中可以看到,这种免费ARP Response广播报文是非常频繁的。
无论是那种情况,其目的都是欺骗PC,路由器虽然可能通过某些特征判断ARP欺骗的发生,但是根本无法制止,因为路由器对该PC是没有控制权的。
2、ARP欺骗发生后
ARP欺骗发生后的情况是怎样呢?当然是PC的ARP表被篡改了,当然我们可以通过手工方式来清除ARP表项重新学习,但ARP欺骗是不断的重复进行的,人工维护的工作量恐怕远远大于前面说的“静态ARP”,显然可行性为零。
既然手工方式不行,那么自动方式怎么样呢?跟ARP Cheater一样,我们可以考虑让网关路由器或者其他专用主机来发送免费ARP广播,把正确的网关ARP信息通报给全网。如果网内的ARP欺骗不是很频繁,这种是方法可行;但如果象聚生网管这样的情况,ARP欺骗为每2秒一次,要让PC的ARP表正确,路由器或专用主机发送的免费ARP Response广播必须更频繁,即便如此,内网PC的ARP表可能还会处于频繁变动的过程中,导致其正常通讯也会随之而产生丢包情况,同时整个网络上会因此而充满大量的以太网广播,我想这事谁也不愿看到的。RG Router的内网口上 arp gratuitous interval xx 的配置实际上就是定期向网内发送 arp Response;
综上,可以得出结论,对于内网主机的ARP欺骗,作为路由器本身基本上是无能为力的,至少效果非常有限。所以在对付ARP欺骗的时候,PC还是乖乖的进行静态ARP绑定措施。比如在PC机上配置autoexec.bat批处理文件:
@echo off
Arp –d
Arp –s 192.168.1.1 00-d0-0f-23-44-89
使得在PC机上能够静态绑定网关的正确MAC地址,防止网关欺骗;
在RG 2126G交换机上可以采用在端口下,anti-arp-spoofing ip xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx是网关地址;RG 2126G将阻止源IP是本网段网关地址的报文从这个端口进入;达到防止该端口上连接的PC发出对其它PC进行网关欺骗的ARP Response、ARP Request报文;
4.4.2 避免ARP欺骗路由器
跟PC的情况不同,由于路由器、Layer 3 Switch是一款三层设备,几乎没有什么上层应用会跟内网主机直接通讯,所以它的ARP表项通常不是主动请求获得的,而是被动学习到的,比如收到ARP Request或者免费的ARP Response前者是正常情况,不在我们讨论范围之内;而后者就是ARP Cheater欺骗网关路由器的手段。
还是分为两个阶段来分析:
1、ARP欺骗发生时
通常情况下下,ARP Cheater是通过单播性质的免费ARP Response把错误的主机ARP信息强制通告路由器、Layer 3 Switch的,而且由于内网的主机数量众多,路由器、Layer 3 Switch每次会收到大量的免费ARP Response单播报文。它们的Sender Internet Addr分别是局域网的主机IP地址,但是Sender Hardware Addr却都是ARP Cheater的网卡MAC地址。
显然,路由器、Layer 3 Switch完全可以通过免费ARP Response报文的特征来确定欺骗是否发生,但当确定的同时,ARP欺骗的结果是已经造成了的。
2、ARP欺骗发生后
由于路由器、Layer 3 Switch的ARP表项是被动学习的,所以在ARP欺骗发生之后,路由器、Layer 3 Switch必须自己主动的去查询正确的ARP信息,方法恐怕只有一种:就是根据现有ARP表项中的IP地址列表,强制性的逐一发送ARP Request,通过对方的Response信息来更新校正自己的ARP Table。显然这个工作量是很大的。尤其是在ARP Cheater的欺骗非常频繁的时候,路由器、Layer 3 Switch的ARP“自我校正”机制显得太苍白无力了。
4.5 应对ARP欺骗的其他方法
从前面的分析来看,单纯的通过ARP机制本身来防止ARP欺骗,几乎是不可能完成的任务。那么还有什么方法来避免呢?
4.5.1 硬件角度
路由器毕竟是一种三层设备,对于ARP二层协议的支持和处理总是有限的;我们是否可以从局域网交换机来入手呢?
因为ARP发生之后的结果(错误的ARP信息)是存储在网关路由器和主机中的,跟交换机没有任何关系,所以要通过交换机来处理,重点就是一个字:“防”。从前面的分析来看,无论怎样欺骗,其关键的特征就是发送免费ARP Response报文,而且ARP字段的Sender信息与其自身MAC地址不相符合,如果二层以太网交换机能够进行ARP报文合法性的判断,那么就自然可以进行相应的屏蔽了;
这个技术看起来不是很难事先,但涉及到交换机ASIC芯片的支持和软件功能的增加,其可行性和性价比还需要考证;同时需要把宽带路由器和交换机作为一个整体推给使用者。现在锐利网络在网吧等宽带市场中的路由交换一体化解决方案就是基于这个原理的。
这种思路应该可以从源头上解决ARP欺骗的发生,但对于交换机的要求比较高,不仅是功能方面,还同时涉及到性能、稳定性和性价比等特性。
在RG 27、29系列交换机上就是从硬件架构上进行设计,使得交换机能够根据报文类型,比如对报文类型Type是0X0806的ARP报文会检查其Source IP和Source MAC,根据在该端口上绑定的IP地址与相应的MAC地址来将攻击者的欺骗性ARP Response过滤掉,从而达到从根源上防止了ARP Attacking的实现;
4.5.2 软件角度
单纯的利用ARP特性是解决不了ARP欺骗的问题的,那么在软件上还有什么出路呢?方法还是有的,可以看一下艾泰的解决方案:
既然ARP欺骗最终影响的是ARP表项的内容,而表中的内容又是动态学习的,所以ARP机制才不安全,那么我为何不摒弃ARP自动学习这种机制呢?当然我们说的不是进行手工静态ARP绑定。其具体处理方法是把ARP表项的相关信息放到NAT的表项中一起处理。
原来NAT表项中的主要内容有:NAT转换前源IP地址、转换前源TCP/UDP端口、转换后源IP地址、转换后TCP/UDP端口、目的IP地址、目的端口等6项信息,而转换前IP地址和MAC地址的对应关系是靠ARP的动态学习机制来实现的。
现在,NAT表项的内容调整为:NAT转换前源IP地址、转换前源MAC地址、转换前源TCP/UDP端口、转换后源IP地址、转换后TCP/UDP端口、目的IP地址、目的端口等7项信息。这个新增加的源MAC地址可以不作为NAT判断的依据,其作用是让数据包从公网一侧回到路由器,经过NAT转换之后,能够送回到正确的PC主机。
那么如何才能保证PC主机的数据包不受ARP欺骗的影响,正确的送到路由器呢?很简单,进行手工的静态ARP绑定。前面分析过,对于ARP欺骗PC主机的情况,路由器是无能为力的。
这样,PC可以根据静态(正确)的ARP信息把数据包发到网关路由器,路由器在记录必要的信息转存为NAT cache的时候,把该以太网帧的源MAC地址也异同记录,写到NAT cache中,作为数据包返回时的参考。
这种方式的优点是不用一来交换机,避免ARP的欺骗,但PC主机还是需要进行手工的ARP绑定。可以说这是“硬件角度”的一种折中方案。其缺点是NAT存储和判断的因素较多,必然影响性能;而且这种机制只能避免PC和路由器之间的通信免受ARP欺骗的干扰,对于PC与PC之间的通讯则无能为力了。
4.5.3 消极角度
什么是消极角度?简单的说就是没有办法了,我不用ARP了,那么在以太网中怎么通讯?PPPoE!在理论上,这的确可以完全规避ARP的问题,但在实际应用的时候,需要让路由器来充当PPPoE服务器,这样所有局域网通讯的流量都要经过路由器进行三层转发。对于路由器的处理压力可想而知――不过确实有这种网络的实际案例,比如ISP的运维办公网,但他们使用PPPoE的目的更重要的是为了网络信息安全和管理。
4.6 建议
对于ARP欺骗,仅仅从ARP本身恐怕是没有什么好的解决方案的,要解决或避免ARP欺骗的问题,需要动一番手术的。
而对于普通的ARP冲突,我到时觉得还可以加强一下:
u 路由器、Layer 3 Switch在确认网络中有IP冲突后,会立刻发送1个免费ARP Request,用以确定冲突已经消失,如果冲突继续存在,则强制发送1个免费ARP Response。
ü 是否可以考虑延时一个时间段再发送免费ARP Request?用以避免Windows主机没有及时处理处于“非正常”状态的情况;
ü 其次,如果冲突继续存在,发送1次ARP Response;更合理的应该是重复进行免费ARP Request探测,冲突存在则强制进行免费ARP Response通报,直到冲突消失。
4.7 总结
在主要的两类ARP问题中,一般的非恶意地址冲突不会对路由器、Layer 3 Switch造成实质性的影响。而对于各种目的的ARP欺骗机制,无论是从预防还是后期干预上,路由器都没有直接有效的手段?
虽然现在可以使用双向的静态ARP来避免ARP欺骗带来的影响,但就实施和后期的维护来看,都非常的不方便,而且也未尝容易出错。
比较好的出路在于从硬件结构上对交换机进行改良,实现成本与功能的平衡,才是防止ARP问题的根本之路。

本文出自 “探寻解决方案营销的奥秘” 博客,请务必保留此出处http://jimqu.blog.51cto.com/105370/108798

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多