Fanxs's Blog

被动扫描系统 - Shadow Border

字数统计: 2k阅读时长: 7 min
2020/02/02 Share

前言:
在之前常规的WEB安全测试时,总感觉要针对每个接口的不同参数做SQL注入检测工作非常的麻烦和费力,往往一个疏忽就漏掉了SQL注入点。同样的漏洞还有如模板注入、XSS等,可存在于不同参数之中,逐一进行检测非常的费时费力。那会儿就想整一个被动扫描系统,可方便完成常规测试时的一些重复性工作,如SQL、XSS等漏洞的检测。刚好想锻炼一下自己的能力,刚辞职空窗期也比较闲,就决定写一个自己用的顺手、能自主拓展的被动扫描系统。

0x00. 简介

Shadow Border,就是在这样的初衷和背景下设计和编写的。Shadow Border是个被动扫描框架,用于渗透测试中的被动扫描、信息收集等并发的任务。使用了Burpsuite,Redis和python,使用者可自定义poc进行被动扫描。

流程:

  1. 运行ShadowBorder脚本,登录后,对scanner进行设置。设置允许扫描和镜像的请求http method,请求域名白名单,黑名单,redis账号,管理页面账号等数据。
  2. 测试时设置Burp代理,加载Shadow Border插件,将请求镜像发送到Redis:
  3. 选择使用的poc后,开启scanner。
  4. 查看扫描状态:

依赖:

  • Python 3.4以上
  • Burpsuite
  • Redis
  • treelib (python库)
  • requests (python库)
  • tornado (python库)
  • redis (python库)
  • gevent (python库)

0x01.简单框架

Shadow Border 总体上参考GourdScanV2,通过设置代理转发请求,针对请求进行漏洞扫描,最后在WEB界面显示扫描结果。GourdScan是一款非常优秀的被动扫描系统,但在使用中发现基于python tornado代理进行转发时,有较大的延时,所以在设计Shadow Border系统时,基于我自己的渗透测试方法和习惯,我选择了使用Burpsuite来做请求的镜像来提高代理速度,之后通过Redis做请求存储,python起的scanner针对请求做扫描。在scanner的编写上,我本人比较喜欢Poc-T那种较为灵活的poc调用方式,所以基于Poc-T编写了Shadow Border的scanner。

主要的框架为:

  1. 测试时设置Burpsuite代理,通过Burpsuite插件,提取请求包的信息,发送到Redis。
  2. Python开启Web Server,在Web页面中点击启动Scanner。
  3. Scanner初始化后,从Redis中获取请求数据。
  4. Scanner Engine调用poc,对请求进行扫描。
  5. 扫描结果存入Redis,在Web页面展示。

0x02.框架细节

整体来看,被动扫描器这类工具大致都是由三部分组成:

  1. 获取请求
  2. 漏洞检测
  3. 结果输出

获取请求

Shadow Border通过Burp插件来镜像请求,Redis来存储请求。Burp的Proxy模块收到请求时,将请求交到插件处,插件使用Burp的API提取每个请求的:

  • 头部
  • HTTP Method
  • URL
  • query参数
  • post数据

之所以选择通过Burp来截获请求,一是因为符合我自己平时渗透测试时的习惯,同时代理请求速度快,而且Burp本身提供了API来解析HTTP请求的各部分数据,不需要再自行解析,提取的数据在poc中可直接通过requests进行发包测试。

在管理页面,可以对允许扫描的请求的HTTP Method,文件后缀,域名白名单,域名黑名单进行设置。Burp插件也允许对单一请求通过右键菜单进行镜像:

漏洞检测

这一部分是引擎的核心功能,针对获取到的标准化的请求,调用poc进行扫描。这一模块是参考Poc-T进行编写的,运行机理和Poc-T差不多。Scanner初始化时加载poc脚本,从Redis中获取请求后,请求和每个poc组成1个Task对象,添加到任务管理TaskManager中,再由扫描引擎Engine消耗任务队列,调用poc进行扫描。

结果输出

Poc执行的结果发送到结果解析队列中,解析后将有效结果存入Redis,通过Web页面展示。

0x03.POC脚本

Shadow Border的scanner模块是基于Poc-T进行开发的,对poc的编写也基本类似,所以可以很方便地将Poc-T的脚本修改为Shadow Border的poc脚本。Shadow Border的poc要求为:

  1. 定义了poc-info
  2. 返回的结果为scan_result字典
  3. 定义了poc(request)函数

poc-info/scan_result

poc中的poc-info变量为dict对象,定义了基础的poc信息。这部分信息会在漏洞显示时使用到。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
poc_info = {
'poc': {
'Id': '', # poc编号
'Name': 'Cross Site Script (XSS)', # poc名称
'Author': 'Fanxs', # poc作者
'Create_date': '2019-01-16', # poc创建时间:如'2014-11-19'
},
'vul': {
'Product': 'Common', # 漏洞所在产品名称
'Version': '', # 产品的版本号
'Type': 'XSS', # 漏洞类型
'Severity': 'Low',
'isWeb': True,
'Description': '''
Cross Site Scripting Attack.
''',
'DisclosureDate': '', # poc公布时间:如'2014-11-19'
}
}

scan_result 为dict对象,为poc返回结果的标准格式:

1
2
3
4
5
6
scan_result = {
'Target': '', # 目标URL
'Error': '', # 记录poc失败信息
'Success': False, # 是否执行成功,默认值为False表示poc执行不成功,若成功请更新该值为True
'Ret': None # 记录额外的poc相关信息
}

其中Ret字段会在漏洞展示时print出来,用于额外漏洞信息,如payload,参数等,应为字符串类型。

poc函数

Shadow Border 会执行每个poc脚本的poc函数,函参为request对象,可访问request对象的成员属性来获取请求数据:

Ex: GET https://www.baidu.com:443/test/test.html?id=1&app=2

  • request.url - 完整URL (“https://www.baidu.com:443/test/test.html")
  • request.path - URL路径 (“/test/test.html”)
  • request.query - query参数 (”id=1&app=2”)
  • request.headers - 头部
  • request.body - body数据
  • request.host - 头部中的host
  • request.port - 目标端口 (“443”)
  • request.method - HTTP方法 (“GET”)
  • request.protocol - 请求协议 (“https”)
  • request.raw - 原请求包

Treelib

目前完成了的poc脚本只有1个XSS检测,之后再慢慢充实,协助自己渗透测试。在Shadow Border的scanner/utils路径下,提供了一些poc可能使用到的工具类,如以下说到的parsejson类。

在平时测试时,有时会遇到请求body中json包含json数据的情况,如:
{"app":"exp", "test":{"module":123, "something":"test"}}

要解析和修改这种情况里的参数,我未找到相关的代码方法。在苦于怎么修改json里的json的参数值时,我发现这种结构类似于树结构。以上的例子,可用树结构解析为:

1
2
3
4
5
Root
├── app
└── test
├── module
└── something

在我们平时测试时,要修改的值一般为树结构中的叶节点,即为”app”, “module”, “something”三个节点参数。通过树结构,直接修改叶节点值,再转换为dict对象,就成功解析了json包含json这一类情况。由此,我利用了Treelib,在的scanner/utils下写了一个专门用于解析此类型结构的类parsejson,可实现修改其中的参数值,转换为字典格式。

0x04.后记

整个系统的代码编写和设计都比较的粗糙,未经过完善的单元测试,目前poc也很少,在以后的使用中,会不断增加自用的poc和完善系统,来更好地帮助我在渗透测试时,省掉重复的工作。这是第一次沉下心来花了个把月写出来一个体量相对较大的系统,练练手,协助自己平时的测试也挺好。

现在Shadow Border的整体框架中获取请求、扫描引擎、调用poc等多个模块之间耦合度较低。在以后整个系统更加完善和有更多的poc后,可以将Burpsuite的位置代替为(资产收集+资产发现+爬虫)模块,就可以改装成主动扫描系统,说不定以后可以整一下。

0x05.参考

  1. Gourdscan v2.1 - YSRC被动式漏洞扫描系统
  2. POC-T: Pentest Over Concurrent Toolkit
CATALOG
  1. 1. 0x00. 简介
  2. 2. 0x01.简单框架
  3. 3. 0x02.框架细节
    1. 3.1. 获取请求
    2. 3.2. 漏洞检测
    3. 3.3. 结果输出
  4. 4. 0x03.POC脚本
    1. 4.1. poc-info/scan_result
    2. 4.2. poc函数
    3. 4.3. Treelib
  5. 5. 0x04.后记
  6. 6. 0x05.参考