import gradio as gr from typing import List, Dict, Tuple, Optional import pandas as pd import plotly.express as px import plotly.graph_objects as go from datetime import datetime, timedelta import random import time import json import os # Mock data generation functions def generate_threat_data() -> pd.DataFrame: """Generate mock threat intelligence data""" threats = ["Credential Leak", "Phishing Campaign", "Malware Distribution", "Dark Web Mention", "Vulnerability Exploit"] sources = ["Twitter", "Pastebin", "Dark Web Forums", "GitHub", "Public Records"] now = datetime.now() data = [] for i in range(100): days_ago = random.randint(0, 30) threat_date = now - timedelta(days=days_ago) data.append({ "threat_type": random.choice(threats), "source": random.choice(sources), "severity": random.randint(1, 10), "confidence": random.randint(50, 100), "date": threat_date.strftime("%Y-%m-%d"), "affected_entity": f"entity-{random.randint(1, 20)}", "status": random.choice(["Active", "Mitigated", "Investigating"]) }) return pd.DataFrame(data) def generate_risk_scores() -> Dict[str, int]: """Generate mock risk scores for entities""" return {f"entity-{i}": random.randint(1, 100) for i in range(1, 21)} def generate_alerts() -> List[List]: """Generate active alerts""" alert_types = ["Credential Exposure", "Suspicious Login", "Data Leak", "Unauthorized Access", "Malware Detected"] now = datetime.now() alerts = [] for i in range(5, 0, -1): alert_time = now - timedelta(minutes=i*15) alerts.append([ alert_time.strftime("%H:%M"), random.choice(alert_types), random.randint(1, 5) ]) return alerts def generate_threat_intel() -> List[Tuple[str, str]]: """Generate threat intelligence feed items""" intel_items = [ ("[10:45] New phishing campaign targeting financial sector", "Phishing"), ("[09:30] Credential leak detected on paste site", "Credential Leak"), ("[08:15] Vulnerability CVE-2023-1234 actively exploited", "Exploit"), ("[07:00] Dark web forum discussing company data", "Dark Web"), ("[06:30] Suspicious API activity detected", "API Abuse") ] return intel_items # Analytics functions def create_threat_timeline(df: pd.DataFrame) -> go.Figure: """Create interactive threat timeline""" if df.empty: fig = go.Figure() fig.add_annotation(text="No data available", xref="paper", yref="paper", showarrow=False) return fig timeline_data = df.groupby(["date", "threat_type"]).size().reset_index(name="count") fig = px.line( timeline_data, x="date", y="count", color="threat_type", title="Threat Activity Timeline", labels={"date": "Date", "count": "Threat Count", "threat_type": "Threat Type"} ) fig.update_layout(height=400, hovermode='x unified') return fig def create_risk_heatmap(scores: Dict[str, int]) -> go.Figure: """Create risk score heatmap""" if not scores: fig = go.Figure() fig.add_annotation(text="No data available", xref="paper", yref="paper", showarrow=False) return fig df = pd.DataFrame(list(scores.items()), columns=["Entity", "Risk Score"]) fig = px.imshow( [list(scores.values())], labels=dict(x="Entities", y="Risk", color="Score"), x=list(scores.keys()), title="Entity Risk Scores", color_continuous_scale="reds" ) fig.update_layout(height=400) return fig def create_threat_distribution(df: pd.DataFrame) -> go.Figure: """Create threat type distribution pie chart""" if df.empty: fig = go.Figure() fig.add_annotation(text="No data available", xref="paper", yref="paper", showarrow=False) return fig dist_data = df["threat_type"].value_counts().reset_index() dist_data.columns = ["Threat Type", "Count"] fig = px.pie( dist_data, values="Count", names="Threat Type", title="Threat Type Distribution" ) fig.update_layout(height=350) return fig def create_source_analysis(df: pd.DataFrame) -> go.Figure: """Create source analysis bar chart""" if df.empty: fig = go.Figure() fig.add_annotation(text="No data available", xref="paper", yref="paper", showarrow=False) return fig source_data = df["source"].value_counts().reset_index() source_data.columns = ["Source", "Count"] fig = px.bar( source_data, x="Source", y="Count", title="Threats by Source", color="Count", color_continuous_scale="blues" ) fig.update_layout(height=350) return fig def filter_threat_data(df: pd.DataFrame, threat_types: List[str], days: int) -> pd.DataFrame: """Filter threat data based on criteria""" if df.empty: return df filtered = df.copy() if threat_types: filtered = filtered[filtered["threat_type"].isin(threat_types)] cutoff_date = datetime.now() - timedelta(days=int(days)) filtered["date"] = pd.to_datetime(filtered["date"]) filtered = filtered[filtered["date"] >= cutoff_date] return filtered def acknowledge_alerts(alerts: List[List]) -> Tuple[List[List], str]: """Acknowledge all alerts""" acknowledged_count = len(alerts) return [], f"✓ Acknowledged {acknowledged_count} alerts" def export_report(threat_data: pd.DataFrame, risk_scores: Dict[str, int]) -> str: """Export report to JSON""" report = { "generated_at": datetime.now().isoformat(), "threat_summary": { "total_threats": len(threat_data), "threat_types": threat_data["threat_type"].value_counts().to_dict() if not threat_data.empty else {}, "avg_severity": float(threat_data["severity"].mean()) if not threat_data.empty else 0 }, "risk_summary": { "entities_monitored": len(risk_scores), "high_risk_count": sum(1 for score in risk_scores.values() if score > 70), "avg_risk_score": sum(risk_scores.values()) / len(risk_scores) if risk_scores else 0 } } filename = f"nexusme_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json" with open(filename, 'w') as f: json.dump(report, f, indent=2) return f"✓ Report exported to {filename}" def start_new_investigation() -> str: """Start new investigation""" investigation_id = f"INV-{datetime.now().strftime('%Y%m%d%H%M%S')}" return f"✓ New investigation started: {investigation_id}" def run_security_scan() -> Tuple[str, str]: """Run security scan""" scan_id = f"SCAN-{datetime.now().strftime('%Y%m%d%H%M%S')}" time.sleep(2) # Simulate scan findings = random.randint(0, 5) status = "Complete" if findings == 0 else f"Complete - {findings} findings" return scan_id, status # Core application with gr.Blocks() as demo: # Header with security warning gr.Markdown(""" # 🛡️ Nexusme OSINT Platform **Advanced Threat Intelligence Dashboard** *For authorized security personnel only - All access is logged and monitored*
⚠️ **Security Notice**: This system is for authorized use only. Unauthorized access is prohibited.
""") # State management threat_data_state = gr.State(generate_threat_data()) risk_scores_state = gr.State(generate_risk_scores()) alerts_state = gr.State(generate_alerts()) with gr.Tabs(): # Tab 1: Threat Landscape with gr.TabItem("🌐 Threat Landscape", id=1): with gr.Row(): with gr.Column(scale=2): timeline_plot = gr.Plot(label="Threat Activity Timeline") with gr.Row(): with gr.Column(): threat_dist_plot = gr.Plot(label="Threat Distribution") with gr.Column(): source_plot = gr.Plot(label="Source Analysis") refresh_btn = gr.Button("🔄 Refresh Data", variant="primary", size="lg") with gr.Column(scale=1): with gr.Group(): gr.Markdown("### 🔍 Advanced Filters") threat_type_filter = gr.CheckboxGroup( ["Credential Leak", "Phishing Campaign", "Malware Distribution", "Dark Web Mention", "Vulnerability Exploit"], label="Filter Threat Types", value=["Credential Leak", "Phishing Campaign", "Malware Distribution"] ) date_range = gr.Slider(1, 30, 7, label="Days to Analyze", step=1) apply_filter_btn = gr.Button("Apply Filters", variant="secondary") with gr.Group(): gr.Markdown("### 📊 Statistics") stats_json = gr.JSON(label="Threat Statistics") # Tab 2: Risk Assessment with gr.TabItem("⚠️ Risk Assessment", id=2): with gr.Row(): with gr.Column(scale=2): heatmap = gr.Plot(label="Entity Risk Scores") risk_refresh = gr.Button("🔄 Refresh Scores", variant="primary") with gr.Column(scale=1): with gr.Group(): gr.Markdown("### 📈 Risk Summary") risk_summary = gr.JSON(label="Risk Metrics") with gr.Group(): gr.Markdown("### 🎯 High Risk Entities") high_risk_table = gr.Dataframe( headers=["Entity", "Risk Score", "Status"], datatype=["str", "number", "str"], interactive=False, label="High Risk (>70)" ) # Tab 3: Alerts & Intelligence with gr.TabItem("🚨 Alerts & Intel", id=3): with gr.Row(): with gr.Column(scale=1): with gr.Group(): gr.Markdown("### 🚨 Active Alerts") alert_table = gr.Dataframe( headers=["Time", "Alert Type", "Severity"], datatype=["str", "str", "number"], interactive=False, label="Current Alerts" ) acknowledge_btn = gr.Button("✓ Acknowledge All", variant="secondary") ack_status = gr.Textbox(label="Status", interactive=False) with gr.Group(): gr.Markdown("### 📡 Threat Intelligence Feed") intel_feed = gr.HighlightedText( value=generate_threat_intel(), color_map={ "Phishing": "#FF6B6B", "Credential Leak": "#FFA500", "Exploit": "#8B0000", "Dark Web": "#4B0082", "API Abuse": "#DC143C" }, show_legend=True, label="" ) with gr.Column(scale=1): with gr.Group(): gr.Markdown("### ⚡ Quick Actions") with gr.Row(): export_btn = gr.Button("📄 Export Report", variant="secondary") new_search = gr.Button("🔍 New Investigation", variant="secondary") scan_now = gr.Button("🔒 Scan Now", variant="primary", size="lg") export_status = gr.Textbox(label="Export Status", interactive=False) investigation_status = gr.Textbox(label="Investigation Status", interactive=False) scan_id_output = gr.Textbox(label="Scan ID", interactive=False) scan_status_output = gr.Textbox(label="Scan Status", interactive=False) # Event handlers def update_all_visualizations(threat_data, risk_scores): """Update all visualization components""" timeline = create_threat_timeline(threat_data) threat_dist = create_threat_distribution(threat_data) source_analysis = create_source_analysis(threat_data) heatmap_viz = create_risk_heatmap(risk_scores) stats = { "total_threats": len(threat_data), "unique_entities": threat_data["affected_entity"].nunique() if not threat_data.empty else 0, "avg_severity": float(threat_data["severity"].mean()) if not threat_data.empty else 0, "avg_confidence": float(threat_data["confidence"].mean()) if not threat_data.empty else 0 } risk_metrics = { "entities_monitored": len(risk_scores), "high_risk_count": sum(1 for score in risk_scores.values() if score > 70), "avg_risk_score": round(sum(risk_scores.values()) / len(risk_scores), 2) if risk_scores else 0, "max_risk_score": max(risk_scores.values()) if risk_scores else 0 } high_risk_entities = [ [entity, score, "Critical" if score > 90 else "High"] for entity, score in risk_scores.items() if score > 70 ][:10] return [ timeline, threat_dist, source_analysis, heatmap_viz, stats, risk_metrics, high_risk_entities ] # Initial load demo.load( fn=update_all_visualizations, inputs=[threat_data_state, risk_scores_state], outputs=[ timeline_plot, threat_dist_plot, source_plot, heatmap, stats_json, risk_summary, high_risk_table ] ) # Refresh threat data refresh_btn.click( fn=generate_threat_data, outputs=threat_data_state ).then( fn=update_all_visualizations, inputs=[threat_data_state, risk_scores_state], outputs=[ timeline_plot, threat_dist_plot, source_plot, heatmap, stats_json, risk_summary, high_risk_table ] ) # Apply filters apply_filter_btn.click( fn=filter_threat_data, inputs=[threat_data_state, threat_type_filter, date_range], outputs=threat_data_state ).then( fn=lambda td, rs: [ create_threat_timeline(td), create_threat_distribution(td), create_source_analysis(td), create_risk_heatmap(rs), { "total_threats": len(td), "unique_entities": td["affected_entity"].nunique() if not td.empty else 0, "avg_severity": float(td["severity"].mean()) if not td.empty else 0 }, risk_summary.value, high_risk_table.value ], inputs=[threat_data_state, risk_scores_state], outputs=[ timeline_plot, threat_dist_plot, source_plot, heatmap, stats_json, risk_summary, high_risk_table ] ) # Refresh risk scores risk_refresh.click( fn=generate_risk_scores, outputs=risk_scores_state ).then( fn=update_all_visualizations, inputs=[threat_data_state, risk_scores_state], outputs=[ timeline_plot, threat_dist_plot, source_plot, heatmap, stats_json, risk_summary, high_risk_table ] ) # Acknowledge alerts acknowledge_btn.click( fn=acknowledge_alerts, inputs=alerts_state, outputs=[alerts_state, ack_status] ).then( fn=lambda: [], outputs=alert_table ) # Export report export_btn.click( fn=export_report, inputs=[threat_data_state, risk_scores_state], outputs=export_status ) # New investigation new_search.click( fn=start_new_investigation, outputs=investigation_status ) # Security scan scan_now.click( fn=run_security_scan, outputs=[scan_id_output, scan_status_output] ) # Footer with compliance info gr.Markdown("""
Nexusme OSINT Platform v1.0 | Built with anycoder | All activities logged and monitored for security compliance
""") # Launch with security-focused settings if __name__ == "__main__": demo.launch( auth=("admin", "securepassword123"), auth_message="Please authenticate with your Nexusme credentials", server_name="0.0.0.0", server_port=7860, show_error=True, share=False, footer_links=[ {"label": "Built with anycoder", "url": "https://huggingface.co/spaces/akhaliq/anycoder"}, {"label": "Privacy Policy", "url": "#"}, {"label": "Terms of Service", "url": "#"}, {"label": "Documentation", "url": "#"} ], theme=gr.themes.Soft( primary_hue="indigo", secondary_hue="blue", neutral_hue="slate", font=[gr.themes.GoogleFont("Roboto"), "ui-sans-serif", "system-ui"], text_size="md", spacing_size="md", radius_size="md" ).set( button_primary_background_fill="*primary_600", button_primary_background_fill_hover="*primary_700", block_title_text_weight="600", ) )