跳转至

SSLStrip攻击

HTTP或者HTTPS?

当用户在浏览器中输入一个域名时,使用 HTTP 还是 HTTPS 协议访问是由多种因素决定的。浏览器会根据用户输入的内容、网站的配置以及浏览器自身的安全策略来决定使用哪种协议。以下是详细解释:


决定使用 HTTP 还是 HTTPS 的因素

用户输入的内容

  • 完整 URL:如果用户输入了完整的 URL(如 https://example.com),浏览器会直接使用用户指定的协议(HTTP 或 HTTPS)。
  • 仅输入域名:如果用户仅输入域名(如 example.com),浏览器会根据以下规则决定使用哪种协议:
  • 默认协议:大多数现代浏览器的默认行为是尝试使用 HTTPS 协议访问网站。
  • HSTS(HTTP Strict Transport Security):如果浏览器之前访问过该网站,并且该网站启用了 HSTS,浏览器会强制使用 HTTPS 协议。
  • 无 HSTS:如果浏览器之前未访问过该网站,或者该网站未启用 HSTS,浏览器可能会尝试使用 HTTP 协议访问,但会根据其他因素(如浏览器的安全策略)决定是否升级到 HTTPS。

网站的配置

  • HSTS(HTTP Strict Transport Security):如果网站启用了 HSTS,浏览器会强制使用 HTTPS 协议。HSTS 是一种安全策略,通过在 HTTP 响应头中设置 Strict-Transport-Security 指令,告诉浏览器在后续访问中始终使用 HTTPS。

  • 示例:

    HTTP
    Strict-Transport-Security: max-age=31536000; includeSubDomains
    
    • max-age:指定 HSTS 策略的有效期(单位为秒)。
    • includeSubDomains:强制所有子域名也使用 HTTPS。
  • HSTS Preloading:一些网站会将自己添加到浏览器的 HSTS Preload 列表中。浏览器在首次访问这些网站时,会直接使用 HTTPS 协议,即使用户输入的是 HTTP 地址。

  • 示例:Google 的 HSTS Preload 列表是一个广泛使用的列表,许多浏览器会内置该列表。

  • 301 永久重定向:如果网站配置了从 HTTP 到 HTTPS 的 301 永久重定向,浏览器在访问 HTTP 地址时会被自动重定向到 HTTPS 地址。

  • 示例:

    HTTP
    HTTP/1.1 301 Moved Permanently
    Location: https://example.com
    

浏览器的安全策略

  • 默认行为:现代浏览器(如 Chrome、Firefox、Safari)的默认行为是优先尝试 HTTPS 协议。如果 HTTPS 请求失败(如证书错误、连接超时),浏览器可能会回退到 HTTP。
  • 安全警告:如果 HTTPS 连接的证书无效(如证书过期、证书颁发机构不可信),浏览器会显示安全警告,阻止用户继续访问。用户可以选择忽略警告,但这是不推荐的。

浏览器如何实现 HTTP 到 HTTPS 的升级

默认尝试 HTTPS

  • 现代浏览器:当用户仅输入域名时,浏览器会默认尝试使用 HTTPS 协议访问网站。
  • 示例:用户输入 example.com,浏览器会尝试访问 https://example.com。

HSTS 和 HSTS Preloading

  • HSTS:如果浏览器之前访问过该网站,并且该网站启用了 HSTS,浏览器会强制使用 HTTPS 协议。
  • 示例:用户输入 http://example.com,浏览器会直接将其重定向为 https://example.com。
  • HSTS Preloading:如果网站在浏览器的 HSTS Preload 列表中,浏览器在首次访问时也会直接使用 HTTPS 协议。
  • 示例:用户输入 http://example.com,浏览器会直接访问 https://example.com。

301 永久重定向

  • 服务器配置:如果网站配置了从 HTTP 到 HTTPS 的 301 永久重定向,浏览器在访问 HTTP 地址时会被自动重定向到 HTTPS 地址。

  • 示例:

    HTTP
    HTTP/1.1 301 Moved Permanently
    Location: https://example.com
    
  • 浏览器收到 301 响应后,会自动跳转到 HTTPS 地址。

浏览器回退机制

  • HTTPS 请求失败:如果 HTTPS 请求失败(如证书错误、连接超时),浏览器可能会回退到 HTTP 协议。
  • 示例:用户输入 https://example.com,但服务器的 SSL 证书无效,浏览器会显示安全警告。用户可以选择忽略警告并继续访问,或者回退到 HTTP 协议。

总结

当用户在浏览器中输入域名时,使用 HTTP 还是 HTTPS 协议的决定因素包括:

  1. 用户输入的内容(是否包含协议)。
  2. 网站的配置(如 HSTS、301 重定向)。
  3. 浏览器的安全策略(如默认行为、HSTS Preloading)。

浏览器通常会优先尝试 HTTPS 协议,以确保用户的安全。如果 HTTPS 请求失败,浏览器可能会回退到 HTTP 协议,但会根据网站的配置和浏览器的安全策略决定是否允许回退。

SSLStrip攻击

攻击原理

SSLStrip 是一种中间人攻击工具,由 Moxie Marlinspike 在 2009 年提出,用于将 HTTPS 连接降级为 HTTP,从而窃取用户敏感信息。其工作原理如下:

  1. 中间人攻击:攻击者通过 ARP 欺骗等手段,将自己置于用户和目标服务器之间,拦截所有经过的 HTTP 流量。
  2. 重定向 HTTPS 到 HTTP:攻击者将用户浏览器中的 HTTPS 请求替换为 HTTP 请求,同时记录下所有被修改的链接。
  3. 代理转发:攻击者与目标服务器保持正常的 HTTPS 连接,而与用户之间则通过 HTTP 连接进行通信。用户提交的敏感信息(如用户名、密码)将以明文形式传输给攻击者。
  4. 伪装安全连接:攻击者可能会将浏览器中的安全图标(如“小黄锁”)替换为用户熟悉的图标,以欺骗用户。

SSLStrip攻击需要配合ARP欺骗、DNS欺骗等使用

  • 开启流量转发
Bash
echo "1" > /proc/sys/net/ipv4/ip_forward
  • ARP欺骗
Bash
arpspoof -i {interface} -t {victimip} {routerip}
  • 端口流量转发
Bash
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 1000
# 将80端口流量转发到1000(sslstrip监听的默认端口)
  • SSLStrip攻击
Bash
sslstrip -l 1000

image-20260818171906757

配置端口转发(IP Forwarding & iptables 重定向)的意义

在中间人攻击中,这一步分为两个关键动作,缺一不可:

  1. 开启内核 IP 转发 (sysctl net.ipv4.ip_forward=1)
  2. 意义:让攻击者的机器具备“路由器”的功能。当攻击者通过 ARP 欺骗截获了受害者的数据包后,如果不开启 IP 转发,Linux 内核会发现这些数据包的目的 IP 不是本机,从而直接**丢弃**它们。这会导致受害者立刻断网,攻击行为瞬间暴露。开启转发后,攻击者机器会将数据包继续发送给真实网关,保持受害者网络的“正常”连通性,实现隐蔽监听。
  3. 配置 iptables 端口重定向 (NAT PREROUTING)
  4. 意义:仅仅转发是不够的,因为受害者发起的是发往目标服务器 80 端口的流量。我们需要在流量刚进入攻击者机器网卡时(PREROUTING 链),强行修改其目标端口,将其“引流”到 sslstrip 工具正在监听的本地端口。
  5. 典型命令:iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
  6. 底层逻辑:这利用了 Netfilter 框架,在数据包进入路由决策之前,修改了 TCP 头部的目的端口字段,并相应地调整了校验和(Checksum)。

为什么要监听 80 或 8080 端口?

这与 HTTP 协议的默认行为和系统资源分配有关: 1. 协议默认行为:当用户在浏览器中输入 http://example.com,或者点击网页中一个没有明确指定协议的相对链接(如 <a href="/login">)时,浏览器默认会向目标服务器的 80 端口 发起 TCP 连接。攻击者必须拦截这个默认端口的流量,才能捕获未加密的初始请求。 2. 避免端口冲突:攻击者的机器(如 Kali Linux)可能自身已经运行了 Apache 或 Nginx 等 Web 服务,占用了 80 端口。因此,sslstrip 通常被配置为监听 8080 或其他高位端口。通过上述的 iptables 规则,外部看起来流量依然发往 80 端口,但在内部已被无缝重定向到 8080 端口交由 sslstrip 处理。

sslstrip 工具在该过程中的核心作用

sslstrip 本质上是一个**恶意的 HTTP/HTTPS 降级代理服务器**(基于 Python 的 Twisted 异步网络框架编写)。它**不破解任何密码学算法**,而是利用了协议设计的缝隙。其工作流程如下:

  1. 接收明文请求:从受害者(经 iptables 重定向)接收原本发往 80 端口的 HTTP 请求。
  2. 发起加密请求:sslstrip 作为客户端,使用底层的加密库(如 OpenSSL)与真实的目标服务器建立 HTTPS 连接,并将受害者的请求转发过去。此时,服务器认为是一个正常的加密客户端在访问。
  3. 拦截并篡改响应(核心动作):当服务器返回 HTTPS 响应时,sslstrip 会在内存中解析该 HTTP 报文,并执行以下关键篡改:
  4. 链接替换:使用正则表达式将 HTML 内容中的所有 https:// 替换为 http://。
  5. 剥离安全头:移除或修改 Strict-Transport-Security (HSTS) 响应头,防止浏览器记住该站点需要 HTTPS。
  6. 降级 Cookie:移除 Set-Cookie 头中的 Secure 标志,诱骗浏览器在后续的 HTTP 请求中明文发送 Session Cookie。
  7. 篡改重定向:将服务器返回的 301/302 重定向的 Location 头从 HTTPS 改为 HTTP。
  8. 返回明文响应:将篡改后的 HTTP 响应发送给受害者。受害者浏览器成功渲染页面,用户毫无察觉地以明文输入账号密码,这些凭据随后被攻击者通过嗅探工具(如 tcpdump)轻松捕获。

防御手段

  1. 全面启用 HSTS (HTTP Strict Transport Security)
  2. 原理:服务器在 HTTPS 响应头中加入 Strict-Transport-Security: max-age=31536000; includeSubDomains。浏览器收到后,会在本地缓存该规则。在 max-age 有效期内,浏览器**在底层网络栈发起请求前**,就会自动将所有对该域名的 HTTP 请求重写为 HTTPS。
  3. 效果:流量根本不会以明文形式离开客户端,SSLstrip 的 iptables 重定向规则捕获不到初始请求。
  4. 加入 HSTS 预加载列表 (Preload List)
  5. 原理:HSTS 的首次访问仍可能是 HTTP(存在“首次访问漏洞”)。通过将域名提交至浏览器维护的 HSTS 预加载列表(如 hstspreload.org),主流浏览器会将该域名硬编码在二进制文件中。
  6. 效果:彻底消除首次访问的降级风险,实现真正的“零明文”。
  7. 物理/防火墙层面禁用 80 端口
  8. 原理:如果业务完全不需要 HTTP 服务,直接在云安全组或本地防火墙(如 iptables/ufw)丢弃目标端口为 80 的入站 TCP 流量。
  9. 效果:攻击者即使拦截了请求,也无法将其转发到服务器的 80 端口,连接会直接超时或重置,从而暴露攻击行为。

SSLStrip+

SSLStrip++ (also called SSLstrip+) is implemented in the sslstrip2 tool. It extends the original SSLStrip technique to work against sites that have HSTS configured, by exploiting the first-visit gap in combination with DNS manipulation.

Technique: Instead of simply rewriting https:// to http://, sslstrip2 rewrites links to look-alike domains (e.g., www.bank.com → wwww.bank.com) that do not have HSTS rules. A companion DNS spoofer resolves these look-alike hostnames to the attacker's IP.

Diagram: sslstrip2 vs sslstrip — Technique Comparison

image-20260818171821110

参考:

Trying to take the dum-dum out of security...: MITMf V0.7 released: SSLstrip+ integration, BeefAutorun plugin update (This blog has moved to https://byt3bl33d3r.github.io)

How to Install SSLStrip2 in Kali Linux

SSLStrip, SSLStrip+, and HSTS | frostbits-security/MITM-cheatsheet | DeepWiki