企业安全实践(基础建设)之被动扫描自动化(上)
前言
常规WEB安全扫描一般分为主动扫描和被动扫描,本章主要讲解其中的被动扫描。
背景
在WEB安全测试中,针对乙方而言,被动扫描其实并不常见,因为数据源单一原因,导致以爬虫为主的安全测试大行其道,但在甲方的视角下,要考虑覆盖率的问题,故被动扫描也在考虑范围内。
被动扫描
被动扫描通俗来讲,就是通过流量、代理、日志等的方式去采集测试数据源,然后进行安全验证的过程。
与主动扫描相比,被动扫描并不会进行大规模的爬虫行为,其优势也比较明显:
1)覆盖率:主动扫描的测试数据源全部来自爬虫,如独立页面、API接口等获取较为困难,而被动扫描可通过流量镜像的方式近似获取全接口请求;
2)速度:被动扫描省去了爬虫的阶段,可以大大减少测试时间
3)精准测试:被动扫描多数为自研扫描,由于充分了解自身业务流程,故可定制更加适用的paylod进行安全测试,如越权测试、信息泄露等。
安全需求
在做项目之前一定要大体明确其需求所在,才能更加优秀的实现其功能。如下
1、需要支持流量镜像、日志,代理等方法作为数据源
2、可对获取到的数据信息进行自定义过滤
3、可对数据源进行自动化安全测试
4、漏洞管理或界面操作暂不考虑,但需要提供相关接口
架构设计
基于安全需求,我们按照模块可把系统划分为四块:数据源、数据处理、任务分发、漏洞验证。
数据源
数据来源有多种途径,其中比较常用的有三种,流量镜像方式、web日志、网络代理,由于很多企业的安全组并没有想象中那么大的权限可以实现流量镜像或者操作线上业务的web server,web日志方式一般都作为流量镜像的补偿方案来进行的方法。在我的开源项目中是基于流量镜像和web日志的方式来实现的。
流量镜像的话,通常是由核心交换机进行的端口镜像来实现,其中可能会涉及到https解密的问题,所以需要运维的同学选定统一解密后的镜像位置。
我的部署方式是在IDC机房内部,镜像Nginx 7负载均衡的一台机子的流量,大概1/10,由于这个阶段已经进行了https解密,故不涉及密钥解密的问题。
数据处理
数据处理包含几个模块,抓包模块、http解析模块、数据过滤模块、信息队列存储。
抓包模块使用的scapy库,scapy是一个可用于网络嗅探非常强大的第三方库,且支持以交互模式进行数据包过滤,故选定scapy作为抓包基础。
其中过滤模块,主要通过方法、协议、域名、接口、参数五元素进行过滤,比如去静态资源,去url相似度,可通过配置redis配置信息实时进行更改过滤规则,并计算MD5(接口+方法)的方法,在redis队列中进行去重操作。
开源项目
项目地址
https://github.com/grayddq/PassiveDataSorting
项目介绍
自动化被动扫描系统共分为数据源、数据处理、任务分发、漏洞验证四个子系统,本系统属于数据源、数据处理部分,抓取流量镜像的数据,进行分析过滤去重等操作,发送至消息队列中,等待PassiveSecCheck消费。
作者
咚咚呛,如有其他建议,可联系微信280495355
满足安全需求
1、支持大流量镜像(比如核心交换机上对负载均衡nginx或waf流量镜像)数据处理,当流量过大会主动丢弃 2、支持流量对http解析 2、支持按照规则进行去重、去静态、去相似等方法,已集成部分规则,另一部分规则需要按照场景和日志进行统计设定 3、支持按照五元素json存储结果到redis(方法、协议、域名、接口、参数)
技术细节
1、基于scapy进行网卡流量数据处理,流量过大会主动丢弃部分数据 2、基于scapy_http进行流量的http解析 3、支持http协议的GET/POST方法,针对POST防止,暂只支持application/x-www-form-urlencoded(如body为user=test&password=123456)类型 4、自定义url过滤规则保存在redis的中,可动态修改,支持如下:匹配任意五元素,进行放行、拦截、替换等操作,如去静态资源、去相似url、去敏感域名等。 5、去重过滤,计算出MD5(方法+接口)值,利用redis唯一key进行去重 6、结果redis存储Key是去重md5值,VALUE是json存储的五元素 7、结果为反复覆盖式存储,可保持请求最新
测试环境
centos 7 + python 2.7.5
部署
1、任意机子安装redis $ yum install redis $ vim /etc/redis.conf # 更改bind 127.0.0.1 改成了 bind 0.0.0.0 # 添加一行requirepass xxxxx密码 # 修改daemonize yes $ redis-server /etc/redis.conf 2、流量镜像数据处理server 1) $ yum install scapy 2) $ pip install -r requirements.txt 3) 配置./lib/config.py 文件,填入Redis和相关规则,后期可以直接在redis进行规则更改添加 4) $ nohup python run.py &
配置
配置目录:./lib/config.py
# redis信息 REDIS_HOST = '127.0.0.1' REDIS_PORT = 6379 REDIS_PASSWORD = 'xxxxxxx' REDIS_DB = 0 # field 代表5元素中字段名称,method/protocol/domain/ng_request_url_short/arg # rule 代表需要匹配的正则 # remarks 代表备注信息 # action代表行为,open匹配上则放过没匹配则拦截、lock匹配上拦截,replace匹配上替换 # replace代表,当action为replace为时,匹配上的替换为replace中的字串 conf_sniffer_rule = [ {'field': 'method', 'rule': '^(GE|POS)T$', 'remarks': '方法过滤只允许GET/POST', 'action': 'open'}, {'field': 'protocol', 'rule': '^http://$', 'remarks': '协议过滤只允许http://', 'action': 'open'}, {'field': 'domain', 'rule': 'www\.test\.com', 'remarks': '禁止www.test.com', 'action': 'lock'}, {'field': 'ng_request_url_short', 'rule': '(.+)\.(ico|mp3|js|jpg|jped|gif|xml|zip|css|png|txt|ttf|rar|gz)$', 'remarks': '排除静态文件', 'action': 'lock'}, {'field': 'ng_request_url_short', 'rule': '(\d+){5,}', 'replace': 'xxxxxx', 'remarks': '接口出现5位以上数字则把相关数字替换为xxxxx', 'action': 'replace'}, {'field': 'ng_request_url_short', 'rule': '/$', 'replace': '', 'remarks': '假如接口最后一位为/进行删除', 'action': 'replace'} ]
运行截图
流量镜像截图:
运行后cpu、内存、IO等如下:
存储数据如下: