92 lines
3.1 KiB
Python
92 lines
3.1 KiB
Python
import re
|
|
import matplotlib.pyplot as plt
|
|
from mpl_toolkits.basemap import Basemap
|
|
from geoip2.database import Reader
|
|
|
|
|
|
# Function to extract IP addresses from text using regex
|
|
def extract_ip_addresses(text):
|
|
ip_pattern = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
|
|
return re.findall(ip_pattern, text)
|
|
|
|
|
|
# Function to check if an IP address is private
|
|
def is_private_ip(ip):
|
|
octets = ip.split('.')
|
|
first_octet = int(octets[0])
|
|
second_octet = int(octets[1])
|
|
|
|
# Check for private IP ranges
|
|
if (first_octet == 10) or (first_octet == 172 and 16 <= second_octet <= 31) or (
|
|
first_octet == 192 and second_octet == 168):
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
|
|
# Function to geolocate multiple IP addresses using GeoIP2
|
|
def geolocate_ips(ip_list):
|
|
latitudes = []
|
|
longitudes = []
|
|
if ip_list:
|
|
try:
|
|
reader = Reader('GeoLite2-City.mmdb') # Replace with your actual GeoIP2 database path
|
|
for ip in ip_list:
|
|
response = reader.city(ip)
|
|
latitudes.append(response.location.latitude)
|
|
longitudes.append(response.location.longitude)
|
|
return latitudes, longitudes
|
|
except Exception as e:
|
|
print(f"Error geolocating IPs: {e}")
|
|
return [], []
|
|
finally:
|
|
if 'reader' in locals():
|
|
reader.close()
|
|
else:
|
|
return [], []
|
|
|
|
|
|
# Function to generate heatmap
|
|
def generate_heatmap(latitude_list, longitude_list, title):
|
|
plt.figure(figsize=(50, 40))
|
|
m = Basemap(projection='merc', llcrnrlat=-60, urcrnrlat=90, llcrnrlon=-180, urcrnrlon=180, resolution='c')
|
|
|
|
if latitude_list and longitude_list and len(latitude_list) == len(longitude_list):
|
|
valid_indices = [i for i in range(len(latitude_list)) if latitude_list[i] is not None and longitude_list[i] is not None]
|
|
if valid_indices:
|
|
latitudes = [latitude_list[i] for i in valid_indices]
|
|
longitudes = [longitude_list[i] for i in valid_indices]
|
|
|
|
x, y = m(longitudes, latitudes)
|
|
m.scatter(x, y, marker='o', color='r', s=50, zorder=10)
|
|
|
|
m.drawcoastlines()
|
|
m.drawcountries()
|
|
m.drawmapboundary()
|
|
|
|
plt.title(title)
|
|
plt.show()
|
|
|
|
|
|
|
|
# Read the contents of the text file
|
|
file_path = 'sample.txt' # Replace with your actual file path
|
|
with open(file_path, 'r') as file:
|
|
data = file.read()
|
|
|
|
# Extract all source and destination IP addresses
|
|
ips = extract_ip_addresses(data)
|
|
source_ips = [ip for ip in ips[::2] if not is_private_ip(ip)] # Exclude private IPs from source list
|
|
destination_ips = [ip for ip in ips[1::2] if not is_private_ip(ip)] # Exclude private IPs from destination list
|
|
|
|
print(f"Source IPs: {source_ips}")
|
|
print(f"Destination IPs: {destination_ips}")
|
|
|
|
# Geolocate all source and destination IPs
|
|
source_lats, source_lons = geolocate_ips(source_ips)
|
|
destination_lats, destination_lons = geolocate_ips(destination_ips)
|
|
|
|
# Generate heatmaps for source and destination IPs
|
|
generate_heatmap(source_lats, source_lons, 'Source IPs Geolocation Heatmap (excluding private)')
|
|
generate_heatmap(destination_lats, destination_lons, 'Destination IPs Geolocation Heatmap (excluding private)')
|