admin 管理员组文章数量: 1086019
2024年2月20日发(作者:websocketclient)
摘 要
当前互联网的网络空间由最初的混沌到现在快速扩展,互联网设备的也运用越来越广泛,全世界上网设备的激增导致连IPV4地址都无法包含下去,想象在未来,会有越来越多设备在互联网中相连接,以互联网为基础上的延伸和扩展,人类生活的延伸扩展到了一切物品之间的信息交换与通信。但是越来越信息化的时代也伴随着越来越多的风险,通过网络空间搜索引擎,我们快速的知道,全世界大约有多少网络摄像头,有多少服务器,某个开源组件的使用情况等等。网络空间搜索引擎在网络空间测绘,态势感知,企业资产安全管理等网络安全领域发挥着巨大的作用。
阿尔文 托夫勒在《第三次浪潮》中提到,“谁掌握了信息,控制了网络,谁就将拥有整个世界”。就“棱镜”事件来看,整个中国社会必须重新认识到网络空间在整个国家安全体系下的重大意义。本文设计的目标便是制造这样一个系统,用于监控整个网络设备,甚至得到某个地区的设备的相关分布情况。
关键词: 网络空间;网络资产;搜索引擎;监控
第一章 序言
1.1 研究目的
网络安全是国家的重点发展目标之一,在防卫自身安全的同时,我们需要了解某个国家的大概网络基础设施情况,有多少的使用率,这样才能在未来的网络空间战中从容不迫,有的放矢。
不仅是了解网络基础设施,当某个使用量大的服务组件被爆出存在漏洞时,我们也需要这样一个系统,来了解使用了该服务组件的主机、相关等等,做好预防措施。当公司需要管理其资产时,只需要在资产配置上输入自己企业的相关域名,ip地址,该引擎就会自动匹配与其相应的服务器、域名等信息,同时也包含在该服务器上运行的各项服务,WEB使用的开源CMS类型,让你一眼就能够了解自己企业相关状况。
1.2 发展概况
在2009年黑客大会DEFCON,名叫John Matherley黑客启动了一个名为“撒旦”的搜索引擎程序。
Shodan将扫描整个设备,并捕获和分析每个设备返回的banana信息。掌握这些信息,Shodan就知道当前最流行的Web服务器是什么类型或网络上存在的匿名登录的数量、FTP服务器等。
近年来,Zoomeye和FOFA在中国推出了追随者,并且功能大致相同,具有网络指纹识别,服务识别,组件发现,资产发现和其他功能。
1.3 开发环境
本项目开发环境是Mac OS Mojave,版本10.14.6,在实际部署期间,将WEB和客户端代码都部署在Linux系统上,开发语言使用python3作为编程语言,基于Django框架实现。
Python是一种高级脚本语言,与其他语言相比,英语关键字更会被经常使用,其他语言中的一些标点符号在语法上比其他语言更独特。
1.4 其他环境
现代软件科学有许多成熟的框架,我们只是站在巨人的肩膀上并享受它。
1.4.1 Django框架
Django的是快速开发安全和维护网站的高级Python Web框架,它采用的软件设计模式MVT:即模型Model,视图View和模板Template。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。
它的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don't Repeat Yourself)。在Django中Python被普遍使用,甚至包括配置文件和数据模型。
1.4.2 Redis缓存服务器
Redis是一个开源的,基于网络的,基于内存的键值存储系统。它是使用最广泛的键值存储数据库,具有高可用性和并发支持。
Redis键包括字符串、列表、集合、哈希、排序集合、位图和superlog。因此,它通常被称为数据结构服务器。
对于高性能,Redis在内存中使用数据集,并且在没有任何其他依赖项的情况下运行。Redis的是在Linux和OS X操作系统和全面的测试开发,因此使用Linux作为一个部署环境这个环境。
1.4.3 Elasticsearch分布式搜索分析引擎
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。
开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。
它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github
都采用它。
1.4.4 Nmap网络探测工具
Nmap全称Network Mapper,又叫网络映射器,用来扫描互联网开放的网络连接。它将特殊的数据包发送到我们检测的目标主机,然后来分析返回的数据包,检查哪个服务在哪个连接上运行,并推断计算机上运行的操作系统(也称为指纹)。它探测网络上的主机存活情况,目标主机开发的端口有哪些,端口对应的软件和版本,以及操作系统等。许多系统管理员和网络管理员也用它来做一些日常的工作,比如查看整个网络的信息, 管理服务升级计划,以及监视主机和服务的运行。
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中,文件里包含wp-admin等,默认样式在主页上包括generator=wordpress xx,在页面上包括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是搜索服务器,全文搜索引擎和RESTful Web界面,它具有非常强大的数据分析和处理功能,还对中文语言支持,并且安装中文分词插件来分析中文。
ElasticSearch通过对存储在数据库中的数据进行分段和索引来显着加快查询速度,其独特的结构化查询语言使查找所需数据以及该数据的相关信息变得容易。
2.3.3 资产关联性算法
在本文的设计中,我们需要设计一种算法,以在存储数据的数据库中找到我们所需的“某处”资产相关情况。例如,需要查看“京东”的相关资产信息,Web程序无法通过输入“京东”关键字自动找到所有相关的百度资产。
本文的设计在Web后端上有一个用于资产检索的配置页面,您需要手动输入与“京东”相关的资产,例如域名,* .,* .,ip资产等。程序使用这些配置来查找相关资产的状态。 Elasticsearch提供了满足您需求的通配符搜索方法。通过Elasticsearch添加布尔查询条件,并使用通配符查询方法来满足您的查询需求。
2.4 扫描端与WEB端的数据交互
当扫描端体系结构和Web端体系结构都完成时,下一个考虑因素是如何在Web端下发任务,并让客户端完成该任务。在分布式体系结构中有一个术语“消息队列”,即使使用了消息队列,该系统仍采用此方法。消息队列代表消费者生产者模型,一端连续将消息写入消息队列,另一端读取或订阅队列中的消息。在本文采用的体系结构中,作为生产者的WEB端将要处理的数据记录在消息队列中,而扫描端在使用者从消息队列中读取和处理数据时结束。
2.4.1 MQ的选择
更成熟的成熟产品包括IBM WEBSPHERE MQ,rabbitmq等。
之所以选择redis数据库作为消息传输队列,是因为该系统的要求相对简单,因此不需要复杂的状态管理,也不需要使用过多的服务并且难以维护。在扫描结束时,redis服务还用作重复数据删除服务。
2.4.2 Redis消息队列的实现
Redis支持列表操作Redis的列表是一个简单的双端列表。您选择从左侧或右侧插入数据,也选择从左侧或右侧读取数据。在该系统的实现中,只要同意一端插入和一端取出,就实现消息队列的功能。
Redis本身是线程安全的,因此无需考虑在插入过程中如何执行读取操作。
2.4.3 相关操作命令
•lpush key value 插入value到key左端。
•lpop key 移除并获取第一个元素,如果此时列表为空则返回None。
•blpop key 移除并获取第一个元素,如果此时列表为空则一直等待。
2.4.4 代码原型
Redis消息队列的Python代码表达
importredis# 导入redis模块,通过python操作redis,以直接在redis主机上的服务器上操作缓存数据库。
pool=tionPool(host='localhost', port='6379',
decode_responses=True)# host为redis主机,redis默认使用端口是6379,解码返回的消息为真
redis_con=(connection_pool=pool)
redis_("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]。
•节点向指定redis key中写入消息,如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端的Web restful接口发送结果。 “分析”是指通过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端Web restful接口,然后Web端将数据存储在Elasticsearch数据库中。 WEB端还提供了一个restful接口来添加扫描目标,首先将扫描目标添加到redis数据库中,然后客户端扫描端从该redis数据库中读取内容。
URL和IP的输入首先执行“重复数据删除过滤算法”,并且过滤后的目标进入“作业分发调度程序”。作业分配调度程序将识别目的地是URL还是IP地址,并根据流程图进行发送。具有不同的操作流程。最后,结果进入“收集器”,“收集器”自动将结果提交到WEB Restful接口。
3.3 系统功能的插件化设计
当“ 分配调度器”接收到域名或IP时,它将缓存一定数量,当达到该数量时,就会开始扫描操作。扫描端会调动“插件”,每个功能模块都用作为一个单独的插件运行。域名和ip会有两种不同的插件集。
对于IP服务,会调用masscan检测出开发的IP端口,然后调用nmap服务以标识与每个端口相对应的服务类型。如果在打开的端口上找到http服务,则会将其添加到域名扫描队列中。如果还有其他服务,例如redis,mysql等,则将调用相应的搜索插件进行密码爆破,漏洞攻击等其他服务。
Poc插件:PoC(全名: Proof of Concept),中文翻译为概念证明。与安全领域中的某些应用程序相比,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统一编写,并且格式一致。 文件在github存储库的根目录中以json格式存在,并且内容包括漏洞类型,软件名称,时间和与漏洞相对
应的路径。因此,根据相应的文件路径找到并加载所需的poc文件。
相关github仓库示例:/boy-hack/airbug
3.5 IP地理位置查询
扫描端需要获取IP的地理位置,解决方案是通过网络的查询API和开源地理位置数据库。经过几次测试,网络的查询API的准确性很高,但请求频率有限,因此决定使用开源的地理信息库进行无限制使用。经过筛选,我决定在网络上使用开放源代码的GeoLite2(GeoLite2国家)数据库,它提供了便捷的
API,还提供了Python调用例程。Python调试代码如下:
import se
def geoip(arg):
filename=(_PATH,"GeoLite2", "")
reader = (filename)
response = (arg)
d = {
"country_id": _code,
"country": ,
"region":
}
return d
print(geoip('1.1.1.1'))
3.6 收集器设计
收集器以集成方式收集扫描结果,并自动将其上传到Web restful接口进行下一步处理。域名或IP扫描结束后,收集器将通知,并且收集器会将结果排队。当队列数量达到一定数量时,会自动读取队列中的结果,批量发送给web端的restful接口存储数据。
整个搜索引擎实际上仅处理两种类型的元数据:域名类和ip类,并且这两种类型的结果也具有不同的结果,因此收集器将分别保存这两种结果。它使用两个缓存队列,这也是提交到Web时读取这两种队列的结果。
在处理域名时,每个扫描插件都将扫描结果存储在收集器中,但是有时扫描插件可能需要当前域名中其他插件提供的扫描信息。所以必须对接口进行设计,以便收集器返回与该域名对应的信息,同时还要考虑插件扫描的执行顺序(例如,依次运行a,b和c插件,首先运行a插件,最后运行c插件),如果a插件需要从c插件结果中调用相关信息,则无法调用它,因此还需在设计中考虑这一点。
第四章 Web端设计
4.1 设计架构
MVC模型是Web服务器领域中众所周知的开发模型,它将Web应用程序分为三层:模型层(M),控制器(C)和视图(V)。这三个模型以松散耦合的方式连接,各自发挥自己的作用。模型层处理业务数据库,控制器接收用户请求并将其发送到视图,并且视图层负责与用户进行交互。 Django使用的开发框架基本上是MVC模式架构。
4.2 Web端总体设计
Web端的作用是显示数据并与用户交互,前端部分使用Html5 + Bootstrap
+ JavaScript进行完善,后端部分使用Python语言和Django框架进行开发,而数据库则以MySQL为功能要求由于需要快速使用搜索服务。还许使用Elasticsearch。根据对资产配置功能的需求,将sqlite3数据库作为存储。 Web端的“任务队列”应使用redis数据库,用作任务的去重,而扫描端应使用中间数据库进行通信。
4.2.1 前端布局设计
前端基于bootstrap框架编写模板,bootstrap已经为我们提供了web前端场景中经常使用到的前端组件,我们只需要将这些组件稍微整合成我们需要的样子即可。本文设计的前端主要有三个页面模块需要设计,分别是前端首页的布局,前端导航页布局,前端资产显示页面的布局。前端的布局主要是上下布局,上为导航栏的一些导航链接,下为展示界面,首页的布局主要以蓝色为主色调,其他颜色为作为辅助。
4.2.1.1 首页布局
此设计的灵感来源是国内的zoomeye、Fofa和国外的Shadons,因此设计的布局也来源于此。顶部是导航栏,显示了各个主页的路径,而左侧是用于统计“国家/地区”,“服务名称”,“开放端口”,“相关组件”等数据信息。右侧显示基本信息,“页面标题”,“归属地”,“页面正文信息”,“相关链接”,“加入时间”等,以及左侧通过过滤方法选择的相关主机和IP地址。网页中使用的某些技术带有相应的图标,当检测到漏洞时,标题右侧将显示一个红色框,以警告用户该网站可能受到威胁。图4.1显示了详细的布局。
图4.1 首页布局图
4.2.1.2 导航布局
Dashboard主要用于可视化显示扫描端系统的状态信息,并计算域名、IP和漏洞数量之类的数据。图表中将显示扫描结束时扫描的工作量以及节点的运行状态之类的信息。由于在设计时扫描端是分布式节点,因此它显示来自多个节点的任务信息,包括扫描队列信息,扫描次数和完成的扫描次数。指示节点状态是running还是pendding。
任务量报告以条形图显示,主要显示每日扫描的工作负载进行直观比较。工作量报告的基本单位是比较单位,是日,周,月,年等。
漏洞统计信息在检索相关威胁的漏洞信息后,扫描程序会统计相同类型的威胁信息并以不同的颜色显示,设计图如图4.2所示。
图4.2 导航布局
4.2.1.3 资产布局
资产布局用于显示IP资产,域名资产或公司相关资产的布局,每个布局结构相似但略有不同。资产布局的显示通过选项卡页面显示,选项卡列分为三层:基本信息,域名资产信息和IP资产信息。基本信息用于显示有关资产的一些基本信息,例如资产名称,资产描述和资产IP范围。以下内容以图表形式总结了总体资产影响的范围,并以图表形式总结了各种应用程序所占的百分比。显示),剩余的域名资产信息和IP资产信息显示在表中。
在资产布局资产统计信息之后,有“域名资产”和“ IP资产”的统计表,主要显示用于此资产的IP或域名使用了哪些技术。统计后的信息以表格格式显示,单击以查看详情,并查看有关资产下的域名或IP的详细信息。
图4.3 资产布局
如图4.3所示,域名资产表格的内容包括域名,IP,标题,使用说明和其他信息,IP资产表单中的标头信息包括ip,开放端口和其他信息。
4.2.2 API模块设计
扫描端(Client端)需要与Elasticsearch数据库进行交互并通过Web的restful api进行通信。 API模块的设计就是要解决这个中间问题。
有两个主要接口用于接收域名信息和接收IP信息,它是使用POST提交的,其内容为json格式。考虑到API的安全性,使用验证标头对其进行检查。
4.2.3 资产模块设计
资产模块的设计包括添加,删除,修改,查看和保存资产,并使用Elasticsearch搜索引擎显示资产的详细信息。使用MySQL数据库添加,删除,修改和检查资产,并且“资产”模块要求输入如资产名称,资产描述,IP范围,域名范围和额外时间之类的字段,使用elasticsearch过滤出需要的数据。
4.2.4 搜索模块设计
在搜索模块的设计中,会根据相应的搜索语法来搜索相关数据,使用类似于key=“value”的语法搜索,elasticsearch存储非关系数据,字段较多,因此用此搜索方式来搜索数据。搜索模块同时也支持组合查询。
相关搜索语法示例:
•title=“abc” # 从标题中搜索
•header=“abc” # 从http头搜索
•body=“123” # 从body搜索
•url = “.” # 搜索的子域名,``号是通配符
•ip = ‘1.1.1.1’ # 搜索IP,支持CIDR'192.168.1.0/24'和通配符搜索'192.168.1.*'
•port = ‘80’ # 搜索端口
•app = ’nginx’ # 搜索组件
•country = ‘cn’ # 搜索国家
•service = ‘mysql’ # 搜索服务
•bugs = 'xx' # 寻找存在某个漏洞的地址
4.3 数据存储结构
对搜索服务的需求使用Elasticsearch服务框架,而Elasticsearch是基于它的开源搜索引擎。无论是开源还是专有领域,Lucene都被视为迄今为止最先进,性能最强,功能最强大的搜索引擎库。因此,数据字段的定义应基于Elasticsearch规则。 Elasticsearch是一个非关系型数据库,常见的数据类型包括intger整数型,text文本型和keyword关键词,date日期型。 Elasticsearch基本上会分析分词,从而使查询非常快。
Elasticsearch和关系数据库以完全不同的方式定义数据存储结构,所定义的是一些在系统实现中必须的字段,也是需要被“分析”的字段。类别关系型数据库Elasticsearch有自己Index和Type,Index 就像关系型数据库里的 database,
Type 就像 database 里的 table。
4.3.1 域名信息存储结构
域名信息主要存储状态代码,标题,header头,网页源代码,服务器文本,IP地址,URL地址,CMS名称和添加时间。因为它是Elasticsearch存储数据结构,数据字段是非关系型,所以只能人为的确定“索引”中包括哪些字段以
及每个字段的含义。数据类型与关系型有所差别,主要体现在定义字段的名称上。图用于表示域名字段中的存储结构及其结构类型。
图 4.4 域名信息数据结构
4.3.2 IP信息存储结构
IP信息不仅要存储位置信息和IP的一些基本信息,包括版本信息,服务名称和端口开放信息,因为是非关系型的数据库,有些数据定义字段结合自身业务需求的关联性,需要将数据结构定为嵌套结构,在嵌套结构中在定义多个相关字段。
Elasticsearch在聚集分析时也支持很多嵌入字段,因此只需要将字段类型定义为Nested。 Elasticsearch在分析时就能进入到嵌入字段内部,对该字段下的下属字段进行分析了。
下图是IP信息存储结构中定义的字段详细信息,包括所包含字段的定义和相关字段定义的注释。
图 4.5 IP信息数据结构
第五章 运行测试
5.1 Web端运行测试
5.1.1 首页
首页会分为三个部分,顶部的导航栏以及下发左侧的统计信息,用于统计国家,端口,服务以及App,清楚标明数量,右侧为展示区,展示新扫描到的地址以及相关的详情。如图5.1 首页所示:
主页分为三个部分,顶部的导航栏以及统计信息用于计算国家、端口、服务和应用程序。右侧为展示区,展示扫描到的地址和相关详细信息。如图5.1第一页所示:
图5.1 首页
主页的结构布局样式,参考shodan,zoomeye和fofa等搜索引擎样式。但是,但总体上和他们不同的是,左侧的统计信息自动生成相应的搜索短语并将其显示在搜索框中,或单击搜索框中的搜索按钮进行搜索。与搜索短语相对应的链接,地址和其他详细信息显示在右侧的界面中。
5.1.2 域名资产信息
域名资产信息即展示了该域名的详细资产信息,如图5.2所示。如果通过“域名”进入到的该页面,它同时会显示该域名的子域名对应的资产信息,包括子域名的数量。下图一个选择夹分为Basic基础信息与History record历史记录,基础信息中显示ip,标题,使用技术,Http Response返回包等信息,同时也提供一些第三方在线查询站点查询相关的信息。
图5.2 域名资产信息
历史记录会显示目标扫描的历史信息,域名或IP可能会在一段时间内发生变化,所以有时历史信息会更有价值。 程序默认将目标缓存一段时间(默认为30天)。当缓存期到期时,再次添加目标扫描,并且相关信息将被新的扫描结果替换。要查找历史记录,转到History Record查看即可。
程序自动关联子域名中的所有信息,展示标题、IP和使用的框架技术等,并列出可能存在的威胁。它是程序的核心部分,会把相关资产链串联起来,它是程序自动搜索相关资产的核心部分。
自动关联域名如图5.3所示,单击域名进入详情页面,该目录所有子域名都会被发现,并且会展示子域名的一些关键特征,也单击此处转到详细信息页面跳转另一个目标的详情页面。
图5.3 子域名资产信息
5.1.3 系统统计页面
系统统计信息页面与整个系统的运行状况分析相同,数据分析的起始页面会统计扫描的域名及IP数量,对扫描漏洞的状态以及每天扫描的工作量进行分析,同时也包含运行节点状态等。
统计页面主要功能是向用户提供参考,以便用户了解整个系统的操作,从而促进将来的系统升级和改进。第一列显示域名数据,IP数据和漏洞数量,第二列以可视条形图显示作业量报告,使用户方便地了解所有搜索节点的每日扫描任务量。
漏洞统计是使用内置漏洞扫描框架来获取每个域名的统计信息,将可能出现的漏洞利用点以名称的形式展现出来,并统计总数,这只是一个大范围的粗略统计,如果是通过资产配置中进行的漏洞统计,将计算详细的状态和数量,并且统计信息将变得更加详细,如图5.4所示。
图5.4 系统统计
5.1.4 资产详情页面
自动查找资产是程序资产关联的一部分,还手动添加一些相关资产,例如,要找到京东的相关资产,只需在资产配置中配置类似于* .即可。还手动将一些关联性的资产加入进来,例如像查找腾讯Tencent的相关资产,程序支持通配符进行匹配。当然目前京东的资产肯定还不止这些,例如*.等等的都加入进来,如果又从其他地方找到了京东的IP段划分范围,也加入进来,资产配置中支持CIDR的IP段描述。加入进来后,程序将对相关的域名范围以及IP范围进行聚合分析,得出结果并以图表的形式展示。
资产详情中的信息由一个tab选择夹表示,如图5.5资产详细信息所示,主要分为三层,第一层是用于统计基本信息,第二层是域名统计,会将聚合分类到的域名资产以表格的形式在此页面中展示,第三层是IP资产统计,也是通过Elasticsearch聚合分类的形式以表格的形式在此页面中统计显示。
图5.5 资产详情
资产详情是完全由用户可控配置的,用户也配置多个资产详情。在以后的使用场景中,想象,如果配置腾讯的资产,京东的资产,中国湖北省的资产,美国的资产等,程序都分析出该范围内的资产详细情况,漏洞情况,方便安全从业人员对其进行安全监测以及漏洞挖掘等。
5.2 扫描端运行测试
前面说到,扫描端不会直接与用户交互的,用户需要从Web端将相关数据存入到中间件数据库中,由扫描端从中间件数据库读取消息并按照消息内容执行程序。
扫描端的作用是为WEB端提供数据的支持,所以在Web端设计了一种在web端直接查看扫描节点的运行过程的功能,可查看到当前节点的运行日志状态,如图5.6 节点日志所示。
图5.6 节点日志
通过节点日志,清楚查看到扫描端的运行过程,运行时间以及运行内容,方便快速定位异常点并处理异常。
结束语
资产收集的行为已经成为黑客们信息收集中必备的手段了,随着Zoomeye、Fofa、Shodan的广泛使用,我也曾幻想自己也能写出和它们一样的工具,通过这次设计,因为需求原因接触到了自己之前从未接触的东西,例如Elasticsearch,Django等等,出现过很多问题,幸运的是最后都被解决了。在最后的部署上线过程中,我又学习了Docker的使用,和Nginx与Django uwsgi的联调方式上线网站,当网站成功运行的时候,内心充满了满足感。目前系统还有很多功能优化,当数据量巨大的时候还会有速度的瓶颈等等,但我相信在未来随着我技术的提高这些问题都会被逐步解决。
版权声明:本文标题:基于Django的网络空间安全资产引擎设计与实现 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/b/1708396816a522623.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论