1. 环境准备
本文演示使用 bettercap 对目标主机实施 HTTPS MITM(中间人)攻击。
实验环境:
| 角色 | IP | 说明 |
|---|---|---|
| 攻击机 | 10.0.0.5 | PVE 宿主机,运行 bettercap v2.41.5 |
| 被攻击机 | 10.0.0.123 | PVE 虚拟机,Windows 11 |
| 目标站点 | www.baidu.com , www.icbc.com.cn | 前者无 HSTS,后者有 HSTS |
Bettercap 最新版可以从项目的release页面下载:https://github.com/bettercap/bettercap/releases
Kali Linux 内置了 bettercap,无需额外安装(apt install bettercap)。
Windows 版还需要下载libusb库:https://lololowe.lanzoul.com/iRNUC3nu0t7i
下载完成后将其和bettercap.exe放到同一个目录下即可:

2. 原理概述
2.1. SSL Stripping

核心思路:
- ARP 劫持让所有流量经过攻击机
- SSLstrip 丢掉服务端的 301 跳转,让受害者全程停留在 HTTP
- 同形字替换(
lololowe→lolol0we,将字母 o 替换为数字 0)让受害者难以直接察觉异常 - DNS 劫持将假域名
blog.lolol0we.com指向攻击机,确保受害者点击任意链接后流量依然经过攻击机
2.2. HSTS绕过
HSTS(HTTP Strict Transport Security)会强制浏览器使用HTTPS与服务器建立连接,用预防御SSL Strip攻击。它分为两种类型,一种静态HSTS,另一种是动态HSTS,前者是靠浏览器内置的HSTS Preload列表强制浏览器使用HTTPS连接,后者是靠服务器返回的HSTS头(strict-transport-security)来指示浏览器在多长时间内强制使用HTTPS连接,后者因为不在 HSTS Preload 列表中,所以首次访问时使用的是HTTP连接。
在我之前写过的一篇关于DNS劫持实验的文章中已经讨论过HSTS,例如中国工商银行的站点就启用了 HSTS 的,使用curl -I https://www.icbc.com.cn 查看返回的响应头:

返回的 strict-transport-security: max-age=31536000 字段表示该站点的 HSTS 保护期为 31536000 秒,即 365 天。这使得浏览器在首次访问后的 365 天内,都会强制升级 HTTP 到 HTTPS。
再以 www.facebook.com 为例,使用 curl -I https://www.facebook.com 查看服务器返回的响应头:

strict-transport-security: max-age=15552000; preload 中的 preload 标记用于向谷歌维护的 hstspreload.org 提交预加载列表申请,通过该列表后,主流浏览器(Chrome, Firefox, Safari 等)会将该域名硬编码进浏览器安装包里,后续即使是首次访问网站,也会强制使用 HTTPS 连接。访问谷歌浏览器的 chrome://net-internals/#hsts 页面查看,即可确认该域名是否已加入预加载列表:

static_sts_domain: www.facebook.com 表明此域名已经进入了 HSTS Preload 列表。
Bettercap 的 HSTSHJACK 从没有开启HSTS预加载的子域名下手(没有includeSubDomains标记),在首次访问没有HSTS保护的子域名时,会使用HTTP连接,攻击机在内网通过ARP劫持被攻击机的所有流量,然后拦截首次发起的明文HTTP请求,并丢弃服务器响应的301跳转,充当中间人,只转发HTTP流量给被攻击机,并篡改HTML,将所有主域名的链接都进行同形字替换,例如将 www.facebook.com 替换为 www.facebok.com(少了个o),因为替换后的假域名没有HSTS防护,因此可以实现HSTS绕过,当被攻击机访问没有HSTS保护的假域名时,攻击机还会进行DNS劫持,返回假的解析结果(解析到攻击机),使被攻击机和攻击机建立HTTP连接,而攻击机和真实服务器建立HTTPS连接,攻击机充当中间人可以注入JS代码,控制网页加载,也可以窃取被攻击机发出的登录凭据。
实际情况但更多的是通过社工钓鱼,诱导受害者点击同形字替换后的链接,以进行HSTS绕过后的HTTPS中间人攻击。
3. caplets
bettercap 有2种使用方式,分别是:
- 命令行参数 + 配置文件
- Web UI 使用
推荐使用命令行方式,使用bettercap命令可以直接进bettercap专属的交互式会话命令行,输入?或者help可以查看所有模块,以及运行状态。
set 命令可以设置配置项,get 命令可以获取配置项的值,on和可以开关模块,可以开关模块,! 命令可以执行系统命令。
要实现HTTPS中间人攻击,通常需要使用 [caplets](https://www.bettercap.org/usage/interactive_session/#caplets) 脚本来实现,我们先用caplets.update`命令来安装官方的caplets脚本:

接着使用caplets.show查看已安装的caplets脚本:

要实现HTTPS中间人攻击,需要使用 hstshijack caplet 脚本,使用! /usr/local/share/bettercap/caplets/hstshijack/hstshijack.cap查看脚本默认配置:
1 |
|
默认只配置了针对了谷歌的域名,并且没有做ARP双向欺骗来劫持目标的流量,因此我们需要自定义配置。
退出bettercap的交互式命令行会话,新建mitm.cap文件,内容如下:
1 |
|
启动攻击:
1 | ./bettercap -iface vmbr0 -caplet mitm.cap |
运行caplet脚本后会自动开启IP路由转发,无需再像下面一样手动开启:
1 | echo 1 > /proc/sys/net/ipv4/ip_forward |
4. 攻击流程
4.1. 确认 ARP 劫持生效
查看被攻击机上的 ARP 缓存表:
1 | arp -a |

可以看到网关的MAC地址已被替换为攻击机的MAC地址了。
查看网关的 ARP 缓存表:
1 | arp -n | grep -E "10.0.0.5|10.0.0.123" |

可以看到被攻击机的MAC地址已被替换为攻击机的MAC地址了。
已完成ARP上下行双向欺骗。
4.2. 确认 SSLstrip 生效
在被攻击机上执行:
1 | curl -LI www.baidu.com |

正常情况下会返回301重定向状态码,重定向到https://www.baidu.com。这里直接返回了200状态码,并且添加CSP和CORS头,移除安全防护。说明bettercap成功拦截了http到https的跳转。
接着打开被攻击机的浏览器,为了模拟首次访问,需要清除浏览器缓存和记录。快捷键 Ctrl + Shift + Del 打开清除数据窗口:

其次还需要删除 www.baidu.com 的书签,否则会优先使用书签的https地址。
继续访问 www.baidu.com :

可以看到地址栏停留在了 http://www.baidu.com ,说明 bettercap 成功拦截了https跳转。
4.3. 确认 Body 注入生效
将鼠标悬停在任意超链接上,可以看到链接已经被替换成了假域名 www.ba1du.com :

说明Body注入已生效。
4.4. 确认 DNS 劫持生效
点击页面的任意超链接,可以正常跳转到假域名上:

说明DNS劫持已生效,可以正常把假域名解析到攻击机的IP。
也可以使用以下命令进行验证:
1 | nslookup www.ba1du.com |

解析出来的IP是攻击机的IP(10.0.0.5),再次说明DNS劫持已没有问题。
如果DNS劫持没有生效,需要检查是不是网关更快的返回了NXDOMAIN记录,如果是,需要添加iptable规则来丢弃这些回包。
4.5. 窃取凭证
点击百度的登录按钮,输入用户名和密码,尝试登录:

回到bettercap的交互式命令行会话,可以看到登录凭证已被捕获:

4.6. HSTS绕过
前面说过,HSTS绕过必须要先引诱受害者访问假域名,例如通过钓鱼邮件让受害者点击假的中国工商银行 www.icbo.com.cn ,页面可以正常加载:

然后通过在 caplet 中添加 payload (set hstshijack.payloads),篡改某些可以用来收集受害者信息的页面,实现定向窃取信息。
当然这只是思路,实际操作中还需要根据具体的情况来调整。
5. 局限
有的网站的静态文件(如 JS、CSS、图片等)也会包含 HSTS 头,例如 www.facebook.com :

这会使得触发浏览器的安全机制,禁止加载 HTTP 请求,解决起来比较麻烦,因为要考虑所有可能的静态文件。
并且因为请求的是明文http,地址栏还会显示不安全提示,所以实战中会偏向根证书劫持,这个以后再更新。
6. 防御建议
- 启用 HSTS:在响应头中添加
strict-transport-security: max-age=15552000; preload; includeSubDomains,浏览器将拒绝包含子域名的任何 HTTP 请求,即使是第一次访问,也会强制使用 HTTPS。 - 使用加密 DNS:DoH(DNS over HTTPS)或 DoT(DNS over TLS)可以防止 DNS 欺骗
- 网络侧防护:在交换机上启用 Dynamic ARP Inspection(DAI)防止 ARP 欺骗
- 个人习惯:涉及重要信息的网站,不要用 HTTP 访问,而要使用 HTTPS。





















