基于Django的网络空间安全资产引擎设计与实现.docx

上传人:b****5 文档编号:14273733 上传时间:2023-06-22 格式:DOCX 页数:27 大小:1.18MB
下载 相关 举报
基于Django的网络空间安全资产引擎设计与实现.docx_第1页
第1页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第2页
第2页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第3页
第3页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第4页
第4页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第5页
第5页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第6页
第6页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第7页
第7页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第8页
第8页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第9页
第9页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第10页
第10页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第11页
第11页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第12页
第12页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第13页
第13页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第14页
第14页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第15页
第15页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第16页
第16页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第17页
第17页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第18页
第18页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第19页
第19页 / 共27页
基于Django的网络空间安全资产引擎设计与实现.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于Django的网络空间安全资产引擎设计与实现.docx

《基于Django的网络空间安全资产引擎设计与实现.docx》由会员分享,可在线阅读,更多相关《基于Django的网络空间安全资产引擎设计与实现.docx(27页珍藏版)》请在冰点文库上搜索。

基于Django的网络空间安全资产引擎设计与实现.docx

基于Django的网络空间安全资产引擎设计与实现

摘  要

当前互联网的网络空间由最初的混沌到现在快速扩展,互联网设备的也运用越来越广泛,全世界上网设备的激增导致连IPV4地址都无法包含下去,想象在未来,会有越来越多设备在互联网中相连接,以互联网为基础上的延伸和扩展,人类生活的延伸扩展到了一切物品之间的信息交换与通信。

但是越来越信息化的时代也伴随着越来越多的风险,通过网络空间搜索引擎,我们快速的知道,全世界大约有多少网络摄像头,有多少服务器,某个开源组件的使用情况等等。

网络空间搜索引擎在网络空间测绘,态势感知,企业资产安全管理等网络安全领域发挥着巨大的作用。

阿尔文托夫勒在《第三次浪潮》中提到,“谁掌握了信息,控制了网络,谁就将拥有整个世界”。

就“棱镜”事件来看,整个中国社会必须重新认识到网络空间在整个国家安全体系下的重大意义。

本文设计的目标便是制造这样一个系统,用于监控整个网络设备,甚至得到某个地区的设备的相关分布情况。

关键词:

网络空间;网络资产;搜索引擎;监控

第一章 序言

1.1 研究目的

网络安全是国家的重点发展目标之一,在防卫自身安全的同时,我们需要了解某个国家的大概网络基础设施情况,有多少的使用率,这样才能在未来的网络空间战中从容不迫,有的放矢。

不仅是了解网络基础设施,当某个使用量大的服务组件被爆出存在漏洞时,我们也需要这样一个系统,来了解使用了该服务组件的主机、相关等等,做好预防措施。

当公司需要管理其资产时,只需要在资产配置上输入自己企业的相关域名,ip地址,该引擎就会自动匹配与其相应的服务器、域名等信息,同时也包含在该服务器上运行的各项服务,WEB使用的开源CMS类型,让你一眼就能够了解自己企业相关状况。

1.2 发展概况

在2009年黑客大会DEFCON,名叫John Matherley黑客启动了一个名为“撒旦”的搜索引擎程序。

Shodan将扫描整个设备,并捕获和分析每个设备返回的banana信息。

掌握这些信息,Shodan就知道当前最流行的Web服务器是什么类型或网络上存在的匿名登录的数量、FTP服务器等。

近年来,Zoomeye和FOFA在中国推出了追随者,并且功能大致相同,具有网络指纹识别,服务识别,组件发现,资产发现和其他功能。

1.3 开发环境

本项目开发环境是MacOSMojave,版本10.14.6,在实际部署期间,将WEB和客户端代码都部署在Linux系统上,开发语言使用python3作为编程语言,基于Django框架实现。

Python是一种高级脚本语言,与其他语言相比,英语关键字更会被经常使用,其他语言中的一些标点符号在语法上比其他语言更独特。

1.4 其他环境

现代软件科学有许多成熟的框架,我们只是站在巨人的肩膀上并享受它。

1.4.1 Django框架

Django的是快速开发安全和维护网站的高级PythonWeb框架,它采用的软件设计模式MVT:

即模型Model,视图View和模板Template。

它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。

并于2005年7月在BSD许可证下发布。

这套框架是以比利时的吉普赛爵士吉他手DjangoReinhardt来命名的。

它的主要目标是使得开发复杂的、数据库驱动的网站变得简单。

Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don'tRepeatYourself)。

在Django中Python被普遍使用,甚至包括配置文件和数据模型。

1.4.2 Redis缓存服务器

Redis是一个开源的,基于网络的,基于内存的键值存储系统。

它是使用最广泛的键值存储数据库,具有高可用性和并发支持。

Redis键包括字符串、列表、集合、哈希、排序集合、位图和superlog。

因此,它通常被称为数据结构服务器。

 对于高性能,Redis在内存中使用数据集,并且在没有任何其他依赖项的情况下运行。

Redis的是在Linux和OS X操作系统和全面的测试开发,因此使用Linux作为一个部署环境这个环境。

1.4.3 Elasticsearch分布式搜索分析引擎

Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。

作为ElasticStack的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。

开源的Elasticsearch(以下简称Elastic)是目前全文搜索引擎的首选。

它可以快速地储存、搜索和分析海量数据。

维基百科、StackOverflow、Github都采用它。

1.4.4 Nmap网络探测工具

Nmap全称NetworkMapper,又叫网络映射器,用来扫描互联网开放的网络连接。

它将特殊的数据包发送到我们检测的目标主机,然后来分析返回的数据包,检查哪个服务在哪个连接上运行,并推断计算机上运行的操作系统(也称为指纹)。

它探测网络上的主机存活情况,目标主机开发的端口有哪些,端口对应的软件和版本,以及操作系统等。

许多系统管理员和网络管理员也用它来做一些日常的工作,比如查看整个网络的信息,管理服务升级计划,以及监视主机和服务的运行。

1.4.5 Masscan网络扫描工具

Masscan,也被称为最快的互联网端口扫描工具,在六分钟内扫描互联网。

masscan相比NMAP扫描要快得多,因为masscan通过异步传输模式,无状态扫描。

而nmap需要记录TCP/IP的状态,但os处理大约1500个TCP/IP连接。

masscan最高1000万/秒并发,相对于其他扫描器来说,它的扫描速度是比较快的。

第二章 系统分析

2.1 主要功能

本论文主要是设计一款资产发现引擎,包括Client端和WEB端,Client端用于不断扫描并识别网络的服务,即本文实现的“网络发现引擎”,本文统一使用“CLient”端称呼它。

WEB端用于接收Client端返回的结果,并以人性化友好的方式展现出来。

在设计中需要考虑非关系型数据如何存储,如何快速搜索相关数据,以及Client端如何快速的扫描和识别网络,针对一个域名,如何识别其所使用的技术等等。

本文主要设计为包括Client端和WEB的资产搜索引擎,并且Client端用于连续扫描和识别网络服务,即本文实现的“网络搜索引擎”。

WEB端用于接收client端返回的结果,并以人性化和友好的方式显示它们。

设计应考虑如何存储非关系数据,如何快速搜索相关数据,如何在客户端快速搜索和标识网络,如何标识域名以及如何标识所使用的技术。

2.2 Client端设计原理

2.2.1 网络服务识别

TCP协议中三次握手可判断一个端口的存活,而一个服务器最多可开启65535个端口,在TCP的最后一次握手中,服务器会返回一段信息给请求者。

所以可以使用TCP连接对一个目标ip进行65535次连接,在连接成功的端口中,获取到服务器最后返回的一段信息,由于不同的服务ftp,http会有不同的返回结果,根据这些结果作为指纹,来识别出该端口所对应的服务。

2.2.2 网络端口扫描

TCP是可靠的面向连接的协议,如图1.1所示,一个完整的TCP会话每个过程都有不同的状态。

快速的端口扫描器原理都是基于无状态的扫描。

在确认端口打开后,通过RST放弃建立连接。

图1.1 Tcp连接图

Masscan扫描互联网规模的端口扫描器,可用于互联网或内部网络的大规模检测。

它选择高达2500万个数据包/秒的扫描速度,这个速度足以在3分钟内扫描互联网。

本文所设计的引擎也是调用masscan来进行扫描。

2.2.3 WEB指纹识别原理

一般开源项目中,静态文件里都会包含一些特征字符串。

开源的WEB系统在静态文件(例如html,js,css)中会包含一些特征字符串,即使不包含特征值,固定的URL链接也可能是某开源项目的特征。

比如在wordpress中,robots.txt文件里包含wp-admin等,默认样式在主页上包括generator=wordpressxx,在页面上包括wp-content路径等,并且几乎所有开源CMS都是相似的。

如果指纹数据库中存在相应的指纹,则通过采用特定路径并判断该路径下返回的文本来识别Web指纹(通过md5或regex)来判断Web应用程序。

2.2.4 插件化扫描

插件有助于程序扩展,Python很自然地适合于插件化,因此在本文的设计思想中,插件化是整个程序设计的重点。

在进行WEB扫描时,所有东西都被用作具有扫描功能的插件(如敏感文档扫描,Web指纹识别等),“调度控制中心”仅需要收集URL和IP之后就可动态调用插件。

2.2.5 去重、缓存调度算法

当一个资产被检测后,又再另一次扫描任务中重新添加此任务,为了节省扫描资源,这些重复的资产会被舍弃,并不会加入到检测任务中,但如果这个资产已经存在系统中,过段时间如果对新的资产进行检测,包含了之前检测过的资产,那么也会将重复的资产重新添加到检测任务中。

这里我们就需要引入“高速缓存数据库”的概念,我们只需要维护一个“已经扫描”的数据库,并且在每次扫描时,您只需要查询此记录在数据库中是否存在,如果存在就不会对资产进行重新检测,之后数据库将自动删除这些“缓存”数据。

并且要保证数据库的读取速度和性能。

缓存数据库使用Redis,它是一款高性能的NOSQL系列的非关系型数据库,充当缓存和消息队列,Redis简单地设计一个满足您需求的程序。

2.3 WEB端设计原理

2.3.1 Restful接收数据

 Restful框架是目前最流行的Web数据接口设计API设计规范。

在Client端传入数据到WEB端的时候,采用RESTful架构接收,很方便的从URL中得到表达意义(具体展现在URL的表现层状态转化),当客户端将数据发送到WEB时,它使用RESTful体系结构来接收数据,我轻松地从URL中获取含义(这在URL的表示层状态转换中特别显示),清晰易懂。

2.3.2 大数据搜索解决方案

由于已在设计中扫描了全球网络,因此也必须将基于此分析的各种服务、指纹、应用程序和版本存储在数据库中。

因此,由于搜索解决方案中的数据量很大,某些常见的数据库搜索可能无法满足时间需求,另一种是需要查找非关系数据来存储这些数据。

在衡量了各种数据指标之后,选择开源的Elasticsearch作为解决方案。

ElasticSearch是搜索服务器,全文搜索引擎和RESTfulWeb界面,它具有非常强大的数据分析和处理功能,还对中文语言支持,并且安装中文分词插件来分析中文。

ElasticSearch通过对存储在数据库中的数据进行分段和索引来显着加快查询速度,其独特的结构化查询语言使查找所需数据以及该数据的相关信息变得容易。

2.3.3 资产关联性算法

在本文的设计中,我们需要设计一种算法,以在存储数据的数据库中找到我们所需的“某处”资产相关情况。

例如,需要查看“京东”的相关资产信息,Web程序无法通过输入“京东”关键字自动找到所有相关的XX资产。

本文的设计在Web后端上有一个用于资产检索的配置页面,您需要手动输入与“京东”相关的资产,例如域名,*,*,ip资产等。

程序使用这些配置来查找相关资产的状态。

Elasticsearch提供了满足您需求的通配符搜索方法。

通过Elasticsearch添加布尔查询条件,并使用通配符查询方法来满足您的查询需求。

2.4 扫描端与WEB端的数据交互

当扫描端体系结构和Web端体系结构都完成时,下一个考虑因素是如何在Web端下发任务,并让客户端完成该任务。

在分布式体系结构中有一个术语“消息队列”,即使使用了消息队列,该系统仍采用此方法。

消息队列代表消费者生产者模型,一端连续将消息写入消息队列,另一端读取或订阅队列中的消息。

在本文采用的体系结构中,作为生产者的WEB端将要处理的数据记录在消息队列中,而扫描端在使用者从消息队列中读取和处理数据时结束。

2.4.1 MQ的选择

更成熟的成熟产品包括IBMWEBSPHEREMQ,rabbitmq等。

之所以选择redis数据库作为消息传输队列,是因为该系统的要求相对简单,因此不需要复杂的状态管理,也不需要使用过多的服务并且难以维护。

在扫描结束时,redis服务还用作重复数据删除服务。

2.4.2 Redis消息队列的实现

Redis支持列表操作Redis的列表是一个简单的双端列表。

您选择从左侧或右侧插入数据,也选择从左侧或右侧读取数据。

在该系统的实现中,只要同意一端插入和一端取出,就实现消息队列的功能。

Redis本身是线程安全的,因此无需考虑在插入过程中如何执行读取操作。

2.4.3 相关操作命令

•lpushkeyvalue插入value到key左端。

•lpopkey移除并获取第一个元素,如果此时列表为空则返回None。

•blpopkey移除并获取第一个元素,如果此时列表为空则一直等待。

2.4.4 代码原型

Redis消息队列的Python代码表达

importredis#导入redis模块,通过python操作redis,以直接在redis主机上的服务器上操作缓存数据库。

pool=redis.ConnectionPool(host='localhost',port='6379',

decode_responses=True)#host为redis主机,redis默认使用端口是6379,解码返回的消息为真

redis_con=redis.Redis(connection_pool=pool)

redis_con.lpush("wscan_scanned",ip)

2.5 扫描端节点监控

由于实际工作中扫描节点数量的增加,管理员需要检查每个扫描节点的运行状态是否正常,因此有必要设计一套直接从WEB端方便地检查节点状态的功能。

节点监视不仅检查每个节点的运行状态(运行作业,成功运行的作业,节点是否运行状况良好以及节点记录的日志等),还处理失败的节点,了解原因并删除该节点。

2.5.1 节点监控思路概述

节点监视方法使用扫描端每5分钟(5*50秒)将数据写入Redis。

内容为当前时间,若WEB端读取时间超过五分钟,会报告节点异常。

2.5.2 节点注册

扫描程序运行时,它以'node'开头,然后输入自定义节点名称,同时将三个字段注册到该节点,以将特定密钥写入redis数据库以注册该节点。

•last_time用于保存节点最后写入时间。

•running用于保存正在运行的任务数量。

•finished用于保存已经完成的任务数量。

2.5.3 节点异常条件

节点异常由WEB端判断,如果当前WEB端的redis读取时间超过五分钟,则通知节点异常,并显示删除节点按钮。

2.5.4 节点与WEB的通信

•节点向指定的redis队列中写入消息如w_log_[nodename]。

•节点向指定rediskey中写入消息,如w_node_[nodename]。

2.5.5 节点销毁

当节点无法再通信时,将执行节点删除选项,仅从redis数据库中删除两个keyw_log_[nodename]和w_node_[nodename]。

如果节点在与之通信的条件下发生故障,则需要确保将Unicom节点一起销毁。

2.5.6 WEB端获取节点信息

Redis使用模式匹配(例如w_node_*)来匹配任何节点,它浏览数据以读取每个节点的信息,然后读取w_log_[nodename]并读取节点的日志。

第三章 扫描端分析

3.1 需求分析

在设计完整扫描端时,应阐明对这两个要求的分析,并证明其有效性。

需求分析对于扫描《网络资产发现引擎》的框架尤其重要,它决定了将来的《网络资产发现引擎》中获得的数据的有效性和真实性。

需求分析主要基于功能需求和性能需求,设计原则是在满足功能需求的前提下尽可能满足性能需求。

3.1.1 功能需求

根据功能要求,搜索引擎应能够接收大量域名或IP地址。

搜索引擎针对每个域名和IP地址发出访问请求,并执行“分析”以获取WEB属性的指纹并将其发送到Web端的Webrestful接口发送结果。

“分析”是指通过IP或域名(例如IP地址)获得尽可能多的不同详细信息,获得开放端口和在每个端口上运行的服务。

换句话说,需要得到服务器、操作系统、运行脚本环境,网站的标题、网站使用的相关技术以及开源组件服务使用的技术等。

3.1.2 性能需求

扫描大量IP地址和域名会占用大量IO延迟,为了加快扫描速度,在IO延迟期间继续扫描其他目标,每次扫描都使用开源的masscan作为网站域名的端口扫描程序工具。

在扫描方面,使用多线程技术检测网站。

在完成扫描后,Massscan默认情况下会等待10秒,因此会花费太多时间,因此扫描结束时收到的IP地址将缓存在列表中。

如果缓存的IP数量大于某个值,则调用Masscan对其进行扫描,类似于IP缓冲池的设计,还设计了域名缓存池。

如果域名缓冲池大于某个值,则将缓冲池的域名发送到多线程框架以进行域名解析和发现。

3.2 系统总体架构设计

需求分析中详细介绍了扫描端的需求。

现在我们需要协调WEB端和扫描端的整体,并计划WEB端如何使用redis作为中间数据库与扫描端通信的消息队列。

设计图3.1展示了扫描端的运行流程以及如何与WEB进行通信的流程。

图3.1系统总体设计流程图

如图所示,扫描端的扫描任务后,会将结果发送到Web端Webrestful接口,然后Web端将数据存储在Elasticsearch数据库中。

WEB端还提供了一个restful接口来添加扫描目标,首先将扫描目标添加到redis数据库中,然后客户端扫描端从该redis数据库中读取内容。

URL和IP的输入首先执行“重复数据删除过滤算法”,并且过滤后的目标进入“作业分发调度程序”。

作业分配调度程序将识别目的地是URL还是IP地址,并根据流程图进行发送。

具有不同的操作流程。

最后,结果进入“收集器”,“收集器”自动将结果提交到WEBRestful接口。

3.3 系统功能的插件化设计

当“分配调度器”接收到域名或IP时,它将缓存一定数量,当达到该数量时,就会开始扫描操作。

扫描端会调动“插件”,每个功能模块都用作为一个单独的插件运行。

域名和ip会有两种不同的插件集。

对于IP服务,会调用masscan检测出开发的IP端口,然后调用nmap服务以标识与每个端口相对应的服务类型。

如果在打开的端口上找到http服务,则会将其添加到域名扫描队列中。

如果还有其他服务,例如redis,mysql等,则将调用相应的搜索插件进行密码爆破,漏洞攻击等其他服务。

Poc插件:

PoC(全名:

ProofofConcept),中文翻译为概念证明。

与安全领域中的某些应用程序相比,PoC只是一个漏洞验证程序,但是无法对漏洞进行深度利用,它只是证明漏洞是否存在。

对于域名服务,首先发出http请求,以获取服务器返回的标头和正文,并对标头和正文进行匹配和关键字分析。

获取服务器信息。

插件化意义在于,每个插件都获取域名的标题和正文进行分析,然后返回结果。

然后,它搜索并收集敏感文件中的域名,如.git,svn和其他敏感文件,一些敏感目录,后台目录等。

最后,通过指纹识别获得用于域名的cms系统名称,并通过该名称调用相应的攻击插件。

由于这些攻击插件的及时性,新的漏洞爆发,一个攻击利用链会被迅速利用。

该poc插件具有时间效率,poc可能会在2-3个月后失效,所以需要定期维护poc插件集。

Poc插件在添加到客户端程序时的思路已被弃用,但是由于Python语言的固有灵活性,您从特定网络下载攻击插件,只需将poc插件存储库保留在github上即可。

识别该服务后,浏览器的工作流程将自动获取与其自身信息相关联的插件,进行攻击,以确保插件维护的及时性和有效性。

3.3.1 Python代码原型

Python是一门灵活的动态语言,它是边解释边执行的脚本语言,因为这个特性,所以在运行的时候动态修改类或变量,当然也在动态运行当中加载其他模块,加载方式是文件或纯文本。

我们要实现从源码加载程序的功能,这是一个非常hack的事情。

顺便幻想一下,如果直接从运行中的程序中加载源码,获得其功能并再次运行,那么是不是我们只需要实现一个类似“加载器”的东西,其主要功能的代码全部从网上下载?

是的这是实现的,我们在线调用漏洞程序也是依据此原理进而联想到的。

用Python来实现这个功能,Python的内置函数库中有importlib库用于加载模块的操作,以上在线加载的所有功能依赖该库即可完成。

通过阅读Python官方文档的相关说明,要实现从源码中加载模块的功能,需要我们自己实现一个加载器,在该加载器中声明加载源码的路径,文件名,以及申明一个唯一值来代表该模块。

需要注意的是,由于我们是从网络上下载源码,源码存储的地方是内存中,我们根本不需要将从网络上读取的源码单独写到一个文件中再从文件中调用,我们只需要读入到内存中,Python有自带的Compile函数将它编译成模块。

同时编译模块的路径我们不需要将它写成真实路径,我们只需要一个唯一的伪路径来表达即可,每个模块的唯一值从该源码文件的md5值计算得出。

3.4 调用外部仓库

由于各种漏洞的发生,Poc更新也非常频繁,如果将poc插件放置在设计“云

端”,并且扫描程序仅需要访问特殊的接口,则从云端加载相关的插件。

这样不仅保证更新速度,而且易于维护和使用。

在本文的设计中,将选择github用作为开放云端,免费使用的且维护的插件与世界各地的开发人员随时随地进行通信交流。

我的设计思想是维护一个github存储库来存储相关的poc文件,poc文件以python3统一编写,并且格式一致。

api.json文件在github存储库的根目录中以json格式存在,并且内容包括漏洞类型,软件名称,时间和与漏洞相对

应的路径。

因此,根据相应的文件路径找到并加载所需的poc文件。

相关github仓库示例:

3.5 IP地理位置查询

扫描端需要获取IP的地理位置,解决方案是通过网络的查询API和开源地理位置数据库。

经过几次测试,网络的查询API的准确性很高,但请求频率有限,因此决定使用开源的地理信息库进行无限制使用。

经过筛选,我决定在网络上使用开放源代码的GeoLite2(GeoLite2国家)数据库,它提供了便捷的

API,还提供了Python调用例程。

Python调试代码如下:

importgeoip2.database

defgeoip(arg):

filename=os.path.join(PATHS.DATA_PATH,"GeoLite2","GeoLite2-City.mmdb")

reader=geoip2.database.Reader(filename)

response=reader.city(arg)

d={

"country_id":

response.country.iso_code,

"country":

response.country.name,

"region":

response.city.name

}

returnd

print(geoip('1.1.1.1'))

3.6 收集器设计

收集器以集成方式收集扫描结果,并自动将其上传到Webrestful接口进行下一步处理。

域名或IP扫描结束后,收集器将通知,并且收集器会将结果排队。

当队列数量达到一定数量时,会自动读取队列中的结果,批量发送给web端的restful接口存

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 其它

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2