巡风是同程安全应急响应中心(YSRC)在GitHub上开源的安全工具,采用Python编写,“是一款适用于企业内网的漏洞快速应急、巡航扫描系统,通过搜索功能可清晰地了解内部网络资产分布情况,并且可指定漏洞插件对搜索结果进行快速漏洞检测并输出结果报表。”对于这款工具,总体感觉小巧、高效,一定程度上关注到了安全运维中的部分痛点。笔者作为公司的安全运维负责人,在工作中有幸使用巡风来寻找内网的安全问题,现将巡风的安装过程和源码的阅读体会与大家一起分享。
参考了官方给出的安装方法,下面是我在CentOS 7系统上的实际操作过程。
<span class="pln">curl </span><span class="pun">-</span><span class="pln">O https</span><span class="pun">:</span><span class="com">//bootstrap.pypa.io/get-pip.py</span><span class="pln"> python </span><span class="kwd">get</span><span class="pun">-</span><span class="pln">pip</span><span class="pun">.</span><span class="pln">py pip install pymongo </span><span class="typ">Flask</span><span class="pln"> xlwt paramiko</span>
配置MongoDB安装源
<span class="pln">vi </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">yum</span><span class="pun">.</span><span class="pln">repos</span><span class="pun">.</span><span class="pln">d</span><span class="pun">/</span><span class="pln">mongodb</span><span class="pun">.</span><span class="pln">repo </span><span class="pun">[</span><span class="pln">mongodb</span><span class="pun">-</span><span class="pln">org</span><span class="pun">-</span><span class="lit">3.4</span><span class="pun">]</span><span class="pln"> name</span><span class="pun">=</span><span class="typ">MongoDB</span> <span class="typ">Repository</span><span class="pln"> baseurl</span><span class="pun">=</span><span class="pln">https</span><span class="pun">:</span><span class="com">//repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/</span><span class="pln"> gpgcheck</span><span class="pun">=</span><span class="lit">1</span><span class="pln"> enabled</span><span class="pun">=</span><span class="lit">1</span><span class="pln"> gpgkey</span><span class="pun">=</span><span class="pln">https</span><span class="pun">:</span><span class="com">//www.mongodb.org/static/pgp/server-3.4.asc</span>
安装运行
<span class="pln">yum install mongodb</span><span class="pun">-</span><span class="pln">org systemctl enable mongod</span><span class="pun">.</span><span class="pln">service systemctl start mongod</span><span class="pun">.</span><span class="pln">service systemctl status mongod</span><span class="pun">.</span><span class="pln">service</span>
此步骤相对简单,从GitHub(https://github.com/Blacksmith-shop/xunfeng)上直接下载Zip包,解压至合适的位置即可,建议与公司应用部署上线的模式相结合,减少后期运维的麻烦。
从最小化修改、最快捷使用的角度出发,在配置过程中我也希望尽可精简。
<span class="pln">mongorestore </span><span class="pun">-</span><span class="pln">d xunfeng db</span>
强迫症患者,可以在此处修改账号、密码,但需要与巡风最终的配置文件保持一致。
<span class="pln">PORT </span><span class="pun">=</span> <span class="lit">27017</span>
<span class="pln">app</span><span class="pun">.</span><span class="pln">debug </span><span class="pun">=</span> <span class="kwd">False</span><span class="pun">,</span><span class="pln">port</span><span class="pun">=</span><span class="lit">8080</span>
<span class="str">"nohup mongod --port 65521 --dbpath=${XUNFENG_DB} --auth > ${XUNFENG_LOG}/db.log &"</span>
<span class="pln">firewall</span><span class="pun">-</span><span class="pln">cmd </span><span class="pun">--</span><span class="pln">permanent </span><span class="pun">--</span><span class="pln">zone</span><span class="pun">=</span><span class="kwd">public</span> <span class="pun">--</span><span class="pln">add</span><span class="pun">-</span><span class="pln">port</span><span class="pun">=</span><span class="lit">8080</span><span class="pun">/</span><span class="pln">tcp firewall</span><span class="pun">-</span><span class="pln">cmd </span><span class="pun">--</span><span class="pln">reload</span>
<span class="pln">sh </span><span class="typ">Run</span><span class="pun">.</span><span class="pln">sh</span>
访问http://[IP]:8080
,默认账号密码:admin
,xunfeng321
,详细使用大家可从官方GitHub可看。
巡风的整体设计比较清晰,估计在设计之初就定位于工具的缘故,侧重实用和效果,源码结构也是一目了然,编程水平高的同学可以通过修改源码来添加需要的功能。
巡风主要由根目录和4个子目录views、aider、nascan、vulscan组成,4个子目录分别对应WebUIAdmin、辅助工具、设备(资产)扫描和漏洞检测4个组成模块,其中WebUIAdmin基于Flask实现,属于轻量级Web解决方案,该程序负责在日常工作中与我们进行请求响应和扫描结果展示,同时也通过Web对巡风进行插件的配置管理。
目前aider目录仅一个文件Aider.py,故先拎出来分析。Aider会在启动时监听53(UDP)、8088(HTTP)两个端口。我们知道,53端口一般用作DNS服务,而aider的作用就是记录DNS的查询情况,并通过HTTP服务对DNS情况进行检查。
值得一提的事,aider的HTTP服务仅仅是一个TCP socket,对于HTTP的请求的处理和响应近乎暴力(高效),直接附上代码。
创建HTTP服务:
<span class="pln">web </span><span class="pun">=</span><span class="pln"> socket</span><span class="pun">.</span><span class="pln">socket</span><span class="pun">(</span><span class="pln">socket</span><span class="pun">.</span><span class="pln">AF_INET</span><span class="pun">,</span><span class="pln">socket</span><span class="pun">.</span><span class="pln">SOCK_STREAM</span><span class="pun">)</span><span class="pln"> web</span><span class="pun">.</span><span class="pln">bind</span><span class="pun">((</span><span class="str">'0.0.0.0'</span><span class="pun">,</span><span class="lit">8088</span><span class="pun">))</span><span class="pln"> web</span><span class="pun">.</span><span class="pln">listen</span><span class="pun">(</span><span class="lit">10</span><span class="pun">)</span>
输出响应:
<span class="pln">raw </span><span class="pun">=</span> <span class="str">"HTTP/1.0 200 OK\r\nContent-Type: application/json; charset=utf-8\r\nContent-Length: %d\r\nConnection: close\r\n\r\n%s"</span> <span class="pun">%(</span><span class="pln">len</span><span class="pun">(</span><span class="pln">html</span><span class="pun">),</span><span class="pln">html</span><span class="pun">)</span><span class="pln"> conn</span><span class="pun">.</span><span class="pln">send</span><span class="pun">(</span><span class="pln">raw</span><span class="pun">)</span><span class="pln"> conn</span><span class="pun">.</span><span class="pln">close</span><span class="pun">()</span>
这部分代码对于初学TCP编程的同学可以借鉴。
NAScan是设备扫描程序,能够通过ICMP、Web和Masscan检测主机情况,包括主机存活性、端口、服务进行探测,同时对应用服务指纹和Web应用指纹进行识别(需要维护指纹配置信息)。
文件NAScan.py会周期性创建扫描任务,具体如何扫描等工作逻辑由lib目录下的start.py完成。start.py是个多线程编程的过程,类start通过读取MongoDB数据库中配置信息,创建相应的扫描线程,如果启用了Masscan,会调用plugin目录下的masscan.py完成端口扫描,并在线程类ThreadNum中进一步调用scan.py文件完成整个扫描工作。
因而scan.py是整个NAScan的核心,弄清楚scan.py就能够理解巡风进行设备扫描时的主要过程。
一般的主机扫描需要扫描端口和识别服务两个主要步骤,并进一步检测服务应用情况,尤其对Web服务基础信息的识别。scan.py的扫描只是处理显而易见的端口和服务,具体需要在“巡风-配置-爬虫引擎”中指定相应的端口和识别规则。弄明白这些,再去阅读scan.py就能够很快切入其中,从而可以根据自身业务的需要变更相关的流程或是添加额外的功能,例如对Web API服务的信息采集。
vulscan不仅是漏洞检测程序,同时也是基于插件的漏洞检测开发框架,程序本身并不难理解,相反是漏洞检测插件的开发会成为后续使用巡风的一大障碍。
漏洞产生的原因多种多样,每种漏洞的检测方法也各不相同,显然在快速事件响应过程中,完成一个漏洞插件开发是安全运维者的较高水平体现,为了提升效率,vulscan定义了两种开发模式来尽可能简化相关漏洞插件的开发:针对Web请求的JSON插件和非Web厂家下的Python脚本。
JSON插件的本质事定义了一次完整的Web请求过程,通过对响应结果的规则匹配来识别Web漏洞;而Python脚本的开发,厉害的同学可以结合最新的exploit进行开发,只要符合vulscan的调用规则即可。两种插件模式配合使用不得不说高效。
在日常的安全运维中,巡风作为安全工具能够协助我们做好最新漏洞的检测,防范安全风险,笔者通过本文也是对巡风使用上的一次回顾,对于巡风的WebUIAdmin和MongoDB数据模型也没有详细去聊,难免有不足之后,恳请大家谅解。