rad 浏览器爬虫如何参与到企业资产测绘中

0x00 Background

目前企业中或者大家日常遇见的网站的研发水平越来越高, 在不考虑 SEO 这类需求(主要指门户网站)的情况下, 各种中台, 后台和管理系统慢慢研发都有走向前端工程化的趋势; 这些现代的 web 应用和工程技术广泛运用, 导致了传统的爬虫或者基于爬虫的 web 扫描技术遭遇了很大的冲击; 对于常见的 Web 资产收集, 冲击也是真的不小, 传统爬虫正则大法已经没有什么特别好的效果了, 毕竟页面内容无法加载 JS, 怎么拿到想要的 “敏感” 信息呢?

在这种大趋势下, 被动扫描技术孕育而生, 这就是大家熟知的 xray; 但是与此同时, 能兼容现代 Web 应用架构的浏览器爬虫的需求也越来越强烈了, 大家慢慢也将目光投向了浏览器爬虫领域; 希望浏览器爬虫能帮助解决上面提到的问题。

当然, 说到浏览器爬虫, 就需要引出本文的主角: xray 社区新成员 rad; 也是老东家长亭科技研发的一款浏览器爬虫, 基于 Chrome-Headless DP 协议, 全面优于 selenium webdriver / phantomjs / ghost 这类系统在兼容性和爬虫上的表现; 可能是安全领域市面上最好的浏览器爬虫了。

概览

  • 0x01 前置技能: 一些简单基础知识
  • 0x02 rad 如何参与解决网站资产关键点和难点
  • 0x03 rad 在 Palm SIEM 中的落地实践
  • 0x04 简单聊聊“资产”
  • 0x05 扩展话题: MITM 代理链的实现(简)
  • 0x06 结语

0x01 前置技能: 一些简单的基础知识

  1. Chrome DevTools Protocol: 如果大家熟悉 F12 Chrome 自带的调试工具的话, 也很容易能理解这个协议; 这个协议是 Chrome 官方开放的调试 Chrome 的 API 协议, 可以通过 --remote-debugging-ports 的 Chrome 启动选项来启动调试端口; 实际效果可以使用外部操纵器通过 Chrome DevTools Protocol 来调试 Chrome 浏览器; 官方文档参考链接
  2. 浏览器爬虫: 爬虫概念本文就不过多介绍了, 浏览器爬虫的难点并不是在于发现页面上的已经由后端渲染的 Url 或者其他资源链接; 而是加载 JS, 并且按照 “人” 的逻辑, 触发 JS 对应的操作; 然而这些操作会对页面产生一些 “无法预料” 的影响; 所以, 进行 Human-Like 的 JS 行为触发, 并捕捉出发 JS 导致的变化和过程中产生的 HTTP 请求, 其实才是实现浏览器爬虫的难点。

    尽管我们发现, 我们无法触发所有 JS 行为和函数, 但是可以尽可能模拟 “人” 去点击页面中的各种元素(通过 ChromeDP 协议触发)
    如果你想要写一个属于自己的浏览器爬虫, 并且偏爱 Go 语言, 那么其实还是有一些资源可供使用的
    chromedp
    go-rod

0x02 rad 如何参与解决网站资产收集中的痛点和难点?(集成思路)

思路分析

rad 本身是基于 chrome devtools protocol 进行开发的浏览器爬虫, 浏览器爬虫的事情, 我们暂且就全权交给 rad 来实现。

有得必有失

但是资产的收集和测绘比较关键的一个点是自动化, 流程化, 系统化, 解放生产力, 因为我们自然会放弃掉 rad 中的 wait-login 这个功能; 这个和自动化, 流程化其实是冲突的。

同样的每个网站的特异性的配置, 我们也需要主动放弃, 毕竟 ”鱼和熊掌不可兼得“。

不会集成? 别慌!

在 rad 中并没有 webhook 相关的接口开放出来, 也就意味着, 我们可能无法像 xray 一样容易收集 rad 吐出来的各种信息, 当然这也并不代表我们没有办法集成?

我猜大家可能能想到一些简单的集成办法, 我会补充一些常见方法, 并提出我自己的方案, 这里来讨论一下优缺点:

方式方法 优点 缺点
直接解析输出的文件 相对解析的结果比较全面, 忠诚于 Rad 的输出意图 实时性打折扣, 依赖于 rad 的输出格式
实时逐行解析 rad 的输出+输出文件 有实时输出 同上
我认为的比较理想的方式: 为 rad 设置一个 mitm 代理 实时输出流量中的数据包, 兼容性极强 丢失一些特定的组装的包

综上, 其实我觉得比较理想的办法其实是自己做一个 mitm 代理, 然后将 rad 的代理设置为自己的代理, 自己的代理可以把流量镜像一份。

什么? 你不太会写这个 mitm 代理? emmm... https://github.com/google/martian

0x03 rad 在 Palm SIEM 中的落地实践

Palm SIEM 就不过多介绍了, 与 xray 相同, 我们可以用一样的手段, 将 rad 集成到我们的系统中, 同样也就只有几十行而已

初级: 我只集成爬虫可以吗?

我们发现, 其实思路按照上面的五个步骤, 已经可以很容易将 rad 集成并把资产输出到了平台数据库中了;
简单的, 我们可以通过这样, 直接来执行这个任务, 就可以进行爬虫了

当我们的任务执行完成后, 资产分析页面会发现有新的网站资产生成

值此为止, 我们已经把 rad 成功集成到了系统中, 但是本文就结束了吗? 显然没有, 我们发现上面的代码中, 其实还有很多很多更牛x的应用: 比如利用代理链进行 rad + xray 全自动。

高级: rad + xray 全自动?

这当然是可实现的, 当然不只是 rad + xray 全自动, 我们还要实现:

  1. rad 输出的结果自动化录入数据库
  2. xray 输出的漏洞结果自动录入漏洞库
  3. xray 在扫描完 rad 的所有流量之后, 自动退出结束扫描

我们发现, 针对第一点, 我们在上一个 rad 在 Palm SIEM 的初级用法中已经实现了, 就是使用一个 mitm 的普通代理来抓流量, 存数据库;

但是我们发现上述的操作又不能完全满足需求: 我们没有办法把镜像流量接入 xray 扫描

新朋友 mitm.Bridge

Let's do It

同样的, 我们使用一个 Webhook 做 xray 的结果输出接收装置, 就可以完美实现我们想要的 rad + xray + 资产收集兼顾漏洞扫描

如上代码其实也并不难理解, 步骤也很简单

  1. 启动 MITM 桥接代理链
  2. 启动 Webhook 等待处理 xray 输出的漏洞
  3. 启动 xray 等待接收 rad 的信息
  4. 为 rad 设置好 MITM 桥接代理

整体系统启动之后, rad 会讲流量输入到 MITM 桥接代理链, 代理链将镜像流量存入数据库, 并同时转发到 xray, xray 进行漏洞扫描, webhook 将漏洞扫描结果输入到系统漏洞库中

0x04 简单聊聊“资产”

为什么要聊这个问题呢? 其实渐渐发现虽然是一个老生常谈的话题, 但是并没有一个体系来把资产定义清楚, 我也只能发表一点自己浅薄的简介来抛砖引玉

0x04.1 企业安全资产到底是什么?

我们发现在安全领域, 并没有什么资料把 “资产” 究竟是什么讲清楚:

有些人说: 主机, 端口, 服务是资产; 有些人补充说服务的细分版本, 指纹也是资产; 除此之外, 如果这个服务时 Web 应用, 对应的域名, 网站结构也是资产;

那么我们深挖一下, 资产是不是也应该包含下面的内容?

  1. 没有对应 web 服务(也可能是么有扫描到的)的域名
  2. 挖掘网站结构时候产生的 HTTP 请求和响应
  3. 从网站相关的 HTTP 请求和响应中挖掘出的网站可能的信息:
    1. 网站的开发语言
    2. 第三方开发组件
    3. JS库等
    4. 网站暴露的一些手机号, 邮箱等信息

仅仅这些吗? 显然不止

对于终端安全和 HIDS 来说, 其实还有别的资产需要考虑

  1. HIDS Agent 的进程, 监控的文件, 用户信息, 网络监控信息
  2. 关键服务日志信息等

对于 SDL 来说, “上游” 供应链的第三方组件库也属于安全资产, 很容易可以进行威胁分析

结论: 你的场景决定了你的资产是什么

  1. 对于远程安全评估系统来说: 资产可能是一切能发现安全风险的地方, 比如主机/端口/服务/域名/网站
  2. 对 SDL 来说, 代码/代码上游依赖/可信容器/运维资源甚至线上环境等都是资产
  3. 对终端安全来说, 终端上的更细粒度的, 包括进程信息, 网络信息, 补丁信息等都是资产
  4. 数据安全: .....

0x04.2 资产梳理与盘点仅仅是安全建设一个环节

重要目的: 合规/流程支持类

当然这个合规并不是说要符合具体的 “ISO-xxx” 某个规; 而是说, 如果要构建流程化的系统/体系/规定来解决某个安全问题, 我们需要相应资产进行参与, 构建自动化流程;

想要构建流程自动化解决某些安全问题, 比如:

1. 全自动化资产盘点与合规检查预警
2. 企业内部资产定期巡检
3. 应急响应快速梳理相关风险资产

上述几个解决安全问题的例子, 都是需要资产深度参与的

但是往往很多人一直在说资产收集, 但是并没有想自己要收集资产做什么, 例如: xray 商业版(洞鉴)有资产收集模块, 但是大家遇到的问题往往是, 洞鉴扫描出来的资产摆在你的面前, 你并不知道你要拿他来干什么, 或者没有办法让他参与你的安全体系建设; 如何理解这段话呢?

我们把所有的原料放在一起, 难道要让使用/运营者自己去编译一个蛋糕吗?

结论: 落地安全流程并运营才能产生真正的价值, 资产只是一个环节

在你梳理和盘点资产的时候, 一定要想好你的场景是什么, 你要构建怎么样的安全系统或者流程, 要解决怎么样的安全问题

一套安全流程的构建(加工)往往未关联的子系统(原料)更有价值

0x05 扩展话题: 如何编写一个 MITM 代理链? 有哪些更有趣的玩法?

结束掉枯燥的观点讨论, 我们说一点大家可能都关心的技术问题, 本文的 MITM 代理链是如何实现的? 其实很简单, 如果有机会为大家提供详细代码吧

实现方法(略):

  1. 选用好用的基础库: martian: 使用代码略
  2. 服务器支持接收 downstream proxy 的设置:
  1. 镜像流量直接 httputil.DumpRequest Dump 出来以你自己喜欢的方式交给第三方解决

    当然我个人更偏好 Callback
    有朋友喜欢 limited chan *http.Request

  2. 当然里面涉及到了一些比较有趣的话题的点, 比如说, request 与 response 构成 httpflow, 如何正确匹配起来? 等等, 大家在实现的时候, 一定会遇到的。

扩展玩法

  1. 镜像流量审计
  2. 镜像流量敏感信息动态抓取
  3. 为 rad 编写一个真正的 webhook
  4. ... 大家发挥想象力啦~

0x06 结语

本文并没有把完整的实现步骤每一步每一步展示给大家(因为太长了写不下), 重点是在讲思路和玩法; 但是关键的实现步骤已经提供的使用的代码库, 大家可以读一下源码和实现自主完成类似的功能, 也算是抛砖引玉了~