pub mod models;
pub mod error;
pub mod fetcher;
pub mod analyzer;
pub mod exploitation;
pub use models::*;
pub use error::*;
pub use fetcher::*;
pub use analyzer::*;
pub use exploitation::*;
use clap::Parser;
#[derive(Parser)]
#[command(name = "cve-explorer")]
#[command(about = "Deep dive CVE analysis tool", long_about = None)]
pub struct Cli {
#[arg(short, long)]
pub cve: String,
#[arg(short, long, default_value = "basic")]
pub mode: String,
#[arg(short, long, default_value = "detailed")]
pub format: String,
#[arg(long)]
pub api_key: Option<String>,
}
pub fn display_summary(cve: &CVE, analysis: &RootCauseAnalysis) {
println!("\n๐ CVE SUMMARY");
println!("ID: {}", cve.id);
println!("Published: {}", cve.publishedDate.format("%Y-%m-%d"));
println!("Primary Cause: {:?}", analysis.primary_cause);
println!("Severity: {:?}", cve.cvss.as_ref().map(|c| &c.severity));
println!("\n๐ง PREVENTION RECOMMENDATIONS");
for rec in &analysis.prevention_recommendations {
println!("- {} ({:?})", rec.description, rec.priority);
}
}
pub fn display_detailed_analysis(cve: &CVE, analysis: &RootCauseAnalysis) {
println!("\n๐ฌ DETAILED CVE ANALYSIS");
println!("โโโโโโโโโโโโโโโโโโโโโโโโโโโ");
println!("\n๐ CVE Details:");
println!(" ID: {}", cve.id);
println!(" Published: {}", cve.publishedDate.format("%Y-%m-%d %H:%M:%S UTC"));
println!(" Last Modified: {}", cve.lastModifiedDate.format("%Y-%m-%d %H:%M:%S UTC"));
if let Some(cvss) = &cve.cvss {
println!(" CVSS Score: {:.1} ({:?})", cvss.base_score, cvss.severity);
println!(" Vector: {}", cvss.vector_string);
}
println!("\n๐ PRIMARY CAUSE:");
println!(" {:?}", analysis.primary_cause);
println!("\n๐ CONTRIBUTING FACTORS:");
for factor in &analysis.contributing_factors {
println!(" โข {:?}", factor);
}
println!("\n๐๏ธ ARCHITECTURAL FLAWS:");
for flaw in &analysis.architectural_flaws {
println!(" โข {:?}: {} (Impact: {:?})",
flaw.category, flaw.description, flaw.impact_level);
}
println!("\n๐ DEVELOPMENT PROCESS ISSUES:");
for issue in &analysis.development_process_issues {
println!(" โข {:?}: {} -> {}",
issue.category, issue.description, issue.recommendation);
}
println!("\n๐ก๏ธ PREVENTION RECOMMENDATIONS:");
for rec in &analysis.prevention_recommendations {
println!(" [{:?}] {:?} - {}",
rec.priority, rec.category, rec.description);
println!(" Implementation: {}", rec.implementation_guide);
}
}
pub fn display_exploitation_analysis(_cve: &CVE, analysis: &ExploitationAnalysis) {
println!("\n๐ฃ EXPLOITATION PATH ANALYSIS");
println!("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
println!("\n๐ฏ ATTACK SURFACE");
for entry_point in &analysis.attack_surface.entry_points {
println!(" ๐ {}{}",
format!("{:?}", entry_point.interface_type),
if let Some(proto) = &entry_point.protocol {
format!(" ({})", proto)
} else {
"".to_string()
}
);
println!(" Auth Required: {}", entry_point.authentication_required);
println!(" Description: {}", entry_point.description);
}
println!("\n๐ TRUST BOUNDARIES");
for boundary in &analysis.attack_surface.trust_boundaries {
println!(" ๐ก๏ธ {}", boundary.name);
println!(" Protection: {}", boundary.protection_mechanism);
println!(" Bypass Technique: {}", boundary.bypass_technique);
}
println!("\nโ๏ธ PRIVILEGE ESCALATION CHAIN");
for step in &analysis.privilege_escalation_chain {
println!(" {}. {} โ {}", step.step_number, step.current_privilege, step.gained_privilege);
println!(" Technique: {}", step.technique);
}
println!("\n๐ EXPLOITATION COMPLEXITY");
println!(" Overall Score: {:.1}", analysis.exploitation_complexity.overall_score);
println!(" Difficulty: {:?}", analysis.exploitation_complexity.difficulty_level);
println!(" Estimated Time: {}-{} hours (typically {})",
analysis.exploitation_complexity.time_estimate.min_hours,
analysis.exploitation_complexity.time_estimate.max_hours,
analysis.exploitation_complexity.time_estimate.typical_hours
);
println!("\n๐ ๏ธ REQUIRED SKILLS");
for skill in &analysis.exploitation_complexity.required_skills {
println!(" โข {} ({:?})", skill.skill, skill.proficiency_required);
}
println!("\n๐งช PROOF OF CONCEPT TEMPLATE");
println!(" Language: {}", analysis.proof_of_concept_framework.language);
println!(" Framework: {}", analysis.proof_of_concept_framework.framework);
println!(" Safety Notes:");
for note in &analysis.proof_of_concept_framework.safety_notes {
println!(" {}", note);
}
println!("\n๐ EXPLOITATION STEPS:");
for (i, step) in analysis.proof_of_concept_framework.exploitation_steps.iter().enumerate() {
println!(" {}. {}", i + 1, step);
}
}
pub fn display_full_analysis(
cve: &CVE,
root_cause: &RootCauseAnalysis,
exploitation: &ExploitationAnalysis
) {
display_detailed_analysis(cve, root_cause);
display_exploitation_analysis(cve, exploitation);
}
pub fn display_json_output(
cve: &CVE,
root_cause: Option<&RootCauseAnalysis>,
exploitation: Option<&ExploitationAnalysis>
) -> anyhow::Result<()> {
let output = serde_json::json!({
"cve": cve,
"root_cause_analysis": root_cause,
"exploitation_analysis": exploitation
});
println!("{}", serde_json::to_string_pretty(&output)?);
Ok(())
}