diff --git a/libs/scanner.py b/libs/scanner.py index ca8219a..bf8f430 100644 --- a/libs/scanner.py +++ b/libs/scanner.py @@ -1,68 +1,155 @@ import subprocess +import requests import random +import importlib import socket import struct +import re from threading import Thread import src.utils as utils +import libs.scanutils as scanutils + +import libs.scanners.tcpScanner as tcpScanner +import libs.scanners.udpScanner as udpScanner + +portScanners = [] +tasks = [] + +for script in utils.listSubdirs(utils.getRoot("libs/scanners/")): + if not script.endswith(".py"): continue + if script == "tcpScanner.py": continue + if script == "udpScanner.py": continue + + spec = importlib.util.spec_from_file_location(script, utils.getRoot(f'libs/scanners/{script}')) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + portScanners.append(module) + + print(f'Imported: {utils.getRoot(f"libs/scanners/{module.__name__}")}') + + + +def getScanner(port: int, protocol: str): + for scanner in portScanners: + if str(scanner.__name__) == f'{port}.{protocol}.py': + return scanner + if protocol == "tcp": + return tcpScanner + elif protocol == "udp": + return udpScanner + else: + raise Exception("This should not happen...") + -threads = [] def start(settings): - global threads + global tasks + + if processStarted(): return + + print("\n\nStarted Scanner!") utils.makeDir("data/scans") + portString = "" + + match settings['udpSettings']['mode']: + case -1: + pass + case 1: + portString += "U:" + ",".join(map(str, settings['udpSettings']['ports'])) + case 2: + portString += "U:" + ",".join(map(str, scanutils.getMostCommon('udp', settings['udpSettings']['topCount']))) + case 3: + portString += "U:" + ",".join(map(str, scanutils.portsRelatedTo('udp', settings['udpSettings']['relatedString']))) + + if settings['tcpSettings']['mode'] != -1 and settings['udpSettings']['mode'] != -1: + portString += "," + + match settings['tcpSettings']['mode']: + case -1: + pass + case 1: + portString += "T:" + ",".join(map(str, settings['tcpSettings']['ports'])) + case 2: + portString += "T:" + ",".join(map(str, scanutils.getMostCommon('tcp', settings['tcpSettings']['topCount']))) + case 3: + portString += "T:" + ",".join(map(str, scanutils.portsRelatedTo('tcp', settings['tcpSettings']['relatedString']))) + for i in range(0,settings['numJobs']): - c = ScanTask() - t = Thread(target = c.run, args=(settings['maxPingTimeout'],)) + c = ScanTask(i) + t = Thread(target = c.run, args=(settings['maxPingTimeout'],portString,)) t.start() - -# def getStdout(): -# global process -# return subprocess.check_output(process).decode() - # return "eee" + process.stdout.readline() + tasks.append(c) def stop(): - global threads - for thread in threads: - thread.stop() - threads = [] + global tasks + for task in tasks: + task.stop() + tasks = [] print("\n\nstopped Scanner!") def processStarted(): - global threads - return len(threads) != 0; + global tasks + return len(tasks) != 0; +def parseNmapResult(result: str, address: str): + return + + + ports = scanutils.getPorts(result) + hostname = scanutils.getHostname(result) + resultstr = f'### {address} ({hostname}) {ports}\n' + + # resultstr += f'Location: {scanutils.geolocation(address)}\n' + + for port in ports: + if port[1] != 'open': + continue + # resultstr += str(port) + '\n' + + portInt = int(port[0].split("/")[0]) + protocol = port[0].split("/")[1] + scanner = getScanner(portInt, protocol) + + resultstr += f'[{scanner.__name__}]\n' + resultstr += scanner.scan(address, portInt) + "\n" + + # print(resultstr) class ScanTask: - def __init__(self): + def __init__(self, threadid: int): + self.threadid = threadid self.running = True def stop(self): self.running = False - def run(self, maxPingTimeout): - while True: + def run(self, maxPingTimeout: int, portString: str): + while self.running: address = socket.inet_ntoa(struct.pack('>I', random.randint(1, 0xffffffff))) pingCommand = f"ping {address} -c 1 -W {maxPingTimeout}" try: subprocess.check_output(pingCommand.split(" ")) - # print(f"{address}: FOUND") + # print(f"{self.threadid} {address}: FOUND") except subprocess.CalledProcessError: - # print(f"{address}: FAIL") + # print(f"{self.threadid} {address}: FAIL") continue - - nmapCommand = f"sudo nmap {address} -O --send-eth --privileged -v -sS" + + + nmapCommand = f"sudo nmap {address} -O --send-eth --privileged -v -sS --reason -sU -p {portString}" + try: - print(subprocess.check_output(nmapCommand.split(" ")).decode()) + parseNmapResult(subprocess.check_output(nmapCommand.split(" ")).decode(), address) except subprocess.CalledProcessError: - continue \ No newline at end of file + continue + \ No newline at end of file diff --git a/libs/scanners/443.tcp.py b/libs/scanners/443.tcp.py new file mode 100644 index 0000000..3a656a1 --- /dev/null +++ b/libs/scanners/443.tcp.py @@ -0,0 +1,119 @@ +import random +import datetime +import socket +import ssl +import OpenSSL + +from faker import Faker + + +def generate_headers(): + fake = Faker() + return "\r\n".join([ + f"User-Agent: {fake.user_agent()}", + f"Accept: {fake.mime_type()}", + f"Accept-Language: {fake.language_code()},{fake.language_code()};q=0.9", + f"Accept-Encoding: {fake.mime_type()}, {fake.mime_type()}, {fake.mime_type()}", + f"Referer: {fake.url()}", + f"Connection: {random.choice(['keep-alive', 'close'])}", + f"Cache-Control: {random.choice(['no-cache', 'max-age=0'])}", + f"Pragma: {random.choice(['no-cache', ''])}", + ]) + "\r\n\r\n" + + + +def get_ssl_cert_info(cert_data): + if not cert_data: + return "" + + cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_ASN1, cert_data) + + string = "Certificate Information:\n" + string += "------------------------\n" + + string += "Subject:\n" + subject = cert.get_subject() + string += f" Common Name (CN): {subject.CN}\n" + string += f" Organization (O): {subject.O}\n" + string += f" Organizational Unit (OU): {subject.OU}\n" + string += f" Country (C): {subject.C}\n" + string += f" State/Province (ST): {subject.ST}\n" + string += f" Locality (L): {subject.L}\n" + + string += "\nIssuer:\n" + issuer = cert.get_issuer() + string += f" Common Name (CN): {issuer.CN}\n" + string += f" Organization (O): {issuer.O}\n" + string += f" Organizational Unit (OU): {issuer.OU}\n" + string += f" Country (C): {issuer.C}\n" + string += f" State/Province (ST): {issuer.ST}\n" + string += f" Locality (L): {issuer.L}\n" + + string += f"\nVersion: {cert.get_version() + 1}" + string += f"Serial Number: {cert.get_serial_number()}" + + not_before = datetime.datetime.strptime(cert.get_notBefore().decode('ascii'), '%Y%m%d%H%M%SZ') + not_after = datetime.datetime.strptime(cert.get_notAfter().decode('ascii'), '%Y%m%d%H%M%SZ') + string += f"Not Before: {not_before}\n" + string += f"Not After: {not_after}\n" + + string += f"Expired: {cert.has_expired()}\n" + + string += "\nExtensions:\n" + for i in range(cert.get_extension_count()): + ext = cert.get_extension(i) + string += f" {ext.get_short_name().decode('utf-8')}: {ext}\n" + + string += "\nSignature Algorithm:\n" + string += f" {cert.get_signature_algorithm().decode('utf-8')}\n" + + string += "\nPublic Key:\n" + public_key = cert.get_pubkey() + string += f" Algorithm: {public_key.type()}\n" + string += f" Bits: {public_key.bits()}\n" + + return string + + + +context = ssl.create_default_context() +# context = ssl.SSLContext(ssl.PROTOCOL_TLS) +context.check_hostname = False +context.verify_mode = ssl.CERT_NONE + +def scan(address:str, port:str): + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + # Wrap the socket with SSL/TLS + ssl_sock = context.wrap_socket(sock, server_hostname=address) + + returnVal = "" + + try: + # Connect to the server + ssl_sock.connect((address, port)) + + ssl_sock.sendall(generate_headers().encode()) + + cert = ssl_sock.getpeercert(binary_form=True) + # Receive the response + response = b"" + while True: + + chunk = ssl_sock.recv(64) + if not chunk: break + + response += chunk + + returnVal = f"Response {response.decode()}" + "\n" + + returnVal += "SSL Certificate Information:\n" + returnVal += get_ssl_cert_info(cert) + "\n" + returnVal += "######### \n" + + except socket.error as e: + returnVal = f" (possible connection reset) {e}" + finally: + if ssl_sock: + ssl_sock.close() + return returnVal \ No newline at end of file diff --git a/libs/scanners/80.tcp.py b/libs/scanners/80.tcp.py new file mode 100644 index 0000000..0fa55f1 --- /dev/null +++ b/libs/scanners/80.tcp.py @@ -0,0 +1,48 @@ +import random +import socket +from faker import Faker + +def generate_headers(): + fake = Faker() + return [ + f"User-Agent: {fake.user_agent()}", + f"Accept: {fake.mime_type()}", + f"Accept-Language: {fake.language_code()},{fake.language_code()};q=0.9", + f"Accept-Encoding: {fake.mime_type()}, {fake.mime_type()}, {fake.mime_type()}", + f"Referer: {fake.url()}", + f"Connection: {random.choice(['keep-alive', 'close'])}", + f"Cache-Control: {random.choice(['no-cache', 'max-age=0'])}", + f"Pragma: {random.choice(['no-cache', ''])}", + ] + +def scan(host:str, port:int): + returnVal = "" + try: + client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + client_socket.connect((host, port)) + headers = generate_headers() + request = "GET / HTTP/1.1\r\n" + request += "Host: " + host + "\r\n" + request += "\r\n".join(headers) + request += "\r\n\r\n" + + client_socket.send(request.encode()) + + response = b"" + while True: + + chunk = client_socket.recv(64) + + if not chunk: break + + response += chunk + + returnVal = "Response: " + response.decode() + + except: + returnVal = " (possible connection reset)" + finally: + if client_socket: + client_socket.close() + + return returnVal \ No newline at end of file diff --git a/libs/scanners/tcpScanner.py b/libs/scanners/tcpScanner.py new file mode 100644 index 0000000..2723ef1 --- /dev/null +++ b/libs/scanners/tcpScanner.py @@ -0,0 +1,34 @@ +import socket +import time + +def scan(address:str, port:int, timeout:int=5): + returnVal = "" + + client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + try: + client_socket.connect((address, port)) + client_socket.settimeout(timeout) + start_time = time.time() + + outBytes = b'' + + while time.time() - start_time < timeout: + try: + + data = client_socket.recv(64) + if not data: break + outBytes += data + + except socket.timeout: + break + + returnVal = f'({address}:{port}) Recieved: {outBytes.decode()}' + + except socket.error as e: + print(f"Error: {e}") + returnVal = f'({address}:{port}) Recieved: ' + finally: + client_socket.close() + + return returnVal \ No newline at end of file diff --git a/libs/scanners/udpScanner.py b/libs/scanners/udpScanner.py new file mode 100644 index 0000000..ece49d9 --- /dev/null +++ b/libs/scanners/udpScanner.py @@ -0,0 +1,2 @@ +def scan(address:str, port:int): + return f'<{address}:{port}>' \ No newline at end of file diff --git a/libs/scanutils.py b/libs/scanutils.py index d58d9fa..f852446 100644 --- a/libs/scanutils.py +++ b/libs/scanutils.py @@ -1,4 +1,9 @@ +import subprocess +import requests import src.utils as utils +import os +import re +import geoip2.database def countScannedIps(): files = utils.listSubdirs("data/") @@ -9,4 +14,155 @@ def countScannedIps(): with open('data/'+file) as f: #Count lines in scan files, Masscan has a 2 line header, so hence -2 count += sum(1 for _ in f)-2 - return count \ No newline at end of file + return count + +def getMostCommon(protocol: str, n: int): + nmap_services_file = "/usr/share/nmap/nmap-services" + + if not os.path.exists(nmap_services_file): + print(f"Error: {nmap_services_file} not found.") + return [] + + ports = [] + with open(nmap_services_file, "r") as file: + for line in file: + if line.startswith("#"): + continue + + fields = line.split() + if len(fields) >= 3: + port_info = fields[1] + port, proto = port_info.split("/") + frequency = float(fields[2]) + + if proto.lower() == protocol.lower(): + ports.append((int(port), frequency)) + + most_common_ports = sorted(ports, key=lambda x: x[1], reverse=True)[:n] + return [port[0] for port in most_common_ports] + + + + +def portsRelatedTo(protocol: str, search_string: str): + nmap_services_file = "/usr/share/nmap/nmap-services" + + if not os.path.exists(nmap_services_file): + print(f"Error: {nmap_services_file} not found.") + return [] + + ports = [] + with open(nmap_services_file, "r") as file: + for line in file: + if line.startswith("#"): + continue + + fields = line.split("#") + port_info = fields[0].strip() + description = fields[1].strip() if len(fields) >= 2 else "" + + port_fields = port_info.split() + if len(port_fields) >= 2: + port, proto = port_fields[1].split("/") + service_name = port_fields[0] + + if ( + proto.lower() == protocol.lower() and + (search_string.lower() in description.lower() or search_string.lower() in service_name.lower()) + ): + ports.append(int(port)) + + return ports + + +def getPorts(nmapResult: str): + lines = nmapResult.split("\n") + + row_pattern = re.compile(r'\d+/(tcp|udp)\s+\S+') + + portInfo = [] + + for line in lines: + if row_pattern.match(line): + columns = line.split(None, 3) + if len(columns) == 4: + portInfo.append(columns) + + return portInfo + + + +def getHostname(nmapResult: str): + hostnamePattern = re.compile(r"Nmap scan report for ([\w.-]+)\s+\(([\d.]+)\)") + hostnameList = hostnamePattern.findall(nmapResult) + return hostnameList[0][0] if len(hostnameList) != 0 else "" + + + +# Download geolocation databases +utils.makeDir(utils.getRoot("data")) + +CITY_DB_PATH = utils.getRoot("data/GeoLite2-City.mmdb") +if not utils.pathExists(CITY_DB_PATH): + print("Downloading GeoLite2-City.mmdb database...") + open(CITY_DB_PATH, 'wb').write( + requests.get("https://github.com/P3TERX/GeoLite.mmdb/releases/download/2024.04.16/GeoLite2-City.mmdb").content + ) + +COUNTRY_DB_PATH = utils.getRoot("data/GeoLite2-Country.mmdb") +if not utils.pathExists(COUNTRY_DB_PATH): + print("Downloading GeoLite2-Country.mmdb database...") + open(COUNTRY_DB_PATH, 'wb').write( + requests.get("https://github.com/P3TERX/GeoLite.mmdb/releases/download/2024.04.16/GeoLite2-Country.mmdb").content + ) + +ASN_DB_PATH = utils.getRoot("data/GeoLite2-ASN.mmdb") +if not utils.pathExists(ASN_DB_PATH): + print("Downloading GeoLite2-ASN.mmdb database...") + open(ASN_DB_PATH, 'wb').write( + requests.get("https://github.com/P3TERX/GeoLite.mmdb/releases/download/2024.04.16/GeoLite2-ASN.mmdb").content + ) + + + +def geolocation(ip_address): + try: + # Attempt to retrieve city-level information + with geoip2.database.Reader(CITY_DB_PATH) as reader: + response = reader.city(ip_address) + return { + 'ip': ip_address, + 'city': response.city.name, + 'subdivision': response.subdivisions.most_specific.name, + 'country': response.country.name, + 'continent': response.continent.name, + 'latitude': response.location.latitude, + 'longitude': response.location.longitude, + 'postal_code': response.postal.code, + 'time_zone': response.location.time_zone + } + except geoip2.errors.AddressNotFoundError: + try: + # Attempt to retrieve country-level information + with geoip2.database.Reader(COUNTRY_DB_PATH) as reader: + response = reader.country(ip_address) + return { + 'ip': ip_address, + 'country': response.country.name, + 'continent': response.continent.name + } + except geoip2.errors.AddressNotFoundError: + try: + # Attempt to retrieve ASN information + with geoip2.database.Reader(ASN_DB_PATH) as reader: + response = reader.asn(ip_address) + return { + 'ip': ip_address, + 'asn': response.autonomous_system_number, + 'org': response.autonomous_system_organization + } + except geoip2.errors.AddressNotFoundError: + return { + 'ip': ip_address, + 'error': 'No geolocation data found' + } diff --git a/libs/test.py b/libs/test.py deleted file mode 100644 index da9a064..0000000 --- a/libs/test.py +++ /dev/null @@ -1,45 +0,0 @@ -import subprocess -import random -import socket -import struct -from threading import Thread - -maxPingTimeout = 3 - -class ScanTask: - def __init__(self): - self.running = True - - def terminate(self): - self.running = False - - def run(self): - while True: - address = socket.inet_ntoa(struct.pack('>I', random.randint(1, 0xffffffff))) - - pingCommand = f"ping {address} -c 1 -W {maxPingTimeout}" - - try: - subprocess.check_output(pingCommand.split(" ")) - # print(f"{address}: FOUND") - except subprocess.CalledProcessError: - # print(f"{address}: FAIL") - continue - - nmapCommand = f"sudo nmap {address} -O --send-eth --privileged -v -sS" - - try: - print(subprocess.check_output(nmapCommand.split(" ")).decode()) - except subprocess.CalledProcessError: - continue - -threads = [] - -for i in range(0,500): - c = ScanTask() - t = Thread(target = c.run) - t.start() - # threads.push(c) - -for thread in threads: - thread.join() \ No newline at end of file diff --git a/modules/scan/main.py b/modules/scan/main.py index 15e6134..604c9a5 100755 --- a/modules/scan/main.py +++ b/modules/scan/main.py @@ -27,9 +27,29 @@ def init(moduleMaster): mm.vars['Scanner-Settings'] = { "range": [[0,0,0,0], [255,255,255,255]], - "numJobs": 50, - "maxPingTimeout": 3, - "output": "./data/scan.txt" + "numJobs": 500, + "maxPingTimeout": 1, + + # Port modes: + # -1: Disable + # 1: Specify Ports + # 2: Top N most common ports + # 3: Related to word + + "tcpSettings": { + "mode": 1, + "ports": [443] + # "topCount": 100 + # "relatedString": "http" + }, + "udpSettings": { + "mode": -1, + # "ports": [631, 161, 137, 123, 138] + "topCount": 50 + # "relatedString": "telnet" + }, + "runTCP": True, + "runUDP": False } mm.addPageEventListener('Scanner-LoadSettings', loadSettings) diff --git a/paused.conf b/paused.conf deleted file mode 100644 index 62b2b0c..0000000 --- a/paused.conf +++ /dev/null @@ -1,150 +0,0 @@ - -# resume information -resume-index = 275723 -seed = 11690600974265531384 -rate = 1000 -shard = 1/1 -nocapture = servername - -output-filename = ./data/scan-1713225964108.txt -output-format = grepable - -adapter-ip = 192.168.0.241 -# TARGET SELECTION (IP, PORTS, EXCLUDES) -ports = 1,3-4,6-7,9,13,17,19-26,30,32-33,37,42-43,49,53,70,79-85,88-90,99-100,106,109-111,113,119,125,135,139,143-144,146,161,163,179,199,211-212,222,254-256,259,264,280,301,306,311,340,366,389,406-407,416-417,425,427,443-445,458,464-465,481,497,500,512-515,524,541,543-545,548,554-555,563,587,593,616-617,625,631,636,646,648,666-668,683,687,691,700,705,711,714,720,722,726,749,765,777,783,787,800-801,808,843,873,880,888,898,900-903,911-912,981,987,990,992-993,995,999-1002,1007,1009-1011,1021-1100,1102,1104-1108,1110-1114,1117,1119,1121-1124,1126,1130-1132,1137-1138,1141,1145,1147-1149,1151-1152,1154,1163-1166,1169,1174-1175,1183,1185-1187,1192,1198-1199,1201,1213,1216-1218,1233-1234,1236,1244,1247-1248,1259,1271-1272,1277,1287,1296,1300-1301,1309-1311,1322,1328,1334,1352,1417,1433-1434,1443,1455,1461,1494,1500-1501,1503,1521,1524,1533,1556,1580,1583,1594,1600,1641,1658,1666,1687-1688,1700,1717-1721,1723,1755,1761,1782-1783,1801,1805,1812,1839-1840,1862-1864,1875,1900,1914,1935,1947,1971-1972,1974,1984,1998-2010,2013,2020-2022,2030,2033-2035,2038,2040-2043,2045-2049,2065,2068,2099-2100,2103,2105-2107,2111,2119,2121,2126,2135,2144,2160-2161,2170,2179,2190-2191,2196,2200,2222,2251,2260,2288,2301,2323,2366,2381-2383,2393-2394,2399,2401,2492,2500,2522,2525,2557,2601-2602,2604-2605,2607-2608,2638,2701-2702,2710,2717-2718,2725,2800,2809,2811,2869,2875,2909-2910,2920,2967-2968,2998,3000-3001,3003,3005-3007,3011,3013,3017,3030-3031,3052,3071,3077,3128,3168,3211,3221,3260-3261,3268-3269,3283,3300-3301,3306,3322-3325,3333,3351,3367,3369-3372,3389-3390,3404,3476,3493,3517,3527,3546,3551,3580,3659,3689-3690,3703,3737,3766,3784,3800-3801,3809,3814,3826-3828,3851,3869,3871,3878,3880,3889,3905,3914,3918,3920,3945,3971,3986,3995,3998,4000-4006,4045,4111,4125-4126,4129,4224,4242,4279,4321,4343,4443-4446,4449,4550,4567,4662,4848,4899-4900,4998,5000-5004,5009,5030,5033,5050-5051,5054,5060-5061,5080,5087,5100-5102,5120,5190,5200,5214,5221-5222,5225-5226,5269,5280,5298,5357,5405,5414,5431-5432,5440,5500,5510,5544,5550,5555,5560,5566,5631,5633,5666,5678-5679,5718,5730,5800-5802,5810-5811,5815,5822,5825,5850,5859,5862,5877,5900-5904,5906-5907,5910-5911,5915,5922,5925,5950,5952,5959-5963,5987-5989,5998-6007,6009,6025,6059,6100-6101,6106,6112,6123,6129,6156,6346,6389,6502,6510,6543,6547,6565-6567,6580,6646,6666-6669,6689,6692,6699,6779,6788-6789,6792,6839,6881,6901,6969,7000-7002,7004,7007,7019,7025,7070,7100,7103,7106,7200-7201,7402,7435,7443,7496,7512,7625,7627,7676,7741,7777-7778,7800,7911,7920-7921,7937-7938,7999-8002,8007-8011,8021-8022,8031,8042,8045,8080-8090,8093,8099-8100,8180-8181,8192-8194,8200,8222,8254,8290-8292,8300,8333,8383,8400,8402,8443,8500,8600,8649,8651-8652,8654,8701,8800,8873,8888,8899,8994,9000-9003,9009-9011,9040,9050,9071,9080-9081,9090-9091,9099-9103,9110-9111,9200,9207,9220,9290,9415,9418,9485,9500,9502-9503,9535,9575,9593-9595,9618,9666,9876-9878,9898,9900,9917,9929,9943-9944,9968,9998-10004,10009-10010,10012,10024-10025,10082,10180,10215,10243,10566,10616-10617,10621,10626,10628-10629,10778,11110-11111,11967,12000,12174,12265,12345,13456,13722,13782-13783,14000,14238,14441-14442,15000,15002-15004,15660,15742,16000-16001,16012,16016,16018,16080,16113,16992-16993,17877,17988,18040,18101,18988,19101,19283,19315,19350,19780,19801,19842,20000,20005,20031,20221-20222,20828,21571,22939,23502,24444,24800,25734-25735,26214,27000,27352-27353,27355-27356,27715,28201,30000,30718,30951,31038,31337,32768-32785,33354,33899,34571-34573,35500,38292,40193,40911,41511,42510,44176,44442-44443,44501,45100,48080,49152-49161,49163,49165,49167,49175-49176,49400,49999-50003,50006,50300,50389,50500,50636,50800,51103,51493,52673,52822,52848,52869,54045,54328,55055-55056,55555,55600,56737-56738,57294,57797,58080,60020,60443,61532,61900,62078,63331,64623,64680,65000,65129,65389 -range = 1.0.0.0-4.53.200.255 -range = 4.53.202.0-5.152.178.255 -range = 5.152.180.0-5.255.255.255 -range = 7.0.0.0-8.12.161.255 -range = 8.12.165.0-8.14.83.255 -range = 8.14.88.0-8.14.144.255 -range = 8.14.148.0-8.17.249.255 -range = 8.17.253.0-9.255.255.255 -range = 11.0.0.0-20.255.255.255 -range = 23.0.0.0-23.26.255.255 -range = 23.28.0.0-23.231.127.255 -range = 23.232.0.0-23.255.255.255 -range = 24.16.0.0-24.87.255.255 -range = 24.89.0.0-24.111.255.255 -range = 24.112.128.0-24.131.255.255 -range = 24.132.3.0-24.187.255.255 -range = 24.192.0.0-37.72.171.255 -range = 37.72.174.0-38.72.199.255 -range = 38.72.204.0-50.93.191.255 -range = 50.93.198.0-50.115.127.255 -range = 50.115.144.0-50.116.255.255 -range = 50.117.128.0-50.118.127.255 -range = 50.119.0.0-63.141.221.255 -range = 63.141.223.0-64.62.252.255 -range = 64.62.254.0-64.92.95.255 -range = 64.92.128.0-64.145.78.255 -range = 64.145.80.0/23 -range = 64.145.84.0-64.158.145.255 -range = 64.158.148.0-65.49.23.255 -range = 65.49.25.0-65.49.92.255 -range = 65.49.94.0-65.162.191.255 -range = 65.162.196.0-66.79.159.255 -range = 66.79.192.0-66.160.190.255 -range = 66.160.192.0-68.68.95.255 -range = 68.68.112.0-69.46.63.255 -range = 69.46.96.0-69.176.79.255 -range = 69.176.96.0-72.13.79.255 -range = 72.13.96.0-72.52.75.255 -range = 72.52.77.0-74.82.42.255 -range = 74.82.44.0-74.82.159.255 -range = 74.82.192.0-74.114.87.255 -range = 74.114.92.0-74.114.255.255 -range = 74.115.1.0/24 -range = 74.115.3.0/24 -range = 74.115.5.0-74.122.99.255 -range = 74.122.104.0-75.126.255.255 -range = 75.127.1.0-100.63.255.255 -range = 100.128.0.0-103.251.90.255 -range = 103.251.92.0-108.171.31.255 -range = 108.171.33.0-108.171.41.255 -range = 108.171.43.0-108.171.51.255 -range = 108.171.53.0-108.171.61.255 -range = 108.171.63.0-118.193.77.255 -range = 118.193.80.0-126.255.255.255 -range = 128.0.0.0-130.93.15.255 -range = 130.93.18.0-131.214.255.255 -range = 131.216.0.0-134.3.255.255 -range = 134.5.0.0-135.255.255.255 -range = 136.1.0.0-142.110.255.255 -range = 142.112.0.0-142.251.255.255 -range = 142.253.0.0-146.82.55.92 -range = 146.82.55.94-149.54.135.255 -range = 149.54.144.0/21 -range = 149.54.160.0-153.10.255.255 -range = 153.12.0.0-165.159.255.255 -range = 165.161.0.0-166.87.255.255 -range = 166.89.0.0-169.253.255.255 -range = 169.255.0.0-172.15.255.255 -range = 172.32.0.0-172.251.255.255 -range = 172.253.0.0-173.245.63.255 -range = 173.245.96.0-173.245.193.255 -range = 173.245.196.0-173.245.219.255 -range = 173.245.224.0-173.252.191.255 -range = 173.253.0.0-178.18.15.255 -range = 178.18.20.0-178.18.25.255 -range = 178.18.30.0-183.182.21.255 -range = 183.182.23.0-191.255.255.255 -range = 192.0.1.0/24 -range = 192.0.3.0-192.12.18.255 -range = 192.12.20.0-192.31.42.255 -range = 192.31.44.0-192.41.207.255 -range = 192.41.209.0-192.43.242.255 -range = 192.43.244.0-192.54.248.255 -range = 192.54.250.0-192.88.98.255 -range = 192.88.100.0-192.92.113.255 -range = 192.92.115.0-192.155.159.255 -range = 192.155.192.0-192.167.255.255 -range = 192.169.0.0-192.176.255.255 -range = 192.178.0.0-192.185.255.255 -range = 192.186.64.0-192.249.63.255 -range = 192.249.80.0-192.250.239.255 -range = 192.251.0.0-194.77.40.241 -range = 194.77.40.243-194.77.40.245 -range = 194.77.40.247-194.110.213.255 -range = 194.110.215.0-198.12.119.255 -range = 198.12.123.0-198.17.255.255 -range = 198.20.0.0-198.51.99.255 -range = 198.51.101.0-198.144.239.255 -range = 198.145.0.0-199.33.119.255 -range = 199.33.121.0-199.33.123.255 -range = 199.33.128.0-199.48.146.255 -range = 199.48.148.0-199.68.195.255 -range = 199.68.200.0-199.127.239.255 -range = 199.127.248.0-199.187.167.255 -range = 199.187.172.0-199.188.237.255 -range = 199.188.240.0-199.255.207.255 -range = 199.255.209.0-203.0.112.255 -range = 203.0.114.0-203.12.5.255 -range = 203.12.7.0-204.13.63.255 -range = 204.13.72.0-204.16.191.255 -range = 204.16.200.0-204.19.237.255 -range = 204.19.239.0-204.74.207.255 -range = 204.74.224.0-205.159.188.255 -range = 205.159.190.0-205.163.255.255 -range = 205.164.64.0-205.209.127.255 -range = 205.209.192.0-206.108.51.255 -range = 206.108.54.0-206.165.3.255 -range = 206.165.5.0-208.77.39.255 -range = 208.77.48.0-208.80.3.255 -range = 208.80.8.0-208.123.222.255 -range = 208.123.224.0-209.51.184.255 -range = 209.51.186.0-209.54.47.255 -range = 209.54.64.0-209.107.191.255 -range = 209.107.194.0-209.107.209.255 -range = 209.107.211.0/24 -range = 209.107.213.0-211.156.109.255 -range = 211.156.112.0-216.83.32.255 -range = 216.83.50.0/24 -range = 216.83.64.0-216.151.182.255 -range = 216.151.184.0-216.151.189.255 -range = 216.151.192.0-216.172.127.255 -range = 216.172.160.0-216.185.35.255 -range = 216.185.37.0-216.218.232.255 -range = 216.218.234.0-216.224.111.255 -range = 216.224.128.0-239.255.255.255 -