0x00 前言
在西弗吉尼亚州查尔斯顿举行的 SecureWV 2019 网络安全会议上,我和Peixue做了名为“详解Tor Bridge及Pluggable Transport”的 主题演讲 。 这里我们将通过两篇文章与大家分享更多细节,在第一篇文章中,我将介绍如何通过逆向工程找到Tor内置的Bridge(网桥),以及在启用Bridge时Tor浏览器的工作方式。0x01 Tor浏览器及Tor网络
Tor浏览器 是用来提供匿名Internet连接的一款工具,可以通过Tor网络实现多层加密。 当用户使用Tor浏览器浏览网站时,真实IP地址会被Tor网络隐藏,因此目的网站永远不知道真实源IP地址。 用户可以在Tor网络上自己创建站点,域名后缀为.onion
。 通过这种方式,只有Tor浏览器能够访问该站点,并且没有人知道站点的真实IP地址。 这也是勒索软件犯罪分子要求受害者通过Tor浏览器访问
.onion
网站上付款页面的原因之一。 Tor项目团队也知道这一点,在项目博客中明确指出“Tor已经被滥用于犯罪场景中”。 Tor浏览器是基于 Mozilla Firefox 的一个开源项目,我们可以从官网下载源代码。 Tor网络是一个全球overlay网络,由数千个自愿加入的中继节点所组成。 该网络有两种中继节点: 普通中继节点以及bridge中继节点。 普通中继节点可以通过Tor主目录查看,网络传感器可以轻松识别并阻止到普通中继节点的连接。 bridge的信息在Firefox的配置文件中定义,因此我们可以在Tor浏览器的地址栏中输入
about:config
中显示该信息,如图1所示:

https://bridges.torproject.org/
,或者向
bridges@bridges.torproject.org
发送邮件来获取该信息。
0x02 实验环境
我们的实验环境如下所示:- Windows 7 32-bit SP1
- Tor浏览器8.0
- TorLauncher 0.2.16.3(扩展)
- Torbutton 2.0.6(扩展)

0x03 使用内置Bridge运行Tor浏览器
我分析的Tor浏览器提供了4种bridge:obfs4
、
fte
、
meek-azure
以及
obfs3
,这些bridge称为“Pluggable Transpoort”(可插拔传输器),具体设置如图3所示:

Obfs4
Bridge,下文所有分析工作都基于这种bridge开展。 当Tor浏览器建立
obfs4
连接时,我分析了通信流量,发现TCP会话由
obfs4proxy.exe
创建,该进程是bridge客户端进程。 使用
obfs4
启动Tor浏览器时的进程依赖情况如图4所示,其中
firefox.ex
启动
tor.exe
,后者随后启动
obfs4proxy.exe
。
obfs4proxy.exe
进程位于
Tor_installation_folder\Browser\TorBrowser\Tor\PluggableTransports
路径中,一开始我认为内置的
obfs4
bridge应该硬编码在
obfs4proxy.exe
进程中。

obfs4
bridge的进程树
0x04 分析obfs4proxy.exe进程
启动调试器,attach到obfs4proxy.exe
,然后在
connect
API上设置断点,该API通常用来创建TCP连接。 通常情况下,通过逆向工程我们可以通过该API快速找到IP地址及端口。 然而当连接到我们创建的
obfs4
bridge时,断点从来没被触发过。 进一步分析
obfs4proxy.exe
进程后,我发现该进程实际使用的是来自
mswsock.dll
的另一个API:
MSAFD_ConnectEx
。

MSAFD_ConnectEx
API 如图5所示,
obfs4proxy.exe
即将调用
mswsock.MSAFD_ConnectEx()
来与内置
obfs4
bridge建立TCP连接,使用的IP地址及端口为
192.95.36.142:443
。 该函数的第二个参数为指向
sockaddr_in
结构变体的一个指针,其中包含待连接的IP地址及端口信息。 随后,该函数会调用
WSASend
及
WSARecv
来与
obfs4
bridge通信