CVE-2020-0796 Scanner Walkthrough

 

昨天群里看到这个漏洞的信息,随手搜了下, 发现这可是比肩 eternalblud(永恒之蓝) 的漏洞,于是决定研究研究,无奈不会调试Windows内核,为了等各路大佬的漏洞分析文章发布以后能更好的理解,只能抓抓包,多了解 SMB 协议了.

还了解到此漏洞只在最新版 Windows 存在,于是,开了两台 Windows10 1909 的虚拟机,打开网络共享访问,随便共享了一个文件夹,开始抓包分析,参考微软公布的SMB协议的官方文档写了一个检测 SMB 协议是否支持压缩的脚本.

代码写的比较渣,原本不想发出的,但也是参考了别人的代码写出来的,说不定我的代码也会启发别人

import socket
import binascii
import sys

payload = binascii.unhexlify('000000c8fe534d42400000000000000000001f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024000500010000007f0000000000000000000000000000000000000070000000030000000202100200030203110300000100260000000000010020000100000000000000000000000000000000000000000000000000000000000000000000000200060000000000020002000100000003000e000000000003000000000000000200030001000000'.encode())


#       Value         Meaning
# NONE 0x0000         No compression
# LZNT1 0x0001        LZNT1 compression algorithm
# LZ77 0x0002         LZ77 compression algorithm
# LZ77+Huffman 0x0003 LZ77+Huffman compression algorithm

try:
    sock = socket.socket(socket.AF_INET)
    sock.settimeout(3)
    sock.connect(( sys.argv[1],  445 ))
    sock.send(payload)
    response = sock.recv(2020)
    sock.close()
    # Detect support SMB version 
    # 1103 -> 3.1.1
    if binascii.hexlify(response)[144:148].startswith('1103'): 
        print(sys.argv[1] + " support SMB protocol version 3.1.1")
    # See above Value:Meaning comment
    if binascii.hexlify(response)[-36:].startswith('03'):
        if response[-2:] == b'\x01\x00':
            exit(sys.argv[1] + "\tVulnerable!!!\tTarget support LZNT1 compression algorithm")
        if response[-2:] == b'\x02\x00':
            exit(sys.argv[1] + "\tVulnerable!!!\tTarget support LZ77 compression algorithm")
        if response[-2:] == b'\x03\x00':
            exit(sys.argv[1] + "\tVulnerable!!!\tTarget support LZ77+Huffman compression algorithm")
except Exception as identifier:
    exit(sys.argv[1] + " " + str(identifier))

exit(sys.argv[1] + "[*] Not vulnerable.")

代码中的 payload 字符串是基于虚拟机A访问虚拟机 B 共享时Wireshark抓取修改的

以上的代码主要做了 2 件事:

  1. 发送包含客户端支持压缩算法和支持的SMB协议版本的 SMB negotiate request(协商请求)
  2. 从响应中判断支持的版本是否是 SMB 3.1.1 ,判断是否支持压缩并输出支持的压缩算法