企业安全实践(基础建设)之被动扫描自动化(中)

前言

       常规WEB安全扫描一般分为主动扫描和被动扫描,本章主要讲解其中的被动扫描。

背景

       在上一篇中(企业安全实践之被动扫描自动化 上)中已经介绍了通过流量镜像的方式获取数据源,并进行数据源处理的过程,本章主要讲下通过日志的方式进行数据源获取和处理的方法。

日志

       我们想抓取所有接口访问请求时,通常的解决方法是流量镜像,但当这种操作我们没有权限进行下时,我可以退而求其次,可以以日志或者代理的方式获取数据源,但日志的方式存在一个缺点就是,大部分的web日志都不会存储post body,所以我们的测试源只能以GET方法为准。

       日志的存储多种多样,比如经典的ELK、Splunk等,其中Splunk是我们今天的例子。日志中存储的记录可能包含众多,但我们需要只是web访问日志,以nginx为例。当我们在splunk搜索nginx日志时,是这样的:

111.png

提取几个关键元素字段,如下:

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

          搜索如下,获取列表信息可作为测试数据源信息。

222.png


开源项目

项目地址

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
}

运行截图

       运行如图:

111.png

       结果redis中记录如下:

222.png

原始链接: http://www.freebuf.com/column/157947.html
侵权请联系站方: admin@sechub.in

相关推荐

换一批