!headers example.com
+• !headers https://github.com
+• !headers http://localhost:8080
+
+Analyzes:
+• Security headers presence and configuration
+• SSL/TLS certificate information
+• HTTP to HTTPS redirects
+• Security scoring and recommendations
+"""
+ await bot.api.send_markdown_message(room.room_id, usage)
+
+async def analyze_headers(room, bot, url):
+ """Perform comprehensive HTTP security header analysis."""
+ try:
+ await bot.api.send_text_message(room.room_id, f"🔍 Analyzing security headers for: {url}")
+
+ results = {
+ 'url': url,
+ 'http_headers': {},
+ 'https_headers': {},
+ 'redirect_chain': [],
+ 'ssl_info': {},
+ 'security_score': 0,
+ 'recommendations': []
+ }
+
+ # Test HTTP first (if HTTPS was provided, we'll still check redirects)
+ parsed = urlparse(url)
+ http_url = f"http://{parsed.netloc or parsed.path}"
+ https_url = f"https://{parsed.netloc or parsed.path}"
+
+ # Analyze HTTP response and redirects
+ await analyze_http_response(results, http_url if not url.startswith('https://') else https_url)
+
+ # Analyze HTTPS response
+ if url.startswith('https://') or results.get('redirects_to_https'):
+ await analyze_https_response(results, https_url)
+
+ # Analyze SSL certificate if HTTPS
+ if url.startswith('https://') or results.get('redirects_to_https'):
+ await analyze_ssl_certificate(results, parsed.netloc or parsed.path)
+
+ # Calculate security score
+ await calculate_security_score(results)
+
+ # Generate recommendations
+ await generate_recommendations(results)
+
+ # Format and send results
+ output = await format_header_analysis(results)
+ await bot.api.send_markdown_message(room.room_id, output)
+
+ logging.info(f"Completed header analysis for {url}")
+
+ except Exception as e:
+ await bot.api.send_text_message(room.room_id, f"Error analyzing headers: {str(e)}")
+ logging.error(f"Error in analyze_headers: {e}")
+
+async def analyze_http_response(results, url):
+ """Analyze HTTP response and redirect chain."""
+ try:
+ session = requests.Session()
+ session.max_redirects = 5
+
+ response = session.get(url, timeout=10, allow_redirects=True)
+ results['final_url'] = response.url
+ results['status_code'] = response.status_code
+ results['http_headers'] = dict(response.headers)
+
+ # Check if redirects to HTTPS
+ results['redirects_to_https'] = response.url.startswith('https://')
+
+ # Store redirect history
+ results['redirect_chain'] = [{
+ 'url': resp.url,
+ 'status_code': resp.status_code,
+ 'headers': dict(resp.headers)
+ } for resp in response.history]
+
+ except requests.exceptions.SSLError:
+ results['ssl_error'] = True
+ except requests.exceptions.RequestException as e:
+ results['http_error'] = str(e)
+
+async def analyze_https_response(results, url):
+ """Analyze HTTPS response headers."""
+ try:
+ response = requests.get(url, timeout=10, allow_redirects=False)
+ results['https_headers'] = dict(response.headers)
+ results['https_status'] = response.status_code
+ except requests.exceptions.RequestException as e:
+ results['https_error'] = str(e)
+
+async def analyze_ssl_certificate(results, domain):
+ """Analyze SSL certificate information."""
+ try:
+ context = ssl.create_default_context()
+ with socket.create_connection((domain, 443), timeout=10) as sock:
+ with context.wrap_socket(sock, server_hostname=domain) as ssock:
+ cert = ssock.getpeercert()
+
+ results['ssl_info'] = {
+ 'subject': dict(x[0] for x in cert['subject']),
+ 'issuer': dict(x[0] for x in cert['issuer']),
+ 'not_before': cert['notBefore'],
+ 'not_after': cert['notAfter'],
+ 'san': cert.get('subjectAltName', []),
+ 'version': cert.get('version'),
+ 'serial_number': cert.get('serialNumber')
+ }
+
+ except Exception as e:
+ results['ssl_error'] = str(e)
+
+async def calculate_security_score(results):
+ """Calculate overall security score based on headers and configuration."""
+ score = 100
+ missing_headers = []
+
+ # Critical security headers
+ critical_headers = [
+ 'Strict-Transport-Security',
+ 'Content-Security-Policy',
+ 'X-Content-Type-Options',
+ 'X-Frame-Options',
+ 'X-XSS-Protection'
+ ]
+
+ headers = results.get('https_headers') or results.get('http_headers', {})
+
+ for header in critical_headers:
+ if header not in headers:
+ score -= 15
+ missing_headers.append(header)
+
+ # Check HSTS configuration
+ hsts = headers.get('Strict-Transport-Security', '')
+ if 'max-age=31536000' not in hsts:
+ score -= 10
+ if 'includeSubDomains' not in hsts:
+ score -= 5
+ if 'preload' not in hsts:
+ score -= 5
+
+ # Check CSP configuration
+ csp = headers.get('Content-Security-Policy', '')
+ if not csp:
+ score -= 10
+ elif "default-src 'none'" not in csp and "default-src 'self'" not in csp:
+ score -= 5
+
+ # Check for insecure headers
+ insecure_headers = ['Server', 'X-Powered-By', 'X-AspNet-Version']
+ for header in insecure_headers:
+ if header in headers:
+ score -= 5
+
+ # Bonus for good practices
+ if headers.get('Referrer-Policy'):
+ score += 5
+ if headers.get('Feature-Policy') or headers.get('Permissions-Policy'):
+ score += 5
+ if headers.get('X-Content-Type-Options') == 'nosniff':
+ score += 5
+ if headers.get('X-Frame-Options') in ['DENY', 'SAMEORIGIN']:
+ score += 5
+
+ # HTTPS enforcement bonus
+ if results.get('redirects_to_https'):
+ score += 10
+
+ results['security_score'] = max(0, score)
+ results['missing_headers'] = missing_headers
+
+async def generate_recommendations(results):
+ """Generate security recommendations based on analysis."""
+ recommendations = []
+ headers = results.get('https_headers') or results.get('http_headers', {})
+
+ # HSTS recommendations
+ if 'Strict-Transport-Security' not in headers:
+ recommendations.append("🔒 Implement HSTS header with max-age=31536000, includeSubDomains, and preload")
+ else:
+ hsts = headers['Strict-Transport-Security']
+ if 'max-age=31536000' not in hsts:
+ recommendations.append("🔒 Increase HSTS max-age to 31536000 (1 year)")
+ if 'includeSubDomains' not in hsts:
+ recommendations.append("🔒 Add includeSubDomains to HSTS header")
+ if 'preload' not in hsts:
+ recommendations.append("🔒 Consider adding preload directive to HSTS for browser preloading")
+
+ # CSP recommendations
+ if 'Content-Security-Policy' not in headers:
+ recommendations.append("🛡️ Implement Content Security Policy to prevent XSS attacks")
+ else:
+ csp = headers['Content-Security-Policy']
+ if "default-src 'self'" not in csp and "default-src 'none'" not in csp:
+ recommendations.append("🛡️ Restrict CSP default-src to 'self' or specific origins")
+
+ # Frame options
+ if 'X-Frame-Options' not in headers:
+ recommendations.append("🚫 Add X-Frame-Options header to prevent clickjacking (DENY or SAMEORIGIN)")
+
+ # Content type options
+ if 'X-Content-Type-Options' not in headers:
+ recommendations.append("📄 Add X-Content-Type-Options: nosniff to prevent MIME type sniffing")
+
+ # Referrer policy
+ if 'Referrer-Policy' not in headers:
+ recommendations.append("🔗 Implement Referrer-Policy to control referrer information leakage")
+
+ # Feature policy
+ if 'Feature-Policy' not in headers and 'Permissions-Policy' not in headers:
+ recommendations.append("⚙️ Implement Feature-Policy/Permissions-Policy to restrict browser features")
+
+ # Remove server information
+ if 'Server' in headers or 'X-Powered-By' in headers:
+ recommendations.append("🕵️ Remove Server and X-Powered-By headers to avoid information disclosure")
+
+ # HTTPS enforcement
+ if not results.get('redirects_to_https') and not results['url'].startswith('https://'):
+ recommendations.append("🔐 Implement HTTP to HTTPS redirects")
+
+ results['recommendations'] = recommendations
+
+async def format_header_analysis(results):
+ """Format the header analysis results for display."""
+ output = f"🔒 Security Headers Analysis: {results['url']}Comprehensive HTTP security header analysis with security scoring and recommendations.
+Features:
+Security Headers Analyzed:
+Strict-Transport-Security
- HSTS enforcementContent-Security-Policy
- XSS protectionX-Frame-Options
- Clickjacking protectionX-Content-Type-Options
- MIME sniffing preventionReferrer-Policy
- Referrer controlFeature-Policy
- Browser feature restrictionsSecurity Ratings:
+Examples:
+!headers example.com
!headers https://github.com
!headers localhost:3000
!headers subdomain.target.com
Provides enterprise-grade security analysis for penetration testers and developers
+Generates images using self-hosted Stable Diffusion. Supports options: --steps, --cfg, --h, --w, --neg, --sampler. Uses queuing system to handle multiple requests. See available options using just '!sd'.
diff --git a/plugins/loadplugin.py b/plugins/loadplugin.py index 71f6a20..82f7e32 100644 --- a/plugins/loadplugin.py +++ b/plugins/loadplugin.py @@ -62,7 +62,8 @@ async def load_plugin(plugin_name): 'dns':'plugins.dns', 'shodan':'plugins.shodan', 'dnsdumpster': 'plugins.dnsdumpster', - 'exploitdb': 'plugins.exploitdb' + 'exploitdb': 'plugins.exploitdb', + 'headers': 'plugins.headers' } # Get the module path from the mapping