热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一比特之差:无需利用漏洞的DNS劫持

一比特之差:无需利用漏洞的DNS劫持|Bitsquatting表示去注册一个域名,它和知名的域名只有一个bit的差别。这个单词源自typosquat

Bitsquatting表示去注册一个域名,它和知名的域名只有一个bit的差别。这个单词源自typosquatting,意为注册一个和知名域名只有一字之差的域名。在解析域名时,bitsquatting可能通过DNS导致计算机上的硬件错误。关于bitsquatting更详细的信息,可以参看我的Blackhat 2011 whitepaper。YouTube上有人发布了我在DEF CON 19上有关此话题的演讲视频,当时使用的幻灯片可以在这里下载。

引言

计算机常常由于一个或多比特的内存损坏出现错误,而造成这些错误的原因可能是制造上的缺陷或者宇宙射线、高温之类的环境因素。虽然单个机器中出现这样的错误的可能性是极小的,但是整个互联网上设备的总量却非常庞大:2010年时就有大约50亿个设备连接到互联网。我们可以将这种存在于各个设备上的小概率错误更加形象地描述,那就是买彩票。赢得头奖的概率是极小的,但是只要有足够多的人去买,总有人会成为赢家。

研究人员之前就在很多惊人的地方利用了比特错误(bit-errors)。现在,在互联网尺度上,我们又有新的办法去利用它。Bitsquatting是其中之一,也就是注册和某个常被访问的域名仅一比特之差的新域名。

工作原理

当比特错误发生时,内存中的数据会被修改。计算机内存的内容可能代表各种意义,有时,它刚好就表示域名。如果程序使用这块内存,就会读取到错误的域名。

下面的图解能够更清楚的说明这个问题,表中是cnn.com的二进制表示方法:

01100011 01101110 0110111 0101110 01100011 01101111 01101101
c n n . c o m

现在假设你使用的计算机含有损坏的内存模块,你打开一个包含超链接到cnn.com的网页,然后你点击了这个链接。会有多少个操作将cnn.com的二进制数据保存到你的内存?写这篇文章时,我想到了下面这些:

  • TCP/IP协议栈由核心态向用户态转化时(根据操作系统的具体实现各有区别)
  • 在浏览器解析HTML时
  • 在创建DOM树的内部表示时
  • 在创建新的HTTP请求时
  • 在操作系统解析域名时

更进一步,假设其中有一次将域名写入到了损坏的内存模块,它的二进制形式被修改了1bit,现在表示为:

01100011 01101111 0110111 0101110 01100011 01101111 01101101
c o n . c o m

 这样一来,当你点击链接时,浏览器将会跳转到con.com,而不是cnn.com。

实验

这个实验背后的概念很简单:如果比特错误确实改变了设备内存中的域名,那么这些设备会访问到和正确域名一比特之差的bitsquat域名。因此很多频繁解析的域名的bitsquat域名会被全球各地的设备访问到。

然而这个实验实施起来却没有那么容易,首要的问题是选择合适的域名来进行比特修改。流行的网站和常被解析的域名是不太相同的,很多鲜为人知的域名实际上会被频繁解析。这类域名一般属于内容分发网络或者广告网络,例如fbcdn.net,、2mdn.net和 akamai.com。由于很少有人实际在浏览器中输入这些域名,它们也成为本次实验中最合适的目标。还有个问题就是每次DNS查询必须有两次响应:一次是原本的域名,一次是经过比特修改的域名。因为原始的请求可能会得到正确域名的响应,而丢弃对无效域名的响应。这方面更多的信息,请参考白皮书或者幻灯片。

为了这次实验我注册了下面这些域名。

注:目前它们全都已经过期,不再属于我了。

Bitsquat Domain Original Domain
ikamai.net akamai.net
aeazon.com amazon.com
a-azon.com amazon.com
amazgn.com amazon.com
microsmft.com microsoft.com
micrgsoft.com microsoft.com
miarosoft.com microsoft.com
iicrosoft.com microsoft.com
microsnft.com microsoft.com
mhcrosoft.com microsoft.com
eicrosoft.com microsoft.com
mic2osoft.com microsoft.com
micro3oft.com microsoft.com
li6e.com live.com
0mdn.net 2mdn.net
2-dn.net 2mdn.net
2edn.net 2mdn.net
2ldn.net 2mdn.net
2mfn.net 2mdn.net
2mln.net 2mdn.net
2odn.net 2mdn.net
6mdn.net 2mdn.net
fbbdn.net fbcdn.net
fbgdn.net fbcdn.net
gbcdn.net fbcdn.net
fjcdn.net fbcdn.net
dbcdn.net fbcdn.net
roop-servers.net root-servers.net
doublechick.net doubleclick.net
do5bleclick.net doubleclick.net

我使用Python脚本应答DNS请求,并且使用Apache记录HTTP请求。令我惊讶的是,有设备连接了。

实验发现

以下结论是基于2010年9月26日至2011年5月5日间的Apache日志得出的。由搜索引擎爬虫和Web漏洞扫描器引起的日志已经被手动过滤了。正因为是手动操作,所以最后统计时可能还有很小一部分漏网之鱼。

发现1:比特错误可以被利用在DNS上

在记录日志期间总共有52317次针bitsquat域名的请求,它们来自与12949个独立IP。除去其中3次产生巨大网络流量的事件,平均每天有59个独立IP对32个bitsquat域名进行了请求。这些请求不是来自于拼写错误或者其他形式的手工输入URL,还有一部分表现出有多个比特错误的特征。以下是一些实际的例子(个人信息已经移除):

static.ak.fjcdn.net 109.242.50.xxx “GET /rsrc.php/z67NS/hash/4ys0envq.js HTTP/1.1″ “http://www.facebook.com/profile.php?id=xxxxxxxxxx” “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0; GTB6.5; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.2; Hotbar 11.0.78.0; OfficeLiveConnector.1.5; OfficeLivePatch.1.3; AskTbZTV/5.8.0.12304)”

msgr.dlservice.mic2osoft.com 213.178.224.xxx “GET /download/A/6/1/A616CCD4-B0CA-4A3D-B975-3EDB38081B38/ar/wlsetup-cvr.exe HTTP/1.1″ 404 268 “Microsoft BITS/6.6″

s0.2ldn.net 66.82.9.xxx “GET /879366/flashwrite_1_2.js HTTP/1.1″ “http://webmail.satx.rr.com/_uac/adpage.html” “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; HPNTDF; AskTB5.2)”

mmv.admob.com 109.175.185.xxx “GET /static/iphone/img/app@2x.png HTTP/1.1″ “Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; HW iPhone2,1; en_gb) AppleWebKit/525.18.1 (KHTML, like Gecko) (AdMob-iSDK-20101108; iphoneos4.2)”

发现2:并不是所有的比特错误都造成同等程度的影响

有些机器相比其他而言,明显控制着更多的网络流量。当一个比特错误发生在普通PC机或者手机上时,它只会影响到一个用户。然而当它发生在代理、DNS服务器或者数据库缓存中时,将会影响到成千上万的用户。在我的实验中,已经观察到了比特错误出现在Web应用、DNS解析服务器和代理服务器中。例如,一个比特错误将fbcnd.net变为fbbdn.net,将使上千个开心农场的玩家请求到我的服务器。

发现3:手机和嵌入式设备可能比传统硬件受的影响更大

我对2011年3月期间访问Wikipedia和bitsquat域名的HTTP User-Agent进行了对比,展示在下面的图例中。其中Other包括了各种手机、游戏机控制台和其他嵌入式设备,它们在对bitsquat域名的访问中,增加的幅度最大。令人好奇的是,来自MacOS针对bitsquat域名的访问相比Wikipedia有显著减少,对此我还没有一个合理的解释。(译注:这里是按两个域名各自的设备分布算的,其中有增多必然有减少,也许分别计算每种设备访问错域名的几率更加合理,即访问错误域名的次数 / 对两种域名的访问总数。)

bitsquat_1

发现4:对bitsquat域名的访问流量是日常网络流量的真实写照

Bitsquat域名的访问者来自于全球各地,其使用的设备也几乎涵盖每种主流的操作系统和嵌入式平台。除使用MacOS的访问者所占的百分比在两种域名间有显著差别之外,使用Windows、Linux、Android和iPhones的百分比基本相同。另外,基于IP地理位置数据库,我们可以观察到来自于美国的访问者在一天内的流量走势。


bitsquat_2

发现5:HTTPS/TLS不会有帮助,DNSSEC可能会有一丁点

HTTP 1.1在头中包含了一个叫Host的字段,其数值是客户端想要访问的域名。如果Host中包含着bitsquat域名,那么比特错误在域名解析前就发生了。如果Host中是原始域名,那么错误就是发生在域名解析中。我数据中96%的情况是在DNS解析前就出现了比特错误。

bitsquat_3

像SSL和TLS这种安全传输技术是用于保证两端之间数据的机密性、真实性和完整性,但是比特错误更多发生在数据在某一端还未传输的时候。DNSSEC只能解决那4%发生在域名解析过程中的比特错误。

数据

DNS流量的全部PCAP在此:dnslogs.tar.7z,56Mb

HTTP日志可能包含个人信息,因此不会公开发布。如果你有正当的研究目的需要它们,请联系我。

这里有个工具可以快速识别潜在的bitsquat域名:bitsquat.py,github

进一步研究

来自Verisign的Duane Wessels也在DNS查询中寻找过网络级别的比特错误,他指出“网络中比特错误相对而言是很少见的,但是有一个可预期的概率”。他研究的主要目的,是确定那4%发生在域名解析时的比特错误是否由UDP包在传输后的损坏造成。结论是网络中传输的包不太可能被损坏,用他自己的话说:“我们相信UDP的校验和能够有效防范bitsquat攻击或者其他DNS查询时的错误。无论如何,在进入网络前发生的比特错误不会从中受益,因为在传输前计算的校验和是基于错误的数据得出的。“

我非常鼓励读者重复我的实验,并且分享你们的结果。如果需要更多信息,请随时联系我。


推荐阅读
  • 本文详细介绍了Java集合框架中的Collection体系,包括集合的基本概念及其与数组的区别。同时,深入探讨了Comparable和Comparator接口的区别,并分析了各种集合类的底层数据结构。最后,提供了如何根据需求选择合适的集合类的指导。 ... [详细]
  • YB02 防水车载GPS追踪器
    YB02防水车载GPS追踪器由Yuebiz科技有限公司设计生产,适用于车辆防盗、车队管理和实时追踪等多种场合。 ... [详细]
  • Python数据类型6 字典
    字典Python的字典数据类型是基于hash散列算法实现的,采用键值对(key:value)的形式,根据key的值计算value的地址,具有非常快的查取和插入速度。但它是无序的,包 ... [详细]
  • 本文详细介绍了ActivityManagerService (AMS) 的工作原理及其在Android系统中的重要角色。AMS作为system_server进程的一部分,在系统启动时加载,负责管理和协调应用程序中的Activity和服务(Service)。文章将通过具体的接口图和通信流程,帮助读者更好地理解AMS的工作机制。 ... [详细]
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • 本文深入探讨了JavaScript中实现继承的四种常见方法,包括原型链继承、构造函数继承、组合继承和寄生组合继承。对于正在学习或从事Web前端开发的技术人员来说,理解这些继承模式对于提高代码质量和维护性至关重要。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 在使用Rails Paperclip插件与AWS S3进行文件管理时,遇到了`exists?`和`clear`方法调用时出现的`AWS::S3::Errors::BadRequest`错误。本文探讨了问题的原因及可能的解决方案。 ... [详细]
  • 本文探讨了亚马逊Go如何通过技术创新推动零售业的发展,以及面临的市场和隐私挑战。同时,介绍了亚马逊最新的‘刷手支付’技术及其潜在影响。 ... [详细]
  • 本文详细介绍如何在 Windows 环境下安装 Ubuntu 12.04 版本的 Linux 操作系统,包括必要的软件下载、配置步骤以及注意事项。 ... [详细]
  • Spring Cloud Config 使用 Vault 作为配置存储
    本文探讨了如何在Spring Cloud Config中集成HashiCorp Vault作为配置存储解决方案,基于Spring Cloud Hoxton.RELEASE及Spring Boot 2.2.1.RELEASE版本。文章还提供了详细的配置示例和实践建议。 ... [详细]
  • 本文介绍如何在Linux系统中卸载预装的OpenJDK,安装指定版本的JDK 1.8,并配置防火墙以确保系统安全性和软件兼容性。 ... [详细]
  • 推荐两款实用的网络诊断工具
    大家好,因为一些私事很久没有更新博客了。今天向大家介绍两款非常有用的网络诊断工具——Tracert和Telnet,帮助你更好地理解和解决网络问题。 ... [详细]
  • JavaScript中使用each方法跳出循环及全角字符检测
    本文介绍了如何在JavaScript中使用jQuery的each方法遍历元素,并在满足特定条件时跳出循环。同时,文章还提供了一个示例函数,用于检测输入值是否包含全角字符。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
author-avatar
我叫yyson_836
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有