如何构建一个网络空间搜索引擎

引言

当初无意中看到知道创宇推出来的网络空间搜索引擎ZoomEye,感觉好炫酷,很好奇它是怎么实现的,所以网上一阵搜索,想弄清楚ZoomEye是怎么实现的,自己也想模仿实现一个,一搜索才知道类似ZoomEye的产品很多,比如最出名的Shodan,以及不包含任何收费项目,全部数据都可以免费下载的Censys,还有开源的ivre,通过查看ivre的源代码,以及网上的一些资料和源码(Scan-T),总结了一个网络空间搜索引擎的大体架构,并为实现自己的个性化网络空间搜索引擎做了一个简单方案。

整体架构

网络空间搜索引擎的整体架构主要分为调度框架、扫描器、存储分类、攻击框架和UI呈现等。

  • 调度框架:负责从队列中获取扫描任务分发给扫描节点,然后处理节点完成扫描任务后返回结果。开源的调度框架很多,比如使用Python开发的Celery、RQ、APScheduler等等。
  • 扫描器:从开源的这些项目中可以看到,它们的扫描器都是使用开源的比如nmap、zmap、bro、pof等,可能商用的网络空间搜索引擎它们不仅仅使用这些开源的扫描器,还使用了自主开发的扫描器,比如我知道的masscan,据说配合专用的驱动,扫描整个网络用时是远远快于zmap、nmap的。
  • 存储分类:存储使用了MongoDB、Redis等非关系型数据库,对于数据的分类查询,好像大家都使用ElasticSearch简称ES。
  • 攻击框架:负责漏洞的检测和验证,我觉得网络空间搜索引擎缺少这个攻击框架,那应该是一个残次品。

初步方案

根据上面对网络空间搜索引擎整体架构的剖析,要自己实现一个轻量级的网络空间搜索引擎,已经不是那么遥不可及,无非就是编程能力的不同,实现的好坏不同而已。我的原则就是商用产品走它们的阳关大道,我走自己的个性独木桥,just for fun 而已。

  • 整体工程:整体工程采用Django框架进行开发
  • 调度框架:采用APScheduler这个轻量级的任务调度框架
  • 扫描器:调用nmap,最好提供接口,可以选择使用nmap还是zmap,或者把主动式是pof、bro也给集成进去
  • 存储:考虑使用MongoDB,因为最近在研究MongoDB
  • 索引查询:使用ElasticSearch,还没用过,以后专门写篇文章介绍一下
  • 攻击框架:还没想好,后续参照Pocsuite,看看能不能写一个简易的。
  • UI呈现:类似zoomeye主页一样,提供攻击地图动态展示。

小结

初步方案只是起一个指导方向,具体实现过程中具体调整,但总体架构是不变的。后续会对方案中涉及的技术写相应的文章分析,算作一个知识储备。