Files
bcow-analyzer/heatmap.py
2025-06-27 12:38:19 +03:00

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)')