作者介绍:Knifer7
信息安全小白一枚,梦想是成为精通多条技术栈的野生程序员,对于各方向的计算机技能都抱有热情,尤其喜欢信安大佬们解决问题的那些灵活的思路和方式。来到这里的目的就是拓展视野,在打好基础的同时尽可能提升自己的能力。
1、项目概要
巡风是一款适用于企业内网的漏洞快速应急、巡航扫描系统,通过搜索功能可清晰的了解内部网络资产分布情况,并且可指定漏洞插件对搜索结果进行快速漏洞检测并输出结果报表。
软件只作初步测试,无攻击*行为性**。
软件主体分为两部分:
①网络资产识别:通过用户配置的IP范围定期自动的进行端口探测(支持调用MASSCAN),并进行指纹识别,识别内容包括:服务类型、组件容器、脚本语言、CMS。
②漏洞检测引擎会根据用户指定的任务规则进行定期或者一次性的漏洞检测,其支持2种插件类型、标示符与脚本,均可通过web控制台进行添加。
参考链接:https://github.com/ysrc/xunfeng
2、项目安装
1. 运行环境
①操作系统
项目适配的64位操作系统列表:
Debian7、8
Ubuntu 14.04、14.10、16.04、16.10
CentOS 7
本次安装项目使用的操作系统版本:
CentOS-7-x86_64-DVD-1908.iso (点击链接可直接*载下**)
②软件依赖
Python2.7
Mogodb3. 2 .0
2. 安装、部署步骤
(不推荐,可跳过)手动安装
在安装之前,建议更换国内yum源
①修改时区
确保时区为Asia/Shanghai
如果不在或不能确定,执行如下命令:
echo TZ='Asia/Shanghai'; export TZ >> ~/.bash_profile && source ~/.bash_profile
②安装操作系统依赖
yum -y install python-devel openssl openssl-devel gcc sqlite sqlite-devel mysql-devel libxml2-devel libxslt-devel git
③(可选)升级CentOS7自带的Python2.7,5
*载下**py2.7:wget https:// www.python.org /ftp/python/2.7.18/Python- 2.7.18.tgz
解压:tar zxvf Python-2.7.18.tgz
进入解压后的目录中,安装并配置编译环境:
./configure --prefix=/usr/local
make
make altinstall
备份原有Python(备份后使用“python 2.7.5”可以打开旧版本):
mv /usr/bin/python /usr/bin/python2.7.5
链接新版本并查看:
ln -s /usr/local/bin/python2.7 /usr/bin/python
python

如图,升级成功
配置yum:
vim /usr/bin/yum
将#!/usr/bin/python改为#!/usr/bin/python2.7.5
用同样方法修改文件:/usr/libexec/urlgrabber-ext-down
④安装pip
如果未安装pip,建议安装pip:
*载下**:wget https://sec.ly.com/mirror/get-pip.py --no-check-certificate
安装:python get-pip.py
⑤安装数据库:
*载下**:wget https:// sec.ly.com /mirror/ mongodb-linux-x86_64-3.4.0.tgz
解压:tar -zxvf mongodb-linux-x86_64-3.4.0.tgz
将二进制文件放置到指定位置:cp -r mongodb-linux-x86_64-3.4.0 /usr/local/mongodb
更改配置文件/etc/profile:
配置如下环境变量:
export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:$MONGODB_HOME/bin
应用配置:
source /etc/profile
配置数据库:
mkdir /var/lib/mongodb/
cd /usr/local/mongodb
mkdir data
cd data
mkdir db
cd ..
mkdir logs
cd logs
touch mongodb.log
cd ..
vi mongodb.conf
配置文件内容如下:

注意,上述配置是为了演示方便,请勿照搬,这样的配置不符合运维规范0.0,正常来讲数据库的数据(data)和日志(logs)是要分开在两块盘上存储的。
启动数据库服务:
./mongod -f mongodb.conf

客户端连接数据库:
./mongo

配置数据库添加认证:

其中,user和pwd项为设置的账号和密码,可根据情况更改
⑥安装巡风
阿里源已失效,官方源*载下**慢,建议最开始先挂着一个终端进行*载下**
git clone https://github.com/ysrc/xunfeng.git
*载下**完成后,先配置好数据库:
进入xunfeng的db目录下:
mongorestore -h 127.0.0.1 --port 27017 -d xunfeng .
修改config.py:

修改run.sh:

根据require.txt安装Python依赖库:
pip install -r requirements.txt -i https://pypi.doubanio.com/simple/
上述这些配置信息必须与mongodb中相应的配置一致
运行xunfeng/run.sh
总体来说很麻烦,特别容易出问题,我在最后一步执行运行脚本时出错,连像样的报错信息都没有显示QAQ,最终还是采用了下面的安装流程。
(非常推荐)基于docker安装部署
①Docker的安装
(如果已经安装了docker,此步可以跳过)
docker依赖环境的安装:
yum -y install yum-utils device-mapper-persistent-data lvm2
设置*载下**docker的镜像源(阿里云):
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker:
yum makecache fast
yum -y install docker-ce
启动docker:
systemctl start docker
设置开机自启:
systemctl enable docker
测试docker:
docker run hello world
②安装巡风
使用git命令*载下**巡风(没有git先用yum安装git):
git clone https://github.com/ysrc/xunfeng.git
在中央仓库中拉取xunfeng的镜像:
docker pull ysrc/xunfeng

创建docker容器:
docker run -d -p 8008:80 --name xunfeng 镜像id

Tip:上述命令其实就相当于在Linux中创造出了一个进程级的隔离环境,简单理解为一块独立空间,然后将那块空间的80端口映射到了外部机器的8008端口上,因此我们在外面访问8008端口,就可以访问到容器中对应的服务
此容器中的xunfeng相关信息如下:

又一个Tip:如果在启动docker容器时出现了:
WARNING: IPv4 forwarding is disabled. Networking will not work.
问题产生原因:没有开启IPv4转发
解决方法(开启IPv4转发):
vi /etc/sysctl.conf
添加:net.ipv4.ip_forward=1
重启网络服务:systemctl restart network
参考链接:
https://www.51ittech.com/knowledge-base/centos-7-upgrade-python2-to-python2-last-version/
https://www.jianshu.com/p/d4ae4f5d283a
https://blog.csdn.net/u012199908/article/details/53056819
https://blog.csdn.net/five3/article/details/8904635
https://blog.csdn.net/github_38885296/article/details/80619191
https://www.jianshu.com/p/3a1c539e7355
https://blog.csdn.net/Jas0n_Liu/article/details/78179762
https://github.com/ysrc/xunfeng
3、项目使用
0. 巡风的工作流程简述
经过初步体验,笔者大概了解了巡风的工作流程:
爬取扫描内网存活IP及其开放的端口,进而生成内网资产统计信息,并进行周期性的更新。
作为用户,我们可以在诸多资产信息中搜索筛选出所需,并可以通过创建任务的方式,周期性或一次性地利用插件对这些内网IP进行漏洞扫描,检查内网的安全情况,能够非常方便地将结果以excel表格的方式导出。必要时,我们还可以自行编写POC来丰富插件库。
巡风的优点同样在于,它可以同时探测、存储、管理大量的内网资产信息,多线程大大提高了它的扫描效率。
1. 内网资产探测
进入xunfeng首页,登录

点击配置


找到网络资产探测列表这一项,此项为必填项,不然项目无法正常工作。
(通过指定IP范围的方式,指定爬虫引擎的探测范围)
设定好后,点击“更新”,扫描将被立刻触发。
此外,爬虫引擎的选项中还可以设定一些服务类型、CMS、代码语言等的识别规则,TCP连接超时时间,资产探测周期等,每一项都带有使用提示(项目名旁边的灰色的问号标识)。
在扫描引擎中,可以开启MASSCAN进行端口扫描(右侧是扫描的线程数),注意MASSCAN的路径要正确(图中root应该改为opt):

在这里也同样可以设置进行一些诸如进程数、白名单、超时时间等跟扫描相关的参数配置。
2. 筛选内网资产,针对性地创建任务

可以根据搜索功能的提示,按照指定格式查询内网资产
如果当前没搜索到所需的目标资产,我们可以选择手动新建目标:

(即使是我们手动新建的,只要目标无效,都会被巡风自动删除)
勾选我们的目标后,可以针对其新建任务:

(完善任务信息后,如果目标符合所选插件的执行条件,添加成功,否则添加失败)
参考链接:
http://blog.icxun.cn/hack/Intranet/672.html
4、使用案例
1. 前期准备
重新开了一个docker容器,为了方便,将端口直接映射到80。
目前巡风装在虚拟机上,为了让内网资产数据更丰富些,我们另外多开几台虚拟机。
以下为开启的所有虚拟机:

2. 扫描内网资产信息
设置探测范围后点击更新
等待一会后,发现扫描结果中多出了一个ssh服务:

勾选,新增任务:

接着又用同样的方式,手动增加了一个目标,添加了一个http相关的漏洞扫描任务。
等待一会,两个任务都有了结果:

结果是:ssh弱密码扫描到一个漏洞,而http的没有扫描到漏洞。
ssh弱密码扫描结果如下:

3. 尾声
准备结束案例的时候,点进统计页面发现所有的内网资产都已经被探测出来了:

模糊查询的结果(列出了所有资产信息,页面按比例缩小了一些):

五、补充:关于插件
1. 添加自定义插件的方式
点击巡风导航栏的“插件”一项进入插件管理页面:

可以看到项目内置有很多插件,我们点击右上角的“新增插件”:


插件的格式分两种,一种是Json格式,另一种是脚本。
Json格式的插件添加很简单,根据提示完成即可:

如果想要添加脚本格式的插件,直接将脚本拖拽上传即可:

(下面着重给出Python脚本格式插件的添加和使用案例)
2. 案例——脚本插件的编写和使用
巡风平台中已经内置有一些插件(下图为其中的一部分):

①准备工作
语言环境:Python2.7
实验对象:Tomcat8.5.32
注意!由于插件脚本最终是要在docker中运行的,脚本中的网络连接默认会被靶机的防火墙拦截,此时最简单的解决方式是关闭靶机的防火墙(在我们不知情的情况下,插件脚本发出的请求被防火墙拦截后,代*会码**抛出异常,如果没有作任何处理,巡风页面将不会有任何提示,也不会有日志记录,这是非常容易踩到的坑!)。
②CVE-2020-1938 Tomcat-Ajp协议漏洞介绍
Tomcat使用两种连接器和客户端进行通信,一种是耳熟能详的http连接器,另一种是ajp连接器。
关于ajp协议,百度百科上的解释为:
AJP(Apache JServ Protocol)是定向包协议。因为性能原因,使用二进制格式来传输可读性文本。WEB服务器通过 TCP连接和SERVLET容器连接。
简单来讲,就是除了http之外,客户端还可以通过ajp协议同Tomcat服务器进行通信,而本次利用的漏洞就出现在Tomcat的ajp协议中。
CVE-2020-1938是文件包含漏洞,攻击者可以利用此漏洞读取或包含Tomcat上webapp目录下的所有文件(如配置文件、源代码等),该漏洞被国家信息安全漏洞库评级为高危。
受漏洞影响的Tomcat版本如下:

图片截取自:https:// www.anquanke.com /post/id/199448
③漏洞复现
在编写插件之前,先进行一个简单的漏洞复现。
POC来源:https:// github.com / YDHCUI / CNVD -2020-10487-Tomcat- Ajp - lfi
(在此之前,已经在靶机上搭建部署好了Tomcat8.5.32)

上图中,我们利用此漏洞成功读取出了Tomcat服务器上WEB-INF目录中的web.xml配置文件。
可见其危害性之大。
查看POC代码的关键部分:
Ajp协议的请求头:

Tomcat中出现漏洞的三个属性:

④编写插件
手中已经拥有了POC,我们只需在其基础之上进行改写即可。
观察POC的主工作流程代码:

argparse模块用于运行脚本时从外部传参的情况,而我们不能规定让巡风如何去运行这个POC。主要修改的就是这个部分。
不难看出,主流程就是先实例化Tomcat对象,然后调用该对象下的perform_request方法取得结果,最终处理结果对象并输出字符串信息。
其中的重点是:
①Tomcat对象的初始化需要两个参数:target和port;
②perform_request方法有两个返回值,而在解*过包**程中第一个返回值是定义了一个单下划线变量去存储的,这说明第一个返回值不重要,可以忽略,最重要的结果在第二个返回值data中。
该POC修改为巡风插件的策略为:
①删除所有相关argparse模块的部分,采用巡风插件的格式进行编写,并在实例化对象时正确传递参数。
②保留代码中对结果对象data的处理部分,改变最后的输出方式(把打印输出改为返回结果字符串)
经过修改后的主流程代码截图如下:

运行测试脚本,功能正常:

⑤添加插件
添加成功:

在插件库中查看:

注意!巡风插件对代码格式的检测非常严格,本人编写代码时经过了多次尝试,发现代码必须完全符合巡风插件的格式规范(包括代码开头的注释)才可成功添加。
④测试自定义插件
新建目标,并为目标新建任务,指定添加的自定义插件:

等待数秒钟,得到结果(对测试代码的输出部分进行了小改动):

可以看到自定义插件的扫描结果也被计入了统计信息:

3. 从官方渠道安装插件
Github上唯一透露的官方渠道就是上图中的公众号,目前可以确定的是,官方渠道的插件已经很久都没有更新过了,不过这并不妨碍用户使用自行编写的或网络上收集到的POC进行插件的制作。
xunfeng中内置的插件下方的信息栏一般会有作者设置的链接,POC和漏洞介绍一般都会包含在目标网页中:

参考链接:https:// github.com / ysrc / xunfeng
5、总结
巡风总体来讲是一个非常好用的开源项目,主要作用就是内网产业的探测和漏扫,可以自定义插件的功能更是增加了项目的可延展性,搜索功能做得也比较人性化,还支持相关数据的Excel形式导出,此外,它对于许多不同类型的服务都有归类的标签,这是一个亮点。
不过也想说一下缺点:
首先是探测和扫描的过程中缺少给用户的反馈,让用户无法获知程序目前在做什么,进展如何(尤其是基于docker搭建的项目,进入到docker容器的内部去翻找项目的扫描日志是非常繁琐的);
第二点是前端页面的展示问题,扫描任务完成后,无法看到任务的简略情况,想知道是否扫出了漏洞,需要一个个点开来查看详细情况,这个会严重拖慢工作进度(尤其是在任务量大的情况下)。
最后一点就是,个人认为该项目再加上一个“立即探测”的功能就更好了,目前的状态是每次扫描至少间隔一小时,无法满足很紧急的场景需求。
(Knifer7:希望自己有朝一日能够读懂这类安全软件的源码)

国科学院学生会是由国科学院指导开展的学员服务型组织,致力于配合国科学院完成日常工作的开展以及强化锻炼学员的自身职业素养与专业技能,建设部门有技术部和综合部。
如果你们也想提升自我,又或者是想认识这些和你们一样优秀的小伙伴,那就赶快联系指导老师并加入我们吧!
学生会信箱:
student@goktech.cn