Add port scanners, better scanning, geo location

This commit is contained in:
Astatin3
2024-04-17 21:46:53 -06:00
parent 65807d0f38
commit 753f9f7742
9 changed files with 494 additions and 223 deletions
+111 -24
View File
@@ -1,68 +1,155 @@
import subprocess import subprocess
import requests
import random import random
import importlib
import socket import socket
import struct import struct
import re
from threading import Thread from threading import Thread
import src.utils as utils 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): def start(settings):
global threads global tasks
if processStarted(): return
print("\n\nStarted Scanner!")
utils.makeDir("data/scans") 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']): for i in range(0,settings['numJobs']):
c = ScanTask() c = ScanTask(i)
t = Thread(target = c.run, args=(settings['maxPingTimeout'],)) t = Thread(target = c.run, args=(settings['maxPingTimeout'],portString,))
t.start() t.start()
tasks.append(c)
# def getStdout():
# global process
# return subprocess.check_output(process).decode()
# return "eee" + process.stdout.readline()
def stop(): def stop():
global threads global tasks
for thread in threads: for task in tasks:
thread.stop() task.stop()
threads = [] tasks = []
print("\n\nstopped Scanner!") print("\n\nstopped Scanner!")
def processStarted(): def processStarted():
global threads global tasks
return len(threads) != 0; 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: class ScanTask:
def __init__(self): def __init__(self, threadid: int):
self.threadid = threadid
self.running = True self.running = True
def stop(self): def stop(self):
self.running = False self.running = False
def run(self, maxPingTimeout): def run(self, maxPingTimeout: int, portString: str):
while True: while self.running:
address = socket.inet_ntoa(struct.pack('>I', random.randint(1, 0xffffffff))) address = socket.inet_ntoa(struct.pack('>I', random.randint(1, 0xffffffff)))
pingCommand = f"ping {address} -c 1 -W {maxPingTimeout}" pingCommand = f"ping {address} -c 1 -W {maxPingTimeout}"
try: try:
subprocess.check_output(pingCommand.split(" ")) subprocess.check_output(pingCommand.split(" "))
# print(f"{address}: FOUND") # print(f"{self.threadid} {address}: FOUND")
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
# print(f"{address}: FAIL") # print(f"{self.threadid} {address}: FAIL")
continue 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: try:
print(subprocess.check_output(nmapCommand.split(" ")).decode()) parseNmapResult(subprocess.check_output(nmapCommand.split(" ")).decode(), address)
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
continue continue
+119
View File
@@ -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"<Error> (possible connection reset) {e}"
finally:
if ssl_sock:
ssl_sock.close()
return returnVal
+48
View File
@@ -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 = "<Error> (possible connection reset)"
finally:
if client_socket:
client_socket.close()
return returnVal
+34
View File
@@ -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: <error>'
finally:
client_socket.close()
return returnVal
+2
View File
@@ -0,0 +1,2 @@
def scan(address:str, port:int):
return f'<{address}:{port}>'
+157 -1
View File
@@ -1,4 +1,9 @@
import subprocess
import requests
import src.utils as utils import src.utils as utils
import os
import re
import geoip2.database
def countScannedIps(): def countScannedIps():
files = utils.listSubdirs("data/") files = utils.listSubdirs("data/")
@@ -9,4 +14,155 @@ def countScannedIps():
with open('data/'+file) as f: with open('data/'+file) as f:
#Count lines in scan files, Masscan has a 2 line header, so hence -2 #Count lines in scan files, Masscan has a 2 line header, so hence -2
count += sum(1 for _ in f)-2 count += sum(1 for _ in f)-2
return count 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'
}
-45
View File
@@ -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()
+23 -3
View File
@@ -27,9 +27,29 @@ def init(moduleMaster):
mm.vars['Scanner-Settings'] = { mm.vars['Scanner-Settings'] = {
"range": [[0,0,0,0], [255,255,255,255]], "range": [[0,0,0,0], [255,255,255,255]],
"numJobs": 50, "numJobs": 500,
"maxPingTimeout": 3, "maxPingTimeout": 1,
"output": "./data/scan.txt"
# 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) mm.addPageEventListener('Scanner-LoadSettings', loadSettings)
-150
View File
@@ -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