绕过 HTTP 到 HTTPS 缓存 301 重定向以使用 SSLstrip

信息安全 tls http 中间人 网址重定向 ssls带
2021-08-22 07:11:16

我正在做一些笔。在没有实现 HSTS 的 HTTPS (443) 服务器上进行测试(响应中没有 HSTS 标头,并且地址不在 Chrome HSTS 预加载列表中)。

问题是在我的场景中,用户之前访问过该网站,因此它在 Chrome 上缓存了第一个 HTTP (80) 请求响应。

现在,当用户在targetaddress.com浏览器中键入时,会自动获取缓存的重定向(301 - HTTP 到 HTTPS location=https://targetaddress.com),从而使 SSLstrip 无用。

我的解决方法是在客户端阻止 443 端口,因此无法连接到目标的用户会手动清除浏览器缓存/历史记录以尝试恢复连接。然后 SSLstrip 将生效,因为它现在将拦截/篡改 HTTP 请求(301 重定向)响应。

除了阻塞端口 443 之外,还有其他更好的方法吗?

这是缓存的重定向:

http://targetaddress.com/
HTTP/1.1 301 Moved Permanently
Date: Wed, 23 Dec 2015 18:31:19 GMT
Server: Apache
Location: https://www.targetaddress.com/
Content-Length: 237
Content-Type: text/html; charset=iso-8859-1
3个回答

如果可以让浏览器向http://targetaddress.com/whatever. 浏览器默认会发出一个普通的 HTTP 请求,而不是 HTTPS 请求,因为 没有缓存响应/whatever,只有/.

这可以通过多种方式实现。一种方法是在浏览器和通过纯 HTTP 访问的任何网站之间进行 MITM 并插入<img>标签。另一种方法是通过社交工程欺骗用户targetaddress.com/whatever在地址栏中输入。

一旦浏览器向目标域发出明文请求,MITM 就赢得了比赛。

HTTP 使客户端能够对实体执行操作。执行哪个操作取决于请求中指定的 HTTP方法对哪个实体执行操作取决于请求中指定的URL

不同的URL可以引用同一个实体,但浏览器不知道这一点。当浏览器缓存 HTTP响应时,它会针对给定的URL进行缓存。

http://www.target.com/是一个网址http://target.com/是另一个。http://www.target.com/whatever又是一个。也是如此http://www.target.com/?

现在,假设http://www.target.com/浏览器中有一个缓存条目。这是否意味着上面列出的任何其他URL都有一个?不,不是的。

因此,回到这个问题,让浏览器在 HTTP 端口上的 Web 应用程序返回永久重定向的情况下发送纯文本请求是制作一个与缓存条目不匹配的URL并欺骗用户访问此URL

证明这个有效:

127.0.0.1 - - [13/Apr/2016:10:01:17 +0200] "GET / HTTP/1.1" 301 226 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
127.0.0.1 - - [13/Apr/2016:10:01:35 +0200] "GET / HTTP/1.1" 301 226 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
127.0.0.1 - - [13/Apr/2016:10:02:10 +0200] "GET /whatever HTTP/1.1" 301 234 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
127.0.0.1 - - [13/Apr/2016:10:02:36 +0200] "GET /whatever HTTP/1.1" 301 234 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
127.0.0.1 - - [13/Apr/2016:10:08:16 +0200] "GET / HTTP/1.1" 301 226 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"
127.0.0.1 - - [13/Apr/2016:10:08:25 +0200] "GET /? HTTP/1.1" 301 227 "-" "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0"

即使为所有内容配置了永久重定向,我也能够使用相同的浏览器向同一个网站发出六个(任意数字)明文 HTTP 请求。(不,我没有清除浏览器的缓存!)

解决永久重定向的其他明显方法包括诱使用户切换到匿名浏览器模式(无缓存)或切换到另一个浏览器(“我在使用 IE 访问应用程序时遇到问题。你能看看吗?”)。

有很多实用的方法可以让目标用户为您清除缓存,这可能是最简单的解决方案。这甚至可能不是那么可疑,尤其是对于非技术目标,因为多年来它一直是每个人的首选 IT 问题解决建议。

如果您正在运行/伪造 wifi 热点进行拦截,则最容易。抛出一个他们在第一次连接时必须接受的“条款和条件”页面,然后无法授予他们访问权限并说“这可能是由缓存问题引起的。请通过执行 X、Y、Z 清除缓存”。没有人真正认为缓存是一种安全功能,如果他们完全理解的话。大多数人会很高兴地清除它以换取免费上网,然后你就是金子了。

您可以尝试对端口 443 运行 synflood。客户端将无法连接,并且可能会故障返回到端口 80。

只是免责声明,但我没有尝试过。有人想插话吗?