Select Git revision
utils.py 1.75 KiB
import shodan
def shodan_scan(api_key, ips):
api = shodan.Shodan(api_key)
scan_results = []
for ip in ips:
try:
host_info = api.host(ip)
scan_result = {
'ip_address': ip,
'open_ports': [{
'port': port_info['port'],
'protocol': port_info['_shodan']['module'],
'banner': port_info.get('banner', '')
} for port_info in host_info.get('data', []) if isinstance(port_info, dict)],
'geolocation': {
'country': host_info.get('country_name', 'Unknown'),
'city': host_info.get('city', 'Unknown'),
'latitude': host_info.get('latitude', 0),
'longitude': host_info.get('longitude', 0)
},
'vulnerabilities': []
}
vulns_info = host_info.get('vulns', [])
if isinstance(vulns_info, list):
for cve in vulns_info:
if isinstance(cve, str):
scan_result['vulnerabilities'].append({
'cve': cve,
'summary': 'Details not provided by Shodan' # Placeholder text
})
else:
print(f"Unexpected format for vulnerability detail: {cve}")
else:
print(f"Vulnerabilities data is not in expected list format: {type(vulns_info)}")
scan_results.append(scan_result)
except shodan.APIError as e:
print(f"Error scanning IP {ip}: {e}")
except KeyError as ke:
print(f"Key error: {ke} - Possible incorrect data structure access.")
return scan_results