Compare commits
33 Commits
try-fix
...
71b2855d01
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
71b2855d01 | ||
|
|
93a258170a | ||
|
|
e2d4e12057 | ||
|
|
c076ee028f | ||
|
|
cbfac0922a | ||
|
|
881f7b74e5 | ||
|
|
c347581a6c | ||
|
|
30ee21f087 | ||
|
|
2496ca26a5 | ||
|
|
8aa3c4933e | ||
|
|
fc326a66c8 | ||
|
|
51902e3155 | ||
|
|
a261d706c8 | ||
|
|
2410e689b8 | ||
|
|
62470673fe | ||
|
|
2658bd148b | ||
|
|
f02381910d | ||
|
|
674ac59c98 | ||
| 434d1f4803 | |||
|
|
eb9eea127b | ||
|
|
ae07635ab6 | ||
|
|
d7adf9ad8b | ||
|
|
39ce0e9d11 | ||
|
|
926f9e1096 | ||
|
|
9499e62ccc | ||
|
|
89ae06482e | ||
|
|
7fe7ca41ba | ||
|
|
949fbdbb45 | ||
|
|
689e8c00d4 | ||
|
|
3511f18f9a | ||
|
|
72f7056bc7 | ||
|
|
2ae33bc5ba | ||
|
|
c91913fa13 |
34
.env.example
Normal file
34
.env.example
Normal file
@@ -0,0 +1,34 @@
|
||||
# ===============================================
|
||||
# DNSRecon Environment Variables
|
||||
# ===============================================
|
||||
# Copy this file to .env and fill in your values.
|
||||
|
||||
# --- API Keys ---
|
||||
# Add your Shodan API key for the Shodan provider to be enabled.
|
||||
SHODAN_API_KEY=
|
||||
|
||||
# --- Flask & Session Settings ---
|
||||
# A strong, random secret key is crucial for session security.
|
||||
FLASK_SECRET_KEY=your-very-secret-and-random-key-here
|
||||
FLASK_HOST=127.0.0.1
|
||||
FLASK_PORT=5000
|
||||
FLASK_DEBUG=True
|
||||
# How long a user's session in the browser lasts (in hours).
|
||||
FLASK_PERMANENT_SESSION_LIFETIME_HOURS=2
|
||||
# How long inactive scanner data is stored in Redis (in minutes).
|
||||
SESSION_TIMEOUT_MINUTES=60
|
||||
|
||||
|
||||
# --- Application Core Settings ---
|
||||
# The default number of levels to recurse when scanning.
|
||||
DEFAULT_RECURSION_DEPTH=2
|
||||
# Default timeout for provider API requests in seconds.
|
||||
DEFAULT_TIMEOUT=30
|
||||
# The number of concurrent provider requests to make.
|
||||
MAX_CONCURRENT_REQUESTS=5
|
||||
# The number of results from a provider that triggers the "large entity" grouping.
|
||||
LARGE_ENTITY_THRESHOLD=100
|
||||
# The number of times to retry a target if a provider fails.
|
||||
MAX_RETRIES_PER_TARGET=8
|
||||
# How long cached provider responses are stored (in hours).
|
||||
CACHE_EXPIRY_HOURS=12
|
||||
322
app.py
322
app.py
@@ -1,3 +1,5 @@
|
||||
# dnsrecon-reduced/app.py
|
||||
|
||||
"""
|
||||
Flask application entry point for DNSRecon web interface.
|
||||
Provides REST API endpoints and serves the web interface with user session support.
|
||||
@@ -11,51 +13,41 @@ import io
|
||||
|
||||
from core.session_manager import session_manager
|
||||
from config import config
|
||||
from core.graph_manager import NodeType
|
||||
from utils.helpers import is_valid_target
|
||||
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['SECRET_KEY'] = 'dnsrecon-dev-key-change-in-production'
|
||||
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2) # 2 hour session lifetime
|
||||
# Use centralized configuration for Flask settings
|
||||
app.config['SECRET_KEY'] = config.flask_secret_key
|
||||
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=config.flask_permanent_session_lifetime_hours)
|
||||
|
||||
def get_user_scanner():
|
||||
"""
|
||||
User scanner retrieval with better error handling and debugging.
|
||||
Retrieves the scanner for the current session, or creates a new
|
||||
session and scanner if one doesn't exist.
|
||||
"""
|
||||
# Get current Flask session info for debugging
|
||||
current_flask_session_id = session.get('dnsrecon_session_id')
|
||||
client_ip = request.remote_addr
|
||||
user_agent = request.headers.get('User-Agent', '')[:100] # Truncate for logging
|
||||
|
||||
# Try to get existing session
|
||||
if current_flask_session_id:
|
||||
existing_scanner = session_manager.get_session(current_flask_session_id)
|
||||
if existing_scanner:
|
||||
# Ensure session ID is set
|
||||
existing_scanner.session_id = current_flask_session_id
|
||||
return current_flask_session_id, existing_scanner
|
||||
else:
|
||||
print(f"Session {current_flask_session_id} not found in session manager")
|
||||
|
||||
# Create new session
|
||||
print("Creating new session...")
|
||||
# Create new session if none exists
|
||||
print("Creating new session as none was found...")
|
||||
new_session_id = session_manager.create_session()
|
||||
new_scanner = session_manager.get_session(new_session_id)
|
||||
|
||||
if not new_scanner:
|
||||
print(f"ERROR: Failed to retrieve newly created session {new_session_id}")
|
||||
raise Exception("Failed to create new scanner session")
|
||||
|
||||
# Store in Flask session
|
||||
session['dnsrecon_session_id'] = new_session_id
|
||||
session.permanent = True
|
||||
|
||||
# Ensure session ID is set on scanner
|
||||
new_scanner.session_id = new_session_id
|
||||
|
||||
print(f"Created new session: {new_session_id}")
|
||||
print(f"New scanner status: {new_scanner.status}")
|
||||
print("=== END SESSION DEBUG ===")
|
||||
|
||||
return new_session_id, new_scanner
|
||||
|
||||
@app.route('/')
|
||||
@@ -67,102 +59,72 @@ def index():
|
||||
@app.route('/api/scan/start', methods=['POST'])
|
||||
def start_scan():
|
||||
"""
|
||||
Start a new reconnaissance scan with immediate GUI feedback.
|
||||
Start a new reconnaissance scan. Creates a new isolated scanner if
|
||||
clear_graph is true, otherwise adds to the existing one.
|
||||
"""
|
||||
print("=== API: /api/scan/start called ===")
|
||||
|
||||
try:
|
||||
print("Getting JSON data from request...")
|
||||
data = request.get_json()
|
||||
print(f"Request data: {data}")
|
||||
if not data or 'target' not in data:
|
||||
return jsonify({'success': False, 'error': 'Missing target in request'}), 400
|
||||
|
||||
if not data or 'target_domain' not in data:
|
||||
print("ERROR: Missing target_domain in request")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'error': 'Missing target_domain in request'
|
||||
}), 400
|
||||
|
||||
target_domain = data['target_domain'].strip()
|
||||
target = data['target'].strip()
|
||||
max_depth = data.get('max_depth', config.default_recursion_depth)
|
||||
clear_graph = data.get('clear_graph', True)
|
||||
force_rescan_target = data.get('force_rescan_target', None) # **FIX**: Get the new parameter
|
||||
|
||||
print(f"Parsed - target_domain: '{target_domain}', max_depth: {max_depth}")
|
||||
print(f"Parsed - target: '{target}', max_depth: {max_depth}, clear_graph: {clear_graph}, force_rescan: {force_rescan_target}")
|
||||
|
||||
# Validation
|
||||
if not target_domain:
|
||||
print("ERROR: Target domain cannot be empty")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'error': 'Target domain cannot be empty'
|
||||
}), 400
|
||||
if not target:
|
||||
return jsonify({'success': False, 'error': 'Target cannot be empty'}), 400
|
||||
if not is_valid_target(target):
|
||||
return jsonify({'success': False, 'error': 'Invalid target format. Please enter a valid domain or IP address.'}), 400
|
||||
if not isinstance(max_depth, int) or not 1 <= max_depth <= 5:
|
||||
return jsonify({'success': False, 'error': 'Max depth must be an integer between 1 and 5'}), 400
|
||||
|
||||
if not isinstance(max_depth, int) or max_depth < 1 or max_depth > 5:
|
||||
print(f"ERROR: Invalid max_depth: {max_depth}")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'error': 'Max depth must be an integer between 1 and 5'
|
||||
}), 400
|
||||
user_session_id, scanner = None, None
|
||||
|
||||
if clear_graph:
|
||||
print("Clear graph requested: Creating a new, isolated scanner session.")
|
||||
old_session_id = session.get('dnsrecon_session_id')
|
||||
if old_session_id:
|
||||
session_manager.terminate_session(old_session_id)
|
||||
|
||||
user_session_id = session_manager.create_session()
|
||||
session['dnsrecon_session_id'] = user_session_id
|
||||
session.permanent = True
|
||||
scanner = session_manager.get_session(user_session_id)
|
||||
else:
|
||||
print("Adding to existing graph: Reusing the current scanner session.")
|
||||
user_session_id, scanner = get_user_scanner()
|
||||
|
||||
if not scanner:
|
||||
return jsonify({'success': False, 'error': 'Failed to get or create a scanner instance.'}), 500
|
||||
|
||||
print("Validation passed, getting user scanner...")
|
||||
print(f"Using scanner {id(scanner)} in session {user_session_id}")
|
||||
|
||||
# Get user-specific scanner
|
||||
user_session_id, scanner = get_user_scanner()
|
||||
|
||||
# Ensure session ID is properly set
|
||||
if not scanner.session_id:
|
||||
scanner.session_id = user_session_id
|
||||
|
||||
print(f"Using session: {user_session_id}")
|
||||
print(f"Scanner object ID: {id(scanner)}")
|
||||
|
||||
# Start scan
|
||||
print(f"Calling start_scan on scanner {id(scanner)}...")
|
||||
success = scanner.start_scan(target_domain, max_depth, clear_graph=clear_graph)
|
||||
|
||||
# Immediately update session state regardless of success
|
||||
session_manager.update_session_scanner(user_session_id, scanner)
|
||||
success = scanner.start_scan(target, max_depth, clear_graph=clear_graph, force_rescan_target=force_rescan_target) # **FIX**: Pass the new parameter
|
||||
|
||||
if success:
|
||||
scan_session_id = scanner.logger.session_id
|
||||
print(f"Scan started successfully with scan session ID: {scan_session_id}")
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': 'Scan started successfully',
|
||||
'scan_id': scan_session_id,
|
||||
'scan_id': scanner.logger.session_id,
|
||||
'user_session_id': user_session_id,
|
||||
'scanner_status': scanner.status,
|
||||
'debug_info': {
|
||||
'scanner_object_id': id(scanner),
|
||||
'scanner_status': scanner.status
|
||||
}
|
||||
})
|
||||
else:
|
||||
print("ERROR: Scanner returned False")
|
||||
|
||||
# Provide more detailed error information
|
||||
error_details = {
|
||||
'scanner_status': scanner.status,
|
||||
'scanner_object_id': id(scanner),
|
||||
'session_id': user_session_id,
|
||||
'providers_count': len(scanner.providers) if hasattr(scanner, 'providers') else 0
|
||||
}
|
||||
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'error': f'Failed to start scan (scanner status: {scanner.status})',
|
||||
'debug_info': error_details
|
||||
}), 409
|
||||
|
||||
except Exception as e:
|
||||
print(f"ERROR: Exception in start_scan endpoint: {e}")
|
||||
traceback.print_exc()
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'error': f'Internal server error: {str(e)}'
|
||||
}), 500
|
||||
|
||||
|
||||
return jsonify({'success': False, 'error': f'Internal server error: {str(e)}'}), 500
|
||||
|
||||
@app.route('/api/scan/stop', methods=['POST'])
|
||||
def stop_scan():
|
||||
"""Stop the current scan with immediate GUI feedback."""
|
||||
@@ -321,6 +283,81 @@ def get_graph_data():
|
||||
}), 500
|
||||
|
||||
|
||||
@app.route('/api/graph/node/<node_id>', methods=['DELETE'])
|
||||
def delete_graph_node(node_id):
|
||||
"""Delete a node from the graph for the current user session."""
|
||||
try:
|
||||
user_session_id, scanner = get_user_scanner()
|
||||
if not scanner:
|
||||
return jsonify({'success': False, 'error': 'No active session found'}), 404
|
||||
|
||||
success = scanner.graph.remove_node(node_id)
|
||||
|
||||
if success:
|
||||
# Persist the change
|
||||
session_manager.update_session_scanner(user_session_id, scanner)
|
||||
return jsonify({'success': True, 'message': f'Node {node_id} deleted successfully.'})
|
||||
else:
|
||||
return jsonify({'success': False, 'error': f'Node {node_id} not found in graph.'}), 404
|
||||
|
||||
except Exception as e:
|
||||
print(f"ERROR: Exception in delete_graph_node endpoint: {e}")
|
||||
traceback.print_exc()
|
||||
return jsonify({'success': False, 'error': f'Internal server error: {str(e)}'}), 500
|
||||
|
||||
|
||||
@app.route('/api/graph/revert', methods=['POST'])
|
||||
def revert_graph_action():
|
||||
"""Reverts a graph action, such as re-adding a deleted node."""
|
||||
try:
|
||||
data = request.get_json()
|
||||
if not data or 'type' not in data or 'data' not in data:
|
||||
return jsonify({'success': False, 'error': 'Invalid revert request format'}), 400
|
||||
|
||||
user_session_id, scanner = get_user_scanner()
|
||||
if not scanner:
|
||||
return jsonify({'success': False, 'error': 'No active session found'}), 404
|
||||
|
||||
action_type = data['type']
|
||||
action_data = data['data']
|
||||
|
||||
if action_type == 'delete':
|
||||
# Re-add the node
|
||||
node_to_add = action_data.get('node')
|
||||
if node_to_add:
|
||||
scanner.graph.add_node(
|
||||
node_id=node_to_add['id'],
|
||||
node_type=NodeType(node_to_add['type']),
|
||||
attributes=node_to_add.get('attributes'),
|
||||
description=node_to_add.get('description'),
|
||||
metadata=node_to_add.get('metadata')
|
||||
)
|
||||
|
||||
# Re-add the edges
|
||||
edges_to_add = action_data.get('edges', [])
|
||||
for edge in edges_to_add:
|
||||
# Add edge only if both nodes exist to prevent errors
|
||||
if scanner.graph.graph.has_node(edge['from']) and scanner.graph.graph.has_node(edge['to']):
|
||||
scanner.graph.add_edge(
|
||||
source_id=edge['from'],
|
||||
target_id=edge['to'],
|
||||
relationship_type=edge['metadata']['relationship_type'],
|
||||
confidence_score=edge['metadata']['confidence_score'],
|
||||
source_provider=edge['metadata']['source_provider'],
|
||||
raw_data=edge.get('raw_data', {})
|
||||
)
|
||||
|
||||
# Persist the change
|
||||
session_manager.update_session_scanner(user_session_id, scanner)
|
||||
return jsonify({'success': True, 'message': 'Delete action reverted successfully.'})
|
||||
|
||||
return jsonify({'success': False, 'error': f'Unknown revert action type: {action_type}'}), 400
|
||||
|
||||
except Exception as e:
|
||||
print(f"ERROR: Exception in revert_graph_action endpoint: {e}")
|
||||
traceback.print_exc()
|
||||
return jsonify({'success': False, 'error': f'Internal server error: {str(e)}'}), 500
|
||||
|
||||
|
||||
@app.route('/api/export', methods=['GET'])
|
||||
def export_results():
|
||||
@@ -367,12 +404,18 @@ def export_results():
|
||||
@app.route('/api/providers', methods=['GET'])
|
||||
def get_providers():
|
||||
"""Get information about available providers for the user session."""
|
||||
print("=== API: /api/providers called ===")
|
||||
|
||||
try:
|
||||
# Get user-specific scanner
|
||||
user_session_id, scanner = get_user_scanner()
|
||||
|
||||
if scanner:
|
||||
completed_tasks = scanner.indicators_completed
|
||||
enqueued_tasks = len(scanner.task_queue)
|
||||
print(f"DEBUG: Tasks - Completed: {completed_tasks}, Enqueued: {enqueued_tasks}")
|
||||
else:
|
||||
print("DEBUG: No active scanner session found.")
|
||||
|
||||
provider_info = scanner.get_provider_info()
|
||||
|
||||
return jsonify({
|
||||
@@ -447,113 +490,6 @@ def set_api_keys():
|
||||
'error': f'Internal server error: {str(e)}'
|
||||
}), 500
|
||||
|
||||
|
||||
@app.route('/api/session/info', methods=['GET'])
|
||||
def get_session_info():
|
||||
"""Get information about the current user session."""
|
||||
try:
|
||||
user_session_id, scanner = get_user_scanner()
|
||||
session_info = session_manager.get_session_info(user_session_id)
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'session_info': session_info
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
print(f"ERROR: Exception in get_session_info endpoint: {e}")
|
||||
traceback.print_exc()
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'error': f'Internal server error: {str(e)}'
|
||||
}), 500
|
||||
|
||||
|
||||
@app.route('/api/session/terminate', methods=['POST'])
|
||||
def terminate_session():
|
||||
"""Terminate the current user session."""
|
||||
try:
|
||||
user_session_id = session.get('dnsrecon_session_id')
|
||||
|
||||
if user_session_id:
|
||||
success = session_manager.terminate_session(user_session_id)
|
||||
# Clear Flask session
|
||||
session.pop('dnsrecon_session_id', None)
|
||||
|
||||
return jsonify({
|
||||
'success': success,
|
||||
'message': 'Session terminated' if success else 'Session not found'
|
||||
})
|
||||
else:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'error': 'No active session to terminate'
|
||||
}), 400
|
||||
|
||||
except Exception as e:
|
||||
print(f"ERROR: Exception in terminate_session endpoint: {e}")
|
||||
traceback.print_exc()
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'error': f'Internal server error: {str(e)}'
|
||||
}), 500
|
||||
|
||||
|
||||
@app.route('/api/admin/sessions', methods=['GET'])
|
||||
def list_sessions():
|
||||
"""Admin endpoint to list all active sessions."""
|
||||
try:
|
||||
sessions = session_manager.list_active_sessions()
|
||||
stats = session_manager.get_statistics()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'sessions': sessions,
|
||||
'statistics': stats
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
print(f"ERROR: Exception in list_sessions endpoint: {e}")
|
||||
traceback.print_exc()
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'error': f'Internal server error: {str(e)}'
|
||||
}), 500
|
||||
|
||||
|
||||
@app.route('/api/health', methods=['GET'])
|
||||
def health_check():
|
||||
"""Health check endpoint."""
|
||||
try:
|
||||
# Get session stats
|
||||
session_stats = session_manager.get_statistics()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'status': 'healthy',
|
||||
'timestamp': datetime.now(timezone.utc).isoformat(),
|
||||
'version': '1.0.0-phase2',
|
||||
'phase': 2,
|
||||
'features': {
|
||||
'multi_provider': True,
|
||||
'concurrent_processing': True,
|
||||
'real_time_updates': True,
|
||||
'api_key_management': True,
|
||||
'visualization': True,
|
||||
'retry_logic': True,
|
||||
'user_sessions': True,
|
||||
'session_isolation': True
|
||||
},
|
||||
'session_statistics': session_stats
|
||||
})
|
||||
except Exception as e:
|
||||
print(f"ERROR: Exception in health_check endpoint: {e}")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'error': f'Health check failed: {str(e)}'
|
||||
}), 500
|
||||
|
||||
|
||||
@app.errorhandler(404)
|
||||
def not_found(error):
|
||||
"""Handle 404 errors."""
|
||||
|
||||
1
cache/crtsh/aibkurpark_de.json
vendored
Normal file
1
cache/crtsh/aibkurpark_de.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/api_piped_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/api_piped_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"api.piped.mikoshi.de","first_cached":"2025-09-14T22:39:13.556737+00:00","last_upstream_query":"2025-09-15T15:40:40.243081+00:00","upstream_query_count":2,"certificates":[{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"api.piped.mikoshi.de","name_value":"api.piped.mikoshi.de","id":20189195635,"entry_timestamp":"2025-08-08T00:03:32.697","not_before":"2025-08-07T23:05:02","not_after":"2025-11-05T23:05:01","serial_number":"057a2344f2f0cff0a83bba587eb7326b4145","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"api.piped.mikoshi.de","name_value":"api.piped.mikoshi.de","id":20189195721,"entry_timestamp":"2025-08-08T00:03:32.49","not_before":"2025-08-07T23:05:02","not_after":"2025-11-05T23:05:01","serial_number":"057a2344f2f0cff0a83bba587eb7326b4145","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"api.piped.mikoshi.de","name_value":"api.piped.mikoshi.de","id":20060635277,"entry_timestamp":"2025-08-02T00:01:30.128","not_before":"2025-08-01T23:02:57","not_after":"2025-10-30T23:02:56","serial_number":"05a33355cd549118b90ec6c7219b2e283059","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"api.piped.mikoshi.de","name_value":"api.piped.mikoshi.de","id":20060633958,"entry_timestamp":"2025-08-02T00:01:27.809","not_before":"2025-08-01T23:02:57","not_after":"2025-10-30T23:02:56","serial_number":"05a33355cd549118b90ec6c7219b2e283059","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"api.piped.mikoshi.de","name_value":"api.piped.mikoshi.de","id":19929361217,"entry_timestamp":"2025-07-27T00:01:57.423","not_before":"2025-07-26T23:03:27","not_after":"2025-10-24T23:03:26","serial_number":"068f68538c5e6483213c6bdff93070960e6a","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"api.piped.mikoshi.de","name_value":"api.piped.mikoshi.de","id":19929361084,"entry_timestamp":"2025-07-27T00:01:57.128","not_before":"2025-07-26T23:03:27","not_after":"2025-10-24T23:03:26","serial_number":"068f68538c5e6483213c6bdff93070960e6a","result_count":2},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"api.piped.mikoshi.de","name_value":"api.piped.mikoshi.de","id":19803755935,"entry_timestamp":"2025-07-21T00:00:47.697","not_before":"2025-07-20T23:02:17","not_after":"2025-10-18T23:02:16","serial_number":"054cc0b2449a9ce1ce82324d844a1d4795f5","result_count":2},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"api.piped.mikoshi.de","name_value":"api.piped.mikoshi.de","id":19803753732,"entry_timestamp":"2025-07-21T00:00:47.407","not_before":"2025-07-20T23:02:17","not_after":"2025-10-18T23:02:16","serial_number":"054cc0b2449a9ce1ce82324d844a1d4795f5","result_count":2},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"api.piped.mikoshi.de","name_value":"api.piped.mikoshi.de","id":19668414027,"entry_timestamp":"2025-07-15T00:00:49.06","not_before":"2025-07-14T23:02:16","not_after":"2025-10-12T23:02:15","serial_number":"06ee7d4154b5a296e1cbefe4df2f6bfeba81","result_count":2},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"api.piped.mikoshi.de","name_value":"api.piped.mikoshi.de","id":19668413763,"entry_timestamp":"2025-07-15T00:00:46.299","not_before":"2025-07-14T23:02:16","not_after":"2025-10-12T23:02:15","serial_number":"06ee7d4154b5a296e1cbefe4df2f6bfeba81","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"api.piped.mikoshi.de","name_value":"api.piped.mikoshi.de","id":19523855233,"entry_timestamp":"2025-07-08T06:30:53.184","not_before":"2025-07-08T05:32:22","not_after":"2025-10-06T05:32:21","serial_number":"05956787611c0bc853c699866a6bc839eb89","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"api.piped.mikoshi.de","name_value":"api.piped.mikoshi.de","id":19523854846,"entry_timestamp":"2025-07-08T06:30:52.835","not_before":"2025-07-08T05:32:22","not_after":"2025-10-06T05:32:21","serial_number":"05956787611c0bc853c699866a6bc839eb89","result_count":2}]}
|
||||
1
cache/crtsh/app_fleischkombinat-ost_de.json
vendored
Normal file
1
cache/crtsh/app_fleischkombinat-ost_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"app.fleischkombinat-ost.de","first_cached":"2025-09-14T21:11:17.304989+00:00","last_upstream_query":"2025-09-15T09:15:09.273000+00:00","upstream_query_count":2,"certificates":[{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"app.fleischkombinat-ost.de","name_value":"app.fleischkombinat-ost.de","id":19374493240,"entry_timestamp":"2025-07-01T14:09:36.354","not_before":"2025-07-01T13:11:00","not_after":"2025-09-29T13:10:59","serial_number":"0693231ff5e3212cabc2588e38b5d8337528","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"app.fleischkombinat-ost.de","name_value":"app.fleischkombinat-ost.de","id":19374489847,"entry_timestamp":"2025-07-01T14:09:30.117","not_before":"2025-07-01T13:11:00","not_after":"2025-09-29T13:10:59","serial_number":"0693231ff5e3212cabc2588e38b5d8337528","result_count":2}]}
|
||||
1
cache/crtsh/bin_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/bin_mikoshi_de.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/c210lb_kasserver_com.json
vendored
Normal file
1
cache/crtsh/c210lb_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"c210lb.kasserver.com","first_cached":"2025-09-15T11:49:15.879325+00:00","last_upstream_query":"2025-09-15T11:49:15.879328+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"test.c210lb.kasserver.com","name_value":"test.c210lb.kasserver.com\nwww.test.c210lb.kasserver.com","id":16080758209,"entry_timestamp":"2024-12-12T09:28:08.296","not_before":"2024-12-12T08:29:37","not_after":"2025-03-12T08:29:36","serial_number":"04d8425c5834ecd8914f58bb80e86bcae4a4","result_count":3},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"test.c210lb.kasserver.com","name_value":"test.c210lb.kasserver.com\nwww.test.c210lb.kasserver.com","id":15724227115,"entry_timestamp":"2024-12-12T09:28:07.974","not_before":"2024-12-12T08:29:37","not_after":"2025-03-12T08:29:36","serial_number":"04d8425c5834ecd8914f58bb80e86bcae4a4","result_count":3}]}
|
||||
1
cache/crtsh/c214lb_kasserver_com.json
vendored
Normal file
1
cache/crtsh/c214lb_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"c214lb.kasserver.com","first_cached":"2025-09-15T11:50:40.061642+00:00","last_upstream_query":"2025-09-15T11:50:40.061644+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"test.c214lb.kasserver.com","name_value":"test.c214lb.kasserver.com\nwww.test.c214lb.kasserver.com","id":16070500096,"entry_timestamp":"2024-12-11T14:25:06.88","not_before":"2024-12-11T13:26:36","not_after":"2025-03-11T13:26:35","serial_number":"047e10af0f4b68375cc37572f400322f1339","result_count":3},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"test.c214lb.kasserver.com","name_value":"test.c214lb.kasserver.com\nwww.test.c214lb.kasserver.com","id":15713437449,"entry_timestamp":"2024-12-11T14:25:06.342","not_before":"2024-12-11T13:26:36","not_after":"2025-03-11T13:26:35","serial_number":"047e10af0f4b68375cc37572f400322f1339","result_count":3}]}
|
||||
1
cache/crtsh/cc24_dev.json
vendored
Normal file
1
cache/crtsh/cc24_dev.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/cc24_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/cc24_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"cc24.mikoshi.de","first_cached":"2025-09-15T15:35:01.674879+00:00","last_upstream_query":"2025-09-15T15:35:01.674884+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"cc24.mikoshi.de","name_value":"cc24.mikoshi.de","id":20275888640,"entry_timestamp":"2025-08-12T00:10:43.67","not_before":"2025-08-11T23:12:11","not_after":"2025-11-09T23:12:10","serial_number":"062bf40cddf77b5bb2efcc8d4394466e2f1b","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"cc24.mikoshi.de","name_value":"cc24.mikoshi.de","id":20275882615,"entry_timestamp":"2025-08-12T00:10:41.383","not_before":"2025-08-11T23:12:11","not_after":"2025-11-09T23:12:10","serial_number":"062bf40cddf77b5bb2efcc8d4394466e2f1b","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"cc24.mikoshi.de","name_value":"cc24.mikoshi.de","id":18987170126,"entry_timestamp":"2025-06-13T00:07:54.264","not_before":"2025-06-12T23:09:23","not_after":"2025-09-10T23:09:22","serial_number":"06146db771c214ec7474cb203b6ab75c21ae","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"cc24.mikoshi.de","name_value":"cc24.mikoshi.de","id":18987169887,"entry_timestamp":"2025-06-13T00:07:53.982","not_before":"2025-06-12T23:09:23","not_after":"2025-09-10T23:09:22","serial_number":"06146db771c214ec7474cb203b6ab75c21ae","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"cc24.mikoshi.de","name_value":"cc24.mikoshi.de","id":17831548102,"entry_timestamp":"2025-04-14T00:19:47.297","not_before":"2025-04-13T23:21:14","not_after":"2025-07-12T23:21:13","serial_number":"05d1504b6ed3a888b7577090d0f45a5e1f6e","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"cc24.mikoshi.de","name_value":"cc24.mikoshi.de","id":17831584469,"entry_timestamp":"2025-04-14T00:19:45.047","not_before":"2025-04-13T23:21:14","not_after":"2025-07-12T23:21:13","serial_number":"05d1504b6ed3a888b7577090d0f45a5e1f6e","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"cc24.mikoshi.de","name_value":"cc24.mikoshi.de","id":17170817151,"entry_timestamp":"2025-02-13T00:02:39.94","not_before":"2025-02-12T23:04:09","not_after":"2025-05-13T23:04:08","serial_number":"03b5b2d8ad135f1cf98224c917b797d0d844","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"cc24.mikoshi.de","name_value":"cc24.mikoshi.de","id":16704121260,"entry_timestamp":"2025-02-13T00:02:39.313","not_before":"2025-02-12T23:04:09","not_after":"2025-05-13T23:04:08","serial_number":"03b5b2d8ad135f1cf98224c917b797d0d844","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"cc24.mikoshi.de","name_value":"cc24.mikoshi.de","id":16672548148,"entry_timestamp":"2025-02-11T11:09:43.173","not_before":"2025-02-11T10:11:12","not_after":"2025-05-12T10:11:11","serial_number":"035ed55d94e5d12e255be2412e4035be70c9","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"cc24.mikoshi.de","name_value":"cc24.mikoshi.de","id":16672548664,"entry_timestamp":"2025-02-11T11:09:42.207","not_before":"2025-02-11T10:11:12","not_after":"2025-05-12T10:11:11","serial_number":"035ed55d94e5d12e255be2412e4035be70c9","result_count":2}]}
|
||||
1
cache/crtsh/cloud_aibkurpark_de.json
vendored
Normal file
1
cache/crtsh/cloud_aibkurpark_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"cloud.aibkurpark.de","first_cached":"2025-09-14T22:46:40.289218+00:00","last_upstream_query":"2025-09-15T15:41:52.573914+00:00","upstream_query_count":2,"certificates":[{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"cloud.aibkurpark.de","name_value":"cloud.aibkurpark.de","id":20275873234,"entry_timestamp":"2025-08-12T00:10:04.8","not_before":"2025-08-11T23:11:34","not_after":"2025-11-09T23:11:33","serial_number":"0502f324ff45ca5c652de0f798011836a079","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"cloud.aibkurpark.de","name_value":"cloud.aibkurpark.de","id":20275861222,"entry_timestamp":"2025-08-12T00:10:04.577","not_before":"2025-08-11T23:11:34","not_after":"2025-11-09T23:11:33","serial_number":"0502f324ff45ca5c652de0f798011836a079","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"cloud.aibkurpark.de","name_value":"cloud.aibkurpark.de","id":18987158394,"entry_timestamp":"2025-06-13T00:07:19.317","not_before":"2025-06-12T23:08:44","not_after":"2025-09-10T23:08:43","serial_number":"051a486ebf950f3ccc46e6da6bc68a6477cc","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"cloud.aibkurpark.de","name_value":"cloud.aibkurpark.de","id":18987157465,"entry_timestamp":"2025-06-13T00:07:15.025","not_before":"2025-06-12T23:08:44","not_after":"2025-09-10T23:08:43","serial_number":"051a486ebf950f3ccc46e6da6bc68a6477cc","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"cloud.aibkurpark.de","name_value":"cloud.aibkurpark.de","id":17831539356,"entry_timestamp":"2025-04-14T00:19:09.511","not_before":"2025-04-13T23:20:39","not_after":"2025-07-12T23:20:38","serial_number":"05d6f819ef2fc26e17ae6bdc186dc1f83610","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"cloud.aibkurpark.de","name_value":"cloud.aibkurpark.de","id":17831579073,"entry_timestamp":"2025-04-14T00:19:09.182","not_before":"2025-04-13T23:20:39","not_after":"2025-07-12T23:20:38","serial_number":"05d6f819ef2fc26e17ae6bdc186dc1f83610","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"cloud.aibkurpark.de","name_value":"cloud.aibkurpark.de","id":17170816053,"entry_timestamp":"2025-02-13T00:02:33.08","not_before":"2025-02-12T23:04:01","not_after":"2025-05-13T23:04:00","serial_number":"0457fefa87af5335359d49883ebe4b6c2f22","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"cloud.aibkurpark.de","name_value":"cloud.aibkurpark.de","id":16704122042,"entry_timestamp":"2025-02-13T00:02:31.914","not_before":"2025-02-12T23:04:01","not_after":"2025-05-13T23:04:00","serial_number":"0457fefa87af5335359d49883ebe4b6c2f22","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"cloud.aibkurpark.de","name_value":"cloud.aibkurpark.de","id":17122421412,"entry_timestamp":"2025-02-09T15:23:02.809","not_before":"2025-02-09T14:24:32","not_after":"2025-05-10T14:24:31","serial_number":"0338963c04daad7c5c311c00a3b6c8999e36","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"cloud.aibkurpark.de","name_value":"cloud.aibkurpark.de","id":16635575756,"entry_timestamp":"2025-02-09T15:23:02.704","not_before":"2025-02-09T14:24:32","not_after":"2025-05-10T14:24:31","serial_number":"0338963c04daad7c5c311c00a3b6c8999e36","result_count":2},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"cloud.aibkurpark.de","name_value":"cloud.aibkurpark.de","id":11633733632,"entry_timestamp":"2024-01-03T19:39:23.66","not_before":"2024-01-03T18:39:23","not_after":"2024-04-02T18:39:22","serial_number":"040656c602c0e9460d045b95c5972319d195","result_count":2},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"cloud.aibkurpark.de","name_value":"cloud.aibkurpark.de","id":11610236633,"entry_timestamp":"2024-01-03T19:39:23.48","not_before":"2024-01-03T18:39:23","not_after":"2024-04-02T18:39:22","serial_number":"040656c602c0e9460d045b95c5972319d195","result_count":2},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"cloud.aibkurpark.de","name_value":"cloud.aibkurpark.de","id":10998276570,"entry_timestamp":"2023-11-04T20:08:52.9","not_before":"2023-11-04T19:08:52","not_after":"2024-02-02T19:08:51","serial_number":"03d6d33fb298a3b24e240893175dc0606f11","result_count":2},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"cloud.aibkurpark.de","name_value":"cloud.aibkurpark.de","id":10998275332,"entry_timestamp":"2023-11-04T20:08:52.78","not_before":"2023-11-04T19:08:52","not_after":"2024-02-02T19:08:51","serial_number":"03d6d33fb298a3b24e240893175dc0606f11","result_count":2}]}
|
||||
1
cache/crtsh/cloud_cc24_dev.json
vendored
Normal file
1
cache/crtsh/cloud_cc24_dev.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"cloud.cc24.dev","first_cached":"2025-09-14T21:36:46.109884+00:00","last_upstream_query":"2025-09-14T21:36:46.109891+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"cloud.cc24.dev","name_value":"cloud.cc24.dev","id":20275852221,"entry_timestamp":"2025-08-12T00:08:47.671","not_before":"2025-08-11T23:10:16","not_after":"2025-11-09T23:10:15","serial_number":"0531b80da7039a455eb889201f8e62ba8cc9","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"cloud.cc24.dev","name_value":"cloud.cc24.dev","id":20275837420,"entry_timestamp":"2025-08-12T00:08:47.014","not_before":"2025-08-11T23:10:16","not_after":"2025-11-09T23:10:15","serial_number":"0531b80da7039a455eb889201f8e62ba8cc9","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"cloud.cc24.dev","name_value":"cloud.cc24.dev","id":18987132752,"entry_timestamp":"2025-06-13T00:06:00.445","not_before":"2025-06-12T23:07:30","not_after":"2025-09-10T23:07:29","serial_number":"066841f1e247045c3bb244d599955addbc66","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"cloud.cc24.dev","name_value":"cloud.cc24.dev","id":18987133145,"entry_timestamp":"2025-06-13T00:06:00.158","not_before":"2025-06-12T23:07:30","not_after":"2025-09-10T23:07:29","serial_number":"066841f1e247045c3bb244d599955addbc66","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"cloud.cc24.dev","name_value":"cloud.cc24.dev","id":17831462233,"entry_timestamp":"2025-04-14T00:17:56.109","not_before":"2025-04-13T23:19:24","not_after":"2025-07-12T23:19:23","serial_number":"051efd08e5e21db1fe47698ba7cb273c05b7","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"cloud.cc24.dev","name_value":"cloud.cc24.dev","id":17831396685,"entry_timestamp":"2025-04-14T00:17:54.708","not_before":"2025-04-13T23:19:24","not_after":"2025-07-12T23:19:23","serial_number":"051efd08e5e21db1fe47698ba7cb273c05b7","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"cloud.cc24.dev","name_value":"cloud.cc24.dev","id":17170810540,"entry_timestamp":"2025-02-13T00:02:07.841","not_before":"2025-02-12T23:03:37","not_after":"2025-05-13T23:03:36","serial_number":"03fe022033cd38b75215385397375a1a3741","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"cloud.cc24.dev","name_value":"cloud.cc24.dev","id":16704105434,"entry_timestamp":"2025-02-13T00:02:07.708","not_before":"2025-02-12T23:03:37","not_after":"2025-05-13T23:03:36","serial_number":"03fe022033cd38b75215385397375a1a3741","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"cloud.cc24.dev","name_value":"cloud.cc24.dev","id":17122390503,"entry_timestamp":"2025-02-09T15:21:20.386","not_before":"2025-02-09T14:22:49","not_after":"2025-05-10T14:22:48","serial_number":"031fcf4e1368ddbc276836806c2d3df6c376","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"cloud.cc24.dev","name_value":"cloud.cc24.dev","id":16635540435,"entry_timestamp":"2025-02-09T15:21:19.831","not_before":"2025-02-09T14:22:49","not_after":"2025-05-10T14:22:48","serial_number":"031fcf4e1368ddbc276836806c2d3df6c376","result_count":2}]}
|
||||
1
cache/crtsh/cloud_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/cloud_mikoshi_de.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/code_cc24_dev.json
vendored
Normal file
1
cache/crtsh/code_cc24_dev.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/console_s3_cc24_dev.json
vendored
Normal file
1
cache/crtsh/console_s3_cc24_dev.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"console.s3.cc24.dev","first_cached":"2025-09-14T21:33:25.149502+00:00","last_upstream_query":"2025-09-14T21:33:25.149505+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"console.s3.cc24.dev","name_value":"console.s3.cc24.dev","id":20287575466,"entry_timestamp":"2025-08-12T12:55:37.077","not_before":"2025-08-12T11:57:05","not_after":"2025-11-10T11:57:04","serial_number":"066bdfa83088f8d7e67284da94dd5d122ed6","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"console.s3.cc24.dev","name_value":"console.s3.cc24.dev","id":20287575457,"entry_timestamp":"2025-08-12T12:55:36.75","not_before":"2025-08-12T11:57:05","not_after":"2025-11-10T11:57:04","serial_number":"066bdfa83088f8d7e67284da94dd5d122ed6","result_count":2}]}
|
||||
1
cache/crtsh/coturn_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/coturn_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"coturn.mikoshi.de","first_cached":"2025-09-14T22:37:33.747891+00:00","last_upstream_query":"2025-09-15T15:40:16.119867+00:00","upstream_query_count":2,"certificates":[{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"coturn.mikoshi.de","name_value":"coturn.mikoshi.de","id":19208664152,"entry_timestamp":"2025-06-23T18:46:24.952","not_before":"2025-06-23T17:47:50","not_after":"2025-09-21T17:47:49","serial_number":"06d2bfd2d049388cf81d75548de9029700a8","result_count":2},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"coturn.mikoshi.de","name_value":"coturn.mikoshi.de","id":19208662980,"entry_timestamp":"2025-06-23T18:46:20.96","not_before":"2025-06-23T17:47:50","not_after":"2025-09-21T17:47:49","serial_number":"06d2bfd2d049388cf81d75548de9029700a8","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"coturn.mikoshi.de","name_value":"coturn.mikoshi.de","id":17345025382,"entry_timestamp":"2025-03-23T14:41:31.643","not_before":"2025-03-23T13:43:01","not_after":"2025-06-21T13:43:00","serial_number":"06245dcee4d40047ccbe0b4eac028e25edbe","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"coturn.mikoshi.de","name_value":"coturn.mikoshi.de","id":17345311273,"entry_timestamp":"2025-03-23T14:41:31.261","not_before":"2025-03-23T13:43:01","not_after":"2025-06-21T13:43:00","serial_number":"06245dcee4d40047ccbe0b4eac028e25edbe","result_count":2}]}
|
||||
1
cache/crtsh/coturn_ms-it-services_de.json
vendored
Normal file
1
cache/crtsh/coturn_ms-it-services_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"coturn.ms-it-services.de","first_cached":"2025-09-14T21:03:44.169328+00:00","last_upstream_query":"2025-09-15T19:08:39.390556+00:00","upstream_query_count":3,"certificates":[{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"coturn.ms-it-services.de","name_value":"coturn.ms-it-services.de","id":14781803935,"entry_timestamp":"2024-10-03T09:53:12.473","not_before":"2024-10-03T08:54:42","not_after":"2025-01-01T08:54:41","serial_number":"0395c04e522a2715eebcb7fc4ffb3da1fdba","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"coturn.ms-it-services.de","name_value":"coturn.ms-it-services.de","id":14781794097,"entry_timestamp":"2024-10-03T09:53:12.142","not_before":"2024-10-03T08:54:42","not_after":"2025-01-01T08:54:41","serial_number":"0395c04e522a2715eebcb7fc4ffb3da1fdba","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"coturn.ms-it-services.de","name_value":"coturn.ms-it-services.de","id":14773518990,"entry_timestamp":"2024-10-02T19:20:49.687","not_before":"2024-10-02T18:22:19","not_after":"2024-12-31T18:22:18","serial_number":"04f26242ac1b2ac659ac2e19ae2522ce3274","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"coturn.ms-it-services.de","name_value":"coturn.ms-it-services.de","id":14773501988,"entry_timestamp":"2024-10-02T19:20:49.356","not_before":"2024-10-02T18:22:19","not_after":"2024-12-31T18:22:18","serial_number":"04f26242ac1b2ac659ac2e19ae2522ce3274","result_count":2}]}
|
||||
1
cache/crtsh/dd10032_kasserver_com.json
vendored
Normal file
1
cache/crtsh/dd10032_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"dd10032.kasserver.com","first_cached":"2025-09-15T11:49:39.835993+00:00","last_upstream_query":"2025-09-15T11:49:39.835996+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"wernertest.dd10032.kasserver.com","name_value":"wernertest.dd10032.kasserver.com\nwww.wernertest.dd10032.kasserver.com","id":19900983152,"entry_timestamp":"2025-07-25T15:08:27.328","not_before":"2025-07-25T14:09:55","not_after":"2025-10-23T14:09:54","serial_number":"053bbb3a5a38ad78a0298a2d7de184471db7","result_count":3},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"wernertest.dd10032.kasserver.com","name_value":"wernertest.dd10032.kasserver.com\nwww.wernertest.dd10032.kasserver.com","id":19900983133,"entry_timestamp":"2025-07-25T15:08:25.843","not_before":"2025-07-25T14:09:55","not_after":"2025-10-23T14:09:54","serial_number":"053bbb3a5a38ad78a0298a2d7de184471db7","result_count":3},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"wernertest.dd10032.kasserver.com","name_value":"wernertest.dd10032.kasserver.com\nwww.wernertest.dd10032.kasserver.com","id":18625008970,"entry_timestamp":"2025-05-26T02:06:09.384","not_before":"2025-05-26T01:07:39","not_after":"2025-08-24T01:07:38","serial_number":"05b1920c57feb37d80ab28e0a745fd4e5711","result_count":3},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"wernertest.dd10032.kasserver.com","name_value":"wernertest.dd10032.kasserver.com\nwww.wernertest.dd10032.kasserver.com","id":18625008687,"entry_timestamp":"2025-05-26T02:06:09.149","not_before":"2025-05-26T01:07:39","not_after":"2025-08-24T01:07:38","serial_number":"05b1920c57feb37d80ab28e0a745fd4e5711","result_count":3},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"wernertest.dd10032.kasserver.com","name_value":"wernertest.dd10032.kasserver.com\nwww.wernertest.dd10032.kasserver.com","id":17676635727,"entry_timestamp":"2025-03-18T15:24:41.197","not_before":"2025-03-18T14:26:10","not_after":"2025-06-16T14:26:09","serial_number":"05f4a3810f24e3916e04d2b092c864e92b04","result_count":3},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"wernertest.dd10032.kasserver.com","name_value":"wernertest.dd10032.kasserver.com\nwww.wernertest.dd10032.kasserver.com","id":17214728959,"entry_timestamp":"2025-03-18T15:24:40.996","not_before":"2025-03-18T14:26:10","not_after":"2025-06-16T14:26:09","serial_number":"05f4a3810f24e3916e04d2b092c864e92b04","result_count":3}]}
|
||||
1
cache/crtsh/dd15000_kasserver_com.json
vendored
Normal file
1
cache/crtsh/dd15000_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"dd15000.kasserver.com","first_cached":"2025-09-15T11:49:51.832307+00:00","last_upstream_query":"2025-09-15T11:49:51.832313+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":16418,"issuer_name":"C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3","common_name":"litera.dd15000.kasserver.com","name_value":"litera.dd15000.kasserver.com\nwww.litera.dd15000.kasserver.com","id":17806830,"entry_timestamp":"2016-05-03T09:27:49.724","not_before":"2016-05-03T08:28:00","not_after":"2016-08-01T08:28:00","serial_number":"030cb7992941a2b2860858446a989170f2db","result_count":3}]}
|
||||
1
cache/crtsh/dd17120_kasserver_com.json
vendored
Normal file
1
cache/crtsh/dd17120_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"dd17120.kasserver.com","first_cached":"2025-09-15T11:50:52.134823+00:00","last_upstream_query":"2025-09-15T11:50:52.134826+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"letest.dd17120.kasserver.com","name_value":"letest.dd17120.kasserver.com\nwww.letest.dd17120.kasserver.com","id":3820560694,"entry_timestamp":"2020-12-23T15:35:32.403","not_before":"2020-12-23T14:35:32","not_after":"2021-03-23T14:35:32","serial_number":"04c92961dbb2d095ce5690f41ab75431abed","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"letest.dd17120.kasserver.com","name_value":"letest.dd17120.kasserver.com\nwww.letest.dd17120.kasserver.com","id":3820561611,"entry_timestamp":"2020-12-23T15:35:32.275","not_before":"2020-12-23T14:35:32","not_after":"2021-03-23T14:35:32","serial_number":"04c92961dbb2d095ce5690f41ab75431abed","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"letest.dd17120.kasserver.com","name_value":"letest.dd17120.kasserver.com\nwww.letest.dd17120.kasserver.com","id":3820541026,"entry_timestamp":"2020-12-23T15:29:20.032","not_before":"2020-12-23T14:29:19","not_after":"2021-03-23T14:29:19","serial_number":"03446bb8f1a87b4f0cb40fd1030125240eed","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"letest.dd17120.kasserver.com","name_value":"letest.dd17120.kasserver.com\nwww.letest.dd17120.kasserver.com","id":3820541140,"entry_timestamp":"2020-12-23T15:29:19.847","not_before":"2020-12-23T14:29:19","not_after":"2021-03-23T14:29:19","serial_number":"03446bb8f1a87b4f0cb40fd1030125240eed","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"letest.dd17120.kasserver.com","name_value":"letest.dd17120.kasserver.com\nwww.letest.dd17120.kasserver.com","id":3820538580,"entry_timestamp":"2020-12-23T15:28:46.532","not_before":"2020-12-23T14:28:46","not_after":"2021-03-23T14:28:46","serial_number":"03c3eb90d764b2c2a0ac04beed2e876f03e1","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"letest.dd17120.kasserver.com","name_value":"letest.dd17120.kasserver.com\nwww.letest.dd17120.kasserver.com","id":3820538531,"entry_timestamp":"2020-12-23T15:28:46.312","not_before":"2020-12-23T14:28:46","not_after":"2021-03-23T14:28:46","serial_number":"03c3eb90d764b2c2a0ac04beed2e876f03e1","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"letest.dd17120.kasserver.com","name_value":"letest.dd17120.kasserver.com\nwww.letest.dd17120.kasserver.com","id":3820537101,"entry_timestamp":"2020-12-23T15:28:12.742","not_before":"2020-12-23T14:28:12","not_after":"2021-03-23T14:28:12","serial_number":"034cd7432ae3dba0e76509de60666d58f1e4","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"letest.dd17120.kasserver.com","name_value":"letest.dd17120.kasserver.com\nwww.letest.dd17120.kasserver.com","id":3820537306,"entry_timestamp":"2020-12-23T15:28:12.459","not_before":"2020-12-23T14:28:12","not_after":"2021-03-23T14:28:12","serial_number":"034cd7432ae3dba0e76509de60666d58f1e4","result_count":3}]}
|
||||
1
cache/crtsh/dd18904_kasserver_com.json
vendored
Normal file
1
cache/crtsh/dd18904_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"dd18904.kasserver.com","first_cached":"2025-09-15T11:49:03.689534+00:00","last_upstream_query":"2025-09-15T11:49:03.689540+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"thomas.dd18904.kasserver.com","name_value":"thomas.dd18904.kasserver.com\nwww.thomas.dd18904.kasserver.com","id":6766495494,"entry_timestamp":"2022-05-20T07:44:34.589","not_before":"2022-05-20T06:44:34","not_after":"2022-08-18T06:44:33","serial_number":"046fc2606fb3d5e6438be8586ff20e296e8e","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"thomas.dd18904.kasserver.com","name_value":"thomas.dd18904.kasserver.com\nwww.thomas.dd18904.kasserver.com","id":6766489032,"entry_timestamp":"2022-05-20T07:44:34.335","not_before":"2022-05-20T06:44:34","not_after":"2022-08-18T06:44:33","serial_number":"046fc2606fb3d5e6438be8586ff20e296e8e","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"thomas.dd18904.kasserver.com","name_value":"thomas.dd18904.kasserver.com\nwww.thomas.dd18904.kasserver.com","id":6766485621,"entry_timestamp":"2022-05-20T07:42:24.52","not_before":"2022-05-20T06:42:24","not_after":"2022-08-18T06:42:23","serial_number":"03a52deebc041d7b6b4246ec8fc0455345a8","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"thomas.dd18904.kasserver.com","name_value":"thomas.dd18904.kasserver.com\nwww.thomas.dd18904.kasserver.com","id":6766485609,"entry_timestamp":"2022-05-20T07:42:24.413","not_before":"2022-05-20T06:42:24","not_after":"2022-08-18T06:42:23","serial_number":"03a52deebc041d7b6b4246ec8fc0455345a8","result_count":3}]}
|
||||
1
cache/crtsh/dd19536_kasserver_com.json
vendored
Normal file
1
cache/crtsh/dd19536_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"dd19536.kasserver.com","first_cached":"2025-09-15T11:47:57.902219+00:00","last_upstream_query":"2025-09-15T11:47:57.902224+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"login.jitsi.dd19536.kasserver.com","name_value":"login.jitsi.dd19536.kasserver.com\nwww.login.jitsi.dd19536.kasserver.com","id":14154546767,"entry_timestamp":"2024-08-12T05:52:06.917","not_before":"2024-08-12T04:53:36","not_after":"2024-11-10T04:53:35","serial_number":"04fca7ec58a44a09702875c5d2c6c9d6401b","result_count":3},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"login.jitsi.dd19536.kasserver.com","name_value":"login.jitsi.dd19536.kasserver.com\nwww.login.jitsi.dd19536.kasserver.com","id":14108590090,"entry_timestamp":"2024-08-12T05:52:06.531","not_before":"2024-08-12T04:53:36","not_after":"2024-11-10T04:53:35","serial_number":"04fca7ec58a44a09702875c5d2c6c9d6401b","result_count":3}]}
|
||||
1
cache/crtsh/dd24432_kasserver_com.json
vendored
Normal file
1
cache/crtsh/dd24432_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"dd24432.kasserver.com","first_cached":"2025-09-15T11:51:28.290098+00:00","last_upstream_query":"2025-09-15T11:51:28.290102+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":16418,"issuer_name":"C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3","common_name":"test1.dd24432.kasserver.com","name_value":"test1.dd24432.kasserver.com\nwww.test1.dd24432.kasserver.com","id":157863863,"entry_timestamp":"2017-06-20T11:17:00.314","not_before":"2017-06-20T10:17:00","not_after":"2017-09-18T10:17:00","serial_number":"03c833715204594e6946b183652f0be2055e","result_count":3}]}
|
||||
1
cache/crtsh/dd27030_kasserver_com.json
vendored
Normal file
1
cache/crtsh/dd27030_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"dd27030.kasserver.com","first_cached":"2025-09-15T11:48:39.556778+00:00","last_upstream_query":"2025-09-15T11:48:39.556783+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"wernertest.dd27030.kasserver.com","name_value":"wernertest.dd27030.kasserver.com\nwww.wernertest.dd27030.kasserver.com","id":17324952949,"entry_timestamp":"2025-03-19T12:30:16.583","not_before":"2025-03-19T11:31:44","not_after":"2025-06-17T11:31:43","serial_number":"0686091c483d6c1a55f241d41c29523fc3f0","result_count":3},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"wernertest.dd27030.kasserver.com","name_value":"wernertest.dd27030.kasserver.com\nwww.wernertest.dd27030.kasserver.com","id":17314228622,"entry_timestamp":"2025-03-19T12:30:14.317","not_before":"2025-03-19T11:31:44","not_after":"2025-06-17T11:31:43","serial_number":"0686091c483d6c1a55f241d41c29523fc3f0","result_count":3}]}
|
||||
1
cache/crtsh/dd27120_kasserver_com.json
vendored
Normal file
1
cache/crtsh/dd27120_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"dd27120.kasserver.com","first_cached":"2025-09-15T11:47:51.800693+00:00","last_upstream_query":"2025-09-15T11:47:51.800697+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":16418,"issuer_name":"C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3","common_name":"otrs2.dd27120.kasserver.com","name_value":"otrs2.dd27120.kasserver.com\nwww.otrs2.dd27120.kasserver.com","id":1476617768,"entry_timestamp":"2019-05-09T10:40:20.848","not_before":"2019-05-09T09:40:19","not_after":"2019-08-07T09:40:19","serial_number":"0342616d062ef6933a703e4de279da4e38b6","result_count":3},{"issuer_ca_id":16418,"issuer_name":"C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3","common_name":"otrs2.dd27120.kasserver.com","name_value":"otrs2.dd27120.kasserver.com\nwww.otrs2.dd27120.kasserver.com","id":1458597695,"entry_timestamp":"2019-05-09T10:40:20.006","not_before":"2019-05-09T09:40:19","not_after":"2019-08-07T09:40:19","serial_number":"0342616d062ef6933a703e4de279da4e38b6","result_count":3},{"issuer_ca_id":16418,"issuer_name":"C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3","common_name":"otrs2.dd27120.kasserver.com","name_value":"otrs2.dd27120.kasserver.com\nwww.otrs2.dd27120.kasserver.com","id":1476589088,"entry_timestamp":"2019-05-09T10:17:27.514","not_before":"2019-05-09T09:17:26","not_after":"2019-08-07T09:17:26","serial_number":"0398319827847d1df54260d7273cd5ea6d5c","result_count":3},{"issuer_ca_id":16418,"issuer_name":"C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3","common_name":"otrs2.dd27120.kasserver.com","name_value":"otrs2.dd27120.kasserver.com\nwww.otrs2.dd27120.kasserver.com","id":1457806572,"entry_timestamp":"2019-05-09T10:17:26.68","not_before":"2019-05-09T09:17:26","not_after":"2019-08-07T09:17:26","serial_number":"0398319827847d1df54260d7273cd5ea6d5c","result_count":3}]}
|
||||
1
cache/crtsh/dd27932_kasserver_com.json
vendored
Normal file
1
cache/crtsh/dd27932_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"dd27932.kasserver.com","first_cached":"2025-09-15T11:48:51.718464+00:00","last_upstream_query":"2025-09-15T11:48:51.718468+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":16418,"issuer_name":"C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3","common_name":"switest.dd27932.kasserver.com","name_value":"switest.dd27932.kasserver.com\nwww.switest.dd27932.kasserver.com","id":99317583,"entry_timestamp":"2017-03-05T01:00:32.21","not_before":"2017-03-05T00:01:00","not_after":"2017-06-03T00:01:00","serial_number":"03e0f1fb8ff2a8a742ee45c2da39e4bd68ed","result_count":3},{"issuer_ca_id":16418,"issuer_name":"C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3","common_name":"switest.dd27932.kasserver.com","name_value":"switest.dd27932.kasserver.com\nwww.switest.dd27932.kasserver.com","id":69451932,"entry_timestamp":"2016-12-21T10:01:06.051","not_before":"2016-12-21T09:01:00","not_after":"2017-03-21T09:01:00","serial_number":"03a4f79d5ed3c6661f6f2c430a1a1546e0d8","result_count":3}]}
|
||||
1
cache/crtsh/dd28826_kasserver_com.json
vendored
Normal file
1
cache/crtsh/dd28826_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"dd28826.kasserver.com","first_cached":"2025-09-15T11:50:28.011163+00:00","last_upstream_query":"2025-09-15T11:50:28.011167+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":16418,"issuer_name":"C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3","common_name":"161gs86116.dd28826.kasserver.com","name_value":"161gs86116.dd28826.kasserver.com\nwww.161gs86116.dd28826.kasserver.com","id":138535930,"entry_timestamp":"2017-05-15T11:15:13.509","not_before":"2017-05-15T10:15:00","not_after":"2017-08-13T10:15:00","serial_number":"03bca24f2de29889f514c04523a1f8945136","result_count":3},{"issuer_ca_id":16418,"issuer_name":"C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3","common_name":"161gs86116.dd28826.kasserver.com","name_value":"161gs86116.dd28826.kasserver.com\nwww.161gs86116.dd28826.kasserver.com","id":40903630,"entry_timestamp":"2016-10-07T12:00:36.009","not_before":"2016-10-07T11:01:00","not_after":"2017-01-05T11:01:00","serial_number":"0385d74f0a39572de61c2b7765c94d848c82","result_count":3},{"issuer_ca_id":16418,"issuer_name":"C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3","common_name":"161gs86116.dd28826.kasserver.com","name_value":"161gs86116.dd28826.kasserver.com\nwww.161gs86116.dd28826.kasserver.com","id":40901166,"entry_timestamp":"2016-10-07T11:54:34.702","not_before":"2016-10-07T10:55:00","not_after":"2017-01-05T10:55:00","serial_number":"039ef12598cb7aaf33c04d4c90983b0829fe","result_count":3}]}
|
||||
1
cache/crtsh/dd30002_kasserver_com.json
vendored
Normal file
1
cache/crtsh/dd30002_kasserver_com.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/dd39314_kasserver_com.json
vendored
Normal file
1
cache/crtsh/dd39314_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"dd39314.kasserver.com","first_cached":"2025-09-15T11:47:59.899335+00:00","last_upstream_query":"2025-09-15T11:47:59.899339+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":16418,"issuer_name":"C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3","common_name":"http2.dd39314.kasserver.com","name_value":"http2.dd39314.kasserver.com\nwww.http2.dd39314.kasserver.com","id":35834556,"entry_timestamp":"2016-09-27T11:27:08.538","not_before":"2016-09-27T10:27:00","not_after":"2016-12-26T10:27:00","serial_number":"03024be246b9452e3e5e7dbed7e502a1ee16","result_count":3}]}
|
||||
1
cache/crtsh/dd39910_kasserver_com.json
vendored
Normal file
1
cache/crtsh/dd39910_kasserver_com.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/dd44624_kasserver_com.json
vendored
Normal file
1
cache/crtsh/dd44624_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"dd44624.kasserver.com","first_cached":"2025-09-15T11:50:16.030946+00:00","last_upstream_query":"2025-09-15T11:50:16.030952+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":16418,"issuer_name":"C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3","common_name":"aitest.dd44624.kasserver.com","name_value":"aitest.dd44624.kasserver.com\nwww.aitest.dd44624.kasserver.com","id":2366400329,"entry_timestamp":"2020-01-21T09:28:49.996","not_before":"2020-01-21T08:28:49","not_after":"2020-04-20T08:28:49","serial_number":"0319ee129ecf09b2a08a98d6cd7d92062efe","result_count":3},{"issuer_ca_id":16418,"issuer_name":"C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3","common_name":"aitest.dd44624.kasserver.com","name_value":"aitest.dd44624.kasserver.com\nwww.aitest.dd44624.kasserver.com","id":2355073809,"entry_timestamp":"2020-01-21T09:28:49.389","not_before":"2020-01-21T08:28:49","not_after":"2020-04-20T08:28:49","serial_number":"0319ee129ecf09b2a08a98d6cd7d92062efe","result_count":3}]}
|
||||
1
cache/crtsh/dd46900_kasserver_com.json
vendored
Normal file
1
cache/crtsh/dd46900_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"dd46900.kasserver.com","first_cached":"2025-09-15T11:49:27.811675+00:00","last_upstream_query":"2025-09-15T11:49:27.811679+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"wernertest.dd46900.kasserver.com","name_value":"wernertest.dd46900.kasserver.com\nwww.wernertest.dd46900.kasserver.com","id":19891708696,"entry_timestamp":"2025-07-25T04:48:43.91","not_before":"2025-07-25T03:50:12","not_after":"2025-10-23T03:50:11","serial_number":"06ab9c27b7c779ee95cb82b66f985d87601c","result_count":3},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"wernertest.dd46900.kasserver.com","name_value":"wernertest.dd46900.kasserver.com\nwww.wernertest.dd46900.kasserver.com","id":19891706706,"entry_timestamp":"2025-07-25T04:48:42.387","not_before":"2025-07-25T03:50:12","not_after":"2025-10-23T03:50:11","serial_number":"06ab9c27b7c779ee95cb82b66f985d87601c","result_count":3},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"wernertest.dd46900.kasserver.com","name_value":"wernertest.dd46900.kasserver.com\nwww.wernertest.dd46900.kasserver.com","id":18618700336,"entry_timestamp":"2025-05-25T17:22:29.664","not_before":"2025-05-25T16:23:59","not_after":"2025-08-23T16:23:58","serial_number":"05abb39369b76694a079e1109a93e616bf18","result_count":3},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"wernertest.dd46900.kasserver.com","name_value":"wernertest.dd46900.kasserver.com\nwww.wernertest.dd46900.kasserver.com","id":18618704556,"entry_timestamp":"2025-05-25T17:22:29.449","not_before":"2025-05-25T16:23:59","not_after":"2025-08-23T16:23:58","serial_number":"05abb39369b76694a079e1109a93e616bf18","result_count":3},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"wernertest.dd46900.kasserver.com","name_value":"wernertest.dd46900.kasserver.com\nwww.wernertest.dd46900.kasserver.com","id":17676537327,"entry_timestamp":"2025-03-18T15:18:10.621","not_before":"2025-03-18T14:19:39","not_after":"2025-06-16T14:19:38","serial_number":"0610cb215ef16b2619af24f76349e349939c","result_count":3},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"wernertest.dd46900.kasserver.com","name_value":"wernertest.dd46900.kasserver.com\nwww.wernertest.dd46900.kasserver.com","id":17230420365,"entry_timestamp":"2025-03-18T15:18:09.941","not_before":"2025-03-18T14:19:39","not_after":"2025-06-16T14:19:38","serial_number":"0610cb215ef16b2619af24f76349e349939c","result_count":3}]}
|
||||
1
cache/crtsh/dd55600_kasserver_com.json
vendored
Normal file
1
cache/crtsh/dd55600_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"dd55600.kasserver.com","first_cached":"2025-09-15T11:47:55.878914+00:00","last_upstream_query":"2025-09-15T11:47:55.878918+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"letest.dd55600.kasserver.com","name_value":"letest.dd55600.kasserver.com\nwww.letest.dd55600.kasserver.com","id":20031222371,"entry_timestamp":"2025-07-31T13:43:52.442","not_before":"2025-07-31T12:45:20","not_after":"2025-10-29T12:45:19","serial_number":"06eb0a6229e52eabee01d67ad7a999665794","result_count":3},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"letest.dd55600.kasserver.com","name_value":"letest.dd55600.kasserver.com\nwww.letest.dd55600.kasserver.com","id":20031228125,"entry_timestamp":"2025-07-31T13:43:50.126","not_before":"2025-07-31T12:45:20","not_after":"2025-10-29T12:45:19","serial_number":"06eb0a6229e52eabee01d67ad7a999665794","result_count":3}]}
|
||||
1
cache/crtsh/deck0_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/deck0_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"deck0.mikoshi.de","first_cached":"2025-09-15T15:38:47.110406+00:00","last_upstream_query":"2025-09-15T15:38:47.110410+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"deck0.mikoshi.de","name_value":"deck0.mikoshi.de","id":20275849021,"entry_timestamp":"2025-08-12T00:08:09.613","not_before":"2025-08-11T23:09:39","not_after":"2025-11-09T23:09:38","serial_number":"05785ec3742887857667078bfa75b21eda78","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"deck0.mikoshi.de","name_value":"deck0.mikoshi.de","id":20275847401,"entry_timestamp":"2025-08-12T00:08:09.412","not_before":"2025-08-11T23:09:39","not_after":"2025-11-09T23:09:38","serial_number":"05785ec3742887857667078bfa75b21eda78","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"deck0.mikoshi.de","name_value":"deck0.mikoshi.de","id":18987122782,"entry_timestamp":"2025-06-13T00:05:25.356","not_before":"2025-06-12T23:06:50","not_after":"2025-09-10T23:06:49","serial_number":"051c77c6054cfd6720e600ff7f5a9a42b40f","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"deck0.mikoshi.de","name_value":"deck0.mikoshi.de","id":18987120711,"entry_timestamp":"2025-06-13T00:05:21.025","not_before":"2025-06-12T23:06:50","not_after":"2025-09-10T23:06:49","serial_number":"051c77c6054cfd6720e600ff7f5a9a42b40f","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"deck0.mikoshi.de","name_value":"deck0.mikoshi.de","id":17831463793,"entry_timestamp":"2025-04-14T00:17:17.936","not_before":"2025-04-13T23:18:47","not_after":"2025-07-12T23:18:46","serial_number":"0652fad83eb95b52eb2a47457872b0408fef","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"deck0.mikoshi.de","name_value":"deck0.mikoshi.de","id":17831393060,"entry_timestamp":"2025-04-14T00:17:17.692","not_before":"2025-04-13T23:18:47","not_after":"2025-07-12T23:18:46","serial_number":"0652fad83eb95b52eb2a47457872b0408fef","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"deck0.mikoshi.de","name_value":"deck0.mikoshi.de","id":16704809501,"entry_timestamp":"2025-02-13T00:02:01.475","not_before":"2025-02-12T23:03:29","not_after":"2025-05-13T23:03:28","serial_number":"03336511cc977e31ed4534ee782a8b856e03","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"deck0.mikoshi.de","name_value":"deck0.mikoshi.de","id":16704111156,"entry_timestamp":"2025-02-13T00:01:59.346","not_before":"2025-02-12T23:03:29","not_after":"2025-05-13T23:03:28","serial_number":"03336511cc977e31ed4534ee782a8b856e03","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"deck0.mikoshi.de","name_value":"deck0.mikoshi.de","id":17122385653,"entry_timestamp":"2025-02-09T15:20:45.345","not_before":"2025-02-09T14:22:14","not_after":"2025-05-10T14:22:13","serial_number":"04b3ee603f5f877a0acbb32ff5e68570fc4e","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"deck0.mikoshi.de","name_value":"deck0.mikoshi.de","id":16636455622,"entry_timestamp":"2025-02-09T15:20:45.058","not_before":"2025-02-09T14:22:14","not_after":"2025-05-10T14:22:13","serial_number":"04b3ee603f5f877a0acbb32ff5e68570fc4e","result_count":2}]}
|
||||
1
cache/crtsh/deck_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/deck_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"deck.mikoshi.de","first_cached":"2025-09-15T15:37:15.209223+00:00","last_upstream_query":"2025-09-15T15:37:15.209226+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"deck.mikoshi.de","name_value":"deck.mikoshi.de","id":20296619407,"entry_timestamp":"2025-08-13T00:04:28.809","not_before":"2025-08-12T23:05:56","not_after":"2025-11-10T23:05:55","serial_number":"068288286ab2af41b51f2a6f0e4c6d6343ed","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"deck.mikoshi.de","name_value":"deck.mikoshi.de","id":20296618002,"entry_timestamp":"2025-08-13T00:04:26.633","not_before":"2025-08-12T23:05:56","not_after":"2025-11-10T23:05:55","serial_number":"068288286ab2af41b51f2a6f0e4c6d6343ed","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"deck.mikoshi.de","name_value":"deck.mikoshi.de","id":19007501639,"entry_timestamp":"2025-06-14T00:02:02.957","not_before":"2025-06-13T23:03:32","not_after":"2025-09-11T23:03:31","serial_number":"065d212df70f76cc2d2e5fb1cd3372785d45","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"deck.mikoshi.de","name_value":"deck.mikoshi.de","id":19007529630,"entry_timestamp":"2025-06-14T00:02:02.71","not_before":"2025-06-13T23:03:32","not_after":"2025-09-11T23:03:31","serial_number":"065d212df70f76cc2d2e5fb1cd3372785d45","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"deck.mikoshi.de","name_value":"deck.mikoshi.de","id":17831396750,"entry_timestamp":"2025-04-14T00:16:41.797","not_before":"2025-04-13T23:18:10","not_after":"2025-07-12T23:18:09","serial_number":"063db5541056907cd7d1a6dd6b90337970cf","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"deck.mikoshi.de","name_value":"deck.mikoshi.de","id":17831377445,"entry_timestamp":"2025-04-14T00:16:41.02","not_before":"2025-04-13T23:18:10","not_after":"2025-07-12T23:18:09","serial_number":"063db5541056907cd7d1a6dd6b90337970cf","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"deck.mikoshi.de","name_value":"deck.mikoshi.de","id":16704809458,"entry_timestamp":"2025-02-13T00:01:53.117","not_before":"2025-02-12T23:03:22","not_after":"2025-05-13T23:03:21","serial_number":"04dd85a6d9cafec66b0b7ca3753191d347fa","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"deck.mikoshi.de","name_value":"deck.mikoshi.de","id":16704110323,"entry_timestamp":"2025-02-13T00:01:52.905","not_before":"2025-02-12T23:03:22","not_after":"2025-05-13T23:03:21","serial_number":"04dd85a6d9cafec66b0b7ca3753191d347fa","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"deck.mikoshi.de","name_value":"deck.mikoshi.de","id":16636696795,"entry_timestamp":"2025-02-09T15:20:11.318","not_before":"2025-02-09T14:21:40","not_after":"2025-05-10T14:21:39","serial_number":"043f12b3e0be22dd52133924bbb5c1ded954","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"deck.mikoshi.de","name_value":"deck.mikoshi.de","id":16635534286,"entry_timestamp":"2025-02-09T15:20:10.545","not_before":"2025-02-09T14:21:40","not_after":"2025-05-10T14:21:39","serial_number":"043f12b3e0be22dd52133924bbb5c1ded954","result_count":2}]}
|
||||
1
cache/crtsh/dev_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/dev_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"dev.mikoshi.de","first_cached":"2025-09-15T15:39:15.810886+00:00","last_upstream_query":"2025-09-15T15:39:15.810888+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"dev.mikoshi.de","name_value":"dev.mikoshi.de","id":20275786291,"entry_timestamp":"2025-08-12T00:05:23.212","not_before":"2025-08-11T23:06:52","not_after":"2025-11-09T23:06:51","serial_number":"062b3368dce240f65370e3fcf5b868f3cb16","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"dev.mikoshi.de","name_value":"dev.mikoshi.de","id":20275788995,"entry_timestamp":"2025-08-12T00:05:22.899","not_before":"2025-08-11T23:06:52","not_after":"2025-11-09T23:06:51","serial_number":"062b3368dce240f65370e3fcf5b868f3cb16","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"dev.mikoshi.de","name_value":"dev.mikoshi.de","id":18987037224,"entry_timestamp":"2025-06-13T00:03:00.049","not_before":"2025-06-12T23:04:25","not_after":"2025-09-10T23:04:24","serial_number":"05dac28fc29cc4ffa07ebb5d652b5d3c220d","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"dev.mikoshi.de","name_value":"dev.mikoshi.de","id":18987083431,"entry_timestamp":"2025-06-13T00:02:56.025","not_before":"2025-06-12T23:04:25","not_after":"2025-09-10T23:04:24","serial_number":"05dac28fc29cc4ffa07ebb5d652b5d3c220d","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"dev.mikoshi.de","name_value":"dev.mikoshi.de","id":17831380009,"entry_timestamp":"2025-04-14T00:13:37.609","not_before":"2025-04-13T23:15:06","not_after":"2025-07-12T23:15:05","serial_number":"05acf9ab2ed9a117ef386d05d6cfae3ed258","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"dev.mikoshi.de","name_value":"dev.mikoshi.de","id":17831368386,"entry_timestamp":"2025-04-14T00:13:36.704","not_before":"2025-04-13T23:15:06","not_after":"2025-07-12T23:15:05","serial_number":"05acf9ab2ed9a117ef386d05d6cfae3ed258","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"dev.mikoshi.de","name_value":"dev.mikoshi.de","id":17170799512,"entry_timestamp":"2025-02-13T00:01:03.867","not_before":"2025-02-12T23:02:33","not_after":"2025-05-13T23:02:32","serial_number":"04324a24cab88153022dd4a82cd03a1d5bec","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"dev.mikoshi.de","name_value":"dev.mikoshi.de","id":16705238915,"entry_timestamp":"2025-02-13T00:01:03.58","not_before":"2025-02-12T23:02:33","not_after":"2025-05-13T23:02:32","serial_number":"04324a24cab88153022dd4a82cd03a1d5bec","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"dev.mikoshi.de","name_value":"dev.mikoshi.de","id":16635493913,"entry_timestamp":"2025-02-09T15:16:09.908","not_before":"2025-02-09T14:17:39","not_after":"2025-05-10T14:17:38","serial_number":"03567895f69539097a4621b1b2f68c04f75c","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"dev.mikoshi.de","name_value":"dev.mikoshi.de","id":16635494768,"entry_timestamp":"2025-02-09T15:16:09.457","not_before":"2025-02-09T14:17:39","not_after":"2025-05-10T14:17:38","serial_number":"03567895f69539097a4621b1b2f68c04f75c","result_count":2}]}
|
||||
1
cache/crtsh/dnsrecon_cc24_dev.json
vendored
Normal file
1
cache/crtsh/dnsrecon_cc24_dev.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"dnsrecon.cc24.dev","first_cached":"2025-09-14T21:33:58.773156+00:00","last_upstream_query":"2025-09-14T21:33:58.773159+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295809,"issuer_name":"C=US, O=Let's Encrypt, CN=E8","common_name":"dnsrecon.cc24.dev","name_value":"dnsrecon.cc24.dev","id":20965278266,"entry_timestamp":"2025-09-12T09:49:23.247","not_before":"2025-09-12T08:50:53","not_after":"2025-12-11T08:50:52","serial_number":"060fbe619a364febd85aebccb1c6fcf7153f","result_count":2},{"issuer_ca_id":295809,"issuer_name":"C=US, O=Let's Encrypt, CN=E8","common_name":"dnsrecon.cc24.dev","name_value":"dnsrecon.cc24.dev","id":20965277886,"entry_timestamp":"2025-09-12T09:49:23.039","not_before":"2025-09-12T08:50:53","not_after":"2025-12-11T08:50:52","serial_number":"060fbe619a364febd85aebccb1c6fcf7153f","result_count":2}]}
|
||||
1
cache/crtsh/einkauf_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/einkauf_mikoshi_de.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/electrum_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/electrum_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"electrum.mikoshi.de","first_cached":"2025-09-15T15:35:50.844792+00:00","last_upstream_query":"2025-09-15T15:35:50.844796+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"electrum.mikoshi.de","name_value":"electrum.mikoshi.de","id":20275738086,"entry_timestamp":"2025-08-12T00:01:00.455","not_before":"2025-08-11T23:02:29","not_after":"2025-11-09T23:02:28","serial_number":"0607acd92d2e4ed2c21a0fd8879b4fcc1da6","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"electrum.mikoshi.de","name_value":"electrum.mikoshi.de","id":20275720683,"entry_timestamp":"2025-08-12T00:01:00.121","not_before":"2025-08-11T23:02:29","not_after":"2025-11-09T23:02:28","serial_number":"0607acd92d2e4ed2c21a0fd8879b4fcc1da6","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"electrum.mikoshi.de","name_value":"electrum.mikoshi.de","id":18987049091,"entry_timestamp":"2025-06-13T00:00:34.9","not_before":"2025-06-12T23:02:04","not_after":"2025-09-10T23:02:03","serial_number":"05b5b53d270451a0c1287c9aad800bf21a5b","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"electrum.mikoshi.de","name_value":"electrum.mikoshi.de","id":18987049255,"entry_timestamp":"2025-06-13T00:00:34.45","not_before":"2025-06-12T23:02:04","not_after":"2025-09-10T23:02:03","serial_number":"05b5b53d270451a0c1287c9aad800bf21a5b","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"electrum.mikoshi.de","name_value":"electrum.mikoshi.de","id":17831223577,"entry_timestamp":"2025-04-14T00:03:09.379","not_before":"2025-04-13T23:04:37","not_after":"2025-07-12T23:04:36","serial_number":"06f83ec1efdf5ec3387c8f241234448b1618","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"electrum.mikoshi.de","name_value":"electrum.mikoshi.de","id":17831306766,"entry_timestamp":"2025-04-14T00:03:07.489","not_before":"2025-04-13T23:04:37","not_after":"2025-07-12T23:04:36","serial_number":"06f83ec1efdf5ec3387c8f241234448b1618","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"electrum.mikoshi.de","name_value":"electrum.mikoshi.de","id":17170790341,"entry_timestamp":"2025-02-13T00:00:15.841","not_before":"2025-02-12T23:01:45","not_after":"2025-05-13T23:01:44","serial_number":"0400d022ec8e2ded90606b9276eef71a1664","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"electrum.mikoshi.de","name_value":"electrum.mikoshi.de","id":16704088726,"entry_timestamp":"2025-02-13T00:00:15.527","not_before":"2025-02-12T23:01:45","not_after":"2025-05-13T23:01:44","serial_number":"0400d022ec8e2ded90606b9276eef71a1664","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"electrum.mikoshi.de","name_value":"electrum.mikoshi.de","id":16635426761,"entry_timestamp":"2025-02-09T15:12:05.797","not_before":"2025-02-09T14:13:35","not_after":"2025-05-10T14:13:34","serial_number":"045de320229498cb69676d307ec9467fa83e","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"electrum.mikoshi.de","name_value":"electrum.mikoshi.de","id":16635425561,"entry_timestamp":"2025-02-09T15:12:05.539","not_before":"2025-02-09T14:13:35","not_after":"2025-05-10T14:13:34","serial_number":"045de320229498cb69676d307ec9467fa83e","result_count":2}]}
|
||||
1
cache/crtsh/element_cc24_dev.json
vendored
Normal file
1
cache/crtsh/element_cc24_dev.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/fleischkombinat-ost_de.json
vendored
Normal file
1
cache/crtsh/fleischkombinat-ost_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"fleischkombinat-ost.de","first_cached":"2025-09-14T21:11:00.028593+00:00","last_upstream_query":"2025-09-15T09:15:04.796648+00:00","upstream_query_count":2,"certificates":[{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"app.fleischkombinat-ost.de","name_value":"app.fleischkombinat-ost.de","id":19374493240,"entry_timestamp":"2025-07-01T14:09:36.354","not_before":"2025-07-01T13:11:00","not_after":"2025-09-29T13:10:59","serial_number":"0693231ff5e3212cabc2588e38b5d8337528","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"app.fleischkombinat-ost.de","name_value":"app.fleischkombinat-ost.de","id":19374489847,"entry_timestamp":"2025-07-01T14:09:30.117","not_before":"2025-07-01T13:11:00","not_after":"2025-09-29T13:10:59","serial_number":"0693231ff5e3212cabc2588e38b5d8337528","result_count":2},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"fleischkombinat-ost.de","name_value":"fleischkombinat-ost.de","id":19374378473,"entry_timestamp":"2025-07-01T14:01:50.593","not_before":"2025-07-01T13:03:20","not_after":"2025-09-29T13:03:19","serial_number":"06315dfed8c93d1497c26b21c448857b6f2c","result_count":2},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"fleischkombinat-ost.de","name_value":"fleischkombinat-ost.de","id":19374376791,"entry_timestamp":"2025-07-01T14:01:50.385","not_before":"2025-07-01T13:03:20","not_after":"2025-09-29T13:03:19","serial_number":"06315dfed8c93d1497c26b21c448857b6f2c","result_count":2},{"issuer_ca_id":158800,"issuer_name":"C=AT, O=ZeroSSL, CN=ZeroSSL RSA Domain Secure Site CA","common_name":"*.fleischkombinat-ost.de","name_value":"*.fleischkombinat-ost.de\nfleischkombinat-ost.de","id":19369530786,"entry_timestamp":"2025-07-01T09:12:02.496","not_before":"2025-07-01T00:00:00","not_after":"2025-09-29T23:59:59","serial_number":"07c51a2c164b3a6c5769b0e03a9f4085","result_count":3},{"issuer_ca_id":158800,"issuer_name":"C=AT, O=ZeroSSL, CN=ZeroSSL RSA Domain Secure Site CA","common_name":"*.fleischkombinat-ost.de","name_value":"*.fleischkombinat-ost.de\nfleischkombinat-ost.de","id":19369530780,"entry_timestamp":"2025-07-01T09:12:01.04","not_before":"2025-07-01T00:00:00","not_after":"2025-09-29T23:59:59","serial_number":"07c51a2c164b3a6c5769b0e03a9f4085","result_count":3}]}
|
||||
1
cache/crtsh/forensics_cc24_dev.json
vendored
Normal file
1
cache/crtsh/forensics_cc24_dev.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/forum_cc24_dev.json
vendored
Normal file
1
cache/crtsh/forum_cc24_dev.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"forum.cc24.dev","first_cached":"2025-09-14T21:37:55.208070+00:00","last_upstream_query":"2025-09-14T21:37:55.208073+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"forum.cc24.dev","name_value":"forum.cc24.dev","id":20275855672,"entry_timestamp":"2025-08-12T00:09:25.872","not_before":"2025-08-11T23:10:53","not_after":"2025-11-09T23:10:52","serial_number":"05e7fa80df3e45a7ecec44d25dafad0904e5","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"forum.cc24.dev","name_value":"forum.cc24.dev","id":20275850214,"entry_timestamp":"2025-08-12T00:09:23.776","not_before":"2025-08-11T23:10:53","not_after":"2025-11-09T23:10:52","serial_number":"05e7fa80df3e45a7ecec44d25dafad0904e5","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"forum.cc24.dev","name_value":"forum.cc24.dev","id":18987146858,"entry_timestamp":"2025-06-13T00:06:40.302","not_before":"2025-06-12T23:08:03","not_after":"2025-09-10T23:08:02","serial_number":"055efe65125ee83f14545a2f5d99590e635f","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"forum.cc24.dev","name_value":"forum.cc24.dev","id":18987145127,"entry_timestamp":"2025-06-13T00:06:34.097","not_before":"2025-06-12T23:08:03","not_after":"2025-09-10T23:08:02","serial_number":"055efe65125ee83f14545a2f5d99590e635f","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"forum.cc24.dev","name_value":"forum.cc24.dev","id":17831472866,"entry_timestamp":"2025-04-14T00:18:33.004","not_before":"2025-04-13T23:20:02","not_after":"2025-07-12T23:20:01","serial_number":"064fefe879ff5e732ce6c6a63f1e911db568","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"forum.cc24.dev","name_value":"forum.cc24.dev","id":17831402949,"entry_timestamp":"2025-04-14T00:18:32.224","not_before":"2025-04-13T23:20:02","not_after":"2025-07-12T23:20:01","serial_number":"064fefe879ff5e732ce6c6a63f1e911db568","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"forum.cc24.dev","name_value":"forum.cc24.dev","id":17170813968,"entry_timestamp":"2025-02-13T00:02:16.332","not_before":"2025-02-12T23:03:44","not_after":"2025-05-13T23:03:43","serial_number":"036e8e11288b54228648cab399477ea43c56","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"forum.cc24.dev","name_value":"forum.cc24.dev","id":16705244862,"entry_timestamp":"2025-02-13T00:02:14.119","not_before":"2025-02-12T23:03:44","not_after":"2025-05-13T23:03:43","serial_number":"036e8e11288b54228648cab399477ea43c56","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"forum.cc24.dev","name_value":"forum.cc24.dev","id":17122401304,"entry_timestamp":"2025-02-09T15:21:53.869","not_before":"2025-02-09T14:23:23","not_after":"2025-05-10T14:23:22","serial_number":"03e0928358e7636b3cc59a7dbc3b188bd7ca","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"forum.cc24.dev","name_value":"forum.cc24.dev","id":16636457115,"entry_timestamp":"2025-02-09T15:21:53.738","not_before":"2025-02-09T14:23:23","not_after":"2025-05-10T14:23:22","serial_number":"03e0928358e7636b3cc59a7dbc3b188bd7ca","result_count":2}]}
|
||||
1
cache/crtsh/git_cc24_dev.json
vendored
Normal file
1
cache/crtsh/git_cc24_dev.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/git_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/git_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"git.mikoshi.de","first_cached":"2025-09-14T22:41:53.620008+00:00","last_upstream_query":"2025-09-15T15:34:53.671880+00:00","upstream_query_count":2,"certificates":[{"issuer_ca_id":295817,"issuer_name":"C=US, O=Let's Encrypt, CN=R13","common_name":"git.mikoshi.de","name_value":"git.mikoshi.de","id":20885174925,"entry_timestamp":"2025-09-09T00:00:36.192","not_before":"2025-09-08T23:02:04","not_after":"2025-12-07T23:02:03","serial_number":"0615e6baefd21c126c2cdddf6dcb2507d56f","result_count":2},{"issuer_ca_id":295817,"issuer_name":"C=US, O=Let's Encrypt, CN=R13","common_name":"git.mikoshi.de","name_value":"git.mikoshi.de","id":20885174361,"entry_timestamp":"2025-09-09T00:00:34.086","not_before":"2025-09-08T23:02:04","not_after":"2025-12-07T23:02:03","serial_number":"0615e6baefd21c126c2cdddf6dcb2507d56f","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"git.mikoshi.de","name_value":"git.mikoshi.de","id":19559742374,"entry_timestamp":"2025-07-10T00:00:34.37","not_before":"2025-07-09T23:02:04","not_after":"2025-10-07T23:02:03","serial_number":"06d9b4e5782769647aa336db245fff31f620","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"git.mikoshi.de","name_value":"git.mikoshi.de","id":19559742305,"entry_timestamp":"2025-07-10T00:00:34.165","not_before":"2025-07-09T23:02:04","not_after":"2025-10-07T23:02:03","serial_number":"06d9b4e5782769647aa336db245fff31f620","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"git.mikoshi.de","name_value":"git.mikoshi.de","id":18325953073,"entry_timestamp":"2025-05-10T12:59:59.883","not_before":"2025-05-10T12:01:29","not_after":"2025-08-08T12:01:28","serial_number":"06b8ea37731e6560b6c67edbefbacfd4105c","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"git.mikoshi.de","name_value":"git.mikoshi.de","id":18325952875,"entry_timestamp":"2025-05-10T12:59:59.504","not_before":"2025-05-10T12:01:29","not_after":"2025-08-08T12:01:28","serial_number":"06b8ea37731e6560b6c67edbefbacfd4105c","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"git.mikoshi.de","name_value":"git.mikoshi.de","id":17831317349,"entry_timestamp":"2025-04-14T00:13:00.421","not_before":"2025-04-13T23:14:28","not_after":"2025-07-12T23:14:27","serial_number":"056bf6f5e9efb81381e56fbd6e28c32f4f90","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"git.mikoshi.de","name_value":"git.mikoshi.de","id":17831304428,"entry_timestamp":"2025-04-14T00:12:58.339","not_before":"2025-04-13T23:14:28","not_after":"2025-07-12T23:14:27","serial_number":"056bf6f5e9efb81381e56fbd6e28c32f4f90","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"git.mikoshi.de","name_value":"git.mikoshi.de","id":17170797746,"entry_timestamp":"2025-02-13T00:00:56.931","not_before":"2025-02-12T23:02:26","not_after":"2025-05-13T23:02:25","serial_number":"03b7b4c4c6233e74e3ad23a7bb2e455fcc3f","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"git.mikoshi.de","name_value":"git.mikoshi.de","id":16705238631,"entry_timestamp":"2025-02-13T00:00:56.689","not_before":"2025-02-12T23:02:26","not_after":"2025-05-13T23:02:25","serial_number":"03b7b4c4c6233e74e3ad23a7bb2e455fcc3f","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"git.mikoshi.de","name_value":"git.mikoshi.de","id":17122277510,"entry_timestamp":"2025-02-09T15:15:36.076","not_before":"2025-02-09T14:17:05","not_after":"2025-05-10T14:17:04","serial_number":"0404f208620f990403046876d32991e8f320","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"git.mikoshi.de","name_value":"git.mikoshi.de","id":16635498764,"entry_timestamp":"2025-02-09T15:15:35.493","not_before":"2025-02-09T14:17:05","not_after":"2025-05-10T14:17:04","serial_number":"0404f208620f990403046876d32991e8f320","result_count":2}]}
|
||||
1
cache/crtsh/graph_cc24_dev.json
vendored
Normal file
1
cache/crtsh/graph_cc24_dev.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/hoarder_cc24_dev.json
vendored
Normal file
1
cache/crtsh/hoarder_cc24_dev.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"hoarder.cc24.dev","first_cached":"2025-09-14T21:33:21.961821+00:00","last_upstream_query":"2025-09-14T21:33:21.961824+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"hoarder.cc24.dev","name_value":"hoarder.cc24.dev","id":17651896110,"entry_timestamp":"2025-04-03T19:39:13.874","not_before":"2025-04-03T18:40:43","not_after":"2025-07-02T18:40:42","serial_number":"062e2d17ef9c31ca560ab40299e0e00701c0","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"hoarder.cc24.dev","name_value":"hoarder.cc24.dev","id":17610697718,"entry_timestamp":"2025-04-03T19:39:13.522","not_before":"2025-04-03T18:40:43","not_after":"2025-07-02T18:40:42","serial_number":"062e2d17ef9c31ca560ab40299e0e00701c0","result_count":2}]}
|
||||
1
cache/crtsh/hub_cc24_dev.json
vendored
Normal file
1
cache/crtsh/hub_cc24_dev.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"hub.cc24.dev","first_cached":"2025-09-14T21:33:48.364903+00:00","last_upstream_query":"2025-09-14T21:33:48.364908+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"hub.cc24.dev","name_value":"hub.cc24.dev","id":20317572962,"entry_timestamp":"2025-08-14T00:02:25.791","not_before":"2025-08-13T23:03:55","not_after":"2025-11-11T23:03:54","serial_number":"05ee38e8ae7bff4c5c414784e2c64d933b7a","result_count":2},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"hub.cc24.dev","name_value":"hub.cc24.dev","id":20317572564,"entry_timestamp":"2025-08-14T00:02:25.581","not_before":"2025-08-13T23:03:55","not_after":"2025-11-11T23:03:54","serial_number":"05ee38e8ae7bff4c5c414784e2c64d933b7a","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"hub.cc24.dev","name_value":"hub.cc24.dev","id":20189230503,"entry_timestamp":"2025-08-08T00:05:51.4","not_before":"2025-08-07T23:07:21","not_after":"2025-11-05T23:07:20","serial_number":"0502ddbfff49d3df12f3a15ba33ad895ccf1","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"hub.cc24.dev","name_value":"hub.cc24.dev","id":20189230585,"entry_timestamp":"2025-08-08T00:05:51.234","not_before":"2025-08-07T23:07:21","not_after":"2025-11-05T23:07:20","serial_number":"0502ddbfff49d3df12f3a15ba33ad895ccf1","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"hub.cc24.dev","name_value":"hub.cc24.dev","id":20060643580,"entry_timestamp":"2025-08-02T00:02:15.895","not_before":"2025-08-01T23:03:45","not_after":"2025-10-30T23:03:44","serial_number":"05c750b95573daa27e1a55a8803a2e6d21ad","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"hub.cc24.dev","name_value":"hub.cc24.dev","id":20060643807,"entry_timestamp":"2025-08-02T00:02:15.683","not_before":"2025-08-01T23:03:45","not_after":"2025-10-30T23:03:44","serial_number":"05c750b95573daa27e1a55a8803a2e6d21ad","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"hub.cc24.dev","name_value":"hub.cc24.dev","id":19929376671,"entry_timestamp":"2025-07-27T00:02:55.144","not_before":"2025-07-26T23:04:22","not_after":"2025-10-24T23:04:21","serial_number":"052c4fe632cf76d0306310cfb9faecc224ba","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"hub.cc24.dev","name_value":"hub.cc24.dev","id":19929375724,"entry_timestamp":"2025-07-27T00:02:52.759","not_before":"2025-07-26T23:04:22","not_after":"2025-10-24T23:04:21","serial_number":"052c4fe632cf76d0306310cfb9faecc224ba","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"hub.cc24.dev","name_value":"hub.cc24.dev","id":19803769083,"entry_timestamp":"2025-07-21T00:01:15.171","not_before":"2025-07-20T23:02:40","not_after":"2025-10-18T23:02:39","serial_number":"05e9927e9ea80c233e8a9502f11e4958cd06","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"hub.cc24.dev","name_value":"hub.cc24.dev","id":19803778513,"entry_timestamp":"2025-07-21T00:01:10.987","not_before":"2025-07-20T23:02:40","not_after":"2025-10-18T23:02:39","serial_number":"05e9927e9ea80c233e8a9502f11e4958cd06","result_count":2},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"hub.cc24.dev","name_value":"hub.cc24.dev","id":19665369127,"entry_timestamp":"2025-07-14T21:15:11.092","not_before":"2025-07-14T20:16:38","not_after":"2025-10-12T20:16:37","serial_number":"069e06aa4855496ab6b766889d6b45135d4e","result_count":2},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"hub.cc24.dev","name_value":"hub.cc24.dev","id":19665373526,"entry_timestamp":"2025-07-14T21:15:08.866","not_before":"2025-07-14T20:16:38","not_after":"2025-10-12T20:16:37","serial_number":"069e06aa4855496ab6b766889d6b45135d4e","result_count":2}]}
|
||||
1
cache/crtsh/ip_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/ip_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"ip.mikoshi.de","first_cached":"2025-09-15T15:35:38.687945+00:00","last_upstream_query":"2025-09-15T15:35:38.687948+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"ip.mikoshi.de","name_value":"ip.mikoshi.de","id":20275799673,"entry_timestamp":"2025-08-12T00:06:09.895","not_before":"2025-08-11T23:07:39","not_after":"2025-11-09T23:07:38","serial_number":"05abe97c54f28c570ed093f2c2064d2bd909","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"ip.mikoshi.de","name_value":"ip.mikoshi.de","id":20275798755,"entry_timestamp":"2025-08-12T00:06:09.726","not_before":"2025-08-11T23:07:39","not_after":"2025-11-09T23:07:38","serial_number":"05abe97c54f28c570ed093f2c2064d2bd909","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"ip.mikoshi.de","name_value":"ip.mikoshi.de","id":18987090979,"entry_timestamp":"2025-06-13T00:03:33.968","not_before":"2025-06-12T23:05:03","not_after":"2025-09-10T23:05:02","serial_number":"05861ba42c1b941a781e56836a1286805486","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"ip.mikoshi.de","name_value":"ip.mikoshi.de","id":18987090443,"entry_timestamp":"2025-06-13T00:03:33.547","not_before":"2025-06-12T23:05:03","not_after":"2025-09-10T23:05:02","serial_number":"05861ba42c1b941a781e56836a1286805486","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"ip.mikoshi.de","name_value":"ip.mikoshi.de","id":17831378289,"entry_timestamp":"2025-04-14T00:14:14.055","not_before":"2025-04-13T23:15:43","not_after":"2025-07-12T23:15:42","serial_number":"05e8a5d6c84779035ff19c804b3eb98d997a","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"ip.mikoshi.de","name_value":"ip.mikoshi.de","id":17831323161,"entry_timestamp":"2025-04-14T00:14:13.821","not_before":"2025-04-13T23:15:43","not_after":"2025-07-12T23:15:42","serial_number":"05e8a5d6c84779035ff19c804b3eb98d997a","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"ip.mikoshi.de","name_value":"ip.mikoshi.de","id":17170801048,"entry_timestamp":"2025-02-13T00:01:10.43","not_before":"2025-02-12T23:02:40","not_after":"2025-05-13T23:02:39","serial_number":"03af85f30dcc4dbca816456437ccc8760356","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"ip.mikoshi.de","name_value":"ip.mikoshi.de","id":16704107826,"entry_timestamp":"2025-02-13T00:01:10.264","not_before":"2025-02-12T23:02:40","not_after":"2025-05-13T23:02:39","serial_number":"03af85f30dcc4dbca816456437ccc8760356","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"ip.mikoshi.de","name_value":"ip.mikoshi.de","id":17122289078,"entry_timestamp":"2025-02-09T15:16:43.147","not_before":"2025-02-09T14:18:12","not_after":"2025-05-10T14:18:11","serial_number":"03ef24688a55744de221b025bac45c4898c5","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"ip.mikoshi.de","name_value":"ip.mikoshi.de","id":16635485733,"entry_timestamp":"2025-02-09T15:16:43.019","not_before":"2025-02-09T14:18:12","not_after":"2025-05-10T14:18:11","serial_number":"03ef24688a55744de221b025bac45c4898c5","result_count":2}]}
|
||||
1
cache/crtsh/kasserver_com.json
vendored
Normal file
1
cache/crtsh/kasserver_com.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/keep_cc24_dev.json
vendored
Normal file
1
cache/crtsh/keep_cc24_dev.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/kvmtest2_kasserver_com.json
vendored
Normal file
1
cache/crtsh/kvmtest2_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"kvmtest2.kasserver.com","first_cached":"2025-09-15T11:48:15.510962+00:00","last_upstream_query":"2025-09-15T11:48:15.510965+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"nextcloud.kvmtest2.kasserver.com","name_value":"nextcloud.kvmtest2.kasserver.com\nwww.nextcloud.kvmtest2.kasserver.com","id":11872742578,"entry_timestamp":"2024-01-26T08:07:49.508","not_before":"2024-01-26T07:07:49","not_after":"2024-04-25T07:07:48","serial_number":"033a4ebc78836fabf49336d55237d61606b1","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"nextcloud.kvmtest2.kasserver.com","name_value":"nextcloud.kvmtest2.kasserver.com\nwww.nextcloud.kvmtest2.kasserver.com","id":11872748114,"entry_timestamp":"2024-01-26T08:07:49.316","not_before":"2024-01-26T07:07:49","not_after":"2024-04-25T07:07:48","serial_number":"033a4ebc78836fabf49336d55237d61606b1","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"nextcloud.kvmtest2.kasserver.com","name_value":"nextcloud.kvmtest2.kasserver.com\nwww.nextcloud.kvmtest2.kasserver.com","id":11867647719,"entry_timestamp":"2024-01-25T21:52:18.981","not_before":"2024-01-25T20:52:18","not_after":"2024-04-24T20:52:17","serial_number":"03e7aa261a2cd46d7de1f7a140b4a798eb21","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"nextcloud.kvmtest2.kasserver.com","name_value":"nextcloud.kvmtest2.kasserver.com\nwww.nextcloud.kvmtest2.kasserver.com","id":11867647704,"entry_timestamp":"2024-01-25T21:52:18.671","not_before":"2024-01-25T20:52:18","not_after":"2024-04-24T20:52:17","serial_number":"03e7aa261a2cd46d7de1f7a140b4a798eb21","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"nextcloud.kvmtest2.kasserver.com","name_value":"nextcloud.kvmtest2.kasserver.com\nwww.nextcloud.kvmtest2.kasserver.com","id":11864252076,"entry_timestamp":"2024-01-25T14:44:38.589","not_before":"2024-01-25T13:44:38","not_after":"2024-04-24T13:44:37","serial_number":"03542eac1a93d9a614ab26535b70ea26a6a5","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"nextcloud.kvmtest2.kasserver.com","name_value":"nextcloud.kvmtest2.kasserver.com\nwww.nextcloud.kvmtest2.kasserver.com","id":11864248841,"entry_timestamp":"2024-01-25T14:44:38.505","not_before":"2024-01-25T13:44:38","not_after":"2024-04-24T13:44:37","serial_number":"03542eac1a93d9a614ab26535b70ea26a6a5","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"nextcloud.kvmtest2.kasserver.com","name_value":"nextcloud.kvmtest2.kasserver.com\nwww.nextcloud.kvmtest2.kasserver.com","id":11853852174,"entry_timestamp":"2024-01-24T14:39:08.051","not_before":"2024-01-24T13:39:06","not_after":"2024-04-23T13:39:05","serial_number":"047335e6361f4c5477b088ff8cd2719d4d9a","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"nextcloud.kvmtest2.kasserver.com","name_value":"nextcloud.kvmtest2.kasserver.com\nwww.nextcloud.kvmtest2.kasserver.com","id":11853852409,"entry_timestamp":"2024-01-24T14:39:07.46","not_before":"2024-01-24T13:39:06","not_after":"2024-04-23T13:39:05","serial_number":"047335e6361f4c5477b088ff8cd2719d4d9a","result_count":3}]}
|
||||
1
cache/crtsh/kvmthkr_kasserver_com.json
vendored
Normal file
1
cache/crtsh/kvmthkr_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"kvmthkr.kasserver.com","first_cached":"2025-09-15T11:50:03.952251+00:00","last_upstream_query":"2025-09-15T11:50:03.952256+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":105484,"issuer_name":"C=GB, ST=Greater Manchester, L=Salford, O=Sectigo Limited, CN=Sectigo ECC Domain Validation Secure Server CA","common_name":"ec.kvmthkr.kasserver.com","name_value":"ec.kvmthkr.kasserver.com\nwww.ec.kvmthkr.kasserver.com","id":14939726486,"entry_timestamp":"2024-10-15T07:02:39.33","not_before":"2024-10-15T00:00:00","not_after":"2024-11-14T23:59:59","serial_number":"6827c362ad3905799d6a865b0f1f60f8","result_count":3},{"issuer_ca_id":105484,"issuer_name":"C=GB, ST=Greater Manchester, L=Salford, O=Sectigo Limited, CN=Sectigo ECC Domain Validation Secure Server CA","common_name":"ec.kvmthkr.kasserver.com","name_value":"ec.kvmthkr.kasserver.com\nwww.ec.kvmthkr.kasserver.com","id":14939726540,"entry_timestamp":"2024-10-15T07:02:38.057","not_before":"2024-10-15T00:00:00","not_after":"2024-11-14T23:59:59","serial_number":"6827c362ad3905799d6a865b0f1f60f8","result_count":3}]}
|
||||
1
cache/crtsh/kvmu12s1_kasserver_com.json
vendored
Normal file
1
cache/crtsh/kvmu12s1_kasserver_com.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"kvmu12s1.kasserver.com","first_cached":"2025-09-15T11:51:04.220452+00:00","last_upstream_query":"2025-09-15T11:51:04.220456+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"nextcloud.kvmu12s1.kasserver.com","name_value":"nextcloud.kvmu12s1.kasserver.com\nwww.nextcloud.kvmu12s1.kasserver.com","id":10586150052,"entry_timestamp":"2023-09-15T10:36:49.311","not_before":"2023-09-15T09:36:48","not_after":"2023-12-14T09:36:47","serial_number":"045dedd31035da18a73d26fe8a4f963f6eef","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"nextcloud.kvmu12s1.kasserver.com","name_value":"nextcloud.kvmu12s1.kasserver.com\nwww.nextcloud.kvmu12s1.kasserver.com","id":10577792024,"entry_timestamp":"2023-09-15T10:36:49.018","not_before":"2023-09-15T09:36:48","not_after":"2023-12-14T09:36:47","serial_number":"045dedd31035da18a73d26fe8a4f963f6eef","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"nextcloud.kvmu12s1.kasserver.com","name_value":"nextcloud.kvmu12s1.kasserver.com\nwww.nextcloud.kvmu12s1.kasserver.com","id":9948906308,"entry_timestamp":"2023-07-14T08:26:39.958","not_before":"2023-07-14T07:26:39","not_after":"2023-10-12T07:26:38","serial_number":"035e2fe150728c3a351990f06dab0a9b29b7","result_count":3},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"nextcloud.kvmu12s1.kasserver.com","name_value":"nextcloud.kvmu12s1.kasserver.com\nwww.nextcloud.kvmu12s1.kasserver.com","id":9905731790,"entry_timestamp":"2023-07-14T08:26:39.811","not_before":"2023-07-14T07:26:39","not_after":"2023-10-12T07:26:38","serial_number":"035e2fe150728c3a351990f06dab0a9b29b7","result_count":3}]}
|
||||
1
cache/crtsh/kvmwerner2_kasserver_com.json
vendored
Normal file
1
cache/crtsh/kvmwerner2_kasserver_com.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/llm_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/llm_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"llm.mikoshi.de","first_cached":"2025-09-15T15:40:09.181904+00:00","last_upstream_query":"2025-09-15T15:40:09.181907+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"llm.mikoshi.de","name_value":"llm.mikoshi.de","id":19995849024,"entry_timestamp":"2025-07-30T00:02:19.725","not_before":"2025-07-29T23:03:47","not_after":"2025-10-27T23:03:46","serial_number":"05335d7df5f076bd039bf6148fe11ebfd86d","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"llm.mikoshi.de","name_value":"llm.mikoshi.de","id":19995848373,"entry_timestamp":"2025-07-30T00:02:17.527","not_before":"2025-07-29T23:03:47","not_after":"2025-10-27T23:03:46","serial_number":"05335d7df5f076bd039bf6148fe11ebfd86d","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"llm.mikoshi.de","name_value":"llm.mikoshi.de","id":18720891589,"entry_timestamp":"2025-05-31T00:01:22.576","not_before":"2025-05-30T23:02:49","not_after":"2025-08-28T23:02:48","serial_number":"064967b3c615cbb4a7f8690b4ee7ed3ab2c2","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"llm.mikoshi.de","name_value":"llm.mikoshi.de","id":18720891502,"entry_timestamp":"2025-05-31T00:01:20.192","not_before":"2025-05-30T23:02:49","not_after":"2025-08-28T23:02:48","serial_number":"064967b3c615cbb4a7f8690b4ee7ed3ab2c2","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"llm.mikoshi.de","name_value":"llm.mikoshi.de","id":17870870943,"entry_timestamp":"2025-03-31T19:43:16.66","not_before":"2025-03-31T18:44:46","not_after":"2025-06-29T18:44:45","serial_number":"05da28c4ebc6a250cb83e37fa4bc54b85508","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"llm.mikoshi.de","name_value":"llm.mikoshi.de","id":17539939653,"entry_timestamp":"2025-03-31T19:43:16.406","not_before":"2025-03-31T18:44:46","not_after":"2025-06-29T18:44:45","serial_number":"05da28c4ebc6a250cb83e37fa4bc54b85508","result_count":2}]}
|
||||
1
cache/crtsh/matrix_cc24_dev.json
vendored
Normal file
1
cache/crtsh/matrix_cc24_dev.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/matrix_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/matrix_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"matrix.mikoshi.de","first_cached":"2025-09-15T15:40:28.068782+00:00","last_upstream_query":"2025-09-15T15:40:28.068785+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"matrix.mikoshi.de","name_value":"matrix.mikoshi.de","id":17170805427,"entry_timestamp":"2025-02-13T00:01:24.095","not_before":"2025-02-12T23:02:53","not_after":"2025-05-13T23:02:52","serial_number":"0340c3ca26c1ab1678dd4c8885208ac93818","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"matrix.mikoshi.de","name_value":"matrix.mikoshi.de","id":16704107881,"entry_timestamp":"2025-02-13T00:01:23.078","not_before":"2025-02-12T23:02:53","not_after":"2025-05-13T23:02:52","serial_number":"0340c3ca26c1ab1678dd4c8885208ac93818","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"matrix.mikoshi.de","name_value":"matrix.mikoshi.de","id":17122315423,"entry_timestamp":"2025-02-09T15:17:51.214","not_before":"2025-02-09T14:19:20","not_after":"2025-05-10T14:19:19","serial_number":"03e088e499d2b5e10132f28674a00990313a","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"matrix.mikoshi.de","name_value":"matrix.mikoshi.de","id":16635517598,"entry_timestamp":"2025-02-09T15:17:50.818","not_before":"2025-02-09T14:19:20","not_after":"2025-05-10T14:19:19","serial_number":"03e088e499d2b5e10132f28674a00990313a","result_count":2}]}
|
||||
1
cache/crtsh/mempool_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/mempool_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"mempool.mikoshi.de","first_cached":"2025-09-15T15:37:03.196760+00:00","last_upstream_query":"2025-09-15T15:37:03.196764+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"mempool.mikoshi.de","name_value":"mempool.mikoshi.de","id":20275766421,"entry_timestamp":"2025-08-12T00:03:06.545","not_before":"2025-08-11T23:04:33","not_after":"2025-11-09T23:04:32","serial_number":"05db41917aa6146ca29cc3a918e57bfa2dcf","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"mempool.mikoshi.de","name_value":"mempool.mikoshi.de","id":20275769957,"entry_timestamp":"2025-08-12T00:03:04.069","not_before":"2025-08-11T23:04:33","not_after":"2025-11-09T23:04:32","serial_number":"05db41917aa6146ca29cc3a918e57bfa2dcf","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"mempool.mikoshi.de","name_value":"mempool.mikoshi.de","id":18986859548,"entry_timestamp":"2025-06-13T00:01:16.577","not_before":"2025-06-12T23:02:40","not_after":"2025-09-10T23:02:39","serial_number":"05b7e05db409b0791e0b480cfb8f3116b44f","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"mempool.mikoshi.de","name_value":"mempool.mikoshi.de","id":18987057144,"entry_timestamp":"2025-06-13T00:01:10.626","not_before":"2025-06-12T23:02:40","not_after":"2025-09-10T23:02:39","serial_number":"05b7e05db409b0791e0b480cfb8f3116b44f","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"mempool.mikoshi.de","name_value":"mempool.mikoshi.de","id":17831239624,"entry_timestamp":"2025-04-14T00:05:10.579","not_before":"2025-04-13T23:06:40","not_after":"2025-07-12T23:06:39","serial_number":"0573b6923c8539ab353225bf023b7fd6b465","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"mempool.mikoshi.de","name_value":"mempool.mikoshi.de","id":17831349460,"entry_timestamp":"2025-04-14T00:05:10.362","not_before":"2025-04-13T23:06:40","not_after":"2025-07-12T23:06:39","serial_number":"0573b6923c8539ab353225bf023b7fd6b465","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"mempool.mikoshi.de","name_value":"mempool.mikoshi.de","id":17170793138,"entry_timestamp":"2025-02-13T00:00:22.884","not_before":"2025-02-12T23:01:52","not_after":"2025-05-13T23:01:51","serial_number":"048ddc03e0d19d586ef5508bb636fa2ba81b","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"mempool.mikoshi.de","name_value":"mempool.mikoshi.de","id":16704095754,"entry_timestamp":"2025-02-13T00:00:22.634","not_before":"2025-02-12T23:01:52","not_after":"2025-05-13T23:01:51","serial_number":"048ddc03e0d19d586ef5508bb636fa2ba81b","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"mempool.mikoshi.de","name_value":"mempool.mikoshi.de","id":16636671204,"entry_timestamp":"2025-02-09T15:12:41.443","not_before":"2025-02-09T14:14:11","not_after":"2025-05-10T14:14:10","serial_number":"03a2ba996fd26f676c53edec5725f7442c90","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"mempool.mikoshi.de","name_value":"mempool.mikoshi.de","id":16635433368,"entry_timestamp":"2025-02-09T15:12:41.328","not_before":"2025-02-09T14:14:11","not_after":"2025-05-10T14:14:10","serial_number":"03a2ba996fd26f676c53edec5725f7442c90","result_count":2}]}
|
||||
1
cache/crtsh/mikoshi_de.json
vendored
Normal file
1
cache/crtsh/mikoshi_de.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/misp_cc24_dev.json
vendored
Normal file
1
cache/crtsh/misp_cc24_dev.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/misp_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/misp_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"misp.mikoshi.de","first_cached":"2025-09-14T22:38:25.627275+00:00","last_upstream_query":"2025-09-15T15:37:51.293899+00:00","upstream_query_count":2,"certificates":[{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"misp.mikoshi.de","name_value":"misp.mikoshi.de","id":17353605244,"entry_timestamp":"2025-02-25T00:29:30.385","not_before":"2025-02-24T23:30:59","not_after":"2025-05-25T23:30:58","serial_number":"03b9fa625fe61e6c16d14916613ca1f46d04","result_count":2},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"misp.mikoshi.de","name_value":"misp.mikoshi.de","id":16895667572,"entry_timestamp":"2025-02-25T00:29:29.913","not_before":"2025-02-24T23:30:59","not_after":"2025-05-25T23:30:58","serial_number":"03b9fa625fe61e6c16d14916613ca1f46d04","result_count":2}]}
|
||||
1
cache/crtsh/mx00_ionos_de.json
vendored
Normal file
1
cache/crtsh/mx00_ionos_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"mx00.ionos.de","first_cached":"2025-09-14T21:05:21.043082+00:00","last_upstream_query":"2025-09-15T15:34:57.508633+00:00","upstream_query_count":3,"certificates":[{"issuer_ca_id":245439,"issuer_name":"C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security ServerID OV Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx00.ionos.de","id":17921174855,"entry_timestamp":"2025-04-18T11:32:56.685","not_before":"2024-05-14T10:13:42","not_after":"2025-05-18T23:59:59","serial_number":"01f21195d95cb3f63712c59f40b2f75c","result_count":1},{"issuer_ca_id":245439,"issuer_name":"C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security ServerID OV Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx00.ionos.de","id":17755974719,"entry_timestamp":"2025-04-10T06:20:35.546","not_before":"2025-04-10T06:20:33","not_after":"2026-04-14T23:59:59","serial_number":"27efd5b7b17610e4ae86d40dea979ad7","result_count":1},{"issuer_ca_id":245439,"issuer_name":"C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security ServerID OV Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx00.ionos.de","id":13038507917,"entry_timestamp":"2024-05-14T10:13:43.64","not_before":"2024-05-14T10:13:42","not_after":"2025-05-18T23:59:59","serial_number":"01f21195d95cb3f63712c59f40b2f75c","result_count":1},{"issuer_ca_id":245439,"issuer_name":"C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security ServerID OV Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx00.ionos.de","id":9700366741,"entry_timestamp":"2023-06-20T11:08:14.981","not_before":"2023-06-20T11:08:11","not_after":"2024-06-24T23:59:59","serial_number":"153f3cd769500d3eebec07c90476d817","result_count":1},{"issuer_ca_id":6069,"issuer_name":"C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx00.ionos.de","id":7107715703,"entry_timestamp":"2022-07-12T10:00:03.026","not_before":"2022-07-12T10:00:01","not_after":"2023-07-16T23:59:59","serial_number":"210a3739eb290b28d1199f6a9c04d294","result_count":1},{"issuer_ca_id":6069,"issuer_name":"C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx00.ionos.de","id":4981516894,"entry_timestamp":"2021-08-04T08:35:13.1","not_before":"2021-08-04T08:35:11","not_after":"2022-08-08T23:59:59","serial_number":"11ae5449f5d5cc2a5ec198105748f927","result_count":1},{"issuer_ca_id":6069,"issuer_name":"C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx00.ionos.de","id":2864694015,"entry_timestamp":"2020-05-28T07:54:38.37","not_before":"2020-05-28T07:54:37","not_after":"2022-06-02T23:59:59","serial_number":"325b678601aae53e99926c1834988786","result_count":1},{"issuer_ca_id":6069,"issuer_name":"C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx00.ionos.de","id":2857249553,"entry_timestamp":"2020-05-26T09:01:33.944","not_before":"2020-05-26T09:01:33","not_after":"2022-05-31T23:59:59","serial_number":"0ceee698ba17a744881fbb3998c05748","result_count":1},{"issuer_ca_id":6069,"issuer_name":"C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx00.ionos.de","id":2857204010,"entry_timestamp":"2020-05-26T08:46:52.8","not_before":"2020-05-26T08:46:52","not_after":"2022-05-31T23:59:59","serial_number":"0ac520de92fde640943c1d2c0eb2f6e8","result_count":1},{"issuer_ca_id":6069,"issuer_name":"C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx00.ionos.de","id":2856876813,"entry_timestamp":"2020-05-26T06:58:49.881","not_before":"2020-05-26T06:58:49","not_after":"2022-05-31T23:59:59","serial_number":"2f9201af62a3408df1579b8a39c0f7b6","result_count":1}]}
|
||||
188
cache/crtsh/mx00_kundenserver_de.json
vendored
Normal file
188
cache/crtsh/mx00_kundenserver_de.json
vendored
Normal file
@@ -0,0 +1,188 @@
|
||||
{
|
||||
"domain": "mx00.kundenserver.de",
|
||||
"first_cached": "2025-09-15T19:23:52.908544+00:00",
|
||||
"last_upstream_query": "2025-09-15T19:23:52.908548+00:00",
|
||||
"upstream_query_count": 1,
|
||||
"certificates": [
|
||||
{
|
||||
"issuer_ca_id": 245439,
|
||||
"issuer_name": "C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security ServerID OV Class 2 CA",
|
||||
"common_name": "mx.kundenserver.de",
|
||||
"name_value": "mx00.kundenserver.de",
|
||||
"id": 17921174855,
|
||||
"entry_timestamp": "2025-04-18T11:32:56.685",
|
||||
"not_before": "2024-05-14T10:13:42",
|
||||
"not_after": "2025-05-18T23:59:59",
|
||||
"serial_number": "01f21195d95cb3f63712c59f40b2f75c",
|
||||
"result_count": 1
|
||||
},
|
||||
{
|
||||
"issuer_ca_id": 245439,
|
||||
"issuer_name": "C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security ServerID OV Class 2 CA",
|
||||
"common_name": "mx.kundenserver.de",
|
||||
"name_value": "mx00.kundenserver.de",
|
||||
"id": 17755974719,
|
||||
"entry_timestamp": "2025-04-10T06:20:35.546",
|
||||
"not_before": "2025-04-10T06:20:33",
|
||||
"not_after": "2026-04-14T23:59:59",
|
||||
"serial_number": "27efd5b7b17610e4ae86d40dea979ad7",
|
||||
"result_count": 1
|
||||
},
|
||||
{
|
||||
"issuer_ca_id": 245439,
|
||||
"issuer_name": "C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security ServerID OV Class 2 CA",
|
||||
"common_name": "mx.kundenserver.de",
|
||||
"name_value": "mx00.kundenserver.de",
|
||||
"id": 13038507917,
|
||||
"entry_timestamp": "2024-05-14T10:13:43.64",
|
||||
"not_before": "2024-05-14T10:13:42",
|
||||
"not_after": "2025-05-18T23:59:59",
|
||||
"serial_number": "01f21195d95cb3f63712c59f40b2f75c",
|
||||
"result_count": 1
|
||||
},
|
||||
{
|
||||
"issuer_ca_id": 245439,
|
||||
"issuer_name": "C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security ServerID OV Class 2 CA",
|
||||
"common_name": "mx.kundenserver.de",
|
||||
"name_value": "mx00.kundenserver.de",
|
||||
"id": 9700366741,
|
||||
"entry_timestamp": "2023-06-20T11:08:14.981",
|
||||
"not_before": "2023-06-20T11:08:11",
|
||||
"not_after": "2024-06-24T23:59:59",
|
||||
"serial_number": "153f3cd769500d3eebec07c90476d817",
|
||||
"result_count": 1
|
||||
},
|
||||
{
|
||||
"issuer_ca_id": 6069,
|
||||
"issuer_name": "C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA",
|
||||
"common_name": "mx.kundenserver.de",
|
||||
"name_value": "mx00.kundenserver.de",
|
||||
"id": 7107715703,
|
||||
"entry_timestamp": "2022-07-12T10:00:03.026",
|
||||
"not_before": "2022-07-12T10:00:01",
|
||||
"not_after": "2023-07-16T23:59:59",
|
||||
"serial_number": "210a3739eb290b28d1199f6a9c04d294",
|
||||
"result_count": 1
|
||||
},
|
||||
{
|
||||
"issuer_ca_id": 6069,
|
||||
"issuer_name": "C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA",
|
||||
"common_name": "mx.kundenserver.de",
|
||||
"name_value": "mx00.kundenserver.de",
|
||||
"id": 4981516894,
|
||||
"entry_timestamp": "2021-08-04T08:35:13.1",
|
||||
"not_before": "2021-08-04T08:35:11",
|
||||
"not_after": "2022-08-08T23:59:59",
|
||||
"serial_number": "11ae5449f5d5cc2a5ec198105748f927",
|
||||
"result_count": 1
|
||||
},
|
||||
{
|
||||
"issuer_ca_id": 6069,
|
||||
"issuer_name": "C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA",
|
||||
"common_name": "mx.kundenserver.de",
|
||||
"name_value": "mx00.kundenserver.de",
|
||||
"id": 2864694015,
|
||||
"entry_timestamp": "2020-05-28T07:54:38.37",
|
||||
"not_before": "2020-05-28T07:54:37",
|
||||
"not_after": "2022-06-02T23:59:59",
|
||||
"serial_number": "325b678601aae53e99926c1834988786",
|
||||
"result_count": 1
|
||||
},
|
||||
{
|
||||
"issuer_ca_id": 6069,
|
||||
"issuer_name": "C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA",
|
||||
"common_name": "mx.kundenserver.de",
|
||||
"name_value": "mx00.kundenserver.de",
|
||||
"id": 2857249553,
|
||||
"entry_timestamp": "2020-05-26T09:01:33.944",
|
||||
"not_before": "2020-05-26T09:01:33",
|
||||
"not_after": "2022-05-31T23:59:59",
|
||||
"serial_number": "0ceee698ba17a744881fbb3998c05748",
|
||||
"result_count": 1
|
||||
},
|
||||
{
|
||||
"issuer_ca_id": 6069,
|
||||
"issuer_name": "C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA",
|
||||
"common_name": "mx.kundenserver.de",
|
||||
"name_value": "mx00.kundenserver.de",
|
||||
"id": 2857204010,
|
||||
"entry_timestamp": "2020-05-26T08:46:52.8",
|
||||
"not_before": "2020-05-26T08:46:52",
|
||||
"not_after": "2022-05-31T23:59:59",
|
||||
"serial_number": "0ac520de92fde640943c1d2c0eb2f6e8",
|
||||
"result_count": 1
|
||||
},
|
||||
{
|
||||
"issuer_ca_id": 6069,
|
||||
"issuer_name": "C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA",
|
||||
"common_name": "mx.kundenserver.de",
|
||||
"name_value": "mx00.kundenserver.de",
|
||||
"id": 2856876813,
|
||||
"entry_timestamp": "2020-05-26T06:58:49.881",
|
||||
"not_before": "2020-05-26T06:58:49",
|
||||
"not_after": "2022-05-31T23:59:59",
|
||||
"serial_number": "2f9201af62a3408df1579b8a39c0f7b6",
|
||||
"result_count": 1
|
||||
},
|
||||
{
|
||||
"issuer_ca_id": 6069,
|
||||
"issuer_name": "C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA",
|
||||
"common_name": "mx.kundenserver.de",
|
||||
"name_value": "mx00.kundenserver.de",
|
||||
"id": 1351991065,
|
||||
"entry_timestamp": "2019-04-05T05:26:06.601",
|
||||
"not_before": "2019-02-18T09:14:39",
|
||||
"not_after": "2021-02-23T23:59:59",
|
||||
"serial_number": "2c12501e6e490dd60bfb87d85edad1d1",
|
||||
"result_count": 1
|
||||
},
|
||||
{
|
||||
"issuer_ca_id": 6069,
|
||||
"issuer_name": "C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA",
|
||||
"common_name": "mx.kundenserver.de",
|
||||
"name_value": "mx00.kundenserver.de",
|
||||
"id": 1213296236,
|
||||
"entry_timestamp": "2019-02-18T09:14:39.61",
|
||||
"not_before": "2019-02-18T09:14:39",
|
||||
"not_after": "2021-02-23T23:59:59",
|
||||
"serial_number": "2c12501e6e490dd60bfb87d85edad1d1",
|
||||
"result_count": 1
|
||||
},
|
||||
{
|
||||
"issuer_ca_id": 1375,
|
||||
"issuer_name": "C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=NRW, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass DE-1",
|
||||
"common_name": "mx00.kundenserver.de",
|
||||
"name_value": "mx00.kundenserver.de",
|
||||
"id": 370285812,
|
||||
"entry_timestamp": "2018-03-30T01:09:17.252",
|
||||
"not_before": "2013-08-06T15:49:56",
|
||||
"not_after": "2014-08-11T23:59:59",
|
||||
"serial_number": "00f17c74ae3d6e7a5c",
|
||||
"result_count": 2
|
||||
},
|
||||
{
|
||||
"issuer_ca_id": 1477,
|
||||
"issuer_name": "C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass DE-2",
|
||||
"common_name": "mx.kundenserver.de",
|
||||
"name_value": "mx00.kundenserver.de",
|
||||
"id": 307747879,
|
||||
"entry_timestamp": "2018-01-19T09:01:19.72",
|
||||
"not_before": "2017-03-22T10:21:38",
|
||||
"not_after": "2019-03-27T23:59:59",
|
||||
"serial_number": "00bf95dcc292d7bf01",
|
||||
"result_count": 1
|
||||
},
|
||||
{
|
||||
"issuer_ca_id": 1477,
|
||||
"issuer_name": "C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass DE-2",
|
||||
"common_name": "mx00.kundenserver.de",
|
||||
"name_value": "mx00.kundenserver.de",
|
||||
"id": 14627870,
|
||||
"entry_timestamp": "2016-03-08T11:54:51.83",
|
||||
"not_before": "2014-07-22T11:15:15",
|
||||
"not_after": "2017-07-27T23:59:59",
|
||||
"serial_number": "20e14d5c7f18e199",
|
||||
"result_count": 2
|
||||
}
|
||||
]
|
||||
}
|
||||
1
cache/crtsh/mx01_ionos_de.json
vendored
Normal file
1
cache/crtsh/mx01_ionos_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"mx01.ionos.de","first_cached":"2025-09-14T21:05:58.567956+00:00","last_upstream_query":"2025-09-15T15:34:59.570960+00:00","upstream_query_count":3,"certificates":[{"issuer_ca_id":245439,"issuer_name":"C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security ServerID OV Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx01.ionos.de","id":17921174855,"entry_timestamp":"2025-04-18T11:32:56.685","not_before":"2024-05-14T10:13:42","not_after":"2025-05-18T23:59:59","serial_number":"01f21195d95cb3f63712c59f40b2f75c","result_count":1},{"issuer_ca_id":245439,"issuer_name":"C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security ServerID OV Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx01.ionos.de","id":17755974719,"entry_timestamp":"2025-04-10T06:20:35.546","not_before":"2025-04-10T06:20:33","not_after":"2026-04-14T23:59:59","serial_number":"27efd5b7b17610e4ae86d40dea979ad7","result_count":1},{"issuer_ca_id":245439,"issuer_name":"C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security ServerID OV Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx01.ionos.de","id":13038507917,"entry_timestamp":"2024-05-14T10:13:43.64","not_before":"2024-05-14T10:13:42","not_after":"2025-05-18T23:59:59","serial_number":"01f21195d95cb3f63712c59f40b2f75c","result_count":1},{"issuer_ca_id":245439,"issuer_name":"C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security ServerID OV Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx01.ionos.de","id":9700366741,"entry_timestamp":"2023-06-20T11:08:14.981","not_before":"2023-06-20T11:08:11","not_after":"2024-06-24T23:59:59","serial_number":"153f3cd769500d3eebec07c90476d817","result_count":1},{"issuer_ca_id":6069,"issuer_name":"C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx01.ionos.de","id":7107715703,"entry_timestamp":"2022-07-12T10:00:03.026","not_before":"2022-07-12T10:00:01","not_after":"2023-07-16T23:59:59","serial_number":"210a3739eb290b28d1199f6a9c04d294","result_count":1},{"issuer_ca_id":6069,"issuer_name":"C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx01.ionos.de","id":4981516894,"entry_timestamp":"2021-08-04T08:35:13.1","not_before":"2021-08-04T08:35:11","not_after":"2022-08-08T23:59:59","serial_number":"11ae5449f5d5cc2a5ec198105748f927","result_count":1},{"issuer_ca_id":6069,"issuer_name":"C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx01.ionos.de","id":2864694015,"entry_timestamp":"2020-05-28T07:54:38.37","not_before":"2020-05-28T07:54:37","not_after":"2022-06-02T23:59:59","serial_number":"325b678601aae53e99926c1834988786","result_count":1},{"issuer_ca_id":6069,"issuer_name":"C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx01.ionos.de","id":2857249553,"entry_timestamp":"2020-05-26T09:01:33.944","not_before":"2020-05-26T09:01:33","not_after":"2022-05-31T23:59:59","serial_number":"0ceee698ba17a744881fbb3998c05748","result_count":1},{"issuer_ca_id":6069,"issuer_name":"C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx01.ionos.de","id":2857204010,"entry_timestamp":"2020-05-26T08:46:52.8","not_before":"2020-05-26T08:46:52","not_after":"2022-05-31T23:59:59","serial_number":"0ac520de92fde640943c1d2c0eb2f6e8","result_count":1},{"issuer_ca_id":6069,"issuer_name":"C=DE, O=T-Systems International GmbH, OU=T-Systems Trust Center, ST=Nordrhein Westfalen, postalCode=57250, L=Netphen, street=Untere Industriestr. 20, CN=TeleSec ServerPass Class 2 CA","common_name":"mx.kundenserver.de","name_value":"mx01.ionos.de","id":2856876813,"entry_timestamp":"2020-05-26T06:58:49.881","not_before":"2020-05-26T06:58:49","not_after":"2022-05-31T23:59:59","serial_number":"2f9201af62a3408df1579b8a39c0f7b6","result_count":1}]}
|
||||
1
cache/crtsh/mx01_kundenserver_de.json
vendored
Normal file
1
cache/crtsh/mx01_kundenserver_de.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/mx_kundenserver_de.json
vendored
Normal file
1
cache/crtsh/mx_kundenserver_de.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/nostr_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/nostr_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"nostr.mikoshi.de","first_cached":"2025-09-14T22:44:55.522098+00:00","last_upstream_query":"2025-09-15T15:39:39.928858+00:00","upstream_query_count":2,"certificates":[{"issuer_ca_id":295809,"issuer_name":"C=US, O=Let's Encrypt, CN=E8","common_name":"nostr.mikoshi.de","name_value":"nostr.mikoshi.de","id":20839972270,"entry_timestamp":"2025-09-07T00:01:25.998","not_before":"2025-09-06T23:02:55","not_after":"2025-12-05T23:02:54","serial_number":"05c5c3ab0353acb84d7adc05e78d6d6fe276","result_count":2},{"issuer_ca_id":295809,"issuer_name":"C=US, O=Let's Encrypt, CN=E8","common_name":"nostr.mikoshi.de","name_value":"nostr.mikoshi.de","id":20839069128,"entry_timestamp":"2025-09-07T00:01:25.786","not_before":"2025-09-06T23:02:55","not_after":"2025-12-05T23:02:54","serial_number":"05c5c3ab0353acb84d7adc05e78d6d6fe276","result_count":2},{"issuer_ca_id":295813,"issuer_name":"C=US, O=Let's Encrypt, CN=E7","common_name":"nostr.mikoshi.de","name_value":"nostr.mikoshi.de","id":20641626677,"entry_timestamp":"2025-08-29T00:03:39.504","not_before":"2025-08-28T23:05:09","not_after":"2025-11-26T23:05:08","serial_number":"059eab3e56a39c431f4cb961af259f45f550","result_count":2},{"issuer_ca_id":295813,"issuer_name":"C=US, O=Let's Encrypt, CN=E7","common_name":"nostr.mikoshi.de","name_value":"nostr.mikoshi.de","id":20641627201,"entry_timestamp":"2025-08-29T00:03:39.306","not_before":"2025-08-28T23:05:09","not_after":"2025-11-26T23:05:08","serial_number":"059eab3e56a39c431f4cb961af259f45f550","result_count":2},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"nostr.mikoshi.de","name_value":"nostr.mikoshi.de","id":20446505609,"entry_timestamp":"2025-08-19T20:58:17.951","not_before":"2025-08-19T19:59:45","not_after":"2025-11-17T19:59:44","serial_number":"06e00b2fda8f18091bb0be67f6809f87a889","result_count":2},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"nostr.mikoshi.de","name_value":"nostr.mikoshi.de","id":20441143198,"entry_timestamp":"2025-08-19T20:58:15.697","not_before":"2025-08-19T19:59:45","not_after":"2025-11-17T19:59:44","serial_number":"06e00b2fda8f18091bb0be67f6809f87a889","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"nostr.mikoshi.de","name_value":"nostr.mikoshi.de","id":17170798515,"entry_timestamp":"2025-02-13T00:00:50.437","not_before":"2025-02-12T23:02:19","not_after":"2025-05-13T23:02:18","serial_number":"04b641da285b3701db3e199cc49b87a023c7","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"nostr.mikoshi.de","name_value":"nostr.mikoshi.de","id":16705237488,"entry_timestamp":"2025-02-13T00:00:50.226","not_before":"2025-02-12T23:02:19","not_after":"2025-05-13T23:02:18","serial_number":"04b641da285b3701db3e199cc49b87a023c7","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"nostr.mikoshi.de","name_value":"nostr.mikoshi.de","id":17122272223,"entry_timestamp":"2025-02-09T15:15:01.538","not_before":"2025-02-09T14:16:30","not_after":"2025-05-10T14:16:29","serial_number":"04f78d3955d454fb6d004d08cfadb198d2be","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"nostr.mikoshi.de","name_value":"nostr.mikoshi.de","id":16636445173,"entry_timestamp":"2025-02-09T15:15:01.221","not_before":"2025-02-09T14:16:30","not_after":"2025-05-10T14:16:29","serial_number":"04f78d3955d454fb6d004d08cfadb198d2be","result_count":2}]}
|
||||
1
cache/crtsh/notes_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/notes_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"notes.mikoshi.de","first_cached":"2025-09-15T15:37:27.243670+00:00","last_upstream_query":"2025-09-15T15:37:27.243675+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"notes.mikoshi.de","name_value":"notes.mikoshi.de","id":17831397265,"entry_timestamp":"2025-04-14T00:15:27.018","not_before":"2025-04-13T23:16:56","not_after":"2025-07-12T23:16:55","serial_number":"0604f6b0149b4afe45efbe46a5493c1ec3fd","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"notes.mikoshi.de","name_value":"notes.mikoshi.de","id":17831343922,"entry_timestamp":"2025-04-14T00:15:26.683","not_before":"2025-04-13T23:16:56","not_after":"2025-07-12T23:16:55","serial_number":"0604f6b0149b4afe45efbe46a5493c1ec3fd","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"notes.mikoshi.de","name_value":"notes.mikoshi.de","id":17170808839,"entry_timestamp":"2025-02-13T00:01:30.661","not_before":"2025-02-12T23:03:00","not_after":"2025-05-13T23:02:59","serial_number":"032b2779b00fd8c25fb56ccab4a5eccf7b1a","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"notes.mikoshi.de","name_value":"notes.mikoshi.de","id":16704108124,"entry_timestamp":"2025-02-13T00:01:30.468","not_before":"2025-02-12T23:03:00","not_after":"2025-05-13T23:02:59","serial_number":"032b2779b00fd8c25fb56ccab4a5eccf7b1a","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"notes.mikoshi.de","name_value":"notes.mikoshi.de","id":17122334548,"entry_timestamp":"2025-02-09T15:18:27.206","not_before":"2025-02-09T14:19:56","not_after":"2025-05-10T14:19:55","serial_number":"042257f7bcc91c0994e9c3c76da6ee700a03","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"notes.mikoshi.de","name_value":"notes.mikoshi.de","id":16636453516,"entry_timestamp":"2025-02-09T15:18:26.537","not_before":"2025-02-09T14:19:56","not_after":"2025-05-10T14:19:55","serial_number":"042257f7bcc91c0994e9c3c76da6ee700a03","result_count":2}]}
|
||||
1
cache/crtsh/ns3_m-online_net.json
vendored
Normal file
1
cache/crtsh/ns3_m-online_net.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/ns4_m-online_net.json
vendored
Normal file
1
cache/crtsh/ns4_m-online_net.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/office_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/office_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"office.mikoshi.de","first_cached":"2025-09-15T15:38:27.549467+00:00","last_upstream_query":"2025-09-15T15:38:27.549473+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"office.mikoshi.de","name_value":"office.mikoshi.de","id":20275820856,"entry_timestamp":"2025-08-12T00:07:33.018","not_before":"2025-08-11T23:09:02","not_after":"2025-11-09T23:09:01","serial_number":"05c2c936c2f12251f76b59d3ad2854f50f78","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"office.mikoshi.de","name_value":"office.mikoshi.de","id":20275819318,"entry_timestamp":"2025-08-12T00:07:32.912","not_before":"2025-08-11T23:09:02","not_after":"2025-11-09T23:09:01","serial_number":"05c2c936c2f12251f76b59d3ad2854f50f78","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"office.mikoshi.de","name_value":"office.mikoshi.de","id":18987110425,"entry_timestamp":"2025-06-13T00:04:44.238","not_before":"2025-06-12T23:06:13","not_after":"2025-09-10T23:06:12","serial_number":"051acaa08d5d89e6f4063edabca209961196","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"office.mikoshi.de","name_value":"office.mikoshi.de","id":18987111139,"entry_timestamp":"2025-06-13T00:04:43.915","not_before":"2025-06-12T23:06:13","not_after":"2025-09-10T23:06:12","serial_number":"051acaa08d5d89e6f4063edabca209961196","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"office.mikoshi.de","name_value":"office.mikoshi.de","id":17831462745,"entry_timestamp":"2025-04-14T00:16:05.147","not_before":"2025-04-13T23:17:32","not_after":"2025-07-12T23:17:31","serial_number":"054ddaf61e4b9f57e8d56a9497df9149c395","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"office.mikoshi.de","name_value":"office.mikoshi.de","id":17831369811,"entry_timestamp":"2025-04-14T00:16:03.009","not_before":"2025-04-13T23:17:32","not_after":"2025-07-12T23:17:31","serial_number":"054ddaf61e4b9f57e8d56a9497df9149c395","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"office.mikoshi.de","name_value":"office.mikoshi.de","id":17170808669,"entry_timestamp":"2025-02-13T00:01:46.473","not_before":"2025-02-12T23:03:15","not_after":"2025-05-13T23:03:14","serial_number":"03deb0895b1825adbbbaf9addcd01dd92799","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"office.mikoshi.de","name_value":"office.mikoshi.de","id":16720296902,"entry_timestamp":"2025-02-13T00:01:45.743","not_before":"2025-02-12T23:03:15","not_after":"2025-05-13T23:03:14","serial_number":"03deb0895b1825adbbbaf9addcd01dd92799","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"office.mikoshi.de","name_value":"office.mikoshi.de","id":17122359365,"entry_timestamp":"2025-02-09T15:19:36.715","not_before":"2025-02-09T14:21:06","not_after":"2025-05-10T14:21:05","serial_number":"04610182dee49a266a3d43aadacfd0b41e27","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"office.mikoshi.de","name_value":"office.mikoshi.de","id":16635528699,"entry_timestamp":"2025-02-09T15:19:36.337","not_before":"2025-02-09T14:21:06","not_after":"2025-05-10T14:21:05","serial_number":"04610182dee49a266a3d43aadacfd0b41e27","result_count":2}]}
|
||||
1
cache/crtsh/overcuriousity_org.json
vendored
Normal file
1
cache/crtsh/overcuriousity_org.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/piped_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/piped_mikoshi_de.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/proxy_piped_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/proxy_piped_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"proxy.piped.mikoshi.de","first_cached":"2025-09-14T22:45:40.325331+00:00","last_upstream_query":"2025-09-15T15:38:51.713680+00:00","upstream_query_count":2,"certificates":[{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"proxy.piped.mikoshi.de","name_value":"proxy.piped.mikoshi.de","id":20189220475,"entry_timestamp":"2025-08-08T00:05:07.009","not_before":"2025-08-07T23:06:36","not_after":"2025-11-05T23:06:35","serial_number":"05c0d9d7f7cae49c673abcdb28c4412d78d6","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"proxy.piped.mikoshi.de","name_value":"proxy.piped.mikoshi.de","id":20189220702,"entry_timestamp":"2025-08-08T00:05:06.824","not_before":"2025-08-07T23:06:36","not_after":"2025-11-05T23:06:35","serial_number":"05c0d9d7f7cae49c673abcdb28c4412d78d6","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"proxy.piped.mikoshi.de","name_value":"proxy.piped.mikoshi.de","id":20060639877,"entry_timestamp":"2025-08-02T00:01:52.165","not_before":"2025-08-01T23:03:21","not_after":"2025-10-30T23:03:20","serial_number":"05cb1fd70bdfe7e07c8a952b4e089c39d1da","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"proxy.piped.mikoshi.de","name_value":"proxy.piped.mikoshi.de","id":20060638194,"entry_timestamp":"2025-08-02T00:01:51.846","not_before":"2025-08-01T23:03:21","not_after":"2025-10-30T23:03:20","serial_number":"05cb1fd70bdfe7e07c8a952b4e089c39d1da","result_count":2},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"proxy.piped.mikoshi.de","name_value":"proxy.piped.mikoshi.de","id":19929369417,"entry_timestamp":"2025-07-27T00:02:26.4","not_before":"2025-07-26T23:03:54","not_after":"2025-10-24T23:03:53","serial_number":"063f8984c7c967816e258a7216ecd1959f34","result_count":2},{"issuer_ca_id":295810,"issuer_name":"C=US, O=Let's Encrypt, CN=E5","common_name":"proxy.piped.mikoshi.de","name_value":"proxy.piped.mikoshi.de","id":19929369596,"entry_timestamp":"2025-07-27T00:02:24.492","not_before":"2025-07-26T23:03:54","not_after":"2025-10-24T23:03:53","serial_number":"063f8984c7c967816e258a7216ecd1959f34","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"proxy.piped.mikoshi.de","name_value":"proxy.piped.mikoshi.de","id":19803763772,"entry_timestamp":"2025-07-21T00:00:57.2","not_before":"2025-07-20T23:02:26","not_after":"2025-10-18T23:02:25","serial_number":"0572a8c3609d51428351eb07244bcd441072","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"proxy.piped.mikoshi.de","name_value":"proxy.piped.mikoshi.de","id":19803763758,"entry_timestamp":"2025-07-21T00:00:56.856","not_before":"2025-07-20T23:02:26","not_after":"2025-10-18T23:02:25","serial_number":"0572a8c3609d51428351eb07244bcd441072","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"proxy.piped.mikoshi.de","name_value":"proxy.piped.mikoshi.de","id":19668416256,"entry_timestamp":"2025-07-15T00:00:58.486","not_before":"2025-07-14T23:02:28","not_after":"2025-10-12T23:02:27","serial_number":"06664191409b60fb8f1241b999cd884247cb","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"proxy.piped.mikoshi.de","name_value":"proxy.piped.mikoshi.de","id":19668412981,"entry_timestamp":"2025-07-15T00:00:58.222","not_before":"2025-07-14T23:02:28","not_after":"2025-10-12T23:02:27","serial_number":"06664191409b60fb8f1241b999cd884247cb","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"proxy.piped.mikoshi.de","name_value":"proxy.piped.mikoshi.de","id":19523857935,"entry_timestamp":"2025-07-08T06:31:01.3","not_before":"2025-07-08T05:32:26","not_after":"2025-10-06T05:32:25","serial_number":"05def41b49262bc3c90ceef09a3c53fdb897","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"proxy.piped.mikoshi.de","name_value":"proxy.piped.mikoshi.de","id":19523855448,"entry_timestamp":"2025-07-08T06:30:56.952","not_before":"2025-07-08T05:32:26","not_after":"2025-10-06T05:32:25","serial_number":"05def41b49262bc3c90ceef09a3c53fdb897","result_count":2}]}
|
||||
1
cache/crtsh/push_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/push_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"push.mikoshi.de","first_cached":"2025-09-15T15:36:51.090852+00:00","last_upstream_query":"2025-09-15T15:36:51.090855+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"push.mikoshi.de","name_value":"push.mikoshi.de","id":20275820653,"entry_timestamp":"2025-08-12T00:06:47.342","not_before":"2025-08-11T23:08:16","not_after":"2025-11-09T23:08:15","serial_number":"052026f4f3142d63bd9ca3feae317ece4ee9","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"push.mikoshi.de","name_value":"push.mikoshi.de","id":20275820169,"entry_timestamp":"2025-08-12T00:06:47.109","not_before":"2025-08-11T23:08:16","not_after":"2025-11-09T23:08:15","serial_number":"052026f4f3142d63bd9ca3feae317ece4ee9","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"push.mikoshi.de","name_value":"push.mikoshi.de","id":18987077850,"entry_timestamp":"2025-06-13T00:04:10.192","not_before":"2025-06-12T23:05:37","not_after":"2025-09-10T23:05:36","serial_number":"0546092d0c32d96eb7fcf0ce30e5e65ea3e1","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"push.mikoshi.de","name_value":"push.mikoshi.de","id":18987099791,"entry_timestamp":"2025-06-13T00:04:07.918","not_before":"2025-06-12T23:05:37","not_after":"2025-09-10T23:05:36","serial_number":"0546092d0c32d96eb7fcf0ce30e5e65ea3e1","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"push.mikoshi.de","name_value":"push.mikoshi.de","id":17831474873,"entry_timestamp":"2025-04-14T00:14:50.26","not_before":"2025-04-13T23:16:19","not_after":"2025-07-12T23:16:18","serial_number":"0513fd56736b1233441a3275762b03fc9eb0","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"push.mikoshi.de","name_value":"push.mikoshi.de","id":17831474384,"entry_timestamp":"2025-04-14T00:14:50.004","not_before":"2025-04-13T23:16:19","not_after":"2025-07-12T23:16:18","serial_number":"0513fd56736b1233441a3275762b03fc9eb0","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"push.mikoshi.de","name_value":"push.mikoshi.de","id":17170801795,"entry_timestamp":"2025-02-13T00:01:17.002","not_before":"2025-02-12T23:02:46","not_after":"2025-05-13T23:02:45","serial_number":"03487570ab1eaa62f8f4c3b61a8b90eda732","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"push.mikoshi.de","name_value":"push.mikoshi.de","id":16715026255,"entry_timestamp":"2025-02-13T00:01:16.729","not_before":"2025-02-12T23:02:46","not_after":"2025-05-13T23:02:45","serial_number":"03487570ab1eaa62f8f4c3b61a8b90eda732","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"push.mikoshi.de","name_value":"push.mikoshi.de","id":17122309940,"entry_timestamp":"2025-02-09T15:17:17.076","not_before":"2025-02-09T14:18:46","not_after":"2025-05-10T14:18:45","serial_number":"047ea82614cb4449bda99fc1ba86eb49b5c8","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"push.mikoshi.de","name_value":"push.mikoshi.de","id":16635500733,"entry_timestamp":"2025-02-09T15:17:16.594","not_before":"2025-02-09T14:18:46","not_after":"2025-05-10T14:18:45","serial_number":"047ea82614cb4449bda99fc1ba86eb49b5c8","result_count":2}]}
|
||||
1
cache/crtsh/raptor_cc24_dev.json
vendored
Normal file
1
cache/crtsh/raptor_cc24_dev.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/s3_cc24_dev.json
vendored
Normal file
1
cache/crtsh/s3_cc24_dev.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"s3.cc24.dev","first_cached":"2025-09-14T21:38:35.568153+00:00","last_upstream_query":"2025-09-14T21:38:35.568155+00:00","upstream_query_count":1,"certificates":[{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"console.s3.cc24.dev","name_value":"console.s3.cc24.dev","id":20287575466,"entry_timestamp":"2025-08-12T12:55:37.077","not_before":"2025-08-12T11:57:05","not_after":"2025-11-10T11:57:04","serial_number":"066bdfa83088f8d7e67284da94dd5d122ed6","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"console.s3.cc24.dev","name_value":"console.s3.cc24.dev","id":20287575457,"entry_timestamp":"2025-08-12T12:55:36.75","not_before":"2025-08-12T11:57:05","not_after":"2025-11-10T11:57:04","serial_number":"066bdfa83088f8d7e67284da94dd5d122ed6","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"s3.cc24.dev","name_value":"s3.cc24.dev","id":20285693027,"entry_timestamp":"2025-08-12T10:58:41.611","not_before":"2025-08-12T10:00:11","not_after":"2025-11-10T10:00:10","serial_number":"06f0f73404258136977fdbfe4cf51db786a7","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"s3.cc24.dev","name_value":"s3.cc24.dev","id":20285693495,"entry_timestamp":"2025-08-12T10:58:41.366","not_before":"2025-08-12T10:00:11","not_after":"2025-11-10T10:00:10","serial_number":"06f0f73404258136977fdbfe4cf51db786a7","result_count":2}]}
|
||||
1
cache/crtsh/se_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/se_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"se.mikoshi.de","first_cached":"2025-09-14T22:37:29.207379+00:00","last_upstream_query":"2025-09-15T15:40:52.328157+00:00","upstream_query_count":2,"certificates":[{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"se.mikoshi.de","name_value":"se.mikoshi.de","id":20296592765,"entry_timestamp":"2025-08-13T00:02:43.765","not_before":"2025-08-12T23:04:13","not_after":"2025-11-10T23:04:12","serial_number":"05688b90444fda4afff5208583d9b4c6b453","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"se.mikoshi.de","name_value":"se.mikoshi.de","id":20296592676,"entry_timestamp":"2025-08-13T00:02:43.253","not_before":"2025-08-12T23:04:13","not_after":"2025-11-10T23:04:12","serial_number":"05688b90444fda4afff5208583d9b4c6b453","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"se.mikoshi.de","name_value":"se.mikoshi.de","id":19007481148,"entry_timestamp":"2025-06-14T00:01:17.383","not_before":"2025-06-13T23:02:46","not_after":"2025-09-11T23:02:45","serial_number":"057f456b58a7ea34177d50585ea3b4561e6b","result_count":2},{"issuer_ca_id":295814,"issuer_name":"C=US, O=Let's Encrypt, CN=R10","common_name":"se.mikoshi.de","name_value":"se.mikoshi.de","id":19007493221,"entry_timestamp":"2025-06-14T00:01:17.049","not_before":"2025-06-13T23:02:46","not_after":"2025-09-11T23:02:45","serial_number":"057f456b58a7ea34177d50585ea3b4561e6b","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"se.mikoshi.de","name_value":"se.mikoshi.de","id":17850961291,"entry_timestamp":"2025-04-15T00:00:37.293","not_before":"2025-04-14T23:02:02","not_after":"2025-07-13T23:02:01","serial_number":"052c5b098d5fa135547d9e3d7f7496b63af6","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"se.mikoshi.de","name_value":"se.mikoshi.de","id":17850962036,"entry_timestamp":"2025-04-15T00:00:32.962","not_before":"2025-04-14T23:02:02","not_after":"2025-07-13T23:02:01","serial_number":"052c5b098d5fa135547d9e3d7f7496b63af6","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"se.mikoshi.de","name_value":"se.mikoshi.de","id":17170796076,"entry_timestamp":"2025-02-13T00:00:29.982","not_before":"2025-02-12T23:01:59","not_after":"2025-05-13T23:01:58","serial_number":"04ecdefe30d1b5ce4d3ebb91bbbb2257bd15","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"se.mikoshi.de","name_value":"se.mikoshi.de","id":16704095774,"entry_timestamp":"2025-02-13T00:00:29.674","not_before":"2025-02-12T23:01:59","not_after":"2025-05-13T23:01:58","serial_number":"04ecdefe30d1b5ce4d3ebb91bbbb2257bd15","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"se.mikoshi.de","name_value":"se.mikoshi.de","id":17122261002,"entry_timestamp":"2025-02-09T15:13:15.78","not_before":"2025-02-09T14:14:45","not_after":"2025-05-10T14:14:44","serial_number":"03972d789d00e59045e4f37eae917438e10a","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"se.mikoshi.de","name_value":"se.mikoshi.de","id":16635473126,"entry_timestamp":"2025-02-09T15:13:15.412","not_before":"2025-02-09T14:14:45","not_after":"2025-05-10T14:14:44","serial_number":"03972d789d00e59045e4f37eae917438e10a","result_count":2},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"se.mikoshi.de","name_value":"se.mikoshi.de","id":11490113222,"entry_timestamp":"2023-12-16T00:55:58.472","not_before":"2023-12-15T23:55:57","not_after":"2024-03-14T23:55:56","serial_number":"0386fd7fd921ad63f4805ad4f593819aa238","result_count":2},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"se.mikoshi.de","name_value":"se.mikoshi.de","id":11422214995,"entry_timestamp":"2023-12-16T00:55:57.647","not_before":"2023-12-15T23:55:57","not_after":"2024-03-14T23:55:56","serial_number":"0386fd7fd921ad63f4805ad4f593819aa238","result_count":2}]}
|
||||
1
cache/crtsh/signaling_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/signaling_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"signaling.mikoshi.de","first_cached":"2025-09-14T21:05:14.189157+00:00","last_upstream_query":"2025-09-15T15:36:14.904100+00:00","upstream_query_count":3,"certificates":[{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"signaling.mikoshi.de","name_value":"signaling.mikoshi.de","id":19208276669,"entry_timestamp":"2025-06-23T18:21:11.885","not_before":"2025-06-23T17:22:40","not_after":"2025-09-21T17:22:39","serial_number":"0542fce9cb99bb1c1d18e5e452c90d850936","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"signaling.mikoshi.de","name_value":"signaling.mikoshi.de","id":19208276557,"entry_timestamp":"2025-06-23T18:21:11.215","not_before":"2025-06-23T17:22:40","not_after":"2025-09-21T17:22:39","serial_number":"0542fce9cb99bb1c1d18e5e452c90d850936","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"signaling.mikoshi.de","name_value":"signaling.mikoshi.de","id":19208272013,"entry_timestamp":"2025-06-23T18:20:29.619","not_before":"2025-06-23T17:21:56","not_after":"2025-09-21T17:21:55","serial_number":"0540be6c8cb99dcaa5492af7b934f40466f9","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"signaling.mikoshi.de","name_value":"signaling.mikoshi.de","id":19208263539,"entry_timestamp":"2025-06-23T18:20:26.82","not_before":"2025-06-23T17:21:56","not_after":"2025-09-21T17:21:55","serial_number":"0540be6c8cb99dcaa5492af7b934f40466f9","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"signaling.mikoshi.de","name_value":"signaling.mikoshi.de","id":17428224909,"entry_timestamp":"2025-03-23T15:21:03.771","not_before":"2025-03-23T14:22:33","not_after":"2025-06-21T14:22:32","serial_number":"0537513d69487cead5f018b5322aa54fb52e","result_count":2},{"issuer_ca_id":295819,"issuer_name":"C=US, O=Let's Encrypt, CN=E6","common_name":"signaling.mikoshi.de","name_value":"signaling.mikoshi.de","id":17346408492,"entry_timestamp":"2025-03-23T15:21:03.617","not_before":"2025-03-23T14:22:33","not_after":"2025-06-21T14:22:32","serial_number":"0537513d69487cead5f018b5322aa54fb52e","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"signaling.mikoshi.de","name_value":"signaling.mikoshi.de","id":17170806575,"entry_timestamp":"2025-02-13T00:01:39.507","not_before":"2025-02-12T23:03:07","not_after":"2025-05-13T23:03:06","serial_number":"04a3141d80551d2287647211445f32131b19","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"signaling.mikoshi.de","name_value":"signaling.mikoshi.de","id":16704105641,"entry_timestamp":"2025-02-13T00:01:37.463","not_before":"2025-02-12T23:03:07","not_after":"2025-05-13T23:03:06","serial_number":"04a3141d80551d2287647211445f32131b19","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"signaling.mikoshi.de","name_value":"signaling.mikoshi.de","id":17122350772,"entry_timestamp":"2025-02-09T15:19:01.645","not_before":"2025-02-09T14:20:31","not_after":"2025-05-10T14:20:30","serial_number":"0456c53707eac4c8e79109b09eb9257674ef","result_count":2},{"issuer_ca_id":295815,"issuer_name":"C=US, O=Let's Encrypt, CN=R11","common_name":"signaling.mikoshi.de","name_value":"signaling.mikoshi.de","id":16635514012,"entry_timestamp":"2025-02-09T15:19:01.438","not_before":"2025-02-09T14:20:31","not_after":"2025-05-10T14:20:30","serial_number":"0456c53707eac4c8e79109b09eb9257674ef","result_count":2}]}
|
||||
1
cache/crtsh/status_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/status_mikoshi_de.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/streaming_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/streaming_mikoshi_de.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/test_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/test_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"test.mikoshi.de","first_cached":"2025-09-14T22:38:58.849950+00:00","last_upstream_query":"2025-09-15T15:34:55.551888+00:00","upstream_query_count":2,"certificates":[{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"test.mikoshi.de","name_value":"test.mikoshi.de","id":11527598498,"entry_timestamp":"2023-12-19T19:30:11.511","not_before":"2023-12-19T18:30:10","not_after":"2024-03-18T18:30:09","serial_number":"0460a2ce513e2971556b911e64d3c06c876d","result_count":2},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"test.mikoshi.de","name_value":"test.mikoshi.de","id":11448041639,"entry_timestamp":"2023-12-19T19:30:10.729","not_before":"2023-12-19T18:30:10","not_after":"2024-03-18T18:30:09","serial_number":"0460a2ce513e2971556b911e64d3c06c876d","result_count":2},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"test.mikoshi.de","name_value":"test.mikoshi.de","id":11487822748,"entry_timestamp":"2023-12-15T22:27:24.154","not_before":"2023-12-15T21:27:23","not_after":"2024-03-14T21:27:22","serial_number":"03524dd265a8db8b1d3b8ae9236457b06564","result_count":2},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"test.mikoshi.de","name_value":"test.mikoshi.de","id":11420685419,"entry_timestamp":"2023-12-15T22:27:23.743","not_before":"2023-12-15T21:27:23","not_after":"2024-03-14T21:27:22","serial_number":"03524dd265a8db8b1d3b8ae9236457b06564","result_count":2},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"test.mikoshi.de","name_value":"test.mikoshi.de","id":10845362810,"entry_timestamp":"2023-10-20T20:03:11.855","not_before":"2023-10-20T19:03:11","not_after":"2024-01-18T19:03:10","serial_number":"04fb05ec64b2614143f419dfe3c1e058a6f8","result_count":2},{"issuer_ca_id":183267,"issuer_name":"C=US, O=Let's Encrypt, CN=R3","common_name":"test.mikoshi.de","name_value":"test.mikoshi.de","id":10845356148,"entry_timestamp":"2023-10-20T20:03:11.585","not_before":"2023-10-20T19:03:11","not_after":"2024-01-18T19:03:10","serial_number":"04fb05ec64b2614143f419dfe3c1e058a6f8","result_count":2}]}
|
||||
1
cache/crtsh/timesketch_cc24_dev.json
vendored
Normal file
1
cache/crtsh/timesketch_cc24_dev.json
vendored
Normal file
File diff suppressed because one or more lines are too long
1
cache/crtsh/vm0800_kasserver_com.json
vendored
Normal file
1
cache/crtsh/vm0800_kasserver_com.json
vendored
Normal file
File diff suppressed because one or more lines are too long
32
cache/crtsh/www_overcuriousity_org.json
vendored
Normal file
32
cache/crtsh/www_overcuriousity_org.json
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"domain": "www.overcuriousity.org",
|
||||
"first_cached": "2025-09-14T21:16:24.041839+00:00",
|
||||
"last_upstream_query": "2025-09-15T19:08:25.160183+00:00",
|
||||
"upstream_query_count": 3,
|
||||
"certificates": [
|
||||
{
|
||||
"issuer_ca_id": 295819,
|
||||
"issuer_name": "C=US, O=Let's Encrypt, CN=E6",
|
||||
"common_name": "signaling.mikoshi.de",
|
||||
"name_value": "www.overcuriousity.org",
|
||||
"id": 19208272013,
|
||||
"entry_timestamp": "2025-06-23T18:20:29.619",
|
||||
"not_before": "2025-06-23T17:21:56",
|
||||
"not_after": "2025-09-21T17:21:55",
|
||||
"serial_number": "0540be6c8cb99dcaa5492af7b934f40466f9",
|
||||
"result_count": 1
|
||||
},
|
||||
{
|
||||
"issuer_ca_id": 295819,
|
||||
"issuer_name": "C=US, O=Let's Encrypt, CN=E6",
|
||||
"common_name": "signaling.mikoshi.de",
|
||||
"name_value": "www.overcuriousity.org",
|
||||
"id": 19208263539,
|
||||
"entry_timestamp": "2025-06-23T18:20:26.82",
|
||||
"not_before": "2025-06-23T17:21:56",
|
||||
"not_after": "2025-09-21T17:21:55",
|
||||
"serial_number": "0540be6c8cb99dcaa5492af7b934f40466f9",
|
||||
"result_count": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
1
cache/crtsh/zap_mikoshi_de.json
vendored
Normal file
1
cache/crtsh/zap_mikoshi_de.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"domain":"zap.mikoshi.de","first_cached":"2025-09-14T22:37:56.901178+00:00","last_upstream_query":"2025-09-15T15:36:02.901638+00:00","upstream_query_count":2,"certificates":[{"issuer_ca_id":295813,"issuer_name":"C=US, O=Let's Encrypt, CN=E7","common_name":"zap.mikoshi.de","name_value":"zap.mikoshi.de","id":20979146330,"entry_timestamp":"2025-09-13T00:01:36.857","not_before":"2025-09-12T23:03:06","not_after":"2025-12-11T23:03:05","serial_number":"060330123144270f9c8614ee282e43b5b676","result_count":2},{"issuer_ca_id":295813,"issuer_name":"C=US, O=Let's Encrypt, CN=E7","common_name":"zap.mikoshi.de","name_value":"zap.mikoshi.de","id":20979146321,"entry_timestamp":"2025-09-13T00:01:36.705","not_before":"2025-09-12T23:03:06","not_after":"2025-12-11T23:03:05","serial_number":"060330123144270f9c8614ee282e43b5b676","result_count":2},{"issuer_ca_id":295809,"issuer_name":"C=US, O=Let's Encrypt, CN=E8","common_name":"zap.mikoshi.de","name_value":"zap.mikoshi.de","id":20955786867,"entry_timestamp":"2025-09-12T00:00:06.78","not_before":"2025-09-11T23:01:36","not_after":"2025-12-10T23:01:35","serial_number":"069fdbfcf2023341872c23d4eadf03dbd600","result_count":2},{"issuer_ca_id":295809,"issuer_name":"C=US, O=Let's Encrypt, CN=E8","common_name":"zap.mikoshi.de","name_value":"zap.mikoshi.de","id":20955786725,"entry_timestamp":"2025-09-12T00:00:06.615","not_before":"2025-09-11T23:01:36","not_after":"2025-12-10T23:01:35","serial_number":"069fdbfcf2023341872c23d4eadf03dbd600","result_count":2},{"issuer_ca_id":295809,"issuer_name":"C=US, O=Let's Encrypt, CN=E8","common_name":"zap.mikoshi.de","name_value":"zap.mikoshi.de","id":20754243960,"entry_timestamp":"2025-09-03T00:01:13.766","not_before":"2025-09-02T23:02:41","not_after":"2025-12-01T23:02:40","serial_number":"05c8fbc52b5d8c0ca2089679fd1574503cf0","result_count":2},{"issuer_ca_id":295809,"issuer_name":"C=US, O=Let's Encrypt, CN=E8","common_name":"zap.mikoshi.de","name_value":"zap.mikoshi.de","id":20754243261,"entry_timestamp":"2025-09-03T00:01:11.505","not_before":"2025-09-02T23:02:41","not_after":"2025-12-01T23:02:40","serial_number":"05c8fbc52b5d8c0ca2089679fd1574503cf0","result_count":2},{"issuer_ca_id":295813,"issuer_name":"C=US, O=Let's Encrypt, CN=E7","common_name":"zap.mikoshi.de","name_value":"zap.mikoshi.de","id":20539947210,"entry_timestamp":"2025-08-24T10:34:58.674","not_before":"2025-08-24T09:36:27","not_after":"2025-11-22T09:36:26","serial_number":"062deaf87750f6cf54f0027bbf6f9617447b","result_count":2},{"issuer_ca_id":295813,"issuer_name":"C=US, O=Let's Encrypt, CN=E7","common_name":"zap.mikoshi.de","name_value":"zap.mikoshi.de","id":20539914846,"entry_timestamp":"2025-08-24T10:34:58.16","not_before":"2025-08-24T09:36:27","not_after":"2025-11-22T09:36:26","serial_number":"062deaf87750f6cf54f0027bbf6f9617447b","result_count":2}]}
|
||||
125
config.py
125
config.py
@@ -5,110 +5,97 @@ Handles API key storage, rate limiting, and default settings.
|
||||
|
||||
import os
|
||||
from typing import Dict, Optional
|
||||
from dotenv import load_dotenv
|
||||
|
||||
# Load environment variables from .env file
|
||||
load_dotenv()
|
||||
|
||||
class Config:
|
||||
"""Configuration manager for DNSRecon application."""
|
||||
|
||||
def __init__(self):
|
||||
"""Initialize configuration with default values."""
|
||||
self.api_keys: Dict[str, Optional[str]] = {
|
||||
'shodan': None
|
||||
}
|
||||
self.api_keys: Dict[str, Optional[str]] = {}
|
||||
|
||||
# Default settings
|
||||
# --- General Settings ---
|
||||
self.default_recursion_depth = 2
|
||||
self.default_timeout = 10
|
||||
self.default_timeout = 30
|
||||
self.max_concurrent_requests = 5
|
||||
self.large_entity_threshold = 100
|
||||
self.max_retries_per_target = 8
|
||||
self.cache_expiry_hours = 12
|
||||
|
||||
# Rate limiting settings (requests per minute)
|
||||
# --- Provider Caching Settings ---
|
||||
self.cache_timeout_hours = 6 # Provider-specific cache timeout
|
||||
|
||||
# --- Rate Limiting (requests per minute) ---
|
||||
self.rate_limits = {
|
||||
'crtsh': 60, # Free service, be respectful
|
||||
'shodan': 60, # API dependent
|
||||
'dns': 100 # Local DNS queries
|
||||
'crtsh': 30,
|
||||
'shodan': 60,
|
||||
'dns': 100
|
||||
}
|
||||
|
||||
# Provider settings
|
||||
# --- Provider Settings ---
|
||||
self.enabled_providers = {
|
||||
'crtsh': True, # Always enabled (free)
|
||||
'dns': True, # Always enabled (free)
|
||||
'shodan': False # Requires API key
|
||||
'crtsh': True,
|
||||
'dns': True,
|
||||
'shodan': False
|
||||
}
|
||||
|
||||
# Logging configuration
|
||||
# --- Logging ---
|
||||
self.log_level = 'INFO'
|
||||
self.log_format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
||||
|
||||
# Flask configuration
|
||||
# --- Flask & Session Settings ---
|
||||
self.flask_host = '127.0.0.1'
|
||||
self.flask_port = 5000
|
||||
self.flask_debug = True
|
||||
self.flask_secret_key = 'default-secret-key-change-me'
|
||||
self.flask_permanent_session_lifetime_hours = 2
|
||||
self.session_timeout_minutes = 60
|
||||
|
||||
def set_api_key(self, provider: str, api_key: str) -> bool:
|
||||
"""
|
||||
Set API key for a provider.
|
||||
# Load environment variables to override defaults
|
||||
self.load_from_env()
|
||||
|
||||
Args:
|
||||
provider: Provider name (shodan, etc)
|
||||
api_key: API key string
|
||||
|
||||
Returns:
|
||||
bool: True if key was set successfully
|
||||
"""
|
||||
if provider in self.api_keys:
|
||||
self.api_keys[provider] = api_key
|
||||
self.enabled_providers[provider] = True if api_key else False
|
||||
return True
|
||||
return False
|
||||
def load_from_env(self):
|
||||
"""Load configuration from environment variables."""
|
||||
self.set_api_key('shodan', os.getenv('SHODAN_API_KEY'))
|
||||
|
||||
# Override settings from environment
|
||||
self.default_recursion_depth = int(os.getenv('DEFAULT_RECURSION_DEPTH', self.default_recursion_depth))
|
||||
self.default_timeout = int(os.getenv('DEFAULT_TIMEOUT', self.default_timeout))
|
||||
self.max_concurrent_requests = int(os.getenv('MAX_CONCURRENT_REQUESTS', self.max_concurrent_requests))
|
||||
self.large_entity_threshold = int(os.getenv('LARGE_ENTITY_THRESHOLD', self.large_entity_threshold))
|
||||
self.max_retries_per_target = int(os.getenv('MAX_RETRIES_PER_TARGET', self.max_retries_per_target))
|
||||
self.cache_expiry_hours = int(os.getenv('CACHE_EXPIRY_HOURS', self.cache_expiry_hours))
|
||||
self.cache_timeout_hours = int(os.getenv('CACHE_TIMEOUT_HOURS', self.cache_timeout_hours))
|
||||
|
||||
# Override Flask and session settings
|
||||
self.flask_host = os.getenv('FLASK_HOST', self.flask_host)
|
||||
self.flask_port = int(os.getenv('FLASK_PORT', self.flask_port))
|
||||
self.flask_debug = os.getenv('FLASK_DEBUG', str(self.flask_debug)).lower() == 'true'
|
||||
self.flask_secret_key = os.getenv('FLASK_SECRET_KEY', self.flask_secret_key)
|
||||
self.flask_permanent_session_lifetime_hours = int(os.getenv('FLASK_PERMANENT_SESSION_LIFETIME_HOURS', self.flask_permanent_session_lifetime_hours))
|
||||
self.session_timeout_minutes = int(os.getenv('SESSION_TIMEOUT_MINUTES', self.session_timeout_minutes))
|
||||
|
||||
def set_api_key(self, provider: str, api_key: Optional[str]) -> bool:
|
||||
"""Set API key for a provider."""
|
||||
self.api_keys[provider] = api_key
|
||||
if api_key:
|
||||
self.enabled_providers[provider] = True
|
||||
return True
|
||||
|
||||
def get_api_key(self, provider: str) -> Optional[str]:
|
||||
"""
|
||||
Get API key for a provider.
|
||||
|
||||
Args:
|
||||
provider: Provider name
|
||||
|
||||
Returns:
|
||||
API key or None if not set
|
||||
"""
|
||||
"""Get API key for a provider."""
|
||||
return self.api_keys.get(provider)
|
||||
|
||||
def is_provider_enabled(self, provider: str) -> bool:
|
||||
"""
|
||||
Check if a provider is enabled.
|
||||
|
||||
Args:
|
||||
provider: Provider name
|
||||
|
||||
Returns:
|
||||
bool: True if provider is enabled
|
||||
"""
|
||||
"""Check if a provider is enabled."""
|
||||
return self.enabled_providers.get(provider, False)
|
||||
|
||||
def get_rate_limit(self, provider: str) -> int:
|
||||
"""
|
||||
Get rate limit for a provider.
|
||||
|
||||
Args:
|
||||
provider: Provider name
|
||||
|
||||
Returns:
|
||||
Rate limit in requests per minute
|
||||
"""
|
||||
"""Get rate limit for a provider."""
|
||||
return self.rate_limits.get(provider, 60)
|
||||
|
||||
def load_from_env(self):
|
||||
"""Load configuration from environment variables."""
|
||||
if os.getenv('SHODAN_API_KEY'):
|
||||
self.set_api_key('shodan', os.getenv('SHODAN_API_KEY'))
|
||||
|
||||
# Override default settings from environment
|
||||
self.default_recursion_depth = int(os.getenv('DEFAULT_RECURSION_DEPTH', '2'))
|
||||
self.flask_debug = os.getenv('FLASK_DEBUG', 'True').lower() == 'true'
|
||||
self.default_timeout = 30
|
||||
self.max_concurrent_requests = 5
|
||||
|
||||
|
||||
# Global configuration instance
|
||||
config = Config()
|
||||
@@ -1,3 +1,5 @@
|
||||
# core/graph_manager.py
|
||||
|
||||
"""
|
||||
Graph data model for DNSRecon using NetworkX.
|
||||
Manages in-memory graph storage with confidence scoring and forensic metadata.
|
||||
@@ -50,21 +52,23 @@ class GraphManager:
|
||||
self.__dict__.update(state)
|
||||
self.date_pattern = re.compile(r'^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}')
|
||||
|
||||
def _update_correlation_index(self, node_id: str, data: Any, path: List[str] = None):
|
||||
"""Recursively traverse metadata and add hashable values to the index."""
|
||||
def _update_correlation_index(self, node_id: str, data: Any, path: List[str] = [], parent_attr: str = ""):
|
||||
"""Recursively traverse metadata and add hashable values to the index with better path tracking."""
|
||||
if path is None:
|
||||
path = []
|
||||
|
||||
if isinstance(data, dict):
|
||||
for key, value in data.items():
|
||||
self._update_correlation_index(node_id, value, path + [key])
|
||||
self._update_correlation_index(node_id, value, path + [key], key)
|
||||
elif isinstance(data, list):
|
||||
for i, item in enumerate(data):
|
||||
self._update_correlation_index(node_id, item, path + [f"[{i}]"])
|
||||
# Instead of just using [i], include the parent attribute context
|
||||
list_path_component = f"[{i}]" if not parent_attr else f"{parent_attr}[{i}]"
|
||||
self._update_correlation_index(node_id, item, path + [list_path_component], parent_attr)
|
||||
else:
|
||||
self._add_to_correlation_index(node_id, data, ".".join(path))
|
||||
self._add_to_correlation_index(node_id, data, ".".join(path), parent_attr)
|
||||
|
||||
def _add_to_correlation_index(self, node_id: str, value: Any, path_str: str):
|
||||
def _add_to_correlation_index(self, node_id: str, value: Any, path_str: str, parent_attr: str = ""):
|
||||
"""Add a hashable value to the correlation index, filtering out noise."""
|
||||
if not isinstance(value, (str, int, float, bool)) or value is None:
|
||||
return
|
||||
@@ -80,8 +84,8 @@ class GraphManager:
|
||||
return
|
||||
if len(value) < 4 or value.lower() in ['true', 'false', 'unknown', 'none', 'crt.sh']:
|
||||
return
|
||||
elif isinstance(value, int) and abs(value) < 9999:
|
||||
return # Ignore small integers
|
||||
elif isinstance(value, int) and (abs(value) < 1024 or abs(value) > 65535):
|
||||
return # Ignore small integers and common port numbers
|
||||
elif isinstance(value, bool):
|
||||
return # Ignore boolean values
|
||||
|
||||
@@ -90,10 +94,47 @@ class GraphManager:
|
||||
self.correlation_index[value] = {}
|
||||
if node_id not in self.correlation_index[value]:
|
||||
self.correlation_index[value][node_id] = []
|
||||
if path_str not in self.correlation_index[value][node_id]:
|
||||
self.correlation_index[value][node_id].append(path_str)
|
||||
|
||||
# Store both the full path and the parent attribute for better edge labeling
|
||||
correlation_entry = {
|
||||
'path': path_str,
|
||||
'parent_attr': parent_attr,
|
||||
'meaningful_attr': self._extract_meaningful_attribute(path_str, parent_attr)
|
||||
}
|
||||
|
||||
if correlation_entry not in self.correlation_index[value][node_id]:
|
||||
self.correlation_index[value][node_id].append(correlation_entry)
|
||||
|
||||
def _check_for_correlations(self, new_node_id: str, data: Any, path: List[str] = None) -> List[Dict]:
|
||||
def _extract_meaningful_attribute(self, path_str: str, parent_attr: str = "") -> str:
|
||||
"""Extract the most meaningful attribute name from a path string."""
|
||||
if not path_str:
|
||||
return "unknown"
|
||||
|
||||
path_parts = path_str.split('.')
|
||||
|
||||
# Look for the last non-array-index part
|
||||
for part in reversed(path_parts):
|
||||
# Skip array indices like [0], [1], etc.
|
||||
if not (part.startswith('[') and part.endswith(']') and part[1:-1].isdigit()):
|
||||
# Clean up compound names like "hostnames[0]" to just "hostnames"
|
||||
clean_part = re.sub(r'\[\d+\]$', '', part)
|
||||
if clean_part:
|
||||
return clean_part
|
||||
|
||||
# Fallback to parent attribute if available
|
||||
if parent_attr:
|
||||
return parent_attr
|
||||
|
||||
# Last resort - use the first meaningful part
|
||||
for part in path_parts:
|
||||
if not (part.startswith('[') and part.endswith(']') and part[1:-1].isdigit()):
|
||||
clean_part = re.sub(r'\[\d+\]$', '', part)
|
||||
if clean_part:
|
||||
return clean_part
|
||||
|
||||
return "correlation"
|
||||
|
||||
def _check_for_correlations(self, new_node_id: str, data: Any, path: List[str] = [], parent_attr: str = "") -> List[Dict]:
|
||||
"""Recursively traverse metadata to find correlations with existing data."""
|
||||
if path is None:
|
||||
path = []
|
||||
@@ -103,10 +144,11 @@ class GraphManager:
|
||||
for key, value in data.items():
|
||||
if key == 'source': # Avoid correlating on the provider name
|
||||
continue
|
||||
all_correlations.extend(self._check_for_correlations(new_node_id, value, path + [key]))
|
||||
all_correlations.extend(self._check_for_correlations(new_node_id, value, path + [key], key))
|
||||
elif isinstance(data, list):
|
||||
for i, item in enumerate(data):
|
||||
all_correlations.extend(self._check_for_correlations(new_node_id, item, path + [f"[{i}]"]))
|
||||
list_path_component = f"[{i}]" if not parent_attr else f"{parent_attr}[{i}]"
|
||||
all_correlations.extend(self._check_for_correlations(new_node_id, item, path + [list_path_component], parent_attr))
|
||||
else:
|
||||
value = data
|
||||
if value in self.correlation_index:
|
||||
@@ -117,11 +159,31 @@ class GraphManager:
|
||||
if len(unique_nodes) < 2:
|
||||
return all_correlations # Correlation must involve at least two distinct nodes
|
||||
|
||||
new_source = {'node_id': new_node_id, 'path': ".".join(path)}
|
||||
new_source = {
|
||||
'node_id': new_node_id,
|
||||
'path': ".".join(path),
|
||||
'parent_attr': parent_attr,
|
||||
'meaningful_attr': self._extract_meaningful_attribute(".".join(path), parent_attr)
|
||||
}
|
||||
all_sources = [new_source]
|
||||
for node_id, paths in existing_nodes_with_paths.items():
|
||||
for p_str in paths:
|
||||
all_sources.append({'node_id': node_id, 'path': p_str})
|
||||
|
||||
for node_id, path_entries in existing_nodes_with_paths.items():
|
||||
for entry in path_entries:
|
||||
if isinstance(entry, dict):
|
||||
all_sources.append({
|
||||
'node_id': node_id,
|
||||
'path': entry['path'],
|
||||
'parent_attr': entry.get('parent_attr', ''),
|
||||
'meaningful_attr': entry.get('meaningful_attr', self._extract_meaningful_attribute(entry['path'], entry.get('parent_attr', '')))
|
||||
})
|
||||
else:
|
||||
# Handle legacy string-only entries
|
||||
all_sources.append({
|
||||
'node_id': node_id,
|
||||
'path': str(entry),
|
||||
'parent_attr': '',
|
||||
'meaningful_attr': self._extract_meaningful_attribute(str(entry))
|
||||
})
|
||||
|
||||
all_correlations.append({
|
||||
'value': value,
|
||||
@@ -163,8 +225,7 @@ class GraphManager:
|
||||
# Skip creating correlation node - would be redundant
|
||||
continue
|
||||
|
||||
# STEP 2: Filter out node pairs that already have direct edges
|
||||
eligible_nodes = self._filter_nodes_without_direct_edges(set(corr['nodes']))
|
||||
eligible_nodes = set(corr['nodes'])
|
||||
|
||||
if len(eligible_nodes) < 2:
|
||||
# Need at least 2 nodes to create a correlation
|
||||
@@ -184,11 +245,12 @@ class GraphManager:
|
||||
metadata={'values': [value], 'sources': corr['sources'],
|
||||
'correlated_nodes': list(eligible_nodes)})
|
||||
|
||||
# Create edges from eligible nodes to this correlation node
|
||||
# Create edges from eligible nodes to this correlation node with better labeling
|
||||
for c_node_id in eligible_nodes:
|
||||
if self.graph.has_node(c_node_id):
|
||||
attribute = corr['sources'][0]['path'].split('.')[-1]
|
||||
relationship_type = f"c_{attribute}"
|
||||
# Find the best attribute name for this node
|
||||
meaningful_attr = self._find_best_attribute_name_for_node(c_node_id, corr['sources'])
|
||||
relationship_type = f"c_{meaningful_attr}"
|
||||
self.add_edge(c_node_id, correlation_node_id, relationship_type, confidence_score=0.9)
|
||||
|
||||
self._update_correlation_index(node_id, attributes)
|
||||
@@ -196,27 +258,34 @@ class GraphManager:
|
||||
self.last_modified = datetime.now(timezone.utc).isoformat()
|
||||
return is_new_node
|
||||
|
||||
def _filter_nodes_without_direct_edges(self, node_set: set) -> set:
|
||||
"""
|
||||
Filter out nodes that already have direct edges between them.
|
||||
Returns set of nodes that should be included in correlation.
|
||||
"""
|
||||
nodes_list = list(node_set)
|
||||
eligible_nodes = set(node_set) # Start with all nodes
|
||||
def _find_best_attribute_name_for_node(self, node_id: str, sources: List[Dict]) -> str:
|
||||
"""Find the best attribute name for a correlation edge by looking at the sources."""
|
||||
node_sources = [s for s in sources if s['node_id'] == node_id]
|
||||
|
||||
# Check all pairs of nodes
|
||||
for i in range(len(nodes_list)):
|
||||
for j in range(i + 1, len(nodes_list)):
|
||||
node_a = nodes_list[i]
|
||||
node_b = nodes_list[j]
|
||||
|
||||
# Check if direct edge exists in either direction
|
||||
if self._has_direct_edge_bidirectional(node_a, node_b):
|
||||
# Remove both nodes from eligible set since they're already connected
|
||||
eligible_nodes.discard(node_a)
|
||||
eligible_nodes.discard(node_b)
|
||||
if not node_sources:
|
||||
return "correlation"
|
||||
|
||||
return eligible_nodes
|
||||
# Use the meaningful_attr if available
|
||||
for source in node_sources:
|
||||
meaningful_attr = source.get('meaningful_attr')
|
||||
if meaningful_attr and meaningful_attr != "unknown":
|
||||
return meaningful_attr
|
||||
|
||||
# Fallback to parent_attr
|
||||
for source in node_sources:
|
||||
parent_attr = source.get('parent_attr')
|
||||
if parent_attr:
|
||||
return parent_attr
|
||||
|
||||
# Last resort - extract from path
|
||||
for source in node_sources:
|
||||
path = source.get('path', '')
|
||||
if path:
|
||||
extracted = self._extract_meaningful_attribute(path)
|
||||
if extracted != "unknown":
|
||||
return extracted
|
||||
|
||||
return "correlation"
|
||||
|
||||
def _has_direct_edge_bidirectional(self, node_a: str, node_b: str) -> bool:
|
||||
"""
|
||||
@@ -290,7 +359,7 @@ class GraphManager:
|
||||
# Create set of unique sources based on (node_id, path) tuples
|
||||
source_set = set()
|
||||
for source in existing_sources + new_sources:
|
||||
source_tuple = (source['node_id'], source['path'])
|
||||
source_tuple = (source['node_id'], source.get('path', ''))
|
||||
source_set.add(source_tuple)
|
||||
|
||||
# Convert back to list of dictionaries
|
||||
@@ -345,6 +414,29 @@ class GraphManager:
|
||||
self.last_modified = datetime.now(timezone.utc).isoformat()
|
||||
return True
|
||||
|
||||
def remove_node(self, node_id: str) -> bool:
|
||||
"""Remove a node and its connected edges from the graph."""
|
||||
if not self.graph.has_node(node_id):
|
||||
return False
|
||||
|
||||
# Remove node from the graph (NetworkX handles removing connected edges)
|
||||
self.graph.remove_node(node_id)
|
||||
|
||||
# Clean up the correlation index
|
||||
keys_to_delete = []
|
||||
for value, nodes in self.correlation_index.items():
|
||||
if node_id in nodes:
|
||||
del nodes[node_id]
|
||||
if not nodes: # If no other nodes are associated with this value, remove it
|
||||
keys_to_delete.append(value)
|
||||
|
||||
for key in keys_to_delete:
|
||||
if key in self.correlation_index:
|
||||
del self.correlation_index[key]
|
||||
|
||||
self.last_modified = datetime.now(timezone.utc).isoformat()
|
||||
return True
|
||||
|
||||
def get_node_count(self) -> int:
|
||||
"""Get total number of nodes in the graph."""
|
||||
return self.graph.number_of_nodes()
|
||||
@@ -421,10 +513,14 @@ class GraphManager:
|
||||
def _get_confidence_distribution(self) -> Dict[str, int]:
|
||||
"""Get distribution of edge confidence scores."""
|
||||
distribution = {'high': 0, 'medium': 0, 'low': 0}
|
||||
for _, _, confidence in self.graph.edges(data='confidence_score', default=0):
|
||||
if confidence >= 0.8: distribution['high'] += 1
|
||||
elif confidence >= 0.6: distribution['medium'] += 1
|
||||
else: distribution['low'] += 1
|
||||
for _, _, data in self.graph.edges(data=True):
|
||||
confidence = data.get('confidence_score', 0)
|
||||
if confidence >= 0.8:
|
||||
distribution['high'] += 1
|
||||
elif confidence >= 0.6:
|
||||
distribution['medium'] += 1
|
||||
else:
|
||||
distribution['low'] += 1
|
||||
return distribution
|
||||
|
||||
def get_statistics(self) -> Dict[str, Any]:
|
||||
@@ -439,9 +535,10 @@ class GraphManager:
|
||||
# Calculate distributions
|
||||
for node_type in NodeType:
|
||||
stats['node_type_distribution'][node_type.value] = self.get_nodes_by_type(node_type).__len__()
|
||||
for _, _, rel_type in self.graph.edges(data='relationship_type', default='unknown'):
|
||||
for _, _, data in self.graph.edges(data=True):
|
||||
rel_type = data.get('relationship_type', 'unknown')
|
||||
stats['relationship_type_distribution'][rel_type] = stats['relationship_type_distribution'].get(rel_type, 0) + 1
|
||||
for _, _, provider in self.graph.edges(data='source_provider', default='unknown'):
|
||||
provider = data.get('source_provider', 'unknown')
|
||||
stats['provider_distribution'][provider] = stats['provider_distribution'].get(provider, 0) + 1
|
||||
return stats
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ class ForensicLogger:
|
||||
Maintains detailed audit trail of all reconnaissance activities.
|
||||
"""
|
||||
|
||||
def __init__(self, session_id: str = None):
|
||||
def __init__(self, session_id: str = ""):
|
||||
"""
|
||||
Initialize forensic logger.
|
||||
|
||||
@@ -203,8 +203,6 @@ class ForensicLogger:
|
||||
self.session_metadata['target_domains'] = list(self.session_metadata['target_domains'])
|
||||
|
||||
self.logger.info(f"Scan Complete - Session: {self.session_id}")
|
||||
self.logger.info(f"Total API Requests: {self.session_metadata['total_requests']}")
|
||||
self.logger.info(f"Total Relationships: {self.session_metadata['total_relationships']}")
|
||||
|
||||
def export_audit_trail(self) -> Dict[str, Any]:
|
||||
"""
|
||||
|
||||
455
core/scanner.py
455
core/scanner.py
@@ -5,7 +5,7 @@ import traceback
|
||||
import time
|
||||
import os
|
||||
import importlib
|
||||
from typing import List, Set, Dict, Any, Tuple
|
||||
from typing import List, Set, Dict, Any, Tuple, Optional
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed, CancelledError, Future
|
||||
from collections import defaultdict, deque
|
||||
from datetime import datetime, timezone
|
||||
@@ -49,11 +49,20 @@ class Scanner:
|
||||
self.max_depth = 2
|
||||
self.stop_event = threading.Event()
|
||||
self.scan_thread = None
|
||||
self.session_id = None # Will be set by session manager
|
||||
self.session_id: Optional[str] = None # Will be set by session manager
|
||||
self.task_queue = deque([])
|
||||
self.target_retries = defaultdict(int)
|
||||
self.scan_failed_due_to_retries = False
|
||||
|
||||
# **NEW**: Track currently processing tasks to prevent processing after stop
|
||||
self.currently_processing = set()
|
||||
self.processing_lock = threading.Lock()
|
||||
|
||||
# Scanning progress tracking
|
||||
self.total_indicators_found = 0
|
||||
self.indicators_processed = 0
|
||||
self.indicators_completed = 0
|
||||
self.tasks_re_enqueued = 0
|
||||
self.current_indicator = ""
|
||||
|
||||
# Concurrent processing configuration
|
||||
@@ -119,7 +128,8 @@ class Scanner:
|
||||
unpicklable_attrs = [
|
||||
'stop_event',
|
||||
'scan_thread',
|
||||
'executor'
|
||||
'executor',
|
||||
'processing_lock' # **NEW**: Exclude the processing lock
|
||||
]
|
||||
|
||||
for attr in unpicklable_attrs:
|
||||
@@ -143,6 +153,11 @@ class Scanner:
|
||||
self.stop_event = threading.Event()
|
||||
self.scan_thread = None
|
||||
self.executor = None
|
||||
self.processing_lock = threading.Lock() # **NEW**: Recreate processing lock
|
||||
|
||||
# **NEW**: Reset processing tracking
|
||||
if not hasattr(self, 'currently_processing'):
|
||||
self.currently_processing = set()
|
||||
|
||||
# Re-set stop events for providers
|
||||
if hasattr(self, 'providers'):
|
||||
@@ -165,9 +180,10 @@ class Scanner:
|
||||
attribute = getattr(module, attribute_name)
|
||||
if isinstance(attribute, type) and issubclass(attribute, BaseProvider) and attribute is not BaseProvider:
|
||||
provider_class = attribute
|
||||
provider_name = provider_class(session_config=self.config).get_name()
|
||||
provider = provider_class(name=attribute_name, session_config=self.config)
|
||||
provider_name = provider.get_name()
|
||||
|
||||
if self.config.is_provider_enabled(provider_name):
|
||||
provider = provider_class(session_config=self.config)
|
||||
if provider.is_available():
|
||||
provider.set_stop_event(self.stop_event)
|
||||
self.providers.append(provider)
|
||||
@@ -188,29 +204,60 @@ class Scanner:
|
||||
self._initialize_providers()
|
||||
print("Session configuration updated")
|
||||
|
||||
def start_scan(self, target_domain: str, max_depth: int = 2, clear_graph: bool = True) -> bool:
|
||||
"""Start a new reconnaissance scan with immediate GUI feedback."""
|
||||
def start_scan(self, target: str, max_depth: int = 2, clear_graph: bool = True, force_rescan_target: Optional[str] = None) -> bool:
|
||||
"""Start a new reconnaissance scan with proper cleanup of previous scans."""
|
||||
print(f"=== STARTING SCAN IN SCANNER {id(self)} ===")
|
||||
print(f"Session ID: {self.session_id}")
|
||||
print(f"Initial scanner status: {self.status}")
|
||||
|
||||
# Clean up previous scan thread if needed
|
||||
# **IMPROVED**: More aggressive cleanup of previous scan
|
||||
if self.scan_thread and self.scan_thread.is_alive():
|
||||
print("A previous scan thread is still alive. Sending termination signal and waiting...")
|
||||
self.stop_scan()
|
||||
self.scan_thread.join(10.0)
|
||||
|
||||
print("A previous scan thread is still alive. Forcing termination...")
|
||||
|
||||
# Set stop signals immediately
|
||||
self._set_stop_signal()
|
||||
self.status = ScanStatus.STOPPED
|
||||
|
||||
# Clear all processing state
|
||||
with self.processing_lock:
|
||||
self.currently_processing.clear()
|
||||
self.task_queue.clear()
|
||||
|
||||
# Shutdown executor aggressively
|
||||
if self.executor:
|
||||
print("Shutting down executor forcefully...")
|
||||
self.executor.shutdown(wait=False, cancel_futures=True)
|
||||
self.executor = None
|
||||
|
||||
# Wait for thread termination with shorter timeout
|
||||
print("Waiting for previous scan thread to terminate...")
|
||||
self.scan_thread.join(5.0) # Reduced from 10 seconds
|
||||
|
||||
if self.scan_thread.is_alive():
|
||||
print("ERROR: The previous scan thread is unresponsive and could not be stopped.")
|
||||
self.status = ScanStatus.FAILED
|
||||
self._update_session_state()
|
||||
return False
|
||||
print("Previous scan thread terminated successfully.")
|
||||
print("WARNING: Previous scan thread is still alive after 5 seconds")
|
||||
# Continue anyway, but log the issue
|
||||
self.logger.logger.warning("Previous scan thread failed to terminate cleanly")
|
||||
|
||||
# Reset state for new scan
|
||||
# Reset state for new scan with proper forensic logging
|
||||
print("Resetting scanner state for new scan...")
|
||||
self.status = ScanStatus.IDLE
|
||||
self._update_session_state() # Update GUI immediately
|
||||
print("Scanner state is now clean for a new scan.")
|
||||
self.stop_event.clear()
|
||||
|
||||
# **NEW**: Clear Redis stop signal explicitly
|
||||
if self.session_id:
|
||||
from core.session_manager import session_manager
|
||||
session_manager.clear_stop_signal(self.session_id)
|
||||
|
||||
with self.processing_lock:
|
||||
self.currently_processing.clear()
|
||||
|
||||
self.task_queue.clear()
|
||||
self.target_retries.clear()
|
||||
self.scan_failed_due_to_retries = False
|
||||
|
||||
# Update session state immediately for GUI feedback
|
||||
self._update_session_state()
|
||||
print("Scanner state reset complete.")
|
||||
|
||||
try:
|
||||
if not hasattr(self, 'providers') or not self.providers:
|
||||
@@ -221,28 +268,31 @@ class Scanner:
|
||||
|
||||
if clear_graph:
|
||||
self.graph.clear()
|
||||
self.current_target = target_domain.lower().strip()
|
||||
|
||||
if force_rescan_target and self.graph.graph.has_node(force_rescan_target):
|
||||
print(f"Forcing rescan of {force_rescan_target}, clearing provider states.")
|
||||
node_data = self.graph.graph.nodes[force_rescan_target]
|
||||
if 'metadata' in node_data and 'provider_states' in node_data['metadata']:
|
||||
node_data['metadata']['provider_states'] = {}
|
||||
|
||||
self.current_target = target.lower().strip()
|
||||
self.max_depth = max_depth
|
||||
self.current_depth = 0
|
||||
|
||||
# Clear both local and Redis stop signals
|
||||
self.stop_event.clear()
|
||||
if self.session_id:
|
||||
from core.session_manager import session_manager
|
||||
session_manager.clear_stop_signal(self.session_id)
|
||||
|
||||
self.total_indicators_found = 0
|
||||
self.indicators_processed = 0
|
||||
self.indicators_completed = 0
|
||||
self.tasks_re_enqueued = 0
|
||||
self.current_indicator = self.current_target
|
||||
|
||||
# Update GUI with scan preparation
|
||||
# Update GUI with scan preparation state
|
||||
self._update_session_state()
|
||||
|
||||
# Start new forensic session
|
||||
print(f"Starting new forensic session for scanner {id(self)}...")
|
||||
self.logger = new_session()
|
||||
|
||||
# Start scan in separate thread
|
||||
# Start scan in a separate thread
|
||||
print(f"Starting scan thread for scanner {id(self)}...")
|
||||
self.scan_thread = threading.Thread(
|
||||
target=self._execute_scan,
|
||||
@@ -258,54 +308,104 @@ class Scanner:
|
||||
print(f"ERROR: Exception in start_scan for scanner {id(self)}: {e}")
|
||||
traceback.print_exc()
|
||||
self.status = ScanStatus.FAILED
|
||||
self._update_session_state() # Update failed status immediately
|
||||
self._update_session_state()
|
||||
return False
|
||||
|
||||
def _execute_scan(self, target_domain: str, max_depth: int) -> None:
|
||||
"""Execute the reconnaissance scan using a task queue-based approach."""
|
||||
print(f"_execute_scan started for {target_domain} with depth {max_depth}")
|
||||
def _execute_scan(self, target: str, max_depth: int) -> None:
|
||||
"""Execute the reconnaissance scan with proper termination handling."""
|
||||
print(f"_execute_scan started for {target} with depth {max_depth}")
|
||||
self.executor = ThreadPoolExecutor(max_workers=self.max_workers)
|
||||
processed_targets = set()
|
||||
|
||||
task_queue = deque([(target_domain, 0, False)]) # target, depth, is_large_entity_member
|
||||
self.task_queue.append((target, 0, False))
|
||||
|
||||
try:
|
||||
self.status = ScanStatus.RUNNING
|
||||
self._update_session_state()
|
||||
|
||||
enabled_providers = [provider.get_name() for provider in self.providers]
|
||||
self.logger.log_scan_start(target_domain, max_depth, enabled_providers)
|
||||
self.graph.add_node(target_domain, NodeType.DOMAIN)
|
||||
self._initialize_provider_states(target_domain)
|
||||
self.logger.log_scan_start(target, max_depth, enabled_providers)
|
||||
|
||||
# Determine initial node type
|
||||
node_type = NodeType.IP if _is_valid_ip(target) else NodeType.DOMAIN
|
||||
self.graph.add_node(target, node_type)
|
||||
|
||||
self._initialize_provider_states(target)
|
||||
|
||||
while task_queue:
|
||||
if self._is_stop_requested():
|
||||
print("Stop requested, terminating scan.")
|
||||
# Better termination checking in main loop
|
||||
while self.task_queue and not self._is_stop_requested():
|
||||
try:
|
||||
target_item, depth, is_large_entity_member = self.task_queue.popleft()
|
||||
except IndexError:
|
||||
# Queue became empty during processing
|
||||
break
|
||||
|
||||
target, depth, is_large_entity_member = task_queue.popleft()
|
||||
|
||||
if target in processed_targets:
|
||||
if target_item in processed_targets:
|
||||
continue
|
||||
|
||||
if depth > max_depth:
|
||||
continue
|
||||
|
||||
self.current_depth = depth
|
||||
self.current_indicator = target
|
||||
self._update_session_state()
|
||||
|
||||
new_targets, large_entity_members = self._query_providers_for_target(target, depth, is_large_entity_member)
|
||||
processed_targets.add(target)
|
||||
|
||||
for new_target in new_targets:
|
||||
if new_target not in processed_targets:
|
||||
task_queue.append((new_target, depth + 1, False))
|
||||
|
||||
for member in large_entity_members:
|
||||
if member not in processed_targets:
|
||||
task_queue.append((member, depth, True))
|
||||
# Track this target as currently processing
|
||||
with self.processing_lock:
|
||||
if self._is_stop_requested():
|
||||
print(f"Stop requested before processing {target_item}")
|
||||
break
|
||||
self.currently_processing.add(target_item)
|
||||
|
||||
try:
|
||||
self.current_depth = depth
|
||||
self.current_indicator = target_item
|
||||
self._update_session_state()
|
||||
|
||||
# More frequent stop checking during processing
|
||||
if self._is_stop_requested():
|
||||
print(f"Stop requested during processing setup for {target_item}")
|
||||
break
|
||||
|
||||
new_targets, large_entity_members, success = self._query_providers_for_target(target_item, depth, is_large_entity_member)
|
||||
|
||||
# Check stop signal after provider queries
|
||||
if self._is_stop_requested():
|
||||
print(f"Stop requested after querying providers for {target_item}")
|
||||
break
|
||||
|
||||
if not success:
|
||||
self.target_retries[target_item] += 1
|
||||
if self.target_retries[target_item] <= self.config.max_retries_per_target:
|
||||
print(f"Re-queueing target {target_item} (attempt {self.target_retries[target_item]})")
|
||||
self.task_queue.append((target_item, depth, is_large_entity_member))
|
||||
self.tasks_re_enqueued += 1
|
||||
else:
|
||||
print(f"ERROR: Max retries exceeded for target {target_item}")
|
||||
self.scan_failed_due_to_retries = True
|
||||
self._log_target_processing_error(target_item, "Max retries exceeded")
|
||||
else:
|
||||
processed_targets.add(target_item)
|
||||
self.indicators_completed += 1
|
||||
|
||||
# Only add new targets if not stopped
|
||||
if not self._is_stop_requested():
|
||||
for new_target in new_targets:
|
||||
if new_target not in processed_targets:
|
||||
self.task_queue.append((new_target, depth + 1, False))
|
||||
|
||||
for member in large_entity_members:
|
||||
if member not in processed_targets:
|
||||
self.task_queue.append((member, depth, True))
|
||||
|
||||
finally:
|
||||
# Always remove from processing set
|
||||
with self.processing_lock:
|
||||
self.currently_processing.discard(target_item)
|
||||
|
||||
# Log termination reason
|
||||
if self._is_stop_requested():
|
||||
print("Scan terminated due to stop request")
|
||||
self.logger.logger.info("Scan terminated by user request")
|
||||
elif not self.task_queue:
|
||||
print("Scan completed - no more targets to process")
|
||||
self.logger.logger.info("Scan completed - all targets processed")
|
||||
|
||||
except Exception as e:
|
||||
print(f"ERROR: Scan execution failed with error: {e}")
|
||||
@@ -313,8 +413,14 @@ class Scanner:
|
||||
self.status = ScanStatus.FAILED
|
||||
self.logger.logger.error(f"Scan failed: {e}")
|
||||
finally:
|
||||
# Clear processing state on exit
|
||||
with self.processing_lock:
|
||||
self.currently_processing.clear()
|
||||
|
||||
if self._is_stop_requested():
|
||||
self.status = ScanStatus.STOPPED
|
||||
elif self.scan_failed_due_to_retries:
|
||||
self.status = ScanStatus.FAILED
|
||||
else:
|
||||
self.status = ScanStatus.COMPLETED
|
||||
|
||||
@@ -322,43 +428,50 @@ class Scanner:
|
||||
self.logger.log_scan_complete()
|
||||
if self.executor:
|
||||
self.executor.shutdown(wait=False, cancel_futures=True)
|
||||
self.executor = None
|
||||
stats = self.graph.get_statistics()
|
||||
print("Final scan statistics:")
|
||||
print(f" - Total nodes: {stats['basic_metrics']['total_nodes']}")
|
||||
print(f" - Total edges: {stats['basic_metrics']['total_edges']}")
|
||||
print(f" - Targets processed: {len(processed_targets)}")
|
||||
|
||||
def _query_providers_for_target(self, target: str, depth: int, dns_only: bool = False) -> Tuple[Set[str], Set[str]]:
|
||||
"""Helper method to query providers for a single target."""
|
||||
def _query_providers_for_target(self, target: str, depth: int, dns_only: bool = False) -> Tuple[Set[str], Set[str], bool]:
|
||||
"""Query providers for a single target with enhanced stop checking."""
|
||||
# **NEW**: Early termination check
|
||||
if self._is_stop_requested():
|
||||
print(f"Stop requested before querying providers for {target}")
|
||||
return set(), set(), False
|
||||
|
||||
is_ip = _is_valid_ip(target)
|
||||
target_type = NodeType.IP if is_ip else NodeType.DOMAIN
|
||||
print(f"Querying providers for {target_type.value}: {target} at depth {depth}")
|
||||
|
||||
if self._is_stop_requested():
|
||||
print(f"Stop requested before querying providers for {target}")
|
||||
return set(), set()
|
||||
|
||||
self.graph.add_node(target, target_type)
|
||||
self._initialize_provider_states(target)
|
||||
|
||||
new_targets = set()
|
||||
large_entity_members = set()
|
||||
node_attributes = defaultdict(lambda: defaultdict(list))
|
||||
all_providers_successful = True
|
||||
|
||||
eligible_providers = self._get_eligible_providers(target, is_ip, dns_only)
|
||||
|
||||
if not eligible_providers:
|
||||
self._log_no_eligible_providers(target, is_ip)
|
||||
return new_targets, large_entity_members
|
||||
return new_targets, large_entity_members, True
|
||||
|
||||
for provider in eligible_providers:
|
||||
# **IMPROVED**: Check stop signal before each provider
|
||||
for i, provider in enumerate(eligible_providers):
|
||||
if self._is_stop_requested():
|
||||
print(f"Stop requested while querying providers for {target}")
|
||||
print(f"Stop requested while querying provider {i+1}/{len(eligible_providers)} for {target}")
|
||||
all_providers_successful = False
|
||||
break
|
||||
|
||||
try:
|
||||
provider_results = self._query_single_provider_forensic(provider, target, is_ip, depth)
|
||||
if provider_results and not self._is_stop_requested():
|
||||
if provider_results is None:
|
||||
all_providers_successful = False
|
||||
elif not self._is_stop_requested():
|
||||
discovered, is_large_entity = self._process_provider_results_forensic(
|
||||
target, provider, provider_results, node_attributes, depth
|
||||
)
|
||||
@@ -366,16 +479,65 @@ class Scanner:
|
||||
large_entity_members.update(discovered)
|
||||
else:
|
||||
new_targets.update(discovered)
|
||||
else:
|
||||
print(f"Stop requested after processing results from {provider.get_name()}")
|
||||
break
|
||||
except Exception as e:
|
||||
all_providers_successful = False
|
||||
self._log_provider_error(target, provider.get_name(), str(e))
|
||||
|
||||
for node_id, attributes in node_attributes.items():
|
||||
if self.graph.graph.has_node(node_id):
|
||||
node_is_ip = _is_valid_ip(node_id)
|
||||
node_type_to_add = NodeType.IP if node_is_ip else NodeType.DOMAIN
|
||||
self.graph.add_node(node_id, node_type_to_add, attributes=attributes)
|
||||
# **NEW**: Only update node attributes if not stopped
|
||||
if not self._is_stop_requested():
|
||||
for node_id, attributes in node_attributes.items():
|
||||
if self.graph.graph.has_node(node_id):
|
||||
node_is_ip = _is_valid_ip(node_id)
|
||||
node_type_to_add = NodeType.IP if node_is_ip else NodeType.DOMAIN
|
||||
self.graph.add_node(node_id, node_type_to_add, attributes=attributes)
|
||||
|
||||
return new_targets, large_entity_members
|
||||
return new_targets, large_entity_members, all_providers_successful
|
||||
|
||||
def stop_scan(self) -> bool:
|
||||
"""Request immediate scan termination with proper cleanup."""
|
||||
try:
|
||||
print("=== INITIATING IMMEDIATE SCAN TERMINATION ===")
|
||||
self.logger.logger.info("Scan termination requested by user")
|
||||
|
||||
# **IMPROVED**: More aggressive stop signal setting
|
||||
self._set_stop_signal()
|
||||
self.status = ScanStatus.STOPPED
|
||||
|
||||
# **NEW**: Clear processing state immediately
|
||||
with self.processing_lock:
|
||||
currently_processing_copy = self.currently_processing.copy()
|
||||
self.currently_processing.clear()
|
||||
print(f"Cleared {len(currently_processing_copy)} currently processing targets: {currently_processing_copy}")
|
||||
|
||||
# **IMPROVED**: Clear task queue and log what was discarded
|
||||
discarded_tasks = list(self.task_queue)
|
||||
self.task_queue.clear()
|
||||
print(f"Discarded {len(discarded_tasks)} pending tasks")
|
||||
|
||||
# **IMPROVED**: Aggressively shut down executor
|
||||
if self.executor:
|
||||
print("Shutting down executor with immediate cancellation...")
|
||||
try:
|
||||
# Cancel all pending futures
|
||||
self.executor.shutdown(wait=False, cancel_futures=True)
|
||||
print("Executor shutdown completed")
|
||||
except Exception as e:
|
||||
print(f"Error during executor shutdown: {e}")
|
||||
|
||||
# Immediately update GUI with stopped status
|
||||
self._update_session_state()
|
||||
|
||||
print("Termination signals sent. The scan will stop as soon as possible.")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"ERROR: Exception in stop_scan: {e}")
|
||||
self.logger.logger.error(f"Error during scan termination: {e}")
|
||||
traceback.print_exc()
|
||||
return False
|
||||
|
||||
def _update_session_state(self) -> None:
|
||||
"""
|
||||
@@ -391,6 +553,49 @@ class Scanner:
|
||||
except Exception as e:
|
||||
print(f"ERROR: Failed to update session state: {e}")
|
||||
|
||||
def get_scan_status(self) -> Dict[str, Any]:
|
||||
"""Get current scan status with processing information."""
|
||||
try:
|
||||
with self.processing_lock:
|
||||
currently_processing_count = len(self.currently_processing)
|
||||
currently_processing_list = list(self.currently_processing)
|
||||
|
||||
return {
|
||||
'status': self.status,
|
||||
'target_domain': self.current_target,
|
||||
'current_depth': self.current_depth,
|
||||
'max_depth': self.max_depth,
|
||||
'current_indicator': self.current_indicator,
|
||||
'indicators_processed': self.indicators_processed,
|
||||
'indicators_completed': self.indicators_completed,
|
||||
'tasks_re_enqueued': self.tasks_re_enqueued,
|
||||
'progress_percentage': self._calculate_progress(),
|
||||
'enabled_providers': [provider.get_name() for provider in self.providers],
|
||||
'graph_statistics': self.graph.get_statistics(),
|
||||
'task_queue_size': len(self.task_queue),
|
||||
'currently_processing_count': currently_processing_count, # **NEW**
|
||||
'currently_processing': currently_processing_list[:5] # **NEW**: Show first 5 for debugging
|
||||
}
|
||||
except Exception as e:
|
||||
print(f"ERROR: Exception in get_scan_status: {e}")
|
||||
traceback.print_exc()
|
||||
return {
|
||||
'status': 'error',
|
||||
'target_domain': None,
|
||||
'current_depth': 0,
|
||||
'max_depth': 0,
|
||||
'current_indicator': '',
|
||||
'indicators_processed': 0,
|
||||
'indicators_completed': 0,
|
||||
'tasks_re_enqueued': 0,
|
||||
'progress_percentage': 0.0,
|
||||
'enabled_providers': [],
|
||||
'graph_statistics': {},
|
||||
'task_queue_size': 0,
|
||||
'currently_processing_count': 0,
|
||||
'currently_processing': []
|
||||
}
|
||||
|
||||
def _initialize_provider_states(self, target: str) -> None:
|
||||
"""Initialize provider states for forensic tracking."""
|
||||
if not self.graph.graph.has_node(target):
|
||||
@@ -420,22 +625,25 @@ class Scanner:
|
||||
return eligible
|
||||
|
||||
def _already_queried_provider(self, target: str, provider_name: str) -> bool:
|
||||
"""Check if we already queried a provider for a target."""
|
||||
"""Check if we already successfully queried a provider for a target."""
|
||||
if not self.graph.graph.has_node(target):
|
||||
return False
|
||||
|
||||
node_data = self.graph.graph.nodes[target]
|
||||
provider_states = node_data.get('metadata', {}).get('provider_states', {})
|
||||
return provider_name in provider_states
|
||||
|
||||
# A provider has been successfully queried if a state exists and its status is 'success'
|
||||
provider_state = provider_states.get(provider_name)
|
||||
return provider_state is not None and provider_state.get('status') == 'success'
|
||||
|
||||
def _query_single_provider_forensic(self, provider, target: str, is_ip: bool, current_depth: int) -> List:
|
||||
def _query_single_provider_forensic(self, provider, target: str, is_ip: bool, current_depth: int) -> Optional[List]:
|
||||
"""Query a single provider with stop signal checking."""
|
||||
provider_name = provider.get_name()
|
||||
start_time = datetime.now(timezone.utc)
|
||||
|
||||
if self._is_stop_requested():
|
||||
print(f"Stop requested before querying {provider_name} for {target}")
|
||||
return []
|
||||
return None
|
||||
|
||||
print(f"Querying {provider_name} for {target}")
|
||||
|
||||
@@ -449,7 +657,7 @@ class Scanner:
|
||||
|
||||
if self._is_stop_requested():
|
||||
print(f"Stop requested after querying {provider_name} for {target}")
|
||||
return []
|
||||
return None
|
||||
|
||||
self._update_provider_state(target, provider_name, 'success', len(results), None, start_time)
|
||||
|
||||
@@ -459,10 +667,10 @@ class Scanner:
|
||||
except Exception as e:
|
||||
self._update_provider_state(target, provider_name, 'failed', 0, str(e), start_time)
|
||||
print(f"✗ {provider_name} failed for {target}: {e}")
|
||||
return []
|
||||
return None
|
||||
|
||||
def _update_provider_state(self, target: str, provider_name: str, status: str,
|
||||
results_count: int, error: str, start_time: datetime) -> None:
|
||||
results_count: int, error: Optional[str], start_time: datetime) -> None:
|
||||
"""Update provider state in node metadata for forensic tracking."""
|
||||
if not self.graph.graph.has_node(target):
|
||||
return
|
||||
@@ -499,7 +707,7 @@ class Scanner:
|
||||
return members, True
|
||||
|
||||
for i, (source, rel_target, rel_type, confidence, raw_data) in enumerate(results):
|
||||
if i % 10 == 0 and self._is_stop_requested():
|
||||
if i % 5 == 0 and self._is_stop_requested(): # Check more frequently
|
||||
print(f"Stop requested while processing results from {provider_name} for {target}")
|
||||
break
|
||||
|
||||
@@ -515,7 +723,22 @@ class Scanner:
|
||||
|
||||
self._collect_node_attributes(source, provider_name, rel_type, rel_target, raw_data, node_attributes[source])
|
||||
|
||||
if _is_valid_ip(rel_target):
|
||||
if isinstance(rel_target, list):
|
||||
# If the target is a list, iterate and process each item
|
||||
for single_target in rel_target:
|
||||
if _is_valid_ip(single_target):
|
||||
self.graph.add_node(single_target, NodeType.IP)
|
||||
if self.graph.add_edge(source, single_target, rel_type, confidence, provider_name, raw_data):
|
||||
print(f"Added IP relationship: {source} -> {single_target} ({rel_type})")
|
||||
discovered_targets.add(single_target)
|
||||
elif _is_valid_domain(single_target):
|
||||
self.graph.add_node(single_target, NodeType.DOMAIN)
|
||||
if self.graph.add_edge(source, single_target, rel_type, confidence, provider_name, raw_data):
|
||||
print(f"Added domain relationship: {source} -> {single_target} ({rel_type})")
|
||||
discovered_targets.add(single_target)
|
||||
self._collect_node_attributes(single_target, provider_name, rel_type, source, raw_data, node_attributes[single_target])
|
||||
|
||||
elif _is_valid_ip(rel_target):
|
||||
self.graph.add_node(rel_target, NodeType.IP)
|
||||
if self.graph.add_edge(source, rel_target, rel_type, confidence, provider_name, raw_data):
|
||||
print(f"Added IP relationship: {source} -> {rel_target} ({rel_type})")
|
||||
@@ -621,7 +844,6 @@ class Scanner:
|
||||
if target not in attributes[record_type_name]:
|
||||
attributes[record_type_name].append(target)
|
||||
|
||||
|
||||
def _log_target_processing_error(self, target: str, error: str) -> None:
|
||||
"""Log target processing errors for forensic trail."""
|
||||
self.logger.logger.error(f"Target processing failed for {target}: {error}")
|
||||
@@ -635,69 +857,12 @@ class Scanner:
|
||||
target_type = 'IP' if is_ip else 'domain'
|
||||
self.logger.logger.warning(f"No eligible providers for {target_type}: {target}")
|
||||
|
||||
def stop_scan(self) -> bool:
|
||||
"""Request immediate scan termination with immediate GUI feedback."""
|
||||
try:
|
||||
print("=== INITIATING IMMEDIATE SCAN TERMINATION ===")
|
||||
self.logger.logger.info("Scan termination requested by user")
|
||||
|
||||
# Set both local and Redis stop signals
|
||||
self._set_stop_signal()
|
||||
self.status = ScanStatus.STOPPED
|
||||
|
||||
# Immediately update GUI with stopped status
|
||||
self._update_session_state()
|
||||
|
||||
# Cancel executor futures if running
|
||||
if self.executor:
|
||||
print("Shutting down executor with immediate cancellation...")
|
||||
self.executor.shutdown(wait=False, cancel_futures=True)
|
||||
|
||||
print("Termination signals sent. The scan will stop as soon as possible.")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"ERROR: Exception in stop_scan: {e}")
|
||||
self.logger.logger.error(f"Error during scan termination: {e}")
|
||||
traceback.print_exc()
|
||||
return False
|
||||
|
||||
def get_scan_status(self) -> Dict[str, Any]:
|
||||
"""Get current scan status with forensic information."""
|
||||
try:
|
||||
return {
|
||||
'status': self.status,
|
||||
'target_domain': self.current_target,
|
||||
'current_depth': self.current_depth,
|
||||
'max_depth': self.max_depth,
|
||||
'current_indicator': self.current_indicator,
|
||||
'total_indicators_found': self.total_indicators_found,
|
||||
'indicators_processed': self.indicators_processed,
|
||||
'progress_percentage': self._calculate_progress(),
|
||||
'enabled_providers': [provider.get_name() for provider in self.providers],
|
||||
'graph_statistics': self.graph.get_statistics()
|
||||
}
|
||||
except Exception as e:
|
||||
print(f"ERROR: Exception in get_scan_status: {e}")
|
||||
traceback.print_exc()
|
||||
return {
|
||||
'status': 'error',
|
||||
'target_domain': None,
|
||||
'current_depth': 0,
|
||||
'max_depth': 0,
|
||||
'current_indicator': '',
|
||||
'total_indicators_found': 0,
|
||||
'indicators_processed': 0,
|
||||
'progress_percentage': 0.0,
|
||||
'enabled_providers': [],
|
||||
'graph_statistics': {}
|
||||
}
|
||||
|
||||
def _calculate_progress(self) -> float:
|
||||
"""Calculate scan progress percentage."""
|
||||
if self.total_indicators_found == 0:
|
||||
"""Calculate scan progress percentage based on task completion."""
|
||||
total_tasks = self.indicators_completed + len(self.task_queue)
|
||||
if total_tasks == 0:
|
||||
return 0.0
|
||||
return min(100.0, (self.indicators_processed / self.total_indicators_found) * 100)
|
||||
return min(100.0, (self.indicators_completed / total_tasks) * 100)
|
||||
|
||||
def get_graph_data(self) -> Dict[str, Any]:
|
||||
"""Get current graph data for visualization."""
|
||||
@@ -748,7 +913,7 @@ class Scanner:
|
||||
if isinstance(attribute, type) and issubclass(attribute, BaseProvider) and attribute is not BaseProvider:
|
||||
provider_class = attribute
|
||||
# Instantiate to get metadata, even if not fully configured
|
||||
temp_provider = provider_class(session_config=self.config)
|
||||
temp_provider = provider_class(name=attribute_name, session_config=self.config)
|
||||
provider_name = temp_provider.get_name()
|
||||
|
||||
# Find the actual provider instance if it exists, to get live stats
|
||||
|
||||
@@ -3,11 +3,9 @@ Per-session configuration management for DNSRecon.
|
||||
Provides isolated configuration instances for each user session.
|
||||
"""
|
||||
|
||||
import os
|
||||
from typing import Dict, Optional
|
||||
from config import Config
|
||||
|
||||
|
||||
class SessionConfig:
|
||||
class SessionConfig(Config):
|
||||
"""
|
||||
Session-specific configuration that inherits from global config
|
||||
but maintains isolated API keys and provider settings.
|
||||
@@ -15,106 +13,8 @@ class SessionConfig:
|
||||
|
||||
def __init__(self):
|
||||
"""Initialize session config with global defaults."""
|
||||
# Copy all attributes from global config
|
||||
self.api_keys: Dict[str, Optional[str]] = {
|
||||
'shodan': None
|
||||
}
|
||||
|
||||
# Default settings (copied from global config)
|
||||
self.default_recursion_depth = 2
|
||||
self.default_timeout = 30
|
||||
self.max_concurrent_requests = 5
|
||||
self.large_entity_threshold = 100
|
||||
|
||||
# Rate limiting settings (per session)
|
||||
self.rate_limits = {
|
||||
'crtsh': 60,
|
||||
'shodan': 60,
|
||||
'dns': 100
|
||||
}
|
||||
|
||||
# Provider settings (per session)
|
||||
self.enabled_providers = {
|
||||
'crtsh': True,
|
||||
'dns': True,
|
||||
'shodan': False
|
||||
}
|
||||
|
||||
# Logging configuration
|
||||
self.log_level = 'INFO'
|
||||
self.log_format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
||||
|
||||
# Flask configuration (shared)
|
||||
self.flask_host = '127.0.0.1'
|
||||
self.flask_port = 5000
|
||||
self.flask_debug = True
|
||||
|
||||
def set_api_key(self, provider: str, api_key: str) -> bool:
|
||||
"""
|
||||
Set API key for a provider in this session.
|
||||
|
||||
Args:
|
||||
provider: Provider name (shodan, etc)
|
||||
api_key: API key string
|
||||
|
||||
Returns:
|
||||
bool: True if key was set successfully
|
||||
"""
|
||||
if provider in self.api_keys:
|
||||
self.api_keys[provider] = api_key
|
||||
self.enabled_providers[provider] = True if api_key else False
|
||||
return True
|
||||
return False
|
||||
|
||||
def get_api_key(self, provider: str) -> Optional[str]:
|
||||
"""
|
||||
Get API key for a provider in this session.
|
||||
|
||||
Args:
|
||||
provider: Provider name
|
||||
|
||||
Returns:
|
||||
API key or None if not set
|
||||
"""
|
||||
return self.api_keys.get(provider)
|
||||
|
||||
def is_provider_enabled(self, provider: str) -> bool:
|
||||
"""
|
||||
Check if a provider is enabled in this session.
|
||||
|
||||
Args:
|
||||
provider: Provider name
|
||||
|
||||
Returns:
|
||||
bool: True if provider is enabled
|
||||
"""
|
||||
return self.enabled_providers.get(provider, False)
|
||||
|
||||
def get_rate_limit(self, provider: str) -> int:
|
||||
"""
|
||||
Get rate limit for a provider in this session.
|
||||
|
||||
Args:
|
||||
provider: Provider name
|
||||
|
||||
Returns:
|
||||
Rate limit in requests per minute
|
||||
"""
|
||||
return self.rate_limits.get(provider, 60)
|
||||
|
||||
def load_from_env(self):
|
||||
"""Load configuration from environment variables (only if not already set)."""
|
||||
if os.getenv('SHODAN_API_KEY') and not self.api_keys['shodan']:
|
||||
self.set_api_key('shodan', os.getenv('SHODAN_API_KEY'))
|
||||
|
||||
# Override default settings from environment
|
||||
self.default_recursion_depth = int(os.getenv('DEFAULT_RECURSION_DEPTH', '2'))
|
||||
self.default_timeout = 30
|
||||
self.max_concurrent_requests = 5
|
||||
super().__init__()
|
||||
|
||||
|
||||
def create_session_config() -> SessionConfig:
|
||||
def create_session_config() -> 'SessionConfig':
|
||||
"""Create a new session configuration instance."""
|
||||
session_config = SessionConfig()
|
||||
session_config.load_from_env()
|
||||
return session_config
|
||||
return SessionConfig()
|
||||
@@ -8,6 +8,7 @@ import pickle
|
||||
from typing import Dict, Optional, Any, List
|
||||
|
||||
from core.scanner import Scanner
|
||||
from config import config
|
||||
|
||||
# WARNING: Using pickle can be a security risk if the data source is not trusted.
|
||||
# In this case, we are only serializing/deserializing our own trusted Scanner objects,
|
||||
@@ -18,10 +19,13 @@ class SessionManager:
|
||||
Manages multiple scanner instances for concurrent user sessions using Redis.
|
||||
"""
|
||||
|
||||
def __init__(self, session_timeout_minutes: int = 60):
|
||||
def __init__(self, session_timeout_minutes: int = 0):
|
||||
"""
|
||||
Initialize session manager with a Redis backend.
|
||||
"""
|
||||
if session_timeout_minutes is None:
|
||||
session_timeout_minutes = config.session_timeout_minutes
|
||||
|
||||
self.redis_client = redis.StrictRedis(db=0, decode_responses=False)
|
||||
self.session_timeout = session_timeout_minutes * 60 # Convert to seconds
|
||||
self.lock = threading.Lock() # Lock for local operations, Redis handles atomic ops
|
||||
@@ -355,31 +359,6 @@ class SessionManager:
|
||||
|
||||
time.sleep(300) # Sleep for 5 minutes
|
||||
|
||||
def list_active_sessions(self) -> List[Dict[str, Any]]:
|
||||
"""List all active sessions for admin purposes."""
|
||||
try:
|
||||
session_keys = self.redis_client.keys("dnsrecon:session:*")
|
||||
sessions = []
|
||||
|
||||
for session_key in session_keys:
|
||||
session_id = session_key.decode('utf-8').split(':')[-1]
|
||||
session_data = self._get_session_data(session_id)
|
||||
|
||||
if session_data:
|
||||
scanner = session_data.get('scanner')
|
||||
sessions.append({
|
||||
'session_id': session_id,
|
||||
'created_at': session_data.get('created_at'),
|
||||
'last_activity': session_data.get('last_activity'),
|
||||
'scanner_status': scanner.status if scanner else 'unknown',
|
||||
'current_target': scanner.current_target if scanner else None
|
||||
})
|
||||
|
||||
return sessions
|
||||
except Exception as e:
|
||||
print(f"ERROR: Failed to list active sessions: {e}")
|
||||
return []
|
||||
|
||||
def get_statistics(self) -> Dict[str, Any]:
|
||||
"""Get session manager statistics."""
|
||||
try:
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
import time
|
||||
import requests
|
||||
import threading
|
||||
import os
|
||||
import json
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import List, Dict, Any, Optional, Tuple
|
||||
|
||||
@@ -80,20 +78,12 @@ class BaseProvider(ABC):
|
||||
self.logger = get_forensic_logger()
|
||||
self._stop_event = None
|
||||
|
||||
# Caching configuration (per session)
|
||||
self.cache_dir = f'.cache/{id(self.config)}' # Unique cache per session config
|
||||
self.cache_expiry = 12 * 3600 # 12 hours in seconds
|
||||
if not os.path.exists(self.cache_dir):
|
||||
os.makedirs(self.cache_dir)
|
||||
|
||||
# Statistics (per provider instance)
|
||||
self.total_requests = 0
|
||||
self.successful_requests = 0
|
||||
self.failed_requests = 0
|
||||
self.total_relationships_found = 0
|
||||
|
||||
print(f"Initialized {name} provider with session-specific config (rate: {actual_rate_limit}/min)")
|
||||
|
||||
def __getstate__(self):
|
||||
"""Prepare BaseProvider for pickling by excluding unpicklable objects."""
|
||||
state = self.__dict__.copy()
|
||||
@@ -174,171 +164,79 @@ class BaseProvider(ABC):
|
||||
def make_request(self, url: str, method: str = "GET",
|
||||
params: Optional[Dict[str, Any]] = None,
|
||||
headers: Optional[Dict[str, str]] = None,
|
||||
target_indicator: str = "",
|
||||
max_retries: int = 3) -> Optional[requests.Response]:
|
||||
target_indicator: str = "") -> Optional[requests.Response]:
|
||||
"""
|
||||
Make a rate-limited HTTP request with aggressive stop signal handling.
|
||||
Terminates immediately when stop is requested, including during retries.
|
||||
Make a rate-limited HTTP request.
|
||||
"""
|
||||
# Check for cancellation before starting
|
||||
if self._is_stop_requested():
|
||||
print(f"Request cancelled before start: {url}")
|
||||
return None
|
||||
|
||||
# Create a unique cache key
|
||||
cache_key = f"{self.name}_{hash(f'{method}:{url}:{json.dumps(params, sort_keys=True)}')}.json"
|
||||
cache_path = os.path.join(self.cache_dir, cache_key)
|
||||
self.rate_limiter.wait_if_needed()
|
||||
|
||||
# Check cache
|
||||
if os.path.exists(cache_path):
|
||||
cache_age = time.time() - os.path.getmtime(cache_path)
|
||||
if cache_age < self.cache_expiry:
|
||||
print(f"Returning cached response for: {url}")
|
||||
with open(cache_path, 'r') as f:
|
||||
cached_data = json.load(f)
|
||||
response = requests.Response()
|
||||
response.status_code = cached_data['status_code']
|
||||
response._content = cached_data['content'].encode('utf-8')
|
||||
response.headers = cached_data['headers']
|
||||
return response
|
||||
start_time = time.time()
|
||||
response = None
|
||||
error = None
|
||||
|
||||
# Determine effective max_retries based on stop signal
|
||||
effective_max_retries = 0 if self._is_stop_requested() else max_retries
|
||||
last_exception = None
|
||||
try:
|
||||
self.total_requests += 1
|
||||
|
||||
for attempt in range(effective_max_retries + 1):
|
||||
# AGGRESSIVE: Check for cancellation before each attempt
|
||||
if self._is_stop_requested():
|
||||
print(f"Request cancelled during attempt {attempt + 1}: {url}")
|
||||
return None
|
||||
request_headers = dict(self.session.headers).copy()
|
||||
if headers:
|
||||
request_headers.update(headers)
|
||||
|
||||
# Apply rate limiting with cancellation awareness
|
||||
if not self._wait_with_cancellation_check():
|
||||
print(f"Request cancelled during rate limiting: {url}")
|
||||
return None
|
||||
print(f"Making {method} request to: {url}")
|
||||
|
||||
# AGGRESSIVE: Final check before making HTTP request
|
||||
if self._is_stop_requested():
|
||||
print(f"Request cancelled before HTTP call: {url}")
|
||||
return None
|
||||
|
||||
start_time = time.time()
|
||||
response = None
|
||||
error = None
|
||||
|
||||
try:
|
||||
self.total_requests += 1
|
||||
|
||||
# Prepare request
|
||||
request_headers = self.session.headers.copy()
|
||||
if headers:
|
||||
request_headers.update(headers)
|
||||
|
||||
print(f"Making {method} request to: {url} (attempt {attempt + 1})")
|
||||
|
||||
# AGGRESSIVE: Use much shorter timeout if termination is requested
|
||||
request_timeout = self.timeout
|
||||
if self._is_stop_requested():
|
||||
request_timeout = 2 # Max 2 seconds if termination requested
|
||||
print(f"Stop requested - using short timeout: {request_timeout}s")
|
||||
|
||||
# Make request
|
||||
if method.upper() == "GET":
|
||||
response = self.session.get(
|
||||
url,
|
||||
params=params,
|
||||
headers=request_headers,
|
||||
timeout=request_timeout
|
||||
)
|
||||
elif method.upper() == "POST":
|
||||
response = self.session.post(
|
||||
url,
|
||||
json=params,
|
||||
headers=request_headers,
|
||||
timeout=request_timeout
|
||||
)
|
||||
else:
|
||||
raise ValueError(f"Unsupported HTTP method: {method}")
|
||||
|
||||
print(f"Response status: {response.status_code}")
|
||||
response.raise_for_status()
|
||||
self.successful_requests += 1
|
||||
|
||||
# Success - log, cache, and return
|
||||
duration_ms = (time.time() - start_time) * 1000
|
||||
self.logger.log_api_request(
|
||||
provider=self.name,
|
||||
url=url,
|
||||
method=method.upper(),
|
||||
status_code=response.status_code,
|
||||
response_size=len(response.content),
|
||||
duration_ms=duration_ms,
|
||||
error=None,
|
||||
target_indicator=target_indicator
|
||||
if method.upper() == "GET":
|
||||
response = self.session.get(
|
||||
url,
|
||||
params=params,
|
||||
headers=request_headers,
|
||||
timeout=self.timeout
|
||||
)
|
||||
# Cache the successful response to disk
|
||||
with open(cache_path, 'w') as f:
|
||||
json.dump({
|
||||
'status_code': response.status_code,
|
||||
'content': response.text,
|
||||
'headers': dict(response.headers)
|
||||
}, f)
|
||||
return response
|
||||
elif method.upper() == "POST":
|
||||
response = self.session.post(
|
||||
url,
|
||||
json=params,
|
||||
headers=request_headers,
|
||||
timeout=self.timeout
|
||||
)
|
||||
else:
|
||||
raise ValueError(f"Unsupported HTTP method: {method}")
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
error = str(e)
|
||||
self.failed_requests += 1
|
||||
print(f"Request failed (attempt {attempt + 1}): {error}")
|
||||
last_exception = e
|
||||
|
||||
# AGGRESSIVE: Immediately abort retries if stop requested
|
||||
if self._is_stop_requested():
|
||||
print(f"Stop requested - aborting retries for: {url}")
|
||||
break
|
||||
|
||||
# Check if we should retry (but only if stop not requested)
|
||||
if attempt < effective_max_retries and self._should_retry(e):
|
||||
# Use a longer, more respectful backoff for 429 errors
|
||||
if isinstance(e, requests.exceptions.HTTPError) and e.response and e.response.status_code == 429:
|
||||
# Start with a 10-second backoff and increase exponentially
|
||||
backoff_time = 10 * (2 ** attempt)
|
||||
print(f"Rate limit hit. Retrying in {backoff_time} seconds...")
|
||||
else:
|
||||
backoff_time = min(1.0, (2 ** attempt) * 0.5) # Shorter backoff for other errors
|
||||
print(f"Retrying in {backoff_time} seconds...")
|
||||
|
||||
# AGGRESSIVE: Much shorter backoff and more frequent checking
|
||||
if not self._sleep_with_cancellation_check(backoff_time):
|
||||
print(f"Stop requested during backoff - aborting: {url}")
|
||||
return None
|
||||
continue
|
||||
else:
|
||||
break
|
||||
print(f"Response status: {response.status_code}")
|
||||
response.raise_for_status()
|
||||
self.successful_requests += 1
|
||||
|
||||
duration_ms = (time.time() - start_time) * 1000
|
||||
self.logger.log_api_request(
|
||||
provider=self.name,
|
||||
url=url,
|
||||
method=method.upper(),
|
||||
status_code=response.status_code,
|
||||
response_size=len(response.content),
|
||||
duration_ms=duration_ms,
|
||||
error=None,
|
||||
target_indicator=target_indicator
|
||||
)
|
||||
|
||||
return response
|
||||
|
||||
except Exception as e:
|
||||
error = f"Unexpected error: {str(e)}"
|
||||
self.failed_requests += 1
|
||||
print(f"Unexpected error: {error}")
|
||||
last_exception = e
|
||||
break
|
||||
|
||||
# All attempts failed - log and return None
|
||||
duration_ms = (time.time() - start_time) * 1000
|
||||
self.logger.log_api_request(
|
||||
provider=self.name,
|
||||
url=url,
|
||||
method=method.upper(),
|
||||
status_code=response.status_code if response else None,
|
||||
response_size=len(response.content) if response else None,
|
||||
duration_ms=duration_ms,
|
||||
error=error,
|
||||
target_indicator=target_indicator
|
||||
)
|
||||
|
||||
if error and last_exception:
|
||||
raise last_exception
|
||||
|
||||
return None
|
||||
except requests.exceptions.RequestException as e:
|
||||
error = str(e)
|
||||
self.failed_requests += 1
|
||||
duration_ms = (time.time() - start_time) * 1000
|
||||
self.logger.log_api_request(
|
||||
provider=self.name,
|
||||
url=url,
|
||||
method=method.upper(),
|
||||
status_code=response.status_code if response else None,
|
||||
response_size=len(response.content) if response else None,
|
||||
duration_ms=duration_ms,
|
||||
error=error,
|
||||
target_indicator=target_indicator
|
||||
)
|
||||
raise e
|
||||
|
||||
def _is_stop_requested(self) -> bool:
|
||||
"""
|
||||
@@ -348,44 +246,6 @@ class BaseProvider(ABC):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def _wait_with_cancellation_check(self) -> bool:
|
||||
"""
|
||||
Wait for rate limiting while aggressively checking for cancellation.
|
||||
Returns False if cancelled during wait.
|
||||
"""
|
||||
current_time = time.time()
|
||||
time_since_last = current_time - self.rate_limiter.last_request_time
|
||||
|
||||
if time_since_last < self.rate_limiter.min_interval:
|
||||
sleep_time = self.rate_limiter.min_interval - time_since_last
|
||||
if not self._sleep_with_cancellation_check(sleep_time):
|
||||
return False
|
||||
|
||||
self.rate_limiter.last_request_time = time.time()
|
||||
return True
|
||||
|
||||
def _sleep_with_cancellation_check(self, sleep_time: float) -> bool:
|
||||
"""
|
||||
Sleep for the specified time while aggressively checking for cancellation.
|
||||
|
||||
Args:
|
||||
sleep_time: Time to sleep in seconds
|
||||
|
||||
Returns:
|
||||
bool: True if sleep completed, False if cancelled
|
||||
"""
|
||||
sleep_start = time.time()
|
||||
check_interval = 0.05 # Check every 50ms for aggressive responsiveness
|
||||
|
||||
while time.time() - sleep_start < sleep_time:
|
||||
if self._is_stop_requested():
|
||||
return False
|
||||
remaining_time = sleep_time - (time.time() - sleep_start)
|
||||
time.sleep(min(check_interval, remaining_time))
|
||||
|
||||
return True
|
||||
|
||||
def set_stop_event(self, stop_event: threading.Event) -> None:
|
||||
"""
|
||||
Set the stop event for this provider to enable cancellation.
|
||||
@@ -395,28 +255,6 @@ class BaseProvider(ABC):
|
||||
"""
|
||||
self._stop_event = stop_event
|
||||
|
||||
def _should_retry(self, exception: requests.exceptions.RequestException) -> bool:
|
||||
"""
|
||||
Determine if a request should be retried based on the exception.
|
||||
|
||||
Args:
|
||||
exception: The request exception that occurred
|
||||
|
||||
Returns:
|
||||
True if the request should be retried
|
||||
"""
|
||||
# Retry on connection errors and timeouts
|
||||
if isinstance(exception, (requests.exceptions.ConnectionError,
|
||||
requests.exceptions.Timeout)):
|
||||
return True
|
||||
|
||||
if isinstance(exception, requests.exceptions.HTTPError):
|
||||
if hasattr(exception, 'response') and exception.response:
|
||||
# Retry on server errors (5xx) AND on rate-limiting errors (429)
|
||||
return exception.response.status_code >= 500 or exception.response.status_code == 429
|
||||
|
||||
return False
|
||||
|
||||
def log_relationship_discovery(self, source_node: str, target_node: str,
|
||||
relationship_type: str,
|
||||
confidence_score: float,
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
"""
|
||||
Certificate Transparency provider using crt.sh.
|
||||
Discovers domain relationships through certificate SAN analysis with comprehensive certificate tracking.
|
||||
Stores certificates as metadata on domain nodes rather than creating certificate nodes.
|
||||
"""
|
||||
# dnsrecon/providers/crtsh_provider.py
|
||||
|
||||
import json
|
||||
import re
|
||||
import os
|
||||
from pathlib import Path
|
||||
from typing import List, Dict, Any, Tuple, Set
|
||||
from urllib.parse import quote
|
||||
from datetime import datetime, timezone
|
||||
@@ -18,10 +16,10 @@ from utils.helpers import _is_valid_domain
|
||||
class CrtShProvider(BaseProvider):
|
||||
"""
|
||||
Provider for querying crt.sh certificate transparency database.
|
||||
Now uses session-specific configuration and caching.
|
||||
Now uses session-specific configuration and caching with accumulative behavior.
|
||||
"""
|
||||
|
||||
def __init__(self, session_config=None):
|
||||
def __init__(self, name=None, session_config=None):
|
||||
"""Initialize CrtSh provider with session-specific configuration."""
|
||||
super().__init__(
|
||||
name="crtsh",
|
||||
@@ -31,6 +29,10 @@ class CrtShProvider(BaseProvider):
|
||||
)
|
||||
self.base_url = "https://crt.sh/"
|
||||
self._stop_event = None
|
||||
|
||||
# Initialize cache directory
|
||||
self.cache_dir = Path('cache') / 'crtsh'
|
||||
self.cache_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
def get_name(self) -> str:
|
||||
"""Return the provider name."""
|
||||
@@ -56,6 +58,158 @@ class CrtShProvider(BaseProvider):
|
||||
"""
|
||||
return True
|
||||
|
||||
def _get_cache_file_path(self, domain: str) -> Path:
|
||||
"""Generate cache file path for a domain."""
|
||||
# Sanitize domain for filename safety
|
||||
safe_domain = domain.replace('.', '_').replace('/', '_').replace('\\', '_')
|
||||
return self.cache_dir / f"{safe_domain}.json"
|
||||
|
||||
def _get_cache_status(self, cache_file_path: Path) -> str:
|
||||
"""
|
||||
Check cache status for a domain.
|
||||
Returns: 'not_found', 'fresh', or 'stale'
|
||||
"""
|
||||
if not cache_file_path.exists():
|
||||
return "not_found"
|
||||
|
||||
try:
|
||||
with open(cache_file_path, 'r') as f:
|
||||
cache_data = json.load(f)
|
||||
|
||||
last_query_str = cache_data.get("last_upstream_query")
|
||||
if not last_query_str:
|
||||
return "stale" # Invalid cache format
|
||||
|
||||
last_query = datetime.fromisoformat(last_query_str.replace('Z', '+00:00'))
|
||||
hours_since_query = (datetime.now(timezone.utc) - last_query).total_seconds() / 3600
|
||||
|
||||
cache_timeout = self.config.cache_timeout_hours
|
||||
if hours_since_query < cache_timeout:
|
||||
return "fresh"
|
||||
else:
|
||||
return "stale"
|
||||
|
||||
except (json.JSONDecodeError, ValueError, KeyError) as e:
|
||||
self.logger.logger.warning(f"Invalid cache file format for {cache_file_path}: {e}")
|
||||
return "stale"
|
||||
|
||||
def _load_cached_certificates(self, cache_file_path: Path) -> List[Dict[str, Any]]:
|
||||
"""Load certificates from cache file."""
|
||||
try:
|
||||
with open(cache_file_path, 'r') as f:
|
||||
cache_data = json.load(f)
|
||||
return cache_data.get('certificates', [])
|
||||
except (json.JSONDecodeError, FileNotFoundError, KeyError) as e:
|
||||
self.logger.logger.error(f"Failed to load cached certificates from {cache_file_path}: {e}")
|
||||
return []
|
||||
|
||||
def _query_crtsh_api(self, domain: str) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
Query crt.sh API for raw certificate data.
|
||||
Raises exceptions for network errors to allow core logic to retry.
|
||||
"""
|
||||
url = f"{self.base_url}?q={quote(domain)}&output=json"
|
||||
response = self.make_request(url, target_indicator=domain)
|
||||
|
||||
if not response or response.status_code != 200:
|
||||
# This could be a temporary error - raise exception so core can retry
|
||||
raise requests.exceptions.RequestException(f"crt.sh API returned status {response.status_code if response else 'None'}")
|
||||
|
||||
certificates = response.json()
|
||||
if not certificates:
|
||||
return []
|
||||
|
||||
return certificates
|
||||
|
||||
def _create_cache_file(self, cache_file_path: Path, domain: str, certificates: List[Dict[str, Any]]) -> None:
|
||||
"""Create new cache file with certificates."""
|
||||
try:
|
||||
cache_data = {
|
||||
"domain": domain,
|
||||
"first_cached": datetime.now(timezone.utc).isoformat(),
|
||||
"last_upstream_query": datetime.now(timezone.utc).isoformat(),
|
||||
"upstream_query_count": 1,
|
||||
"certificates": certificates
|
||||
}
|
||||
|
||||
cache_file_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
with open(cache_file_path, 'w') as f:
|
||||
json.dump(cache_data, f, separators=(',', ':'))
|
||||
|
||||
self.logger.logger.info(f"Created cache file for {domain} with {len(certificates)} certificates")
|
||||
|
||||
except Exception as e:
|
||||
self.logger.logger.warning(f"Failed to create cache file for {domain}: {e}")
|
||||
|
||||
def _append_to_cache(self, cache_file_path: Path, new_certificates: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
||||
"""Append new certificates to existing cache and return all certificates."""
|
||||
try:
|
||||
# Load existing cache
|
||||
with open(cache_file_path, 'r') as f:
|
||||
cache_data = json.load(f)
|
||||
|
||||
# Track existing certificate IDs to avoid duplicates
|
||||
existing_ids = {cert.get('id') for cert in cache_data.get('certificates', [])}
|
||||
|
||||
# Add only new certificates
|
||||
added_count = 0
|
||||
for cert in new_certificates:
|
||||
cert_id = cert.get('id')
|
||||
if cert_id and cert_id not in existing_ids:
|
||||
cache_data['certificates'].append(cert)
|
||||
existing_ids.add(cert_id)
|
||||
added_count += 1
|
||||
|
||||
# Update metadata
|
||||
cache_data['last_upstream_query'] = datetime.now(timezone.utc).isoformat()
|
||||
cache_data['upstream_query_count'] = cache_data.get('upstream_query_count', 0) + 1
|
||||
|
||||
# Write updated cache
|
||||
with open(cache_file_path, 'w') as f:
|
||||
json.dump(cache_data, f, separators=(',', ':'))
|
||||
|
||||
total_certs = len(cache_data['certificates'])
|
||||
self.logger.logger.info(f"Appended {added_count} new certificates to cache. Total: {total_certs}")
|
||||
|
||||
return cache_data['certificates']
|
||||
|
||||
except Exception as e:
|
||||
self.logger.logger.warning(f"Failed to append to cache: {e}")
|
||||
return new_certificates # Fallback to new certificates only
|
||||
|
||||
def _parse_issuer_organization(self, issuer_dn: str) -> str:
|
||||
"""
|
||||
Parse the issuer Distinguished Name to extract just the organization name.
|
||||
|
||||
Args:
|
||||
issuer_dn: Full issuer DN string (e.g., "C=US, O=Let's Encrypt, CN=R11")
|
||||
|
||||
Returns:
|
||||
Organization name (e.g., "Let's Encrypt") or original string if parsing fails
|
||||
"""
|
||||
if not issuer_dn:
|
||||
return issuer_dn
|
||||
|
||||
try:
|
||||
# Split by comma and look for O= component
|
||||
components = [comp.strip() for comp in issuer_dn.split(',')]
|
||||
|
||||
for component in components:
|
||||
if component.startswith('O='):
|
||||
# Extract the value after O=
|
||||
org_name = component[2:].strip()
|
||||
# Remove quotes if present
|
||||
if org_name.startswith('"') and org_name.endswith('"'):
|
||||
org_name = org_name[1:-1]
|
||||
return org_name
|
||||
|
||||
# If no O= component found, return the original string
|
||||
return issuer_dn
|
||||
|
||||
except Exception as e:
|
||||
self.logger.logger.debug(f"Failed to parse issuer DN '{issuer_dn}': {e}")
|
||||
return issuer_dn
|
||||
|
||||
def _parse_certificate_date(self, date_string: str) -> datetime:
|
||||
"""
|
||||
Parse certificate date from crt.sh format.
|
||||
@@ -133,10 +287,15 @@ class CrtShProvider(BaseProvider):
|
||||
Returns:
|
||||
Comprehensive certificate metadata dictionary
|
||||
"""
|
||||
# Parse the issuer name to get just the organization
|
||||
raw_issuer_name = cert_data.get('issuer_name', '')
|
||||
parsed_issuer_name = self._parse_issuer_organization(raw_issuer_name)
|
||||
|
||||
metadata = {
|
||||
'certificate_id': cert_data.get('id'),
|
||||
'serial_number': cert_data.get('serial_number'),
|
||||
'issuer_name': cert_data.get('issuer_name'),
|
||||
'issuer_name': parsed_issuer_name, # Use parsed organization name
|
||||
#'issuer_name_full': raw_issuer_name, # deliberately left out, because its not useful in most cases
|
||||
'issuer_ca_id': cert_data.get('issuer_ca_id'),
|
||||
'common_name': cert_data.get('common_name'),
|
||||
'not_before': cert_data.get('not_before'),
|
||||
@@ -167,7 +326,8 @@ class CrtShProvider(BaseProvider):
|
||||
|
||||
def query_domain(self, domain: str) -> List[Tuple[str, str, str, float, Dict[str, Any]]]:
|
||||
"""
|
||||
Query crt.sh for certificates containing the domain.
|
||||
Query crt.sh for certificates containing the domain with caching support.
|
||||
Properly raises exceptions for network errors to allow core logic retries.
|
||||
"""
|
||||
if not _is_valid_domain(domain):
|
||||
return []
|
||||
@@ -177,131 +337,167 @@ class CrtShProvider(BaseProvider):
|
||||
print(f"CrtSh query cancelled before start for domain: {domain}")
|
||||
return []
|
||||
|
||||
relationships = []
|
||||
# === CACHING LOGIC ===
|
||||
cache_file = self._get_cache_file_path(domain)
|
||||
cache_status = self._get_cache_status(cache_file)
|
||||
|
||||
certificates = []
|
||||
|
||||
try:
|
||||
# Query crt.sh for certificates
|
||||
url = f"{self.base_url}?q={quote(domain)}&output=json"
|
||||
response = self.make_request(url, target_indicator=domain, max_retries=3)
|
||||
|
||||
if not response or response.status_code != 200:
|
||||
return []
|
||||
|
||||
# Check for cancellation after request
|
||||
if self._stop_event and self._stop_event.is_set():
|
||||
print(f"CrtSh query cancelled after request for domain: {domain}")
|
||||
return []
|
||||
|
||||
certificates = response.json()
|
||||
|
||||
if not certificates:
|
||||
return []
|
||||
|
||||
# Check for cancellation before processing
|
||||
if self._stop_event and self._stop_event.is_set():
|
||||
print(f"CrtSh query cancelled before processing for domain: {domain}")
|
||||
return []
|
||||
|
||||
# Aggregate certificate data by domain
|
||||
domain_certificates = {}
|
||||
all_discovered_domains = set()
|
||||
|
||||
# Process certificates with cancellation checking
|
||||
for i, cert_data in enumerate(certificates):
|
||||
# Check for cancellation every 5 certificates instead of 10 for faster response
|
||||
if i % 5 == 0 and self._stop_event and self._stop_event.is_set():
|
||||
print(f"CrtSh processing cancelled at certificate {i} for domain: {domain}")
|
||||
break
|
||||
|
||||
cert_metadata = self._extract_certificate_metadata(cert_data)
|
||||
cert_domains = self._extract_domains_from_certificate(cert_data)
|
||||
if cache_status == "fresh":
|
||||
# Use cached data
|
||||
certificates = self._load_cached_certificates(cache_file)
|
||||
self.logger.logger.info(f"Using cached data for {domain} ({len(certificates)} certificates)")
|
||||
|
||||
# Add all domains from this certificate to our tracking
|
||||
for cert_domain in cert_domains:
|
||||
# Additional stop check during domain processing
|
||||
if i % 20 == 0 and self._stop_event and self._stop_event.is_set():
|
||||
print(f"CrtSh domain processing cancelled for domain: {domain}")
|
||||
break
|
||||
|
||||
if not _is_valid_domain(cert_domain):
|
||||
continue
|
||||
elif cache_status == "not_found":
|
||||
# Fresh query, create new cache
|
||||
certificates = self._query_crtsh_api(domain)
|
||||
if certificates: # Only cache if we got results
|
||||
self._create_cache_file(cache_file, domain, certificates)
|
||||
self.logger.logger.info(f"Cached fresh data for {domain} ({len(certificates)} certificates)")
|
||||
else:
|
||||
self.logger.logger.info(f"No certificates found for {domain}, not caching")
|
||||
|
||||
all_discovered_domains.add(cert_domain)
|
||||
|
||||
# Initialize domain certificate list if needed
|
||||
if cert_domain not in domain_certificates:
|
||||
domain_certificates[cert_domain] = []
|
||||
|
||||
# Add this certificate to the domain's certificate list
|
||||
domain_certificates[cert_domain].append(cert_metadata)
|
||||
elif cache_status == "stale":
|
||||
# Append query, update existing cache
|
||||
try:
|
||||
new_certificates = self._query_crtsh_api(domain)
|
||||
if new_certificates:
|
||||
certificates = self._append_to_cache(cache_file, new_certificates)
|
||||
self.logger.logger.info(f"Refreshed and appended cache for {domain}")
|
||||
else:
|
||||
# Use existing cache if API returns no results
|
||||
certificates = self._load_cached_certificates(cache_file)
|
||||
self.logger.logger.info(f"API returned no new results, using existing cache for {domain}")
|
||||
except requests.exceptions.RequestException:
|
||||
# If API call fails for stale cache, use cached data and re-raise for retry logic
|
||||
certificates = self._load_cached_certificates(cache_file)
|
||||
if certificates:
|
||||
self.logger.logger.warning(f"API call failed for {domain}, using stale cache data ({len(certificates)} certificates)")
|
||||
# Don't re-raise here, just use cached data
|
||||
else:
|
||||
# No cached data and API failed - re-raise for retry
|
||||
raise
|
||||
|
||||
# Final cancellation check before creating relationships
|
||||
if self._stop_event and self._stop_event.is_set():
|
||||
print(f"CrtSh query cancelled before relationship creation for domain: {domain}")
|
||||
return []
|
||||
except requests.exceptions.RequestException as e:
|
||||
# Network/API errors should be re-raised so core logic can retry
|
||||
self.logger.logger.error(f"API query failed for {domain}: {e}")
|
||||
raise e
|
||||
except json.JSONDecodeError as e:
|
||||
# JSON parsing errors should also be raised for retry
|
||||
self.logger.logger.error(f"Failed to parse JSON response from crt.sh for {domain}: {e}")
|
||||
raise e
|
||||
|
||||
# Check for cancellation after cache operations
|
||||
if self._stop_event and self._stop_event.is_set():
|
||||
print(f"CrtSh query cancelled after cache operations for domain: {domain}")
|
||||
return []
|
||||
|
||||
if not certificates:
|
||||
return []
|
||||
|
||||
return self._process_certificates_to_relationships(domain, certificates)
|
||||
|
||||
def _process_certificates_to_relationships(self, domain: str, certificates: List[Dict[str, Any]]) -> List[Tuple[str, str, str, float, Dict[str, Any]]]:
|
||||
"""
|
||||
Process certificates to relationships using existing logic.
|
||||
This method contains the original processing logic from query_domain.
|
||||
"""
|
||||
relationships = []
|
||||
|
||||
# Check for cancellation before processing
|
||||
if self._stop_event and self._stop_event.is_set():
|
||||
print(f"CrtSh processing cancelled before processing for domain: {domain}")
|
||||
return []
|
||||
|
||||
# Create relationships from query domain to ALL discovered domains with stop checking
|
||||
for i, discovered_domain in enumerate(all_discovered_domains):
|
||||
if discovered_domain == domain:
|
||||
continue # Skip self-relationships
|
||||
# Aggregate certificate data by domain
|
||||
domain_certificates = {}
|
||||
all_discovered_domains = set()
|
||||
|
||||
# Process certificates with cancellation checking
|
||||
for i, cert_data in enumerate(certificates):
|
||||
# Check for cancellation every 5 certificates for faster response
|
||||
if i % 5 == 0 and self._stop_event and self._stop_event.is_set():
|
||||
print(f"CrtSh processing cancelled at certificate {i} for domain: {domain}")
|
||||
break
|
||||
|
||||
# Check for cancellation every 10 relationships
|
||||
if i % 10 == 0 and self._stop_event and self._stop_event.is_set():
|
||||
print(f"CrtSh relationship creation cancelled for domain: {domain}")
|
||||
break
|
||||
|
||||
if not _is_valid_domain(discovered_domain):
|
||||
cert_metadata = self._extract_certificate_metadata(cert_data)
|
||||
cert_domains = self._extract_domains_from_certificate(cert_data)
|
||||
|
||||
# Add all domains from this certificate to our tracking
|
||||
all_discovered_domains.update(cert_domains)
|
||||
for cert_domain in cert_domains:
|
||||
if not _is_valid_domain(cert_domain):
|
||||
continue
|
||||
|
||||
# Get certificates for both domains
|
||||
query_domain_certs = domain_certificates.get(domain, [])
|
||||
discovered_domain_certs = domain_certificates.get(discovered_domain, [])
|
||||
# Initialize domain certificate list if needed
|
||||
if cert_domain not in domain_certificates:
|
||||
domain_certificates[cert_domain] = []
|
||||
|
||||
# Find shared certificates (for metadata purposes)
|
||||
shared_certificates = self._find_shared_certificates(query_domain_certs, discovered_domain_certs)
|
||||
|
||||
# Calculate confidence based on relationship type and shared certificates
|
||||
confidence = self._calculate_domain_relationship_confidence(
|
||||
domain, discovered_domain, shared_certificates, all_discovered_domains
|
||||
)
|
||||
|
||||
# Create comprehensive raw data for the relationship
|
||||
relationship_raw_data = {
|
||||
'relationship_type': 'certificate_discovery',
|
||||
'shared_certificates': shared_certificates,
|
||||
'total_shared_certs': len(shared_certificates),
|
||||
'discovery_context': self._determine_relationship_context(discovered_domain, domain),
|
||||
'domain_certificates': {
|
||||
domain: self._summarize_certificates(query_domain_certs),
|
||||
discovered_domain: self._summarize_certificates(discovered_domain_certs)
|
||||
}
|
||||
}
|
||||
|
||||
# Create domain -> domain relationship
|
||||
relationships.append((
|
||||
domain,
|
||||
discovered_domain,
|
||||
'san_certificate',
|
||||
confidence,
|
||||
relationship_raw_data
|
||||
))
|
||||
|
||||
# Log the relationship discovery
|
||||
self.log_relationship_discovery(
|
||||
source_node=domain,
|
||||
target_node=discovered_domain,
|
||||
relationship_type='san_certificate',
|
||||
confidence_score=confidence,
|
||||
raw_data=relationship_raw_data,
|
||||
discovery_method="certificate_transparency_analysis"
|
||||
)
|
||||
|
||||
except json.JSONDecodeError as e:
|
||||
self.logger.logger.error(f"Failed to parse JSON response from crt.sh: {e}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
self.logger.logger.error(f"HTTP request to crt.sh failed: {e}")
|
||||
|
||||
# Add this certificate to the domain's certificate list
|
||||
domain_certificates[cert_domain].append(cert_metadata)
|
||||
|
||||
# Final cancellation check before creating relationships
|
||||
if self._stop_event and self._stop_event.is_set():
|
||||
print(f"CrtSh query cancelled before relationship creation for domain: {domain}")
|
||||
return []
|
||||
|
||||
# Create relationships from query domain to ALL discovered domains with stop checking
|
||||
for i, discovered_domain in enumerate(all_discovered_domains):
|
||||
if discovered_domain == domain:
|
||||
continue # Skip self-relationships
|
||||
|
||||
# Check for cancellation every 10 relationships
|
||||
if i % 10 == 0 and self._stop_event and self._stop_event.is_set():
|
||||
print(f"CrtSh relationship creation cancelled for domain: {domain}")
|
||||
break
|
||||
|
||||
if not _is_valid_domain(discovered_domain):
|
||||
continue
|
||||
|
||||
# Get certificates for both domains
|
||||
query_domain_certs = domain_certificates.get(domain, [])
|
||||
discovered_domain_certs = domain_certificates.get(discovered_domain, [])
|
||||
|
||||
# Find shared certificates (for metadata purposes)
|
||||
shared_certificates = self._find_shared_certificates(query_domain_certs, discovered_domain_certs)
|
||||
|
||||
# Calculate confidence based on relationship type and shared certificates
|
||||
confidence = self._calculate_domain_relationship_confidence(
|
||||
domain, discovered_domain, shared_certificates, all_discovered_domains
|
||||
)
|
||||
|
||||
# Create comprehensive raw data for the relationship
|
||||
relationship_raw_data = {
|
||||
'relationship_type': 'certificate_discovery',
|
||||
'shared_certificates': shared_certificates,
|
||||
'total_shared_certs': len(shared_certificates),
|
||||
'discovery_context': self._determine_relationship_context(discovered_domain, domain),
|
||||
'domain_certificates': {
|
||||
domain: self._summarize_certificates(query_domain_certs),
|
||||
discovered_domain: self._summarize_certificates(discovered_domain_certs)
|
||||
}
|
||||
}
|
||||
|
||||
# Create domain -> domain relationship
|
||||
relationships.append((
|
||||
domain,
|
||||
discovered_domain,
|
||||
'san_certificate',
|
||||
confidence,
|
||||
relationship_raw_data
|
||||
))
|
||||
|
||||
# Log the relationship discovery
|
||||
self.log_relationship_discovery(
|
||||
source_node=domain,
|
||||
target_node=discovered_domain,
|
||||
relationship_type='san_certificate',
|
||||
confidence_score=confidence,
|
||||
raw_data=relationship_raw_data,
|
||||
discovery_method="certificate_transparency_analysis"
|
||||
)
|
||||
|
||||
return relationships
|
||||
|
||||
def _find_shared_certificates(self, certs1: List[Dict[str, Any]], certs2: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
||||
@@ -345,14 +541,15 @@ class CrtShProvider(BaseProvider):
|
||||
'expires_soon_count': 0,
|
||||
'unique_issuers': [],
|
||||
'latest_certificate': None,
|
||||
'has_valid_cert': False
|
||||
'has_valid_cert': False,
|
||||
'certificate_details': [] # Always include empty list
|
||||
}
|
||||
|
||||
valid_count = sum(1 for cert in certificates if cert.get('is_currently_valid'))
|
||||
expired_count = len(certificates) - valid_count
|
||||
expires_soon_count = sum(1 for cert in certificates if cert.get('expires_soon'))
|
||||
|
||||
# Get unique issuers
|
||||
# Get unique issuers (using parsed organization names)
|
||||
unique_issuers = list(set(cert.get('issuer_name') for cert in certificates if cert.get('issuer_name')))
|
||||
|
||||
# Find the most recent certificate
|
||||
@@ -369,6 +566,13 @@ class CrtShProvider(BaseProvider):
|
||||
except Exception:
|
||||
continue
|
||||
|
||||
# Sort certificates by date for better display (newest first)
|
||||
sorted_certificates = sorted(
|
||||
certificates,
|
||||
key=lambda c: self._get_certificate_sort_date(c),
|
||||
reverse=True
|
||||
)
|
||||
|
||||
return {
|
||||
'total_certificates': len(certificates),
|
||||
'valid_certificates': valid_count,
|
||||
@@ -377,9 +581,35 @@ class CrtShProvider(BaseProvider):
|
||||
'unique_issuers': unique_issuers,
|
||||
'latest_certificate': latest_cert,
|
||||
'has_valid_cert': valid_count > 0,
|
||||
'certificate_details': certificates # Full details for forensic analysis
|
||||
'certificate_details': sorted_certificates # Include full certificate details
|
||||
}
|
||||
|
||||
def _get_certificate_sort_date(self, cert: Dict[str, Any]) -> datetime:
|
||||
"""
|
||||
Get a sortable date from certificate data for chronological ordering.
|
||||
|
||||
Args:
|
||||
cert: Certificate metadata dictionary
|
||||
|
||||
Returns:
|
||||
Datetime object for sorting (falls back to epoch if parsing fails)
|
||||
"""
|
||||
try:
|
||||
# Try not_before first (issue date)
|
||||
if cert.get('not_before'):
|
||||
return self._parse_certificate_date(cert['not_before'])
|
||||
|
||||
# Fall back to entry_timestamp if available
|
||||
if cert.get('entry_timestamp'):
|
||||
return self._parse_certificate_date(cert['entry_timestamp'])
|
||||
|
||||
# Last resort - return a very old date for certificates without dates
|
||||
return datetime(1970, 1, 1, tzinfo=timezone.utc)
|
||||
|
||||
except Exception:
|
||||
# If all parsing fails, return epoch
|
||||
return datetime(1970, 1, 1, tzinfo=timezone.utc)
|
||||
|
||||
def _calculate_domain_relationship_confidence(self, domain1: str, domain2: str,
|
||||
shared_certificates: List[Dict[str, Any]],
|
||||
all_discovered_domains: Set[str]) -> float:
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
# dnsrecon/providers/dns_provider.py
|
||||
|
||||
import dns.resolver
|
||||
import dns.reversename
|
||||
from dns import resolver, reversename
|
||||
from typing import List, Dict, Any, Tuple
|
||||
from .base_provider import BaseProvider
|
||||
from utils.helpers import _is_valid_ip, _is_valid_domain
|
||||
@@ -13,7 +12,7 @@ class DNSProvider(BaseProvider):
|
||||
Now uses session-specific configuration.
|
||||
"""
|
||||
|
||||
def __init__(self, session_config=None):
|
||||
def __init__(self, name=None, session_config=None):
|
||||
"""Initialize DNS provider with session-specific configuration."""
|
||||
super().__init__(
|
||||
name="dns",
|
||||
@@ -23,7 +22,7 @@ class DNSProvider(BaseProvider):
|
||||
)
|
||||
|
||||
# Configure DNS resolver
|
||||
self.resolver = dns.resolver.Resolver()
|
||||
self.resolver = resolver.Resolver()
|
||||
self.resolver.timeout = 5
|
||||
self.resolver.lifetime = 10
|
||||
#self.resolver.nameservers = ['127.0.0.1']
|
||||
@@ -51,12 +50,7 @@ class DNSProvider(BaseProvider):
|
||||
def query_domain(self, domain: str) -> List[Tuple[str, str, str, float, Dict[str, Any]]]:
|
||||
"""
|
||||
Query DNS records for the domain to discover relationships.
|
||||
|
||||
Args:
|
||||
domain: Domain to investigate
|
||||
|
||||
Returns:
|
||||
List of relationships discovered from DNS analysis
|
||||
...
|
||||
"""
|
||||
if not _is_valid_domain(domain):
|
||||
return []
|
||||
@@ -65,7 +59,15 @@ class DNSProvider(BaseProvider):
|
||||
|
||||
# Query all record types
|
||||
for record_type in ['A', 'AAAA', 'CNAME', 'MX', 'NS', 'SOA', 'TXT', 'SRV', 'CAA']:
|
||||
relationships.extend(self._query_record(domain, record_type))
|
||||
try:
|
||||
relationships.extend(self._query_record(domain, record_type))
|
||||
except resolver.NoAnswer:
|
||||
# This is not an error, just a confirmation that the record doesn't exist.
|
||||
self.logger.logger.debug(f"No {record_type} record found for {domain}")
|
||||
except Exception as e:
|
||||
self.failed_requests += 1
|
||||
self.logger.logger.debug(f"{record_type} record query failed for {domain}: {e}")
|
||||
# Optionally, you might want to re-raise other, more serious exceptions.
|
||||
|
||||
return relationships
|
||||
|
||||
@@ -87,7 +89,7 @@ class DNSProvider(BaseProvider):
|
||||
try:
|
||||
# Perform reverse DNS lookup
|
||||
self.total_requests += 1
|
||||
reverse_name = dns.reversename.from_address(ip)
|
||||
reverse_name = reversename.from_address(ip)
|
||||
response = self.resolver.resolve(reverse_name, 'PTR')
|
||||
self.successful_requests += 1
|
||||
|
||||
@@ -119,9 +121,14 @@ class DNSProvider(BaseProvider):
|
||||
discovery_method="reverse_dns_lookup"
|
||||
)
|
||||
|
||||
except resolver.NXDOMAIN:
|
||||
self.failed_requests += 1
|
||||
self.logger.logger.debug(f"Reverse DNS lookup failed for {ip}: NXDOMAIN")
|
||||
except Exception as e:
|
||||
self.failed_requests += 1
|
||||
self.logger.logger.debug(f"Reverse DNS lookup failed for {ip}: {e}")
|
||||
# Re-raise the exception so the scanner can handle the failure
|
||||
raise e
|
||||
|
||||
return relationships
|
||||
|
||||
@@ -185,5 +192,7 @@ class DNSProvider(BaseProvider):
|
||||
except Exception as e:
|
||||
self.failed_requests += 1
|
||||
self.logger.logger.debug(f"{record_type} record query failed for {domain}: {e}")
|
||||
# Re-raise the exception so the scanner can handle it
|
||||
raise e
|
||||
|
||||
return relationships
|
||||
@@ -1,7 +1,4 @@
|
||||
"""
|
||||
Shodan provider for DNSRecon.
|
||||
Discovers IP relationships and infrastructure context through Shodan API.
|
||||
"""
|
||||
# dnsrecon/providers/shodan_provider.py
|
||||
|
||||
import json
|
||||
from typing import List, Dict, Any, Tuple
|
||||
@@ -15,7 +12,7 @@ class ShodanProvider(BaseProvider):
|
||||
Now uses session-specific API keys.
|
||||
"""
|
||||
|
||||
def __init__(self, session_config=None):
|
||||
def __init__(self, name=None, session_config=None):
|
||||
"""Initialize Shodan provider with session-specific configuration."""
|
||||
super().__init__(
|
||||
name="shodan",
|
||||
|
||||
@@ -6,4 +6,5 @@ Werkzeug>=2.3.7
|
||||
urllib3>=2.0.0
|
||||
dnspython>=2.4.2
|
||||
gunicorn
|
||||
redis
|
||||
redis
|
||||
python-dotenv
|
||||
1901
static/css/main.css
1901
static/css/main.css
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user