IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    巡风源码初探

    铁匠发表于 2017-02-22 14:42:38
    love 0

    0x01 前言

    巡风是同程安全应急响应中心(YSRC)在GitHub上开源的安全工具,采用Python编写,“是一款适用于企业内网的漏洞快速应急、巡航扫描系统,通过搜索功能可清晰地了解内部网络资产分布情况,并且可指定漏洞插件对搜索结果进行快速漏洞检测并输出结果报表。”对于这款工具,总体感觉小巧、高效,一定程度上关注到了安全运维中的部分痛点。笔者作为公司的安全运维负责人,在工作中有幸使用巡风来寻找内网的安全问题,现将巡风的安装过程和源码的阅读体会与大家一起分享。

    0x02 安装

    参考了官方给出的安装方法,下面是我在CentOS 7系统上的实际操作过程。

    1.安装Python基础软件包

    <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>

    2.安装MongoDB数据库

    配置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>

    3.安装巡风

    此步骤相对简单,从GitHub(https://github.com/Blacksmith-shop/xunfeng)上直接下载Zip包,解压至合适的位置即可,建议与公司应用部署上线的模式相结合,减少后期运维的麻烦。

    参考:巡风:企业内网的漏洞快速应急巡航扫描系统

    0x03 配置

    从最小化修改、最快捷使用的角度出发,在配置过程中我也希望尽可精简。

    1.导入基础数据

    <span class="pln">mongorestore </span><span class="pun">-</span><span class="pln">d xunfeng db</span>

    2.设置MongoDB账户

    20170222165147

    强迫症患者,可以在此处修改账号、密码,但需要与巡风最终的配置文件保持一致。

    3.修改巡风

    • 对Config.py文件,由于采用MongoDB默认安装,还是采用默认端口,修改如下:

    <span class="pln">PORT </span><span class="pun">=</span> <span class="lit">27017</span>

    • 对Run.py文件,这是巡风WebUIAdmin的主要启动程序,因在非root用户下运行,换成8080端口,修改如下:

    <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>

    • 对Run.sh文件,注释该行:

    <span class="str">"nohup mongod --port 65521 --dbpath=${XUNFENG_DB} --auth &gt; ${XUNFENG_LOG}/db.log &amp;"</span>

    • 对masscan文件,添加执行权限:

    20170222170925

    4.配置防火墙

    <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>

    5.运行使用

    <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可看。

    0x04 源码分析

    巡风的整体设计比较清晰,估计在设计之初就定位于工具的缘故,侧重实用和效果,源码结构也是一目了然,编程水平高的同学可以通过修改源码来添加需要的功能。

    1.目录结构及其功能

    巡风主要由根目录和4个子目录views、aider、nascan、vulscan组成,4个子目录分别对应WebUIAdmin、辅助工具、设备(资产)扫描和漏洞检测4个组成模块,其中WebUIAdmin基于Flask实现,属于轻量级Web解决方案,该程序负责在日常工作中与我们进行请求响应和扫描结果展示,同时也通过Web对巡风进行插件的配置管理。

    2.aider目录源码解读

    目前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编程的同学可以借鉴。

    3.nascan目录源码解读

    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服务的信息采集。

    4.vulscan目录源码解读

    vulscan不仅是漏洞检测程序,同时也是基于插件的漏洞检测开发框架,程序本身并不难理解,相反是漏洞检测插件的开发会成为后续使用巡风的一大障碍。

    漏洞产生的原因多种多样,每种漏洞的检测方法也各不相同,显然在快速事件响应过程中,完成一个漏洞插件开发是安全运维者的较高水平体现,为了提升效率,vulscan定义了两种开发模式来尽可能简化相关漏洞插件的开发:针对Web请求的JSON插件和非Web厂家下的Python脚本。

    JSON插件的本质事定义了一次完整的Web请求过程,通过对响应结果的规则匹配来识别Web漏洞;而Python脚本的开发,厉害的同学可以结合最新的exploit进行开发,只要符合vulscan的调用规则即可。两种插件模式配合使用不得不说高效。

    0x05 总结

    在日常的安全运维中,巡风作为安全工具能够协助我们做好最新漏洞的检测,防范安全风险,笔者通过本文也是对巡风使用上的一次回顾,对于巡风的WebUIAdmin和MongoDB数据模型也没有详细去聊,难免有不足之后,恳请大家谅解。



沪ICP备19023445号-2号
友情链接