from multiprocessing import Pool
import os
import socket
from multiprocessing import Pool
import os
import socket
import sys
from netaddr import IPNetwork
import struct

#多进程扫描局域网中存在CVE-2020-0796远程代码执行漏洞的主机

def CVE0796(port):
    try:
        subnet = sys.argv[1]
        for ip in IPNetwork(subnet):
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            sock.settimeout(0.5)
            code = sock.connect_ex((str(ip),port))
            if code == 0:
                pkt = b'\x00\x00\x00\xc0\xfeSMB@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00\x08\x00\x01\x00\x00\x00\x7f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00x\x00\x00\x00\x02\x00\x00\x00\x02\x02\x10\x02"\x02$\x02\x00\x03\x02\x03\x10\x03\x11\x03\x00\x00\x00\x00\x01\x00&\x00\x00\x00\x00\x00\x01\x00 \x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\n\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00'
                sock.send(pkt)
                nb, = struct.unpack(">I", sock.recv(4))
                res = sock.recv(nb)
                KB = os.system('systeminfo | findstr KB4551762')
                if res[68:70] != b"\x11\x03" or res[70:72] != b"\x02\x00" or KB == 0:
                    print("{} Not vulnerable.".format(ip))
                else:
                    print("\033[4m{} 存在CVE-2020-0796远程代码执行漏洞\033[0m".format(ip))
            else:
                print("{}未开启{}端口".format(ip,port))
    except Exception as e:
        print(e)
if __name__ == '__main__':
    #设置进程池
    p = Pool(20)
    for port in range(45,46):
        port = int(port)
        p.apply_async(CVE0796,args=(port,))
    p.close()
    p.join()
