Sniffly是一种通过利用HSTS(HTTP Strict Transport Security)和内容安全策略(Content Security Policy)进行攻击的方式,它允许任意网站嗅探用户的浏览器历史。该技术被测试于 Firefox 和 Chrome 浏览器。
Demo
首先可以先参照DEMO的演示,通过使用Firefox/Chrome/Opera,但请先将HTTPS关闭。
演示地址: Sniffly (打开之前,请再确认是否使用Firefox/Chrome/Opera浏览器打开,否则可能引起其他浏览器的崩溃)
首先推荐先读一读源文件中的src/index.js,可以先理解下Sniffly是如何工作的。
下面讲介绍其主要的工作原理:
1、首先,用户一开始会先访问嵌入Sniffly的网页; 2、接着,浏览器会先尝试通过http协议,转向使用HTTPS协议从服务器下载图像; 3、这个时候,Sniffly会通过设置 CSP(内容过滤策略)屏蔽图像下载,从而实现阻断从http重定向到https,这是很重要的一步。如果浏览器完成了对https网址的请求,那么随后将会直接接收hsts发过来的 pin码,而接下来的攻击将难以实现。 4、当图像被 CSP所中断,接下来将会调用onerror处理程序。在这种情况下,由onerror处理程序对图像从HTTP重定向到HTTPS的时间进行追踪计算。如果时间是在毫秒内,那么这意味着浏览器不需要发出网络请求,也就是用户以前访问过目标域名。如果时间是100毫秒左右,那么这意味着浏览器需要发出网络请求,也就是用户以前没有访问过目标域名。
寻找HSTS主机地址
加入网站列表,检测哪一台主机是发送 HSTS报文头部信息,
$ cd util $ ./run.sh <number_of_batches> > results.log
其中初始配置有100个网址,根据实际的环境,也可以使用不同的网址列表替代进行检测,如全Alexa排名前100万。
通过最大时间跨度对结果进行处理和分类,先排除那些最大时间跨度少于1天以及预下载的。
$ cd util $ ./process.py <results_file> > processed.log
执行之后,你可以从process.log中将主机地址复制到src/index.js中。
运行
在Chrome浏览器中访问file:///path/to/sniffly/src/index.html。而在Firefox中,显然是不支持CSP 头部信息使用标签的,所以需要建立一个本地网络服务器,去为CSP HTTP响应头部信息做回应。我的Nginx服务器功能模块如下,
server { listen 8081; server_name localhost; location / { root /path/to/sniffly/src; add_header Content-Security-Policy "img-src http:"; index index.html; } }
或者通过分布式配置文件.htaccess
<IfModule mod_headers.c> Header set Content-Security-Policy "img-src http:" </IfModule>
又或者通过php发送头部信息
将以下代码段粘贴在脚本的开头(请记得修改index.php名称)
<?php $csp_rules = "img-src http:"; // Just to ensure maximum compatibility header('X-WebKit-CSP: '.$csp_rules); header('X-Content-Security-Policy: '.$csp_rules); header('Content-Security-Policy: '.$csp_rules); ?>
温馨提示
1、目前尚不支持Safari, IE, o或者Chrome (iOS) 2、请将HTTPS功能关闭,浏览器的扩展功能如HTTPS会混淆结果; 3、请勿使用 Tor浏览器,因为时间统计会被四舍五入到接近100毫秒; 4、用户如果有不同的HSTS预置列表(因为有较低版本的浏览器),可能看不到准确结果。
Github地址: Github download
*参考来源: Github ,FB小编troy编译,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)