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

  • A+
所属分类:安全文章

0x00 Background

目前企业中或者大家日常遇见的网站的研发水平越来越高,在不考虑 SEO 这类需求(主要指门户网站)的情况下,各种中台、后台和管理系统慢慢研发都有走向前端工程化的趋势。这些现代的 web 应用和工程技术广泛运用,导致了传统的爬虫或者基于爬虫的 web 扫描技术遭遇了很大的冲击;对于常见的 Web 资产收集,冲击也是不小。传统爬虫正则大法已经没有什么特别好的效果了,毕竟页面内容无法加载 JS,那怎么拿到想要的 “敏感” 信息呢?
在这种大趋势下,被动扫描技术孕育而生,这就是大家熟知的 xray。但与此同时,能兼容现代 Web 应用架构的浏览器爬虫的需求也越来越强烈了。大家慢慢将目光投向了浏览器爬虫领域,希望浏览器爬虫能帮助解决上面提到的问题。
当然,说到浏览器爬虫,就需要引出本文的主角:xray 社区新成员 rad。同样是老东家长亭科技研发的一款浏览器爬虫。基于 Chrome-Headless DP 协议,全面优于 selenium webdriver / phantomjs / ghost 这类系统在兼容性和爬虫上的表现。我认为 rad 应该是目前市面上最好的安全领域浏览器爬虫了。

概览

  • 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 语言,那么其实还是有一些资源可供使用的:https://github.com/chromedp/chromedphttps://github.com/go-rod/rod

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

思路分析

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

有得必有失

但是资产的收集和测绘比较关键的一个点是自动化、流程化、系统化。解放生产力,因为我们自然会放弃掉 rad 中的 wait-login 这个功能。这个和自动化、流程化其实是冲突的。同样,每个网站的特异性的配置,我们也需要主动放弃。毕竟”鱼和熊掌不可兼得“。

不会集成?别慌!有我在

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

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

方式方法

优点
缺点
直接解析输出的文件 相对解析的结果比较全面,忠诚于 Rad 的输出意图。 实时性打折扣,依赖于 rad 的输出格式。
实时逐行解析 rad 的输出+输出文件 有实时输出 同上‍‍
我认为的比较理想的方式:为 rad 设置一个 mitm 代理 实时输出流量中的数据包,兼容性极强 丢失一些特定的组装的包
综上,其实我觉得比较理想的办法其实是自己做一个 mitm 代理,然后将 rad 的代理设置为自己的代理,自己的代理可以把流量镜像一份。
什么?你不太会写这个 mitm 代理? 

emm... https://github.com/google/martian 拿去吧

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

Palm SIEM 就不过多介绍了,与 xray 相同,我们可以用一样的手段,将 rad 集成到我们的系统中,同样也就只有几十行而已。如果没看过上一篇文章的朋友,可以去看一下之前 xray 的文章。

我用几十行代码封装了xray

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

rad 浏览器爬虫如何参与到企业资产测绘中
我们发现,其实思路按照上面的五个步骤,已经可以很容易将 rad 集成并把资产输出到了平台数据库中了。简单的,我们可以通过这样,直接来执行这个任务,就可以进行爬虫了。
rad 浏览器爬虫如何参与到企业资产测绘中
当我们的任务执行完成后, 资产分析页面会发现有新的网站资产生成:
rad 浏览器爬虫如何参与到企业资产测绘中
至此,我们已经把 rad 成功集成到了系统中。但你真以为本文这样就结束了吗?

显然没有!!!我们发现上面的代码中,其实还有很多很多更牛 x 的应用:比如利用代理链进行 rad + xray 全自动

高级:rad + xray 全自动?

这当然是可实现的。当然,我们实现的不仅仅只是 rad + xray 全自动,我们还要实现:
  1. rad 输出的结果自动化录入数据库;
  2. xray 输出的漏洞结果自动录入漏洞库;
  3. xray 在扫描完 rad 的所有流量之后,自动退出结束扫描。

我们发现,针对第一点,我们在上一个 rad 在 Palm SIEM 的初级用法中已经实现了,就是使用一个 mitm 的普通代理来抓流量,存数据库。但是我们发现上述的操作又不能完全满足需求,我们没有办法把镜像流量接入 xray 扫描?

新朋友 mitm.Bridge

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

Let's do It!

rad 浏览器爬虫如何参与到企业资产测绘中
同样,我们使用一个 Webhook 做 xray 的结果输出接收装置,就可以完美实现我们想要的 rad + xray + 资产收集兼顾漏洞扫描。
rad 浏览器爬虫如何参与到企业资产测绘中
如上代码其实也并不难理解,步骤也很简单:
  1. 启动 MITM 桥接代理链;
  2. 启动 Webhook 等待处理 xray 输出的漏洞;
  3. 启动 xray 等待接收 rad 的信息;
  4. 为 rad 设置好 MITM 桥接代理。
整体系统启动之后,rad 会将流量输入到 MITM 桥接代理链,代理链将镜像流量存入数据库,并同时转发到 xray;xray 进行漏洞扫描,webhook 将漏洞扫描结果输入到系统漏洞库中。

0x04 简单聊聊“资产”

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

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

我们发现,在安全领域并没有什么资料把 “资产” 究竟是什么讲清楚。
有些人说:主机、端口、服务是资产;有些人补充说服务的细分版本、指纹也是资产;除此之外,如果这个服务是 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 商业版(洞鉴)有资产收集模块,但是大家遇到的问题往往是,洞鉴扫描出来的资产摆在你的面前,你并不知道你要拿他来干什么?或者没有办法让他参与你的安全体系建设。如何理解这段话呢?

rad 浏览器爬虫如何参与到企业资产测绘中
我们把所有的原料放在一起,难道要让使用/运营者自己去编译一个蛋糕吗?

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

在你梳理和盘点资产的时候,一定要想好你的场景是什么,你要构建怎么样的安全系统或者流程?要解决怎么样的安全问题?一套安全流程的构建(加工)往往未关联的子系统(原料)更有价值。

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

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

实现方法(略):

  1. 选用好用的基础库:martian(使用代码略)

  2. 服务器支持接收 downstream proxy 的设置:

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

  3. 镜像流量直接 httputil.DumpRequest Dump 出来,以你自己喜欢的方式交给第三方解决:

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

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

扩展玩法

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

0x06 结语

本文并没有把完整的实现步骤每一步每一步展示给大家(因为太长了写不下),重点是在讲思路和玩法。但是关键的实现步骤已经提供的使用的代码库,大家可以读一下源码和实现自主完成类似的功能,也算是抛砖引玉了~
如果大家还想了解哪一部分的具体实现或者有更好的想法/技术问题想要一起讨论,欢迎添加笔者微信一起讨论。
rad 浏览器爬虫如何参与到企业资产测绘中
rad 浏览器爬虫如何参与到企业资产测绘中
rad 浏览器爬虫如何参与到企业资产测绘中


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


发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: