企业安全实践(基础建设)之被动扫描自动化(中)
前言
常规WEB安全扫描一般分为主动扫描和被动扫描,本章主要讲解其中的被动扫描。
背景
在上一篇中(企业安全实践之被动扫描自动化 上)中已经介绍了通过流量镜像的方式获取数据源,并进行数据源处理的过程,本章主要讲下通过日志的方式进行数据源获取和处理的方法。
日志
我们想抓取所有接口访问请求时,通常的解决方法是流量镜像,但当这种操作我们没有权限进行下时,我可以退而求其次,可以以日志或者代理的方式获取数据源,但日志的方式存在一个缺点就是,大部分的web日志都不会存储post body,所以我们的测试源只能以GET方法为准。
日志的存储多种多样,比如经典的ELK、Splunk等,其中Splunk是我们今天的例子。日志中存储的记录可能包含众多,但我们需要只是web访问日志,以nginx为例。当我们在splunk搜索nginx日志时,是这样的:
提取几个关键元素字段,如下:
ng_request_method 代表访问方法(GET/POST) ng_status 代表response code(通常有200、400、302等等) ng_request_domain 代表访问域名(如www.test.com) ng_request_url_short 代表访问接口(不包含参数字串,如/zh/user.php) ng_query 参数字串(通常指GET方法的参数字串,如user=aaa&password=123456)
可通过自定义规则查询,参考规则如下, 建议通过函数rename把最终查询字段名称统一为“ng_request_method、ng_request_domain、ng_request_url_short、ng_query、ng_status”,方便代码执行,防止出现错误。
search index=nginx ng_request_method=GET ng_status!=40* |eval ng_request_url_short=lower(ng_request_url_short) |regex ng_request_url_short != "(?i)(.+\.(htm|html|ico|mp3|js|jpg|jped|gif|xml|zip|css|png|txt|ttf|rar|gz))$" |regex ng_request_url_short != "(?i)((\d+){5,})" |rex field=ng_request_url_short mode=sed "s/\/$//g" |stats last(ng_request_domain) last(ng_query) by ng_request_url_short, ng_status, ng_request_method |rename "last(ng_request_domain)" as ng_request_domain |rename "last(ng_query)" as ng_query
搜索如下,获取列表信息可作为测试数据源信息。
开源项目
项目地址
https://github.com/grayddq/PassiveLogSorting
项目介绍
自动化被动扫描系统共分为数据源、数据处理、任务分发、漏洞验证四个子系统,本系统属于数据源、数据处理部分,当流量镜像方法无权限或者不适合的时候,可把WEB日志作为数据源,进行分析过滤去重等操作,发送至消息队列中,等待PassiveSecCheck消费。
作者
咚咚呛,如有其他建议,可联系微信280495355
满足安全需求
1、支持远程splunk大数据日志的提取和分析 2、支持自定义规则进行去重、去静态、去相似等方法,已集成部分规则,另一部分规则需要按照场景和日志进行统计设定 3、支持按照五元素json存储结果到redis(方法、协议、域名、接口、参数)
技术细节
1、逻辑上日志一般不存储post body,假如存储了,恭喜你可通过日志获取所有接口。 2、日志使用splunk搭建,并提取相应的字段,分别对应为ng_request_method、ng_status、ng_request_domain、ng_request_url_short、ng_query 3、、自定义splunk搜索规则保存在redis的中,可动态修改,如去静态资源、去相似url、去敏感域名、任务最大时间、搜索时间等。 4、去重过滤,计算出MD5(方法+接口)值,利用redis唯一key进行去重 5、结果redis存储Key是去重md5值,VALUE是json存储的五元素 6、结果为反复覆盖式存储,可保持请求最新
测试环境
centos 7 + python 2.7.5
部署
1、逻辑上日志一般不存储post body,假如存储了,恭喜你可通过日志获取所有接口。 2、日志使用splunk搭建,并提取相应的字段,分别对应为ng_request_method、ng_status、ng_request_domain、ng_request_url_short、ng_query 3、、自定义splunk搜索规则保存在redis的中,可动态修改,如去静态资源、去相似url、去敏感域名、任务最大时间、搜索时间等。 4、去重过滤,计算出MD5(方法+接口)值,利用redis唯一key进行去重 5、结果redis存储Key是去重md5值,VALUE是json存储的五元素 6、结果为反复覆盖式存储,可保持请求最新
配置
配置目录:./lib/config.py
# redis 配置信息 REDIS_HOST = '127.0.0.1' REDIS_PORT = 6379 REDIS_PASSWORD = 'xxxxxx' REDIS_DB = 6 # Splunk配置信息 SPLUNK_HOST = "10.1.2.10" SPLUNK_PORT = 8089 SPLUNK_SCHEME = "https" SPLUNK_USERNAME = "xxxxx" SPLUNK_PASSWORD = "xxxxxx" # query保存查询语句 # earliest_time查询时间,从现在往前推多长时间 # max_time 表示任务执行最大时间 #请使用rename函数保证字段名称一致,ng_request_method、ng_request_domain、ng_request_url_short、ng_query、ng_status rule = { 'query': ''' search index=nginx ng_request_method=GET ng_status!=40* |eval ng_request_url_short=lower(ng_request_url_short) |regex ng_request_url_short != "(?i)(.+\.(htm|html|ico|mp3|js|jpg|jped|gif|xml|zip|css|png|txt|ttf|rar|gz))$" |regex ng_request_url_short != "(?i)((\d+){5,})" |rex field=ng_request_url_short mode=sed "s/\/$//g" |stats last(ng_request_domain) last(ng_query) by ng_request_url_short, ng_status, ng_request_method |rename "last(ng_request_domain)" as ng_request_domain |rename "last(ng_query)" as ng_query''', 'earliest_time': '-1m', 'max_time': 60 }
运行截图
运行如图:
结果redis中记录如下: