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
+109 -22
View File
@@ -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
+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}>'
+156
View File
@@ -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/")
@@ -10,3 +15,154 @@ def countScannedIps():
#Count lines in scan files, Masscan has a 2 line header, so hence -2
count += sum(1 for _ in f)-2
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'] = {
"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)
-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