# 攻击洋葱路由(Tor)匿名服务的一些综述

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2015-08-26T06:34:00Z
Canonical: https://wepostx.com/topics/999

> 乌云历史资料归档
>
> **原始作者：** phunter
> **原始编号：** superkieran-wooyundrops:729
> **原始发布时间：** 2015-08-26 14:34
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

最近MIT发了一篇文章（[English PDF](https://people.csail.mit.edu/devadas/pubs/circuit_finger.pdf)），讲了他们通过给Tor网络回路做指纹特征的办法企图识别洋葱路由Tor的匿名服务，结合网页指纹的办法最终可以跟踪到用户。这篇文章引起很多讨论，是否成功攻破Tor这个话题又被讨论起来。由这篇文章启发，受小编邀请，我就来把最近这几年攻击Tor匿名服务的一些方法和尝试做个简单的综述。以下内容都不是我原创，我尽量保持浅显地做了这篇文章整理综述的工作，文章结尾有一些深入阅读材料供进一步参考。这篇文章字比较多又没什么图和代码，所以给个TL;DR（太长不读）: 攻破Tor的匿名服务是很难的事，下面这些方法和尝试都是一些启发性的工作(heuristic analysis)。

# 0x00 听风就是雨：简单介绍一下Tor

Tor（The Onion Router，洋葱路由器）的主要目的是为了防范通过流量过滤和嗅探来窥探用户的通信隐私，多数中国人民熟悉它倒不是因为它的加密而是因为它的多层节点能跨越长城。它的基本原理是，Tor用户在本地架设一个洋葱代理服务器，这个服务器定期和其他Tor用户交流从而形成一个拓扑结构的回路（circuit）。Tor把用户要传输的信息在应用层加密，每对路由之间都通过点对点的对称加密通信，每对路由相当于洋葱的一层皮，这样的多层拓扑结构相当于把客户端温暖地包在洋葱的心里，这就是Tor保护信息来源的方式。信息从客户端发出，通过网络随机化寻找路径，通过一层一层的加密代理节点，从出口节点以明文的方式发出去，所以对目的节点来说它只能看到明文消息从出口节点发出并不知道消息源客户端的位置。如果知道Tor部分节点的IP，攻击者可以反向查询整个信息的流向从而找出客户端的源头，所以对于每个Tor的代理服务器来说，千万不能告诉外界自己的IP地址。

![原文图片](/media/2016/06/4399245112219098721ec8089dc61a74)

引用自[wikipedia link](http://drops.wooyun.org/wp-content/uploads/2015/08/137.png)
值得注意的是，攻击Tor匿名服务主要目标并不在于获取传输的信息而在于找出哪些节点是Tor的中间节点、哪些用户用Tor、用的是哪些Tor服务等等，因为在出口节点出来的信息都是明文的只要抓出口节点就可以获取传输的信息，比如当年wikileaks泄漏的文件有一部分是从出口节点获取的。

# 0x01 人生的经验：攻击方法的理论概要

Tor是个复杂的系统，复杂系统的复杂性导致了它设计上有很多可以被攻击的本质特征，它的实现和服务器配置上也不是完美无缺的，它同时还有一些“猪队友”的问题可供攻击使用。这些方面是攻击Tor匿名性和隐私的套路攻击点。
基于Tor本身信息特性的攻击基本上使用的是tor的对称加密以及网络的复杂性，一般方法是侦听网络数据的模式，因为链接是通过多层节点加密的，所以Tor在确定链接的时间上以及网络数据的一些特殊模式上和普通的网络数据传输有所不同，通过侦听网络节点的数据传输模式可以基本猜测出来这个节点是否为Tor节点。传播的信息因为有自己的固定特征（比如[击键频率的模式](http://www.welivesecurity.com/2015/07/29/keystroke-biometrics-exploit-defeats-tor-privacy/)等），这些特征从Tor的源头传到目的的时候引起的加密流量也会因此含有一些可以被识别的特征，如果攻击者设计一些特别的实验，信息传播的序列可以被用来探测Tor的节点位置。多数攻击Tor匿名性的研究工作多集中在这个方向，包括上面MIT的这篇文章通过给节点回路做指纹的方式也是这类方法。这些方法一般都是很巧妙的构造方法，有很多大的研究机构（包括一些国家机构）都在积极研究这个方向。
基于攻击Tor的实现／配置等其他“猪队友”的方法并不常见于各大研究机构的科研项目里，但它和社会工程学在黑客攻击里的地位一样，在一切特定情况下可能成为唐门暗器一招毙命（洋气一点叫做 [Achilles' heel](https://en.wikipedia.org/wiki/Achilles%27_heel)）。攻击Tor实现的方法一般是欺骗，比如设置由攻击者控制的的Tor节点吸引其他的Tor节点来链接。攻击Tor的实现和服务器配置的办法多是在于，如果一个tor服务器没有合理配置，它的tor之外的服务可能会被攻破从而导致tor服务的地址泄漏。比如说有一种“猪队友”就是，一个Tor的代理服务器节点同时也是其他服务的节点，比如上面跑了个web程序（即使是一个世界上最好的语言PHP写的web程序但是这个PHP版本很低有若干漏洞），攻击者可以通过web服务的漏洞侵入系统，只要攻击者得到shell就可以扫描整个机器看看有没有跑Tor就可以判断了。最近比较热门的猪队友是bitcoin比特币，有相关的研究利用比特币的交易可以探测到Tor网络里一些节点的IP地址，可以在这里深入阅读：[文章地址](http://orbilu.uni.lu/handle/10993/18679)，在这里这些方法就不赘述。

# 0x02 问我支持不支持：长城的一些工作

Tor可以用在跨越长城上，因为Tor会自动监测相关的代理节点是否可达，如果不可达就自动更换节点直到可以连接到长城之外，所以长城比较讨厌Tor是可以理解的。更让长城讨厌的是，因为最终目标服务器只能看到Tor的出口节点，所以一个境外服务器可以用Tor伪装自己是中国境内服务器提供反向跨越长城的服务。
长城的研究主要目的并不是想找到信息的源头，它的主要目的是为了封杀Tor代理节点和阻断连接，这样可以封杀跨越长城的用户。长城的工作没有具体文献可以参考，但是从一些观测结果上看，长城的基本方法就是：

- 封杀一些已知IP节点和桥接节点：长城会封杀部分已知节点并对其余部分进行监控。监控的目的可能是为了收集节点之间的数据传输，可以用作机器学习时对信息流的特征提取。

- 设置一些由长城控制的Tor节点吸引别的Tor节点进行链接并封杀。

- 针对非SSL加密Tor节点收集信息流作特征分析：长城可以识别出来一些Tor信息流的特征，并通过机器学习＋人工规则的方法判断该节点是否是Tor。如果是，就重置链接并封杀。
长城的优势在于可以看到别人看不到的真实流量数据，这决定了他们的方法是通过真实流量里面收集特征和正负样例进行机器学习的分析，Tor的各种加密和网络结构的变化，长城都能很快观测到。长城也可以做很多被动的数据收集工作，保证了他们对Tor的攻击保持低调。基于长城工作的目的性是在于阻断链接而不是寻找信息源头，它摧毁的差不多只有一小部分Tor的节点，而新的节点在不断产生它本身对Tor网络的隐私和匿名性并不会造成巨大伤害。至于它有没有更深入和进一步的工作，由于缺少参考文献我们暂时不可知，而且这一段纯学术讨论我连图都不敢配啊。

# 0x03 你们很熟悉西方的那一套

以美帝国主义为首的研究机构们对Tor的研究比较深入，主要目的是攻破Tor的隐私和匿名，常见于大学和研究机构的论文，以及美国国安局（NSA）的一些公开和非公开但是不小心泄漏的文稿。

# 0x04 MIT的工作

本文开头提到的MIT的工作主要方法是对一个信息流在Tor里的传输回路做指纹特征，它的直接目标不是寻找Tor的节点或者查找用户信息，而是先判断网络中是否存在Tor隐藏服务，当攻击者判断网络中存在Tor隐藏服务，可以设计一个网页指纹来攻击Tor节点的客户端或服务器的位置（关于网页指纹的深入阅读可以参考Cai et al “[Touching from a Distance: Website Fingerprinting Attacks and Defenses](http://www3.cs.stonybrook.edu/~xcai/fp.pdf)”，基本方法就是攻击者在Tor网络里自己设个客户端去访问某个网站，跟踪自己发出的信息的流向，把路过的节点的一些特征比如包的大小间隔序列等，然后用机器学习的办法建个分类器）。它判定网络中是否存在Tor隐藏服务的方法比较简单，就是设立一个由攻击者控制的Tor节点（友情提醒，攻击者设置了Tor节点也对拦截信息没有什么用，因为点对点之间是对称加密的），当有别的Tor节点和用户链接进来，经过一段时间的信息相互传输，攻击者可以统计出数据传输量和发送接收包的数量，以及构建回路的序列，通过运行一个简单的机器学习模型，攻击者就能预测出发送信息的用户所使用的Tor服务（比如OpenWeb等等）。这个方法厉害之处在于它是被动收集数据而不是主动发送数据包，也就是说，在最终揭露Tor节点信息之前攻击者可以完全不被发现。
这是一个很有意义的工作，全文的阐述也很详细，对学习攻击Tor初学者也是个不错的阅读教材，但是至于他是否是宣称的那样攻破了Tor的隐私和匿名，在这个[reddit讨论](https://www.reddit.com/r/TOR/comments/3f3ioo/mit_breaks_tor_anonymity_by_exploiting_entry_nodes/)里，大家都觉得和所谓攻破差的有些远，还有很长一段路。

# 0x05 IIIT的工作

印度小哥[Chakravarty](https://sites.google.com/site/sambuddhochakravarty/)的组利用了Cisco的NetFlow网关监测工具设计了一个巧妙的摄动实验检测服务器端和客户端信息的相关性。Cisco的很多路由器都有一个这个默认工具NetFlow，有网络流的各种统计信息比如package的数量byte数之类的，用来给管理员判断网络信息的模式以确定网络阻塞等网络问题的原因。Chakravarty的组设计了这么个实验，它在服务器端流量的模式里加入了一个特殊的摄动（Perturbation）导致在网关上的网络流有一定统计特征，然后按照这个摄动的特征持续发送一定的信息。这个摄动在流过Tor的整个网络的时候，在客户端上观测到的摄动特征和服务器端发送的特征可以观测到有统计上的关联，而这些统计上的关联可以推测出发送消息的源。小哥的组也对这个方法提出了防护意见：在节点把这些可以引起泄密摄动特征进行混淆，比如一些数据包延迟发送，隐藏这些特征就行。
他们的实验比MIT更NB的地方在于，他们的实验可以在公共Tor网络上重复，他们只要监测一小部分的因特网网关，利用类似netflow这样的网关监测工具就能基本上观测到足够多的Tor流量信息。这种方法是主动探测Tor网络的方法，这一点和MIT的被动收集数据方法有所区别。相关深入阅读请参考这篇[blog](http://securityaffairs.co/wordpress/30202/hacking/tor-traffic-analysis-attack.html)以及[这篇](http://resources.infosecinstitute.com/hacking-tor-network-follow/)。从原理上看，长城也可以使用类似方法观测，只是不知道他们的工作进展如何。
顺道说一句，之前戳戳给我看的Freebuf上介绍的那篇《[麻省理工大学（MIT）研究出识别Tor匿名服务的方法，准确率高达88%](http://www.freebuf.com/news/73920.html)》，实际内容并不是MIT的工作而是印度小哥的这个关联性实验设计的工作。请观众朋友们不要把这两个工作混淆了。

# 0x06 NSA的工作

美国国安局（NSA）的工作就有相对广泛的多，基本上哪些节点是Tor的中间节点、哪些用户用Tor、用的是哪些Tor服务等等这些方向都有涉及。邪恶美帝国主义NSA的主要目的是为了跟踪Tor的用户。不过NSA也承认他们距离完全攻破Tor的隐私和匿名服务有很大距离，他们只能攻击到极少部分的特定用户（这些被成功攻下的用户一般是用缓存泄密[Cookie Leakge](https://edwardsnowden.com/wp-content/uploads/2013/10/tor-stinks-presentation.pdf)的办法，也有一些用户就是自己很笨不会用Tor然后随意下个套装连接到一个假冒服务器就给抓了）。以下信息均没有NSA主动提供的参考文献。

![原文图片](/media/2016/06/2d8f084e4854758893422d274ffc54ed)

引用自 [http://yalasu.com/an-open-letter-to-asu-president-michael-crow/](http://yalasu.com/an-open-letter-to-asu-president-michael-crow/)

### 猪队友系列方法
NSA主要利用的猪队友就是浏览器（主要用Firefox），以及喜闻乐见的Flash，外加一些网页脚本。多数用户并不真正理解Tor的工作原理和方法，他们多半会选择一个[一键安装Tor浏览器套装](http://www.darkreading.com/risk-management/fbi-admits-to-tor-server-takeover/d/d-id/1111553?)之类的，里面包含了什么东西其实他们并不知道，比如有漏洞的Firefox浏览器，浑身是漏洞的Flash播放器等等，其实里面装个百度全家用户也不一定知道。而FBI NSA之类的机构就利用了安装了这些套装的用户，通过攻击他们浏览器和Flash的漏洞攻击Tor用户的隐私和匿名性。不过这个方法也从侧面说明了，NSA等机构其实没有什么直接有效攻击Tor的办法，要不然这些猪队友不会成为主要目标。

# 0x07 FoxAcid 服务器系列

NSA有种神秘的服务器代码名叫FoxAcid，也就是NSA控制的Tor服务器。它有多种用法，比如说NSA想跟踪某个用户的Tor，他们用一些特殊的方法把该用户的Tor回路连接到NSA的某个FoxAcid服务器上，并且为了保证长时间连接，NSA做了一些进一步的攻击工作（包括给用户植入一些木马）保证该用户在较长一段时间都可以连接到FoxAcid服务器上。这些FoxAcid服务器据说都是Windows Server 2003，并且用户重启了这些木马还是能照常连上FoxAcid。

### 神奇的好队友和网页指纹
除了利用猪队友，NSA有一些神奇的好队友：各大通讯运营商。NSA可以要求美国的通讯运营商提供特定的用户的数据，而运营商们比如AT&T也都毫不犹豫的配合。NSA在网页里植入特定的指纹信息，如果用户通过Tor访问了这个网页，NSA可以通过运营商数据跟踪到这个用户访问这个网页的数据流向，从而跟踪到特定的用户。其实我觉得理论上长城也可以做类似的工作，但是长城的主要目标并不是跟踪用户，所以可能他们会直接让运营商把某个架了Tor的IP封掉就好。
这部分相关阅读参见 [http://www.networkcomputing.com/networking/nsa-battles-tor-9-facts/d/d-id/1111857?](http://www.networkcomputing.com/networking/nsa-battles-tor-9-facts/d/d-id/1111857?)

# 0x08 谈笑风生：小结

感谢观众朋友们看完这么长一篇综述。攻击Tor匿名和隐私是个很热门的话题，无论是在学术界还是工业界，都有很多不同角度的攻击方法。攻击方法多是两类，一是针对Tor网络的复杂加密特性造成的数据流模式和普通流量不同，二是利用架设Tor服务的节点的其他相关服务的弱点。每个机构针对Tor的攻击方法也由于目的不同而不同。长城的主要目标是为了阻断链接，所以他们主要目标是为了找出Tor节点的位置并封杀，所以他们的方法多在侦测网络流量模式；NSA的主要目标是为了跟踪用户，所以他们的主要目标是用户经过的Tor链路以及用户本身，他们就用了各种千奇百怪的方法跟踪用户。MIT的工作比较有意思，论文本身也是对回路指纹这个攻击方法的一个详细描述，可以自己阅读。IIIT的印度小哥的工作是主动探测Tor的办法，这个工作也很有启发性。

## Replies
