From 6caf1fce54dbc2631b52899393f3485443f57bcd Mon Sep 17 00:00:00 2001 From: knightmare Date: Thu, 12 Mar 2020 09:52:16 +0000 Subject: [PATCH 1/3] Rename script & add CIDR notation(knightmare/8balla/MinatoTW) --- cve2020-0796.py | 37 +++++++++++++++++++++++++++++++++++++ scanner.py | 19 ------------------- 2 files changed, 37 insertions(+), 19 deletions(-) create mode 100644 cve2020-0796.py delete mode 100644 scanner.py diff --git a/cve2020-0796.py b/cve2020-0796.py new file mode 100644 index 0000000..7ac83c9 --- /dev/null +++ b/cve2020-0796.py @@ -0,0 +1,37 @@ +# Original code: https://github.com/ollypwn/SMBGhost/blob/master +# +# Updated by Knightmare/ 8balla / MinatoTW to support CID masks + +import socket +import struct +import sys +from netaddr import IPNetwork + +subnet = sys.argv[1] + +for ip in IPNetwork(subnet): + + 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 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(3) + try : + sock.connect(( str(ip), 445 )) + sock.send(pkt) + except: + pass +# print("Failed to connect") + sock.close() + continue + nb, = struct.unpack(">I", sock.recv(4)) + res = sock.recv(nb) + sock.close() + if not res[68:70] == b"\x11\x03": + pass + print('%s Not vulnerable' % ip) + elif not res[70:72] == b"\x02\x00": + pass + print('%s Not vulnerable' % ip) + else: + pass + print('%s Vulnerable!' % ip) + sock.close() diff --git a/scanner.py b/scanner.py deleted file mode 100644 index 970164c..0000000 --- a/scanner.py +++ /dev/null @@ -1,19 +0,0 @@ -import socket -import struct -import sys - -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 = socket.socket(socket.AF_INET) -sock.settimeout(3) -sock.connect(( sys.argv[1], 445 )) -sock.send(pkt) - -nb, = struct.unpack(">I", sock.recv(4)) -res = sock.recv(nb) - -if not res[68:70] == b"\x11\x03": - exit("Not vulnerable.") -if not res[70:72] == b"\x02\x00": - exit("Not vulnerable.") - -exit("Vulnerable.") \ No newline at end of file From 566decb02b16d37990910f723a4d3287012e614c Mon Sep 17 00:00:00 2001 From: knightmare Date: Thu, 12 Mar 2020 16:14:50 +0000 Subject: [PATCH 2/3] Rename script & add multi-threading (knightmare/MinatoTW) --- cve2020-0796.py | 67 ++++++++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/cve2020-0796.py b/cve2020-0796.py index 7ac83c9..a151cdf 100644 --- a/cve2020-0796.py +++ b/cve2020-0796.py @@ -1,37 +1,46 @@ # Original code: https://github.com/ollypwn/SMBGhost/blob/master # # Updated by Knightmare/ 8balla / MinatoTW to support CID masks - +# version 2.0 - free threading with every Happy Meal! import socket import struct import sys +import threading from netaddr import IPNetwork - -subnet = sys.argv[1] - -for ip in IPNetwork(subnet): - - 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 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.settimeout(3) - try : - sock.connect(( str(ip), 445 )) - sock.send(pkt) - except: - pass +def checkvuln(ip): + 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 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.settimeout(3) + try : + sock.connect(( str(ip), 445 )) + sock.send(pkt) + except: + pass + sock.close() + return # print("Failed to connect") - sock.close() - continue - nb, = struct.unpack(">I", sock.recv(4)) - res = sock.recv(nb) - sock.close() - if not res[68:70] == b"\x11\x03": - pass - print('%s Not vulnerable' % ip) - elif not res[70:72] == b"\x02\x00": - pass - print('%s Not vulnerable' % ip) - else: - pass - print('%s Vulnerable!' % ip) - sock.close() + sock.close() + nb, = struct.unpack(">I", sock.recv(4)) + res = sock.recv(nb) + sock.close() + if not res[68:70] == b"\x11\x03": + pass + print('%s Not vulnerable' % ip) + elif not res[70:72] == b"\x02\x00": + pass + print('%s Not vulnerable' % ip) + else: + pass + print('%s Vulnerable!' % ip) + sock.close() +if __name__ == "__main__": + ## run the function against all the IPs + subnet = sys.argv[1] + for ip in IPNetwork(subnet): + threads = [] + # Make threads run in parallel + runscan = threading.Thread(target=checkvuln, args=(ip,)) + threads.append(runscan) + runscan.start() + for runscan in threads: + runscan.join() From 7e5882b57e0df197b05614a1e5af4b11ec29fd2a Mon Sep 17 00:00:00 2001 From: knightmare Date: Fri, 13 Mar 2020 09:53:54 +0000 Subject: [PATCH 3/3] Update script iwth command line parameter check, clean up some code (knightmare/MinatoTW) --- cve2020-0796.py | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/cve2020-0796.py b/cve2020-0796.py index a151cdf..2b888d9 100644 --- a/cve2020-0796.py +++ b/cve2020-0796.py @@ -7,8 +7,11 @@ import sys import threading from netaddr import IPNetwork + +# Packet to check vuln +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' + def checkvuln(ip): - 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 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(3) try : @@ -18,29 +21,29 @@ def checkvuln(ip): pass sock.close() return -# print("Failed to connect") - sock.close() nb, = struct.unpack(">I", sock.recv(4)) res = sock.recv(nb) sock.close() if not res[68:70] == b"\x11\x03": - pass print('%s Not vulnerable' % ip) elif not res[70:72] == b"\x02\x00": - pass print('%s Not vulnerable' % ip) else: - pass print('%s Vulnerable!' % ip) sock.close() + if __name__ == "__main__": + ## Check command line parameters are correct + if len(sys.argv) != 2: + print("Usage: python %s subnet" % (sys.argv[0])) + sys.exit() ## run the function against all the IPs - subnet = sys.argv[1] - for ip in IPNetwork(subnet): - threads = [] - # Make threads run in parallel - runscan = threading.Thread(target=checkvuln, args=(ip,)) - threads.append(runscan) - runscan.start() - for runscan in threads: - runscan.join() + subnet = sys.argv[1] + for ip in IPNetwork(subnet): + threads = [] + # Make threads run in parallel + runscan = threading.Thread(target=checkvuln, args=(ip,)) + threads.append(runscan) + runscan.start() + for runscan in threads: + runscan.join()