uTorrent协议层远程漏洞的分析和利用

安全 漏洞
近期,世界上最流行的torrent客户端uTorrent被爆出了一个安全漏洞,该漏洞的CVE编号为CVE-2020-8437。

写在前面的话

近期,世界上最流行的torrent客户端uTorrent被爆出了一个安全漏洞,该漏洞的CVE编号为CVE-2020-8437。根据研究人员透露的信息,远程攻击者可以利用该漏洞来入侵任何一个连接至互联网的uTorrent实例,并让其运行崩溃。作为合格的白帽黑客,我们在发现了该漏洞之后便立刻将其上报给了uTorrent团队,该漏洞也在短时间内迅速得到修复。现在在这篇文章中,我们将公开该漏洞的概况以及相应的利用方式。

[[349013]]

Torrent协议

Torrent下载(传说中的BT下载)可以同时与多个对等节点建立连接(其他人下载同一文件),并创建一个分散的下载网络来使整个对等节点组共同受益。每个对等节点都可以上传和下载数据到任何其他的对等节点,这种方式可以消除任何单一故障点或宽带瓶颈,从而使所有对等节点的下载速度更快更稳定。

对等节点之间使用了BitTorrent协议进行通信,而这种协议通信方式需要通过握手来发起。在接下来的分析过程中,我们将主要关注握手包以及随后的数据包。

BitTorrent握手

握手包是对等节点之间初始化通信所要发送的第一个数据包,握手包中包含了五个字段,每个字段都有严格的结构化格式。

握手包格式:

  • Name Length:1字节无符号整型,后跟字符串长度。
  • ProtocalName:可变长度的字符串,用于标记发起初始化的对等节点支持的协议。此字段将用于兼容性问题,不过在目前主要的协议实现中该字段都被设置为了“BitTorrent protocol”。
  • Reserved Bytes:8字节比特字段,每一位代表了一个协议功能扩展,现代Torrent客户端将使用这个字段来跟高级功能进行通信以优化下载任务。
  • Info Hash:20字节SHA1,用于识别初始化对等节点想要下载的种子文件,这个哈希是目标种子文件全部信息的哈希,其中包括种子名称、文件域哈希、文件大小、数量等等。
  • Peer ID:20字节缓冲区,一个发起方跟自己指定的随机标识。

当一个节点收到一个握手包之后,它将会用自己的握手包来回应。如果两个节点的Reserved Bytes字段都设置为了“Extension Protocol”,那么节点之间将使用一个“扩展”消息握手来交换更多关于扩展组建的信息。

BitTorrent扩展消息握手

扩展消息握手是对等节点之间用于共享额外扩展实现信息时使用的,跟我们之前分析的BitTorrent握手包不同的是,BitTorrent握手包的大小是固定的,但扩展消息握手包是可以动态变化的,这将允许该数据包传输大量扩展数据。

扩展消息握手包格式:

  • Length:4字节无符号整型,后跟整个信息的长度。
  • BitTorrent Message Type:1个字节,即数据包的BitTorrent消息ID,扩展消息对应的是20(0x14)。
  • BitTorrent Extended Message Type:1个字节,代表扩展消息的ID,对应的值为0。
  • M:动态变化的数据包大小,支持的补充扩展Bencoded格式字典。

Bencoded字典

M字段是一个Bencoded格式的字典,这种格式跟Python字典格式类似:即字符串类型的键值对。但是,跟Python字典相比,Bencoded字典在值前面会包含每一个字符串的长度,“d”和“e”分别用来代表“{”和“}”。下面给出的是Python字典和Bencoded字典的对比图:


除此之外,Python字典和Bencoded字典都可以在字典内部包含一个单独的字典,即支持字典嵌套:


漏洞CVE-2020-8437

漏洞CVE-2020-8437存在于uTorrent解析Bencoded字典的代码之中,说准确一点,就是解析嵌套字典的代码。在补丁发布之前(uTorrent 3.5.5及其之前版本),uTorrent将使用一个32位整数作为一个比特字段来跟踪Bencoded字典当前正在解析的部分。比如说,当uTorrent在解析第一层时,这个比特字段将会被设置为‘00000000 00000000 00000000 00000001’,当uTorrent在解析第二层时,这个比特字段将会被设置为‘00000000 00000000 00000000 00000011’。

但是,如果一个Bencoded字典的嵌套层数超过32层的话,会发生什么呢?于是乎,我便创建了一个这样的字典,然后丢给了uTorrent的字典解析器,结果如下:


这就很Nice!uTorrent崩溃啦!深入分析后,我们发现这是一个空指针引用错误。

漏洞利用

漏洞CVE-2020-8437有两个简单的利用向量,首先是要一个远程对等节点发送一个包含恶意Bencoded字典的扩展消息数据包,其次就是需要一个包含了恶意Bencoded字典的.torrent种子文件。

1. 远程对等节点利用

当两个支持扩展消息的对等节点开始交互通信时,它们都会发送一个数据包来枚举各自支持的扩展功能,而关于支持扩展的消息就是通过Bencoded字典来发送的,如果字典是恶意字典,那么客户端在解析Bencoded字典时就会触发漏洞CVE-2020-8437。

2. Torrent文件利用

.torrent种子文件封装了客户端开始下载torrent所需的最基本信息,这些文件在torrent网站上公开共享,任何人都可以直接下载,然后使用torrent客户端来打开,因此这些文件都有可能成为触发漏洞CVE-2020-8437的工具。一个.torrent文件相当于是一个以文件格式保存的Bencoded字典,因此我们只需要将一个恶意Bencoded字典保存为一个.torrent文件,就可以实现攻击向量的创建了。

漏洞利用代码:【点我获取

漏洞利用演示视频

视频地址:【点我观看

缓解方案

根据该漏洞的严重性情况,建议广大用户尽快将uTorrent客户端程序升级至最新版本!

 

责任编辑:赵宁宁 来源: FreeBuf
相关推荐

2016-09-29 14:37:39

ImageMagick漏洞分析

2017-08-22 13:45:27

2020-12-29 10:57:28

恶意软件漏洞远程桌面协议

2009-07-06 17:47:44

2010-07-06 15:43:04

UDP协议

2017-01-16 09:26:07

2010-07-21 15:27:51

2013-03-22 10:00:14

2020-10-14 09:44:52

漏洞

2010-08-03 11:08:57

2009-06-02 11:14:03

2010-06-13 17:51:16

SET应用层协议

2010-06-09 10:28:20

2010-09-27 13:25:58

TCP IP协议栈

2015-03-13 19:15:06

2020-10-08 13:44:27

漏洞

2016-04-29 10:58:13

2014-08-27 16:22:19

2019-04-02 08:30:03

2019-02-26 15:15:16

DNS漏洞IP
点赞
收藏

51CTO技术栈公众号