use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use struct_metadata::Described;
use crate::{Sha1, Sha256, MD5, Domain, IP, Uri, Platform, Processor, SSDeepHash, PhoneNumber, UpperString, UNCPath, UriPath, Email, Mac, ElasticMeta};
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct Attribution {
pub actor: Option<Vec<UpperString>>,
pub campaign: Option<Vec<UpperString>>,
pub category: Option<Vec<UpperString>>,
pub exploit: Option<Vec<UpperString>>,
pub implant: Option<Vec<UpperString>>,
pub family: Option<Vec<UpperString>>,
pub network: Option<Vec<UpperString>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct AV {
pub heuristic: Option<Vec<String>>,
pub virus_name: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct CertValid {
pub start: Option<Vec<String>>,
pub end: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct Cert {
pub extended_key_usage: Option<Vec<String>>,
pub issuer: Option<Vec<String>>,
pub key_usage: Option<Vec<String>>,
pub owner: Option<Vec<String>>,
pub serial_no: Option<Vec<String>>,
pub signature_algo: Option<Vec<String>>,
pub subject: Option<Vec<String>>,
pub subject_alt_name: Option<Vec<String>>,
pub thumbprint: Option<Vec<String>>,
pub valid: Option<CertValid>,
pub version: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct DynamicProcess {
pub command_line: Option<Vec<String>>,
pub file_name: Option<Vec<String>>,
pub shortcut: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct DynamicSignature {
pub category: Option<Vec<String>>,
pub family: Option<Vec<String>>,
pub name: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct DynamicSSDeep {
pub cls_ids: Option<Vec<SSDeepHash>>,
pub dynamic_classes: Option<Vec<SSDeepHash>>,
pub regkeys: Option<Vec<SSDeepHash>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct DynamicWindow {
pub cls_ids: Option<Vec<String>>,
pub dynamic_classes: Option<Vec<String>>,
pub regkeys: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct DynamicOperatingSystem {
pub platform: Option<Vec<Platform>>,
pub version: Option<Vec<String>>,
pub processor: Option<Vec<Processor>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct Dynamic {
pub autorun_location: Option<Vec<String>>,
pub dos_device: Option<Vec<String>>,
pub mutex: Option<Vec<String>>,
pub registry_key: Option<Vec<String>>,
pub process: Option<DynamicProcess>,
pub signature: Option<DynamicSignature>,
pub ssdeep: Option<DynamicSSDeep>,
pub window: Option<DynamicWindow>,
pub operating_system: Option<DynamicOperatingSystem>,
pub processtree_id: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct TaggingInfo {
pub phone_number: Option<Vec<PhoneNumber>>,
pub password: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileAPKApp {
pub label: Option<Vec<String>>,
pub version: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileAPKSDK {
pub min: Option<Vec<String>>,
pub target: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileAPK {
pub activity: Option<Vec<String>>,
pub app: Option<FileAPKApp>,
pub feature: Option<Vec<String>>,
pub locale: Option<Vec<String>>,
pub permission: Option<Vec<String>>,
pub pkg_name: Option<Vec<String>>,
pub provides_component: Option<Vec<String>>,
pub sdk: Option<FileAPKSDK>,
pub used_library: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileDate {
pub creation: Option<Vec<String>>,
pub last_modified: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileELFSections {
pub name: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileELFSegments {
#[serde(rename = "type")]
pub segment_type: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileELFNotes {
pub name: Option<Vec<String>>,
#[serde(rename = "type")]
pub note_type: Option<Vec<String>>,
pub type_core: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileELF {
pub libraries: Option<Vec<String>>,
pub interpreter: Option<Vec<String>>,
pub sections: Option<FileELFSections>,
pub segments: Option<FileELFSegments>,
pub notes: Option<FileELFNotes>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileIMGExiftool {
pub creator_tool: Option<Vec<String>>,
pub derived_document_id: Option<Vec<String>>,
pub document_id: Option<Vec<String>>,
pub instance_id: Option<Vec<String>>,
pub toolkit: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileIMG {
pub exif_tool: Option<FileIMGExiftool>,
pub mega_pixels: Option<Vec<String>>,
pub mode: Option<Vec<String>>,
pub size: Option<Vec<String>>,
pub sorted_metadata_hash: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileJAR {
pub main_class: Option<Vec<String>>,
pub main_package: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileName {
pub anomaly: Option<Vec<String>>,
pub extracted: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileOLEMacro {
pub sha256: Option<Vec<Sha256>>,
pub suspicious_string: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileOLESummary {
pub author: Option<Vec<String>>,
pub codepage: Option<Vec<String>>,
pub comment: Option<Vec<String>>,
pub company: Option<Vec<String>>,
pub create_time: Option<Vec<String>>,
pub last_printed: Option<Vec<String>>,
pub last_saved_by: Option<Vec<String>>,
pub last_saved_time: Option<Vec<String>>,
pub manager: Option<Vec<String>>,
pub subject: Option<Vec<String>>,
pub title: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileOLE {
#[serde(rename = "macro")]
pub ole_macro: Option<FileOLEMacro>,
pub summary: Option<FileOLESummary>,
pub clsid: Option<Vec<String>>,
pub dde_link: Option<Vec<String>>,
pub fib_timestamp: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePDFDate {
pub modified: Option<Vec<String>>,
pub pdfx: Option<Vec<String>>,
pub source_modified: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePDFJavascript {
pub sha1: Option<Vec<Sha1>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePDFStats {
pub sha1: Option<Vec<Sha1>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePDF {
pub date: Option<FilePDFDate>,
pub javascript: Option<FilePDFJavascript>,
pub stats: Option<FilePDFStats>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePEDebug {
pub guid: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePEExports {
pub function_name: Option<Vec<String>>,
pub module_name: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePEImports {
pub fuzzy: Option<Vec<SSDeepHash>>,
pub md5: Option<Vec<MD5>>,
pub imphash: Option<Vec<MD5>>,
pub sorted_fuzzy: Option<Vec<SSDeepHash>>,
pub sorted_sha1: Option<Vec<Sha1>>,
pub gimphash: Option<Vec<Sha256>>,
pub suspicious: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePELinker {
pub timestamp: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePEOEP {
pub bytes: Option<Vec<String>>,
pub hexdump: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePEResources {
pub language: Option<Vec<String>>,
pub name: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePERichHeader {
pub hash: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePESections {
pub hash: Option<Vec<String>>,
pub name: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePEVersions {
pub description: Option<Vec<String>>,
pub filename: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePE {
pub api_vector: Option<Vec<String>>,
pub debug: Option<FilePEDebug>,
pub exports: Option<FilePEExports>,
pub imports: Option<FilePEImports>,
pub linker: Option<FilePELinker>,
pub oep: Option<FilePEOEP>,
pub pdb_filename: Option<Vec<String>>,
pub resources: Option<FilePEResources>,
pub rich_header: Option<FilePERichHeader>,
pub sections: Option<FilePESections>,
pub versions: Option<FilePEVersions>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePListBuild {
pub machine_os: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePListCFBundleVersion {
pub long: Option<Vec<String>>,
pub short: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePListCFBundle {
pub development_region: Option<Vec<String>>,
pub display_name: Option<Vec<String>>,
pub executable: Option<Vec<String>>,
pub identifier: Option<Vec<String>>,
pub name: Option<Vec<String>>,
pub pkg_type: Option<Vec<String>>,
pub signature: Option<Vec<String>>,
pub url_scheme: Option<Vec<String>>,
pub version: Option<FilePListCFBundleVersion>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePListDTPlatform {
pub build: Option<Vec<String>>,
pub name: Option<Vec<String>>,
pub version: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePListDT {
pub compiler: Option<Vec<String>>,
pub platform: Option<FilePListDTPlatform>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePListLS {
pub background_only: Option<Vec<String>>,
pub min_system_version: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePListNS {
pub apple_script_enabled: Option<Vec<String>>,
pub principal_class: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePListUI {
pub background_modes: Option<Vec<String>>,
pub requires_persistent_wifi: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePListWK {
pub app_bundle_identifier: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePList {
pub installer_url: Option<Vec<String>>,
pub min_os_version: Option<Vec<String>>,
pub requests_open_access: Option<Vec<String>>,
pub build: Option<FilePListBuild>,
pub cf_bundle: Option<FilePListCFBundle>,
pub dt: Option<FilePListDT>,
pub ls: Option<FilePListLS>,
pub ns: Option<FilePListNS>,
pub ui: Option<FilePListUI>,
pub wk: Option<FilePListWK>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FilePowerShell {
pub cmdlet: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileShortcut {
pub command_line: Option<Vec<String>>,
pub icon_location: Option<Vec<String>>,
pub machine_id: Option<Vec<String>>,
pub tracker_mac: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileStrings {
pub api: Option<Vec<String>>,
pub blacklisted: Option<Vec<String>>,
pub decoded: Option<Vec<String>>,
pub extracted: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileSWFHeaderFrame {
pub count: Option<Vec<i64>>,
pub rate: Option<Vec<String>>,
pub size: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileSWFHeader {
pub frame: Option<FileSWFHeaderFrame>,
pub version: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct FileSWF {
pub header: Option<FileSWFHeader>,
pub tags_ssdeep: Option<Vec<SSDeepHash>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct NetworkIOCs {
pub domain: Option<Vec<Domain>>,
pub ip: Option<Vec<IP>>,
pub unc_path: Option<Vec<UNCPath>>,
pub uri: Option<Vec<Uri>>,
pub uri_path: Option<Vec<UriPath>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct NetworkEmail {
pub address: Option<Vec<Email>>,
pub date: Option<Vec<String>>,
pub subject: Option<Vec<String>>,
pub msg_id: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct NetworkSignature {
pub signature_id: Option<Vec<String>>,
pub message: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct NetworkTLS {
pub ja3_hash: Option<Vec<MD5>>,
pub ja3_string: Option<Vec<String>>,
pub sni: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct Network {
pub attack: Option<Vec<String>>,
pub dynamic: Option<NetworkIOCs>,
pub email: Option<NetworkEmail>,
pub mac_address: Option<Vec<Mac>>,
pub port: Option<Vec<i64>>,
pub protocol: Option<Vec<String>>,
pub signature: Option<NetworkSignature>,
#[serde(rename = "static")]
pub static_ioc: Option<NetworkIOCs>,
pub tls: Option<NetworkTLS>,
pub user_agent: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct Technique {
pub comms_routine: Option<Vec<String>>,
pub config: Option<Vec<String>>,
pub crypto: Option<Vec<String>>,
pub keylogger: Option<Vec<String>>,
#[serde(rename = "macro")]
pub macro_string: Option<Vec<String>>,
pub masking_algo: Option<Vec<String>>,
pub obfuscation: Option<Vec<String>>,
pub packer: Option<Vec<String>>,
pub persistence: Option<Vec<String>>,
pub shellcode: Option<Vec<String>>,
pub string: Option<Vec<String>>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
pub struct TaggingFile {
pub ancestry: Option<Vec<String>>,
pub behavior: Option<Vec<String>>,
pub compiler: Option<Vec<String>>,
pub config: Option<Vec<String>>,
pub date: Option<FileDate>,
pub elf: Option<FileELF>,
pub lib: Option<Vec<String>>,
pub lsh: Option<Vec<String>>,
pub name: Option<FileName>,
pub path: Option<Vec<String>>,
pub rule: Option<HashMap<String, Vec<String>>>,
pub string: Option<FileStrings>,
pub apk: Option<FileAPK>,
pub jar: Option<FileJAR>,
pub img: Option<FileIMG>,
pub ole: Option<FileOLE>,
pub pe: Option<FilePE>,
pub pdf: Option<FilePDF>,
pub plist: Option<FilePList>,
pub powershell: Option<FilePowerShell>,
pub shortcut: Option<FileShortcut>,
pub swf: Option<FileSWF>,
}
#[derive(Serialize, Deserialize, Debug, Default, Described)]
#[metadata_type(ElasticMeta)]
#[metadata(copyto="__text__")]
pub struct Tagging {
pub attribution: Option<Box<Attribution>>,
pub av: Option<Box<AV>>,
pub cert: Option<Box<Cert>>,
pub dynamic: Option<Box<Dynamic>>,
pub info: Option<Box<TaggingInfo>>,
pub file: Option<Box<TaggingFile>>,
pub network: Option<Box<Network>>,
pub source: Option<Box<Vec<String>>>,
pub technique: Option<Box<Technique>>,
pub vector: Option<Box<Vec<String>>>,
}