攻防两端对外网资产的安全风险都很关注,在资源有限的情况下,怎么低成本地实现性能、扩展性都不错的、易运维的漏扫平台呢?
本篇站在白帽子的视角,聊一聊我的思路和实践。
本文会涉及到以下内容:
我们可以通过粘合现有的工具做成一个扫描器,比如通过以下工具可以粗略完成资产收集、漏洞扫描
但是这里存在几个问题:
针对上面问题,下面我想向你介绍我的解决方法和思考过程。
我们可以想一下代码中集成工具,碰到技术栈不同怎么办?比如我们扫描引擎是 python 语言编写的,我们可以通过子命令调用 nmap,通过函数调用 oneforall,但如果某个工具(比如爬虫)是 nodejs 写的,这个时候怎么跨语言调用?而且我们还需要考虑到在部署时,我们还需要安装 c、go 程序依赖的系统动态库,python、java 程序依赖的解释器、lib 库,这些环节可能会出现意想不到的问题。
我们可以把程序构建成镜像,然后以命令行或者 api 服务的形式,向外部提供服务。这样工具无论是什么语言编写的,只要打包成镜像,就能以相同的方式被调用,也不用操心依赖的事情。
与此同时应用升级也会变得简单一点,我们可以用 github workflow 做镜像构建和推送、镜像 tag 管理应用版本。当然,我们也可以基于 kubernetes 生态来编排、管理服务。
基于 kubernetes 的 service 机制,我们很容易能够提供可用性、性能更好的服务,比如把 xray 打包成镜像后,以 service 形式暴露代理和漏扫功能。
基于 kubernetes 的健康检查机制、deployment 对象,也很方便地实现服务故障的感知和自动恢复。
kubernetes 生态也提供很大的便利。比如,基于 helm 很容易部署和升级服务,基于 kubesphere 可视化地管理集群和服务。
到这里有一个问题要考虑,子域名收集工具(oneforall/subfinder)、poc 扫描工具(nulei)这些能力应该以什么样的形式提供服务?它们本身能以命令行的方式被调用,那么有必要封装成 api 服务的形式吗?
如果要封装成 api 服务,就需要编写 api,这个 api 输入参数和命令行参数的映射关系也需要考虑,这里会有一些工作量,而且会让工具变得不灵活。
不论怎么样,调用方想要完成一次扫描,就需要调用各个能力,把整个工作流串起来。这个时候可以选择编写代码调用,但是更好的做法是基于任务编排来做这件事。下面向你介绍任务编排、它怎么应用在漏扫中。
任务编排是什么呢?按照我的理解,我们用 dsl 语言去描述任务,提交任务后,编排引擎最终可以完成任务。kubernetes、nuclei workflow[1]、github action 都有提供这种能力。
为什么我们需要任务编排呢?任务编排能够让我们以声明配置的方式,而不是写代码的方式去实现任务,这里最大的好处我理解是节省了工作量,很多相似的业务需求抽象出来让编排引擎统一实现了。
在前期调研阶段,我也发现有一些厂商漏扫平台是以任务编排为核心构建的,比如 潮汐开源社区[2],也了解到 soar、bas 产品的核心也在于任务编排,比如华云安的漏洞管理之自动化(Automation)[3]、腾讯 SOAR 的安全运营探索[4]、安全运营之 SOAR:架构雏形[5]。甲方厂商中也有以任务编排为核心的安全服务架构设计,见 宜信分布式安全服务编排实践[6]。
针对漏扫会有的需求:
以前工作中,还遇到过业务方要求只能晚上扫描。还有某些信息收集阶段会有些误报,需要人工修改后才能继续后面的扫描。
面对这些需求,我调研了 argo-workflows[7]、w5 soar[8] 两个开源的编排引擎。编排引擎我觉得很重要的是怎么调用应用、怎么在应用间传递数据,可视化任务编排对我来说不重要。w5 soar 只支持调用 python 应用,而不支持调用容器应用,argo-workflows 基于 kubernetes 调度,提供 ui、api、sdk、cmd 等交互方式,非常满足我的需求。
你可以参考argo-workflows的文档,结合我下面的模板体验一把拼积木式的漏扫开发。
以下任务模板中,main 是一个"subfinder 子域名收集-nuclei 扫描-存储扫描结果"的工作流
spec:
templates:
- name: main
inputs:
parameters:
- name: domain
steps:
- - name: subdomain
template: subdomain
arguments:
parameters:
- name: domain
value: '{{inputs.parameters.domain}}'
- - name: nuclei
template: nuclei
arguments:
artifacts:
- name: hosts
raw:
data: '{{steps.subdomain.outputs.result}}'
- - name: save-nuclei
template: save-nuclei
arguments:
artifacts:
- name: result
from: '{{steps.nuclei.outputs.artifacts.nuclei-result}}'
- name: subdomain
inputs:
parameters:
- name: domain
container:
name: main
image: projectdiscovery/subfinder:v2.5.5
args:
- '-d'
- '{{inputs.parameters.domain}}'
resources: {}
- name: nuclei
inputs:
artifacts:
- name: hosts
path: /tmp/host
container:
image: projectdiscovery/nuclei:v2.8.3
command:
- nuclei
args:
- '-l'
- /tmp/host
- '-t'
- exposures,misconfiguration,cnvd,vulnerabilities,workflows,exposed-panels
- '-es'
- info
- '-o'
- /tmp/nuclei-result.json
outputs:
artifacts:
- name: nuclei-result
path: /tmp/nuclei-result.json
- name: save-nuclei
inputs:
artifacts:
- name: result
path: /tmp/result
container:
image: leveryd/x-tool:v2022.12.14
args:
- '-f'
- /tmp/result
- '-api'
- 'http://192.168.0.110:30274' # todo:config
启动一个扫描任务实例
查看任务实例状态
基于开源的安全工具、argo-workflows 编排引擎可以低成本的实现性能和扩展性都还不错的漏扫功能,基于 helm、kubesphere、argo-workflows ui 可以方便运维漏扫服务。
argo-workflows 的社区感觉不是很活跃,欢迎加我微信 happy_leveryd 和我交流。
nuclei workflow: https://nuclei.projectdiscovery.io/templating-guide/workflows/
[2]潮汐开源社区: https://lev.zone/
[3]漏洞管理之自动化(Automation): https://www.freebuf.com/articles/security-management/246149.html
[4]腾讯 SOAR 的安全运营探索: https://security.tencent.com/index.php/blog/msg/196
[5]安全运营之 SOAR:架构雏形: https://www.freebuf.com/articles/es/256988.html
[6]宜信分布式安全服务编排实践: https://www.infoq.cn/article/9bslvn96torgkjxxuc4n
[7]argo-workflows: https://github.com/argoproj/argo-workflows
[8]w5 soar: https://github.com/w5teams/w5