基于协程的CVE-2020-0796检测脚本

前言

在公开的POC基础上利用协程大幅提升了检测速度,方便运维师傅们快速的对内网进行检测。

影响版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Windows 10 Version 1903 for 32-bit Systems

Windows 10 Version 1903 for x64-based Systems

Windows 10 Version 1903 for ARM64-based Systems

Windows Server, Version 1903 (Server Core installation)

Windows 10 Version 1909 for 32-bit Systems

Windows 10 Version 1909 for x64-based Systems

Windows 10 Version 1909 for ARM64-based Systems

Windows Server, Version 1909 (Server Core installation)

修复建议

参考微软的临时解决方案
ADV200005 | Microsoft Guidance for Disabling SMBv3 Compression

使用powershell来禁止SMBv3服务的压缩(无需重启)

1
2
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" DisableCompression -Type DWORD -Value 1 -Force

用法

请使用python3.5及以上的版本运行。
请使用python3.7及以上的版本运行(由于asyncio.run是3.7新增的API,我只考虑到了async\await 是3.5新增的语法)

ip地址处理使用了第三方库 netaddr

1
pip3 install netaddr

如果不想显示连接超时的ip信息,可以把39行换成pass

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import sys
import struct
import asyncio
from netaddr import IPNetwork

pkt = b'\x00\x00\x00\xc0\xfeSMB@\x00\x00\x00\x00\x00' \
b'\x00\x00\x00\x00\x1f\x00\x00\x00\x00\x00\x00' \
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00' \
b'\x08\x00\x01\x00\x00\x00\x7f\x00\x00\x00\x00' \
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \
b'\x00\x00\x00\x00x\x00\x00\x00\x02\x00\x00\x00' \
b'\x02\x02\x10\x02"\x02$\x02\x00\x03\x02\x03\x10' \
b'\x03\x11\x03\x00\x00\x00\x00\x01\x00&\x00\x00' \
b'\x00\x00\x00\x01\x00 \x00\x01\x00\x00\x00\x00' \
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00' \
b'\n\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00' \
b'\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00'

async def connet(ip):
try:
fut = asyncio.open_connection(ip, 445)
reader, writer = await asyncio.wait_for(fut, timeout=3)
writer.write(pkt)
await writer.drain()
size, = struct.unpack(">I", (await reader.read(4)))
ret = await reader.read(size)

if ret[68:70] != b"\x11\x03" or ret[70:72] != b"\x02\x00":
print(f"[-]{ip} Not vulnerable.")
else:
print(f"[*]{ip} Vulnerable!!")

except (asyncio.TimeoutError, ConnectionRefusedError, OSError):
print(f'[-]{ip!r}connection failed.')
except Exception:pass

async def main(ips):
tasks = []
ips = [str(ip) for ip in IPNetwork(ips)]
for ip in ips:
tasks.append(asyncio.create_task(connet(ip)))
await asyncio.wait(tasks)

if __name__ == '__main__':
if len(sys.argv) > 1:
ips = sys.argv[1]
asyncio.run(main(ips))
else:
print('''
Usage : python main.py 10.10.10.10
python main.py 10.10.10.0/24

Info : 使用协程加快了扫描速度
请在python 3.7及以上的版本运行

POC : https://github.com/ollypwn/SMBGhost/blob/master/scanner.py

''')


交个朋友
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

吹吹牛吗?

微信