目前企业中或者大家日常遇见的网站的研发水平越来越高, 在不考虑 SEO 这类需求(主要指门户网站)的情况下, 各种中台, 后台和管理系统慢慢研发都有走向前端工程化的趋势; 这些现代的 web 应用和工程技术广泛运用, 导致了传统的爬虫或者基于爬虫的 web 扫描技术遭遇了很大的冲击; 对于常见的 Web 资产收集, 冲击也是真的不小, 传统爬虫正则大法已经没有什么特别好的效果了, 毕竟页面内容无法加载 JS, 怎么拿到想要的 “敏感” 信息呢?
在这种大趋势下, 被动扫描技术孕育而生, 这就是大家熟知的 xray; 但是与此同时, 能兼容现代 Web 应用架构的浏览器爬虫的需求也越来越强烈了, 大家慢慢也将目光投向了浏览器爬虫领域; 希望浏览器爬虫能帮助解决上面提到的问题。
当然, 说到浏览器爬虫, 就需要引出本文的主角: xray 社区新成员 rad; 也是老东家长亭科技研发的一款浏览器爬虫, 基于 Chrome-Headless DP 协议, 全面优于 selenium webdriver / phantomjs / ghost 这类系统在兼容性和爬虫上的表现; 可能是安全领域市面上最好的浏览器爬虫了。
--remote-debugging-ports
的 Chrome 启动选项来启动调试端口; 实际效果可以使用外部操纵器通过 Chrome DevTools Protocol 来调试 Chrome 浏览器; 官方文档参考链接尽管我们发现, 我们无法触发所有 JS 行为和函数, 但是可以尽可能模拟 “人” 去点击页面中的各种元素(通过 ChromeDP 协议触发)
如果你想要写一个属于自己的浏览器爬虫, 并且偏爱 Go 语言, 那么其实还是有一些资源可供使用的
chromedp
go-rod
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
Palm SIEM 就不过多介绍了, 与 xray 相同, 我们可以用一样的手段, 将 rad 集成到我们的系统中, 同样也就只有几十行而已
我们发现, 其实思路按照上面的五个步骤, 已经可以很容易将 rad 集成并把资产输出到了平台数据库中了;
简单的, 我们可以通过这样, 直接来执行这个任务, 就可以进行爬虫了
当我们的任务执行完成后, 资产分析页面会发现有新的网站资产生成
值此为止, 我们已经把 rad 成功集成到了系统中, 但是本文就结束了吗? 显然没有, 我们发现上面的代码中, 其实还有很多很多更牛x的应用: 比如利用代理链进行 rad + xray 全自动。
这当然是可实现的, 当然不只是 rad + xray 全自动, 我们还要实现:
我们发现, 针对第一点, 我们在上一个 rad 在 Palm SIEM 的初级用法中已经实现了, 就是使用一个 mitm 的普通代理来抓流量, 存数据库;
但是我们发现上述的操作又不能完全满足需求: 我们没有办法把镜像流量接入 xray 扫描
同样的, 我们使用一个 Webhook 做 xray 的结果输出接收装置, 就可以完美实现我们想要的 rad + xray + 资产收集兼顾漏洞扫描
如上代码其实也并不难理解, 步骤也很简单
整体系统启动之后, rad 会讲流量输入到 MITM 桥接代理链, 代理链将镜像流量存入数据库, 并同时转发到 xray, xray 进行漏洞扫描, webhook 将漏洞扫描结果输入到系统漏洞库中
为什么要聊这个问题呢? 其实渐渐发现虽然是一个老生常谈的话题, 但是并没有一个体系来把资产定义清楚, 我也只能发表一点自己浅薄的简介来抛砖引玉
我们发现在安全领域, 并没有什么资料把 “资产” 究竟是什么讲清楚:
有些人说: 主机, 端口, 服务是资产; 有些人补充说服务的细分版本, 指纹也是资产; 除此之外, 如果这个服务时 Web 应用, 对应的域名, 网站结构也是资产;
那么我们深挖一下, 资产是不是也应该包含下面的内容?
对于终端安全和 HIDS 来说, 其实还有别的资产需要考虑
对于 SDL 来说, “上游” 供应链的第三方组件库也属于安全资产, 很容易可以进行威胁分析
当然这个合规并不是说要符合具体的 “ISO-xxx” 某个规; 而是说, 如果要构建流程化的系统/体系/规定来解决某个安全问题, 我们需要相应资产进行参与, 构建自动化流程;
想要构建流程自动化解决某些安全问题, 比如:
1. 全自动化资产盘点与合规检查预警
2. 企业内部资产定期巡检
3. 应急响应快速梳理相关风险资产
上述几个解决安全问题的例子, 都是需要资产深度参与的
但是往往很多人一直在说资产收集, 但是并没有想自己要收集资产做什么, 例如: xray 商业版(洞鉴)有资产收集模块, 但是大家遇到的问题往往是, 洞鉴扫描出来的资产摆在你的面前, 你并不知道你要拿他来干什么, 或者没有办法让他参与你的安全体系建设; 如何理解这段话呢?
我们把所有的原料放在一起, 难道要让使用/运营者自己去编译一个蛋糕吗?
在你梳理和盘点资产的时候, 一定要想好你的场景是什么, 你要构建怎么样的安全系统或者流程, 要解决怎么样的安全问题
一套安全流程的构建(加工)往往未关联的子系统(原料)更有价值
结束掉枯燥的观点讨论, 我们说一点大家可能都关心的技术问题, 本文的 MITM 代理链是如何实现的? 其实很简单, 如果有机会为大家提供详细代码吧
镜像流量直接 httputil.DumpRequest
Dump 出来以你自己喜欢的方式交给第三方解决
当然我个人更偏好 Callback
有朋友喜欢 limited chan *http.Request
当然里面涉及到了一些比较有趣的话题的点, 比如说, request 与 response 构成 httpflow, 如何正确匹配起来? 等等, 大家在实现的时候, 一定会遇到的。
本文并没有把完整的实现步骤每一步每一步展示给大家(因为太长了写不下), 重点是在讲思路和玩法; 但是关键的实现步骤已经提供的使用的代码库, 大家可以读一下源码和实现自主完成类似的功能, 也算是抛砖引玉了~