SpiderFoot Cheat Blatt
Überblick
SpiderFoot ist ein Open-Source-Intelligent (OSINT) Automatisierungstool, das Aufklärungs- und Informationserfassung über Ziele wie IP-Adressen, Domainnamen, E-Mail-Adressen und Namen durchführt. Es integriert sich mit über 200 Datenquellen, um Intelligenz zu sammeln und Sicherheitsrisiken zu identifizieren, so dass es ein wesentliches Werkzeug für Penetrationstester, Sicherheitsforscher und Bedrohungsanalysen.
ZEIT Note: Open-Source-Tool mit kommerzieller HX-Edition verfügbar. Stellen Sie immer sicher, dass Sie eine ordnungsgemäße Berechtigung haben, bevor Sie Ziele scannen.
Installation und Inbetriebnahme
Installationsmethoden
```bash
Method 1: Install from PyPI
pip3 install spiderfoot
Method 2: Install from GitHub (latest development version)
git clone https://github.com/smicallef/spiderfoot.git cd spiderfoot pip3 install -r requirements.txt
Method 3: Docker installation
docker pull spiderfoot/spiderfoot docker run -p 5001:5001 spiderfoot/spiderfoot
Method 4: Using package managers
Ubuntu/Debian
sudo apt update && sudo apt install spiderfoot
Arch Linux
yay -S spiderfoot
macOS with Homebrew
brew install spiderfoot ```_
Erstkonfiguration
```bash
Create configuration directory
mkdir -p ~/.spiderfoot cd ~/.spiderfoot
Generate default configuration
spiderfoot -C
Edit configuration file
nano spiderfoot.conf
Key configuration options:
- __webaddr: Web interface bind address (default: 127.0.0.1)
- __webport: Web interface port (default: 5001)
- __database: Database file location
- __logfile: Log file location
- __modules: Module directory path
```_
API Keys Konfiguration
```bash
Configure API keys for enhanced data sources
Edit ~/.spiderfoot/spiderfoot.conf
Common API configurations:
[api_keys]
VirusTotal API key
virustotal_api_key = your_virustotal_api_key
Shodan API key
shodan_api_key = your_shodan_api_key
Have I Been Pwned API key
hibp_api_key = your_hibp_api_key
SecurityTrails API key
securitytrails_api_key = your_securitytrails_api_key
PassiveTotal API key
passivetotal_api_key = your_passivetotal_api_key passivetotal_username = your_passivetotal_username
AlienVault OTX API key
otx_api_key = your_otx_api_key
Censys API credentials
censys_api_id = your_censys_api_id censys_api_secret = your_censys_api_secret
Hunter.io API key
hunter_api_key = your_hunter_api_key
Clearbit API key
clearbit_api_key = your_clearbit_api_key ```_
Verwendung der Befehlszeile
Basic Scaning Operationen
```bash
Basic domain scan
spiderfoot -s example.com -t DOMAIN
IP address scan
spiderfoot -s 192.168.1.1 -t IP_ADDRESS
Email address investigation
spiderfoot -s user@example.com -t EMAILADDR
Human name investigation
spiderfoot -s "John Smith" -t HUMAN_NAME
Multiple targets scan
spiderfoot -s "example.com,192.168.1.1" -t DOMAIN,IP_ADDRESS
Scan with specific modules only
spiderfoot -s example.com -t DOMAIN -m sfp_dnsresolve,sfp_whois,sfp_virustotal
Exclude specific modules
spiderfoot -s example.com -t DOMAIN -x sfp_social,sfp_pgp ```_
Erweiterte Scanoptionen
```bash
Passive scan only (no active probing)
spiderfoot -s example.com -t DOMAIN -p
Scan with custom user agent
spiderfoot -s example.com -t DOMAIN -u "Mozilla/5.0 Custom Agent"
Scan with proxy
spiderfoot -s example.com -t DOMAIN -y http://proxy.example.com:8080
Scan with custom timeout
spiderfoot -s example.com -t DOMAIN -w 30
Scan with maximum threads
spiderfoot -s example.com -t DOMAIN -T 10
Scan with output to file
spiderfoot -s example.com -t DOMAIN -o json > scan_results.json
Scan with specific data types
spiderfoot -s example.com -t DOMAIN -f SUBDOMAIN,IP_ADDRESS,EMAILADDR ```_
Scan Management
```bash
List available modules
spiderfoot -M
Get module information
spiderfoot -M sfp_virustotal
List available data types
spiderfoot -F
List running scans
spiderfoot -l
Stop a running scan
spiderfoot -q scan_id
Delete scan data
spiderfoot -d scan_id
Export scan results
spiderfoot -e scan_id -o json > results.json spiderfoot -e scan_id -o csv > results.csv spiderfoot -e scan_id -o xml > results.xml ```_
Web Interface Nutzung
Starten der Web-Schnittstelle
```bash
Start web interface (default: http://127.0.0.1:5001)
spiderfoot -l 127.0.0.1:5001
Start web interface on all interfaces
spiderfoot -l 0.0.0.0:5001
Start with custom configuration
spiderfoot -c /path/to/custom.conf -l 127.0.0.1:5001
Start in background
nohup spiderfoot -l 127.0.0.1:5001 &
Start with Docker
docker run -p 5001:5001 -d spiderfoot/spiderfoot ```_
Web Interface Navigation
```bash
Access web interface
Navigate to http://localhost:5001
Main sections:
- New Scan: Create new scans
- Scans: View and manage existing scans
- Browse: Browse scan results by data type
- Search: Search across all scan data
- Settings: Configure modules and API keys
- About: System information and statistics
Scan creation workflow:
1. Enter target (domain, IP, email, etc.)
2. Select scan modules or use presets
3. Configure scan options
4. Start scan and monitor progress
5. Review results and export data
```_
Scan Configuration Presets
json
{
"scan_presets": {
"passive_recon": {
"description": "Passive reconnaissance without active probing",
"modules": [
"sfp_dnsresolve",
"sfp_whois",
"sfp_virustotal",
"sfp_shodan",
"sfp_censys",
"sfp_passivetotal",
"sfp_securitytrails",
"sfp_threatcrowd",
"sfp_otx"
],
"passive_only": true
},
"comprehensive_domain": {
"description": "Comprehensive domain investigation",
"modules": [
"sfp_dnsresolve",
"sfp_dnsbrute",
"sfp_whois",
"sfp_virustotal",
"sfp_shodan",
"sfp_censys",
"sfp_subdomain_enum",
"sfp_ssl_analyze",
"sfp_port_scan",
"sfp_web_crawl"
]
},
"email_investigation": {
"description": "Email address and person investigation",
"modules": [
"sfp_hunter",
"sfp_clearbit",
"sfp_hibp",
"sfp_social",
"sfp_pgp",
"sfp_gravatar",
"sfp_fullcontact",
"sfp_pipl"
]
},
"threat_intelligence": {
"description": "Threat intelligence gathering",
"modules": [
"sfp_virustotal",
"sfp_otx",
"sfp_threatcrowd",
"sfp_malwaredomains",
"sfp_reputation",
"sfp_blacklist",
"sfp_phishing",
"sfp_malware"
]
}
}
}
_
Modulkonfiguration und Anpassung
Kernmodule Überblick
```bash
DNS and Domain Modules
sfp_dnsresolve # DNS resolution and record enumeration sfp_dnsbrute # DNS subdomain brute forcing sfp_whois # WHOIS information gathering sfp_subdomain_enum # Subdomain enumeration from various sources
Network and Infrastructure
sfp_port_scan # Port scanning and service detection sfp_ssl_analyze # SSL/TLS certificate analysis sfp_banner_grab # Service banner grabbing sfp_traceroute # Network path tracing
Threat Intelligence
sfp_virustotal # VirusTotal integration sfp_otx # AlienVault OTX integration sfp_threatcrowd # ThreatCrowd integration sfp_reputation # Reputation checking across sources
Search Engines and OSINT
sfp_google # Google search integration sfp_bing # Bing search integration sfp_shodan # Shodan integration sfp_censys # Censys integration
Social Media and People
sfp_social # Social media profile discovery sfp_hunter # Email address discovery sfp_clearbit # Company and person enrichment sfp_hibp # Have I Been Pwned integration
Web Application
sfp_web_crawl # Web application crawling sfp_web_analyze # Web technology identification sfp_robots # robots.txt analysis sfp_sitemap # Sitemap discovery and analysis ```_
Personalentwicklung
```python
Example custom module: sfp_custom_example.py
import re import requests from spiderfoot import SpiderFootEvent, SpiderFootPlugin
class sfp_custom_example(SpiderFootPlugin): """Custom SpiderFoot module example"""
meta = {
'name': "Custom Example Module",
'summary': "Example custom module for demonstration",
'flags': [""],
'useCases': ["Investigate", "Passive"],
'categories': ["Search Engines"],
'dataSource': {
'website': "https://example.com",
'model': "FREE_NOAUTH_UNLIMITED",
'references': ["https://example.com/api"],
'favIcon': "https://example.com/favicon.ico",
'logo': "https://example.com/logo.png",
'description': "Example data source for custom module"
}
}
# Default options
opts = {
'api_key': '',
'max_results': 100,
'timeout': 30
}
# Option descriptions
optdescs = {
'api_key': "API key for the service",
'max_results': "Maximum number of results to return",
'timeout': "Request timeout in seconds"
}
# What events this module accepts for input
events = {
'DOMAIN_NAME': ['SUBDOMAIN', 'EMAILADDR'],
'IP_ADDRESS': ['GEOINFO', 'NETBLOCK_OWNER']
}
def setup(self, sfc, userOpts=dict()):
self.sf = sfc
self.results = self.tempStorage()
# Override default options with user settings
for opt in list(userOpts.keys()):
self.opts[opt] = userOpts[opt]
def watchedEvents(self):
"""Events this module will accept as input"""
return list(self.events.keys())
def producedEvents(self):
"""Events this module will produce"""
evts = []
for eventType in self.events:
evts.extend(self.events[eventType])
return evts
def handleEvent(self, event):
"""Handle incoming events"""
eventName = event.eventType
srcModuleName = event.module
eventData = event.data
# Don't process events from ourselves
if srcModuleName == "sfp_custom_example":
return
# Check if we've already processed this data
if eventData in self.results:
return
self.results[eventData] = True
self.sf.debug(f"Received event, {eventName}, from {srcModuleName}")
# Process different event types
if eventName == 'DOMAIN_NAME':
self.processDomain(eventData, event)
elif eventName == 'IP_ADDRESS':
self.processIP(eventData, event)
def processDomain(self, domain, parentEvent):
"""Process domain name events"""
try:
# Example: Query custom API for domain information
url = f"https://api.example.com/domain/{domain}"
headers = {'Authorization': f'Bearer {self.opts["api_key"]}'}
response = requests.get(
url,
headers=headers,
timeout=self.opts['timeout']
)
if response.status_code == 200:
data = response.json()
# Extract subdomains
if 'subdomains' in data:
for subdomain in data['subdomains'][:self.opts['max_results']]:
evt = SpiderFootEvent(
'SUBDOMAIN',
subdomain,
self.__name__,
parentEvent
)
self.notifyListeners(evt)
# Extract email addresses
if 'emails' in data:
for email in data['emails'][:self.opts['max_results']]:
evt = SpiderFootEvent(
'EMAILADDR',
email,
self.__name__,
parentEvent
)
self.notifyListeners(evt)
except Exception as e:
self.sf.error(f"Error processing domain {domain}: {str(e)}")
def processIP(self, ip, parentEvent):
"""Process IP address events"""
try:
# Example: Query custom API for IP information
url = f"https://api.example.com/ip/{ip}"
headers = {'Authorization': f'Bearer {self.opts["api_key"]}'}
response = requests.get(
url,
headers=headers,
timeout=self.opts['timeout']
)
if response.status_code == 200:
data = response.json()
# Extract geolocation info
if 'location' in data:
location = f"{data['location']['city']}, {data['location']['country']}"
evt = SpiderFootEvent(
'GEOINFO',
location,
self.__name__,
parentEvent
)
self.notifyListeners(evt)
except Exception as e:
self.sf.error(f"Error processing IP {ip}: {str(e)}")
Install custom module:
1. Save as sfp_custom_example.py in modules/ directory
2. Restart SpiderFoot
3. Module will appear in available modules list
```_
Modulkonfigurationsdateien
```ini
~/.spiderfoot/modules.conf
Module-specific configuration
[sfp_virustotal] api_key = your_virustotal_api_key max_results = 100 timeout = 30
[sfp_shodan] api_key = your_shodan_api_key max_results = 50 timeout = 20
[sfp_hunter] api_key = your_hunter_api_key max_results = 25 verify_emails = true
[sfp_censys] api_id = your_censys_api_id api_secret = your_censys_api_secret max_results = 100
[sfp_passivetotal] api_key = your_passivetotal_api_key username = your_passivetotal_username max_results = 200
[sfp_hibp] api_key = your_hibp_api_key check_pastes = true truncate_response = false ```_
Advanced OSINT Techniques
Umfassende Domain-Untersuchung
```bash
Multi-stage domain investigation
Stage 1: Passive reconnaissance
spiderfoot -s target.com -t DOMAIN -m sfp_dnsresolve,sfp_whois,sfp_virustotal,sfp_passivetotal -p
Stage 2: Subdomain enumeration
spiderfoot -s target.com -t DOMAIN -m sfp_dnsbrute,sfp_subdomain_enum,sfp_crt,sfp_google
Stage 3: Infrastructure analysis
spiderfoot -s target.com -t DOMAIN -m sfp_port_scan,sfp_ssl_analyze,sfp_banner_grab,sfp_web_analyze
Stage 4: Threat intelligence
spiderfoot -s target.com -t DOMAIN -m sfp_reputation,sfp_blacklist,sfp_malware,sfp_phishing
Combined comprehensive scan
spiderfoot -s target.com -t DOMAIN \ -m sfp_dnsresolve,sfp_dnsbrute,sfp_whois,sfp_virustotal,sfp_shodan,sfp_censys,sfp_passivetotal,sfp_subdomain_enum,sfp_ssl_analyze,sfp_port_scan,sfp_web_crawl,sfp_reputation \ -f SUBDOMAIN,IP_ADDRESS,EMAILADDR,SSL_CERTIFICATE,WEBSERVER_TECHNOLOGY,VULNERABILITY ```_
E-Mail und Person Untersuchung
```bash
Email address investigation
spiderfoot -s user@target.com -t EMAILADDR \ -m sfp_hunter,sfp_clearbit,sfp_hibp,sfp_social,sfp_pgp,sfp_gravatar,sfp_fullcontact \ -f EMAILADDR,SOCIAL_MEDIA,PHONE_NUMBER,PHYSICAL_ADDRESS,BREACH_DATA
Person name investigation
spiderfoot -s "John Smith" -t HUMAN_NAME \ -m sfp_social,sfp_pipl,sfp_fullcontact,sfp_clearbit,sfp_google,sfp_bing \ -f SOCIAL_MEDIA,EMAILADDR,PHONE_NUMBER,PHYSICAL_ADDRESS,COMPANY_NAME
Company investigation
spiderfoot -s "Example Corp" -t COMPANY_NAME \ -m sfp_clearbit,sfp_hunter,sfp_google,sfp_bing,sfp_social \ -f EMAILADDR,DOMAIN_NAME,PHYSICAL_ADDRESS,PHONE_NUMBER,SOCIAL_MEDIA ```_
IP-Adresse und Netzwerkanalyse
```bash
IP address investigation
spiderfoot -s 192.168.1.1 -t IP_ADDRESS \ -m sfp_shodan,sfp_censys,sfp_virustotal,sfp_reputation,sfp_geoip,sfp_port_scan \ -f GEOINFO,NETBLOCK_OWNER,OPEN_TCP_PORT,WEBSERVER_TECHNOLOGY,VULNERABILITY
Network range investigation
spiderfoot -s 192.168.1.0/24 -t NETBLOCK_OWNER \ -m sfp_shodan,sfp_censys,sfp_port_scan,sfp_banner_grab \ -f IP_ADDRESS,OPEN_TCP_PORT,WEBSERVER_TECHNOLOGY,OPERATING_SYSTEM
ASN investigation
spiderfoot -s AS12345 -t BGP_AS_OWNER \ -m sfp_bgpview,sfp_shodan,sfp_censys \ -f NETBLOCK_OWNER,IP_ADDRESS,DOMAIN_NAME ```_
Social Media und Dark Web Investigation
```bash
Social media investigation
spiderfoot -s target.com -t DOMAIN \ -m sfp_social,sfp_twitter,sfp_linkedin,sfp_facebook,sfp_instagram \ -f SOCIAL_MEDIA,EMAILADDR,HUMAN_NAME,PHONE_NUMBER
Dark web monitoring
spiderfoot -s target.com -t DOMAIN \ -m sfp_darkweb,sfp_onion,sfp_pastebin,sfp_leakdb \ -f DARKWEB_MENTION,BREACH_DATA,LEAKED_DOCUMENT,PASTE_SITE
Cryptocurrency investigation
spiderfoot -s 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa -t BITCOIN_ADDRESS \ -m sfp_blockchain,sfp_bitcoinabuse,sfp_cryptocurrency \ -f BITCOIN_ADDRESS,CRYPTOCURRENCY_ADDRESS,MALICIOUS_CRYPTOCURRENCY ```_
API Integration und Automatisierung
Python API Verwendung
```python
SpiderFoot Python API integration
import requests import json import time from typing import Dict, List, Optional
class SpiderFootAPI: def init(self, base_url: str = "http://localhost:5001"): self.base_url = base_url.rstrip('/') self.session = requests.Session()
def start_scan(self, target: str, target_type: str, modules: List[str] = None) -> str:
"""Start a new scan and return scan ID"""
scan_data = {
'scanname': f"API Scan - {target}",
'scantarget': target,
'targettype': target_type,
'modulelist': ','.join(modules) if modules else '',
'typelist': 'all'
}
response = self.session.post(
f"{self.base_url}/startscan",
data=scan_data
)
if response.status_code == 200:
result = response.json()
return result.get('id')
else:
raise Exception(f"Failed to start scan: {response.text}")
def get_scan_status(self, scan_id: str) -> Dict:
"""Get scan status and progress"""
response = self.session.get(f"{self.base_url}/scanstatus?id={scan_id}")
if response.status_code == 200:
return response.json()
else:
raise Exception(f"Failed to get scan status: {response.text}")
def wait_for_scan_completion(self, scan_id: str, timeout: int = 3600) -> Dict:
"""Wait for scan to complete with timeout"""
start_time = time.time()
while time.time() - start_time < timeout:
status = self.get_scan_status(scan_id)
if status.get('status') in ['FINISHED', 'ABORTED', 'FAILED']:
return status
print(f"Scan progress: {status.get('status')} - {status.get('progress', 0)}%")
time.sleep(30)
raise TimeoutError("Scan did not complete within timeout")
def get_scan_results(self, scan_id: str, data_type: str = None) -> List[Dict]:
"""Get scan results, optionally filtered by data type"""
params = {'id': scan_id}
if data_type:
params['type'] = data_type
response = self.session.get(f"{self.base_url}/scaneventresults", params=params)
if response.status_code == 200:
return response.json()
else:
raise Exception(f"Failed to get scan results: {response.text}")
def export_scan_results(self, scan_id: str, format: str = 'json') -> str:
"""Export scan results in specified format"""
params = {
'id': scan_id,
'type': format
}
response = self.session.get(f"{self.base_url}/scaneventresultexport", params=params)
if response.status_code == 200:
return response.text
else:
raise Exception(f"Failed to export scan results: {response.text}")
def delete_scan(self, scan_id: str) -> bool:
"""Delete scan and its data"""
response = self.session.get(f"{self.base_url}/scandelete?id={scan_id}")
return response.status_code == 200
def get_available_modules(self) -> Dict:
"""Get list of available modules"""
response = self.session.get(f"{self.base_url}/modules")
if response.status_code == 200:
return response.json()
else:
raise Exception(f"Failed to get modules: {response.text}")
def bulk_scan(self, targets: List[Dict], wait_for_completion: bool = True) -> List[Dict]:
"""Perform bulk scanning of multiple targets"""
scan_results = []
for target_info in targets:
target = target_info['target']
target_type = target_info['type']
modules = target_info.get('modules', [])
print(f"Starting scan for {target}")
try:
scan_id = self.start_scan(target, target_type, modules)
scan_info = {
'target': target,
'scan_id': scan_id,
'status': 'started'
}
if wait_for_completion:
final_status = self.wait_for_scan_completion(scan_id)
scan_info['status'] = final_status.get('status')
scan_info['results'] = self.get_scan_results(scan_id)
scan_results.append(scan_info)
except Exception as e:
print(f"Failed to scan {target}: {str(e)}")
scan_results.append({
'target': target,
'status': 'failed',
'error': str(e)
})
return scan_results
Usage example
api = SpiderFootAPI("http://localhost:5001")
Single target scan
scan_id = api.start_scan("example.com", "DOMAIN", ["sfp_dnsresolve", "sfp_whois", "sfp_virustotal"]) print(f"Started scan: {scan_id}")
Wait for completion
final_status = api.wait_for_scan_completion(scan_id) print(f"Scan completed: {final_status['status']}")
Get results
results = api.get_scan_results(scan_id) print(f"Found {len(results)} events")
Export results
json_results = api.export_scan_results(scan_id, 'json') with open(f"scan_{scan_id}_results.json", 'w') as f: f.write(json_results)
Bulk scanning
targets = [ {'target': 'example.com', 'type': 'DOMAIN', 'modules': ['sfp_dnsresolve', 'sfp_whois']}, {'target': 'test.com', 'type': 'DOMAIN', 'modules': ['sfp_dnsresolve', 'sfp_virustotal']}, {'target': '192.168.1.1', 'type': 'IP_ADDRESS', 'modules': ['sfp_shodan', 'sfp_geoip']} ]
bulk_results = api.bulk_scan(targets) print(f"Completed {len(bulk_results)} scans") ```_
Automatisierte Reporting und Analyse
```python
Automated SpiderFoot reporting and analysis
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from collections import defaultdict, Counter import re
class SpiderFootAnalyzer: def init(self, api: SpiderFootAPI): self.api = api
def analyze_scan_results(self, scan_id: str) -> Dict:
"""Comprehensive analysis of scan results"""
# Get all scan results
results = self.api.get_scan_results(scan_id)
# Convert to DataFrame for analysis
df = pd.DataFrame(results)
# Basic statistics
stats = {
'total_events': len(results),
'unique_data_types': df['type'].nunique(),
'data_type_distribution': df['type'].value_counts().to_dict(),
'module_distribution': df['module'].value_counts().to_dict(),
'confidence_distribution': df['confidence'].value_counts().to_dict()
}
# Risk analysis
risk_analysis = self.analyze_risk_indicators(results)
# Network analysis
network_analysis = self.analyze_network_data(results)
# Email and person analysis
person_analysis = self.analyze_person_data(results)
# Threat intelligence analysis
threat_analysis = self.analyze_threat_intelligence(results)
return {
'statistics': stats,
'risk_analysis': risk_analysis,
'network_analysis': network_analysis,
'person_analysis': person_analysis,
'threat_analysis': threat_analysis
}
def analyze_risk_indicators(self, results: List[Dict]) -> Dict:
"""Analyze risk indicators from scan results"""
risk_indicators = {
'high_risk': [],
'medium_risk': [],
'low_risk': [],
'informational': []
}
# Define risk patterns
high_risk_patterns = [
'VULNERABILITY',
'MALWARE',
'BLACKLISTED',
'BREACH_DATA',
'DARKWEB_MENTION'
]
medium_risk_patterns = [
'OPEN_TCP_PORT',
'SSL_CERTIFICATE_EXPIRED',
'WEBSERVER_TECHNOLOGY',
'OPERATING_SYSTEM'
]
for result in results:
data_type = result.get('type', '')
data_value = result.get('data', '')
if any(pattern in data_type for pattern in high_risk_patterns):
risk_indicators['high_risk'].append(result)
elif any(pattern in data_type for pattern in medium_risk_patterns):
risk_indicators['medium_risk'].append(result)
elif data_type in ['SUBDOMAIN', 'IP_ADDRESS', 'EMAILADDR']:
risk_indicators['low_risk'].append(result)
else:
risk_indicators['informational'].append(result)
# Calculate risk score
risk_score = (
len(risk_indicators['high_risk']) * 10 +
len(risk_indicators['medium_risk']) * 5 +
len(risk_indicators['low_risk']) * 1
)
return {
'risk_score': risk_score,
'risk_indicators': risk_indicators,
'risk_summary': {
'high_risk_count': len(risk_indicators['high_risk']),
'medium_risk_count': len(risk_indicators['medium_risk']),
'low_risk_count': len(risk_indicators['low_risk']),
'informational_count': len(risk_indicators['informational'])
}
}
def analyze_network_data(self, results: List[Dict]) -> Dict:
"""Analyze network-related data"""
network_data = {
'subdomains': [],
'ip_addresses': [],
'open_ports': [],
'ssl_certificates': [],
'web_technologies': []
}
for result in results:
data_type = result.get('type', '')
data_value = result.get('data', '')
if data_type == 'SUBDOMAIN':
network_data['subdomains'].append(data_value)
elif data_type == 'IP_ADDRESS':
network_data['ip_addresses'].append(data_value)
elif data_type == 'OPEN_TCP_PORT':
network_data['open_ports'].append(data_value)
elif data_type == 'SSL_CERTIFICATE':
network_data['ssl_certificates'].append(data_value)
elif data_type == 'WEBSERVER_TECHNOLOGY':
network_data['web_technologies'].append(data_value)
# Analysis
analysis = {
'subdomain_count': len(set(network_data['subdomains'])),
'ip_count': len(set(network_data['ip_addresses'])),
'unique_ports': list(set([port.split(':')[-1] for port in network_data['open_ports']])),
'technology_stack': Counter(network_data['web_technologies']),
'attack_surface': {
'external_subdomains': len(set(network_data['subdomains'])),
'exposed_services': len(network_data['open_ports']),
'ssl_endpoints': len(network_data['ssl_certificates'])
}
}
return analysis
def analyze_person_data(self, results: List[Dict]) -> Dict:
"""Analyze person and email related data"""
person_data = {
'email_addresses': [],
'social_media': [],
'phone_numbers': [],
'physical_addresses': [],
'breach_data': []
}
for result in results:
data_type = result.get('type', '')
data_value = result.get('data', '')
if data_type == 'EMAILADDR':
person_data['email_addresses'].append(data_value)
elif data_type == 'SOCIAL_MEDIA':
person_data['social_media'].append(data_value)
elif data_type == 'PHONE_NUMBER':
person_data['phone_numbers'].append(data_value)
elif data_type == 'PHYSICAL_ADDRESS':
person_data['physical_addresses'].append(data_value)
elif data_type == 'BREACH_DATA':
person_data['breach_data'].append(data_value)
# Email domain analysis
email_domains = [email.split('@')[1] for email in person_data['email_addresses'] if '@' in email]
analysis = {
'email_count': len(set(person_data['email_addresses'])),
'email_domains': Counter(email_domains),
'social_media_count': len(person_data['social_media']),
'breach_exposure': len(person_data['breach_data']),
'contact_info_exposure': {
'emails': len(person_data['email_addresses']),
'phones': len(person_data['phone_numbers']),
'addresses': len(person_data['physical_addresses'])
}
}
return analysis
def generate_report(self, scan_id: str, output_file: str = None) -> str:
"""Generate comprehensive HTML report"""
analysis = self.analyze_scan_results(scan_id)
html_report = f"""
<!DOCTYPE html>
<html>
<head>
<title>SpiderFoot Scan Analysis Report</title>
<style>
body {{ font-family: Arial, sans-serif; margin: 40px; }}
.header {{ background-color: #2c3e50; color: white; padding: 20px; }}
.section {{ margin: 20px 0; padding: 15px; border-left: 4px solid #3498db; }}
.risk-high {{ border-left-color: #e74c3c; }}
.risk-medium {{ border-left-color: #f39c12; }}
.risk-low {{ border-left-color: #27ae60; }}
table {{ border-collapse: collapse; width: 100%; }}
th, td {{ border: 1px solid #ddd; padding: 8px; text-align: left; }}
th {{ background-color: #f2f2f2; }}
</style>
</head>
<body>
<div class="header">
<h1>SpiderFoot Scan Analysis Report</h1>
<p>Scan ID: {scan_id}</p>
<p>Generated: {pd.Timestamp.now().strftime('%Y-%m-%d %H:%M:%S')}</p>
</div>
<div class="section">
<h2>Executive Summary</h2>
<p><strong>Risk Score:</strong> {analysis['risk_analysis']['risk_score']}</p>
<p><strong>Total Events:</strong> {analysis['statistics']['total_events']}</p>
<p><strong>High Risk Findings:</strong> {analysis['risk_analysis']['risk_summary']['high_risk_count']}</p>
<p><strong>Attack Surface:</strong> {analysis['network_analysis']['attack_surface']['external_subdomains']} subdomains, {analysis['network_analysis']['attack_surface']['exposed_services']} exposed services</p>
</div>
<div class="section risk-high">
<h2>High Risk Findings</h2>
<p>Found {analysis['risk_analysis']['risk_summary']['high_risk_count']} high-risk indicators requiring immediate attention.</p>
</div>
<div class="section">
<h2>Network Analysis</h2>
<table>
<tr><th>Metric</th><th>Count</th></tr>
<tr><td>Unique Subdomains</td><td>{analysis['network_analysis']['subdomain_count']}</td></tr>
<tr><td>IP Addresses</td><td>{analysis['network_analysis']['ip_count']}</td></tr>
<tr><td>Exposed Services</td><td>{analysis['network_analysis']['attack_surface']['exposed_services']}</td></tr>
<tr><td>SSL Endpoints</td><td>{analysis['network_analysis']['attack_surface']['ssl_endpoints']}</td></tr>
</table>
</div>
<div class="section">
<h2>Data Exposure Analysis</h2>
<table>
<tr><th>Data Type</th><th>Count</th></tr>
<tr><td>Email Addresses</td><td>{analysis['person_analysis']['email_count']}</td></tr>
<tr><td>Social Media Profiles</td><td>{analysis['person_analysis']['social_media_count']}</td></tr>
<tr><td>Breach Exposures</td><td>{analysis['person_analysis']['breach_exposure']}</td></tr>
</table>
</div>
<div class="section">
<h2>Recommendations</h2>
<ul>
<li>Review and remediate high-risk findings immediately</li>
<li>Implement subdomain monitoring for {analysis['network_analysis']['subdomain_count']} discovered subdomains</li>
<li>Secure exposed services and unnecessary open ports</li>
<li>Monitor for data breaches affecting discovered email addresses</li>
<li>Implement security awareness training for exposed personnel</li>
</ul>
</div>
</body>
</html>
"""
if output_file:
with open(output_file, 'w') as f:
f.write(html_report)
return output_file
else:
return html_report
Usage example
api = SpiderFootAPI() analyzer = SpiderFootAnalyzer(api)
Analyze scan results
analysis = analyzer.analyze_scan_results("scan_123") print(f"Risk Score: {analysis['risk_analysis']['risk_score']}") print(f"High Risk Findings: {analysis['risk_analysis']['risk_summary']['high_risk_count']}")
Generate report
report_file = analyzer.generate_report("scan_123", "spiderfoot_analysis_report.html") print(f"Report generated: {report_file}") ```_
Integration mit anderen Tools
Integration mit Metasploit
```bash
Export SpiderFoot results for Metasploit
| spiderfoot -e scan_id -o csv | grep "IP_ADDRESS\ | OPEN_TCP_PORT" > targets.csv |
Convert to Metasploit workspace format
python3 << 'EOF' import csv import xml.etree.ElementTree as ET
Create Metasploit XML import format
root = ET.Element("nmaprun") hosts = {}
with open('targets.csv', 'r') as f: reader = csv.DictReader(f) for row in reader: if row['type'] == 'IP_ADDRESS': ip = row['data'] if ip not in hosts: hosts[ip] = {'ports': []} elif row['type'] == 'OPEN_TCP_PORT': ip, port = row['data'].split(':') if ip in hosts: hosts[ip]['ports'].append(port)
for ip, data in hosts.items(): host = ET.SubElement(root, "host") address = ET.SubElement(host, "address") address.set("addr", ip) address.set("addrtype", "ipv4")
ports_elem = ET.SubElement(host, "ports")
for port in data['ports']:
port_elem = ET.SubElement(ports_elem, "port")
port_elem.set("portid", port)
port_elem.set("protocol", "tcp")
state = ET.SubElement(port_elem, "state")
state.set("state", "open")
tree = ET.ElementTree(root) tree.write("spiderfoot_targets.xml") print("Metasploit import file created: spiderfoot_targets.xml") EOF
Import into Metasploit
msfconsole -q -x " workspace -a spiderfoot_scan; db_import spiderfoot_targets.xml; hosts; services; exit" ```_
Integration mit Nmap
```bash
Extract IP addresses and ports for Nmap scanning
| spiderfoot -e scan_id -o json | jq -r '.[] | select(.type=="IP_ADDRESS") | .data' | sort -u > ips.txt | | spiderfoot -e scan_id -o json | jq -r '.[] | select(.type=="OPEN_TCP_PORT") | .data | split(":")[1]' | sort -u > ports.txt |
Perform targeted Nmap scan
| nmap -iL ips.txt -p $(cat ports.txt | tr '\n' ',' | sed 's/,$//') -sV -sC -oA spiderfoot_nmap |
Combine results
| echo "SpiderFoot discovered $(cat ips.txt | wc -l) IP addresses and $(cat ports.txt | wc -l) unique ports" | echo "Nmap scan results saved to spiderfoot_nmap.*" ```_
Integration mit TheHarvester
```bash
Use SpiderFoot domains with TheHarvester
| spiderfoot -e scan_id -o json | jq -r '.[] | select(.type=="DOMAIN_NAME") | .data' | sort -u > domains.txt |
Run TheHarvester on discovered domains
while read domain; do echo "Harvesting $domain..." theHarvester -d "$domain" -b all -f "${domain}_harvest" done < domains.txt
Combine email results
| cat *harvest.json | jq -r '.emails[]?' | sort -u > combined_emails.txt | echo "Found $(cat combined_emails.txt | wc -l) unique email addresses" ```
Integration mit Amass
```bash
Use SpiderFoot results to seed Amass enumeration
| spiderfoot -e scan_id -o json | jq -r '.[] | select(.type=="DOMAIN_NAME") | .data' | sort -u > seed_domains.txt |
Run Amass with SpiderFoot seeds
amass enum -df seed_domains.txt -active -brute -o amass_results.txt
Compare results
| echo "SpiderFoot found $(spiderfoot -e scan_id -o json | jq -r '.[] | select(.type=="SUBDOMAIN") | .data' | sort -u | wc -l) subdomains" | echo "Amass found $(cat amass_results.txt | wc -l) subdomains"
Find new subdomains discovered by Amass
| comm -13 <(spiderfoot -e scan_id -o json | jq -r '.[] | select(.type=="SUBDOMAIN") | .data' | sort -u) <(sort -u amass_results.txt) > new_subdomains.txt | echo "Amass discovered $(cat new_subdomains.txt | wc -l) additional subdomains" ```_
Leistungsoptimierung und Fehlerbehebung
Leistung Tuning
```bash
Optimize SpiderFoot performance
Edit ~/.spiderfoot/spiderfoot.conf
Increase thread count for faster scanning
__threads = 20
Adjust request delays to avoid rate limiting
__delay = 1
Increase timeout for slow responses
__timeout = 30
Optimize database settings
__database = /tmp/spiderfoot.db # Use faster storage __dbpragmas = journal_mode=WAL,synchronous=NORMAL,cache_size=10000
Memory optimization
__maxmemory = 2048 # MB
Network optimization
__useragent = Mozilla/5.0 (compatible; SpiderFoot) __proxy = http://proxy.example.com:8080 # Use proxy for better performance ```_
Überwachung und Protokollierung
```bash
Enable detailed logging
spiderfoot -l 127.0.0.1:5001 -d
Monitor scan progress
tail -f ~/.spiderfoot/spiderfoot.log
Check system resources
ps aux | grep spiderfoot netstat -tulpn | grep 5001
Database optimization
sqlite3 ~/.spiderfoot/spiderfoot.db "VACUUM;" sqlite3 ~/.spiderfoot/spiderfoot.db "ANALYZE;"
Clean old scan data
spiderfoot -D # Delete all scan data
Or delete specific scans via web interface
```_
Gemeinsame Themen und Lösungen
```bash
Issue: API rate limiting
Solution: Configure delays and use API keys
echo "api_delay = 2" >> ~/.spiderfoot/spiderfoot.conf
Issue: Memory usage too high
Solution: Limit concurrent modules and use passive scanning
spiderfoot -s target.com -t DOMAIN -T 5 -p
Issue: Slow database performance
Solution: Use WAL mode and optimize database
sqlite3 ~/.spiderfoot/spiderfoot.db "PRAGMA journal_mode=WAL;" sqlite3 ~/.spiderfoot/spiderfoot.db "PRAGMA synchronous=NORMAL;"
Issue: Module errors
Solution: Check module configuration and API keys
spiderfoot -M sfp_virustotal # Check specific module grep "ERROR" ~/.spiderfoot/spiderfoot.log | tail -20
Issue: Web interface not accessible
Solution: Check binding and firewall
netstat -tulpn | grep 5001 sudo ufw allow 5001/tcp # If using UFW firewall ```_
Kundenspezifische Bereitstellung und Skalierung
```bash
Docker deployment with custom configuration
docker run -d \ --name spiderfoot \ -p 5001:5001 \ -v /path/to/config:/home/spiderfoot/.spiderfoot \ -v /path/to/data:/home/spiderfoot/data \ -e SF_THREADS=20 \ -e SF_DELAY=1 \ spiderfoot/spiderfoot
Docker Compose for production deployment
cat > docker-compose.yml << 'EOF' version: '3.8' services: spiderfoot: image: spiderfoot/spiderfoot:latest ports: - "5001:5001" volumes: - ./config:/home/spiderfoot/.spiderfoot - ./data:/home/spiderfoot/data environment: - SF_THREADS=20 - SF_DELAY=1 - SF_TIMEOUT=30 restart: unless-stopped
nginx: image: nginx:alpine ports: - "80:80" - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./ssl:/etc/nginx/ssl depends_on: - spiderfoot restart: unless-stopped EOF
Kubernetes deployment
cat > spiderfoot-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: spiderfoot spec: replicas: 1 selector: matchLabels: app: spiderfoot template: metadata: labels: app: spiderfoot spec: containers: - name: spiderfoot image: spiderfoot/spiderfoot:latest ports: - containerPort: 5001 env: - name: SF_THREADS value: "20" - name: SF_DELAY value: "1" volumeMounts: - name: config mountPath: /home/spiderfoot/.spiderfoot - name: data mountPath: /home/spiderfoot/data volumes: - name: config configMap: name: spiderfoot-config - name: data persistentVolumeClaim: claimName: spiderfoot-data
apiVersion: v1 kind: Service metadata: name: spiderfoot-service spec: selector: app: spiderfoot ports: - port: 80 targetPort: 5001 type: LoadBalancer EOF
kubectl apply -f spiderfoot-deployment.yaml ```_
Ressourcen
Dokumentation und Gemeinschaft
- (LINK12_)
- [GitHub Repository](LINK_12___ -%20[Modulentwicklungsleitfaden](__LINK_12___ -%20[API-Dokumentation](__LINK_12
%20Schulungen%20und%20Tutorials
-%20[SpiderFoot%20Tutorial%20Series](LINK_12___ -%20[OSINT%20with%20SpiderFoot](LINK_12 -%20Video-Tutorials - [Gemeinschaftsforum](LINK_12