./CVE-2020-0796.py servername
该脚本连接到目标主机,并在转换头中设置一个错误的偏移字段,压缩认证请求,导致解压器缓冲区溢出并使目标崩溃。
这是对优秀项目 smbprotocol 的修改,添加了对 SMB 3.1.1 压缩/解压(仅限 LZNT1)的支持。大部分新增代码在 smbprotocol/connection.py 中。包含了一个 lznt1 的版本,经过修改以支持 Python 3。
压缩转换头位于 SMB2CompressionTransformHeader 类中。函数 _compress 被调用来压缩树请求。这里将偏移字段设为最大值以触发崩溃。
def _compress(self, b_data, session):
header = SMB2CompressionTransformHeader()
header['original_size'] = len(b_data)
header['offset'] = 4294967295
header['data'] = smbprotocol.lznt1.compress(b_data)
CVE-2020-0796 是 Windows 10 1903/1909 新 SMB3 压缩功能中的一个漏洞。SMB 协议版本 3.1.1 引入了客户端或服务器通告压缩能力并选择性地压缩 SMB3 消息以提高效率的能力。为此,在协商 SMB 会话时,客户端和服务器都必须包含 SMB2_COMPRESSION_CAPABILITIES,如 MS-SMB2 2.2.3.1.3 所述。
一旦通过此能力协商会话,客户端或服务器就可以选择性地压缩某些 SMB 消息。为此,整个 SMB 数据包被压缩,并在前面添加一个转换头,如 MS-SMB2 2.2.42 所述。该头是一个小型(16 字节)结构,包含一个魔数、未压缩数据大小、使用的压缩算法以及一个偏移值。
CVE-2020-0796 是由该偏移大小缺乏边界检查引起的,该偏移被直接传递给多个子程序。传入大值将导致缓冲区溢出,并使内核崩溃。通过进一步工作,这可以发展为 RCE 漏洞利用。