最近发生在美国一个华人绑架事件把“暗网(Darknet或Dark Web)”带入到公众的视野,本文从技术角度分析暗网的工作原理和安全性。
什么是暗网
我们日常使用的互联网(Internet)被称为“明网”,与之对应的借助互联网而形成的“隐藏”的网络被称为“暗网”。所以“暗网”其实是还是属于互联网,只不过它不为我们所知。暗网相对于“明网”最大的特点是——匿名,通过一些技术手段保证通讯双方的匿名性。最著名的匿名技术叫“洋葱路由(Onion routing)”,Tor是基于这种技术实现的一套软件。除此之外还有一个叫“大蒜路由(Garlic routing)”的技术,I2P是基于这种技术实现的一套软件。Tor的用户群更大几乎成了暗网的代名词所以我们主要关注Tor。利用Tor可以实现两种匿名方式
- 作为客户端匿名访问某个明网的服务器,此时Tor保护客户端的匿名性,明网的服务器是无法获知躲在暗网的客户端的IP地址。比如一些黑客在入侵的时候会利用Tor隐藏自己的身份。
- 作为服务器端在暗网提供服务,此时Tor保护服务器端的匿名性,暗网的客户端可以访问服务器端资源但是不知道服务器端资源的IP地址。 这种服务器一般以.onion这样的域名结尾,比如著名的WannaCry(比特币勒索软件)提供的付款地址就是位于暗网的一台服务器(以.onion域名结尾)。
Tor链路原理
在讲解Tor原理之前必须先要搞清楚传输层安全协议(Transport Layer Security,TLS)TLS的前身是安全套接层(Secure Sockets Layer,SSL)目的是为了防止数据被窃听、篡改、冒充。TLS的工作原理非常简单,客户端通讯的时候会先向服务器端索要公钥,然后通过公钥加密要发送的数据,服务器端收到数据后利用私钥解密。
Tor有两种主要服务器角色,中继服务器是负责中转数据包的,可以理解为代理;目录服务器保存中继服务器的列表(保存中继服务器地址、公钥)。当客户端访问目标服务器的时候会先通过查询目录服务器获取中继服务器列表(图中红色部分);客户端从中继服务器列表中选择三个延时最低的作为中继服务器并建立链路(Tor称为Circuit),客户端后续的所有请求都通过这条链路到达目标服务器以达到匿名的目的。在整个通讯过程,客户端<->目录服务器,客户端<->中继服务器,中继服务器<->中继服务器,虽然这三次通讯是建立在TLS之上的(图中的红色和蓝色),但是DPI(深度数据包检测)还是能探测到TCP的包头——目标地址、源地址、目标端口、源端口(TLS只会加密TCP、UDP的Data部分,毕竟路由寻址需要依靠IP头部和TCP、UDP头部的)。这里的源地址是用户访问公网的真实地址,一般运营商提供上网服务都会有备案,所以是可以通过这个IP地址追查到具体某个用户的。所以Tor在TLS之上叠加了一层链路,通过这个链路来转发数据已达到匿名的目标。
匿名原理
Tor中相互通讯所采用的数据包叫Cell,它是固定长度的。
CircID是客户端产生的一个随机数,用于区别不同的链路(Circuit),我们可以理解为一个目标服务器代表一条链路;CMD是一个枚举值表示数据包的含义(比如建立链路、关闭链路)。Tor选择3个中继服务器后会先尝试和第一个服务器“握手”(OR1是指第一个中继服务器也叫入口路由,OR2是第二个,OR3是第三个也叫出口路由)
- 客户端会生成一对密钥(一个公钥client-publicKey,一个私钥client-privateKey)构建一个Cell,CircID=随机数N,CMD=create,Data=加密(OR1,client-publicKey)。注意Data部分传递的是客户端的的公钥,这个数据会用目标中继服务器的公钥加密。(每台中继服务器都会产生一对密钥,公钥发布到目录服务器上,私钥自己保存)
- OR1收到数据包后检查CMD部分发现是create,然后用私钥解开data部分保存client-publicKey。然后生成一对密钥(公钥or1-circuit-publicKey,or1-circuit-privateKey)构建一个返回数据包,CircID=N(客户端产生的),CMD=created,Data=加密(client-publicKey, or1-circuit-publicKey)。Data部分是中继服务器为这次会话(circuit)产生的临时密钥对,通过client的公钥加密。
- 客户端收到数据后检查CMD部分是created,用私钥解开data部分保存中继服务器1的临时公钥。接下来客户端要和OR2建立连接,这次连接是通过OR1建立的所以数据包还是发送给OR1的。
- 客户端构建“扩展数据包”,CircID=N,CMD=relay,Data部分是OR2的地址信息、公钥信息。当然Data部分用or1-circuit-publicKey加密。
- OR1收到数据包,发现是relay,用私钥解开data部分拿到OR2的地址信息和公钥,利用上面的握手过程(和客户端到OR1一样)完成OR1和OR2之间的握手。
- 同样的道理OR2也和OR3完成握手
整个握手过程就是链路建立过程,首先是客户端和OR1建立链路然后通过“扩展”指令让OR1<->OR2、OR2<->OR3之间建立链路。链路建立成功后客户端会发送CMD=data的数据包,其中DATA部分是经过三层公钥加密的or1-circuit-publicKey(or2-circuit-publicKey(or3-circuit-publicKey(data))),OR1收到数据包后会解密第一层然后交给OR2,解密第二层以此类推。就像剥洋葱一样,剥了一层又一层,这就是“洋葱路由”名称的来历。通讯过程中看似OR1是知道客户端的公网IP的,其实不然。有两种方法保证了匿名性:1. OR服务器来源于互联网用户自己提供的,客户端使用的时候是随机选择的,所以随机性很大。2. OR1服务器并不知道自己是“入口路由”,它仅仅知道有一个请求需要建立链路,因为客户端的建链过程和OR1到OR2的建链过程是一样的。每个OR服务器仅仅知道建立链路而没有办法判断请求者是实际用户还是其他OR服务器。
Tor安全吗
首先我们要搞清楚Tor的目标不是提供代理服务器而是实现匿名,所以它的设计其实是很脆弱的。攻击它的方式有两种:
- 釜底抽薪,Tor属于集中式设计,它正常工作完全依赖于目录服务器。为了防止目录服务器被冒充所有的目录服务器IP地址都被硬编码在客户端一共9个主用的,151个备用的。禁用这些IP地址或者直接干掉这些服务器那么Tor网络就彻底瘫痪了,所谓的“暗网”就永远从世界上消失了(^_^,厉害的我都害怕了)。
- 破除匿名,釜底抽薪的方式最彻底但是对于技术流是没有挑战性的,“暗网”是一个鱼龙混杂的地方美帝的FBI、五角大楼之类的机构还指望从上面收集信息呢,如果直接把网络干掉了属于“同归于尽”的做法。破除Tor匿名的唯一办法是加入到Tor之中——成为一台OR服务器,因为Tor会选择延时比较低的OR作为服务器所以对于“美帝”来说他们可以利用网络优势让服务器更容易被选中。
成为OR之后就可以收集数据里,记录每条链路建立的时间,前驱后继,然后再通过在明网收集到客户端访问目录服务器(目录服务器是固定的)的证据就可以“基于时间”判断出他访问了暗网从而破除匿名。更牛逼的是通过“强制”解开数据包还有更大的惊喜——如果解包成功说明这台OR服务器承担了“出口”的角色,出口到目标服务器数据是不经过加密的,据说维基解密的很多资料都是通过这种方式获取的。
总结
Tor的Cell是over在TCP、UDP之上的(作为TCP、UDP的data部分)而TCP、UDP链路是经过TLS保护的所以DPI是识别不了Tor Cell,也就没有办法判断用户是否在访问暗网。通过握手机制建立起来的链路保护了用户访问时的匿名性,即便是中间参与转发数据的代理服务器也没有办法判断谁访问了暗网。当然再狡猾的狐狸也斗不过猎手,Tor的安全性其实没有想想的那么高反而很容易就被攻击。更加要命的是可以轻而易举的彻底摧毁Tor网络,而美帝之所以不这么做是想通过暗网获取更多信息,监控更多的人(好比一个天然的大“蜜罐”系统)。
【本文是51CTO专栏作者“邢森”的原创文章,转载请联系作者本人获取授权】