use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
pub const MODULE_EXPLOIT: &str = "exploit";
pub const MODULE_AUXILIARY: &str = "auxiliary";
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModuleOption {
pub name: String,
pub required: bool,
pub default: Option<String>,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ModuleInfo {
pub name: String,
pub module_type: String,
pub rank: String,
pub description: String,
pub platforms: Vec<String>,
pub targets: Vec<String>,
pub options: Vec<ModuleOption>,
pub required_options: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExploitStep {
pub module_type: String,
pub module_name: String,
pub cve: Option<String>,
pub vulnerability: String,
pub rank: String,
pub asset_id: String,
pub finding_id: String,
pub host: String,
pub service_port: Option<u16>,
pub service_protocol: Option<String>,
pub inferred_options: BTreeMap<String, String>,
pub missing_options: Vec<String>,
pub payload_compatibility: String,
pub confidence: String,
pub default_selected: bool,
}
impl ExploitStep {
pub fn resolved_options(&self) -> BTreeMap<String, String> {
self.inferred_options.clone()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModuleRunResult {
pub job_id: Option<String>,
pub success: bool,
pub message: String,
pub raw: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JobStatus {
pub job_id: String,
pub running: bool,
pub status: String,
pub error: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionInfo {
pub id: String,
pub typ: String,
pub target_host: String,
pub platform: String,
pub info: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LootInfo {
pub id: String,
pub name: String,
pub content_type: String,
pub host: String,
pub path: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ExploitStatus {
Planned,
Running,
Completed,
Failed,
Skipped,
DryRun,
}
impl ExploitStatus {
pub fn as_str(&self) -> &'static str {
match self {
ExploitStatus::Planned => "planned",
ExploitStatus::Running => "running",
ExploitStatus::Completed => "completed",
ExploitStatus::Failed => "failed",
ExploitStatus::Skipped => "skipped",
ExploitStatus::DryRun => "dry_run",
}
}
pub fn parse(value: &str) -> Self {
match value {
"running" => ExploitStatus::Running,
"completed" => ExploitStatus::Completed,
"failed" => ExploitStatus::Failed,
"skipped" => ExploitStatus::Skipped,
"dry_run" => ExploitStatus::DryRun,
_ => ExploitStatus::Planned,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExploitOutcome {
pub step: ExploitStep,
pub status: ExploitStatus,
pub job_id: Option<String>,
pub session_id: Option<String>,
pub error: Option<String>,
pub loot: Vec<String>,
pub start_time: String,
pub finish_time: Option<String>,
}
#[derive(Debug, Clone, Default)]
pub struct ExploitOptions {
pub dry_run: bool,
pub yes: bool,
pub module_filter: Option<String>,
pub target_filter: Option<String>,
pub payload_override: Option<String>,
pub workspace: Option<String>,
pub backend: Option<String>,
pub pocketbase_url: Option<String>,
pub sqlite_path: Option<String>,
pub verbose: bool,
}