changed arg import from argmatches to clap derive

This commit is contained in:
DustInDark
2022-06-16 17:39:55 +09:00
parent a8d345b422
commit c2a8a0f018

View File

@@ -3,15 +3,17 @@ use crate::detections::pivot::PIVOT_KEYWORD;
use crate::detections::print::AlertMessage;
use crate::detections::utils;
use chrono::{DateTime, Utc};
use clap::{ArgMatches, CommandFactory, Parser};
use clap::{App, CommandFactory, Parser};
use hashbrown::HashMap;
use hashbrown::HashSet;
use lazy_static::lazy_static;
use regex::Regex;
use std::path::PathBuf;
use std::sync::RwLock;
use terminal_size::{terminal_size, Width, Height};
lazy_static! {
pub static ref CONFIG: RwLock<ConfigReader> = RwLock::new(ConfigReader::new());
pub static ref CONFIG: RwLock<ConfigReader<'static>> = RwLock::new(ConfigReader::new());
pub static ref LEVELMAP: HashMap<String, u128> = {
let mut levelmap = HashMap::new();
levelmap.insert("INFORMATIONAL".to_owned(), 1);
@@ -23,276 +25,207 @@ lazy_static! {
};
pub static ref EVENTKEY_ALIAS: EventKeyAliasConfig = load_eventkey_alias(&format!(
"{}/eventkey_alias.txt",
CONFIG.read().unwrap().folder_path
CONFIG.read().unwrap().args.config.as_path().display()
));
pub static ref IDS_REGEX: Regex =
Regex::new(r"^[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}$").unwrap();
pub static ref TERM_SIZE:Option<(Width, Height)> = terminal_size();
}
#[derive(Clone)]
pub struct ConfigReader {
pub args: ArgMatches,
pub struct ConfigReader<'a> {
pub app: App<'a>,
pub args: Config,
pub headless_help: String,
pub folder_path: String,
pub event_timeline_config: EventInfoConfig,
pub target_eventids: TargetEventIds,
}
impl Default for ConfigReader {
impl Default for ConfigReader<'_> {
fn default() -> Self {
Self::new()
}
}
/// Hayabusa: Aiming to be the world's greatest Windows event log analysis tool!
#[derive(Parser)]
#[clap(
name = "Hayabusa",
about,
usage = "hayabusa.exe -f file.evtx [OPTIONS] / hayabusa.exe -d evtx-directory [OPTIONS]",
author = "Yamato Security (https://github.com/Yamato-Security/hayabusa) @SecurityYamato)",
version
version,
term_width = 400,
)]
struct Config {
pub struct Config {
/// Directory of multiple .evtx files.
#[clap(short = 'd', long, value_name = "DIRECTORY")]
directory: Option<PathBuf>,
pub directory: Option<PathBuf>,
/// File path to one .evtx file.
#[clap(short = 'f', long, value_name = "FILE_PATH")]
filepath: Option<PathBuf>,
pub filepath: Option<PathBuf>,
/// Print all field information.
#[clap(short = 'F', long = "full-data")]
full_data: bool,
pub full_data: bool,
/// Rule directory or file.
/// Specify rule directory or file. (Default: .\rules)
#[clap(
short = 'r',
long,
default_value = "./rules",
hide_default_value = true,
value_name = "RULE_DIRECTORY/RULE_FILE"
)]
rules: PathBuf,
pub rules: PathBuf,
/// Rule config folder.
/// Rule config folder. [Default: .\rules\config]
#[clap(
short = 'c',
long,
default_value = "./rules/config",
hide_default_value = true,
value_name = "RULE_CONFIG_DIRECTORY"
)]
config: PathBuf,
pub config: PathBuf,
/// Save the timeline in CSV format. (Ex: results.csv)
#[clap(short = 'o', long, value_name = "CSV_TIMELINE")]
output: Option<PathBuf>,
pub output: Option<PathBuf>,
/// Output all tags when saving to a CSV file.
#[clap(long = "all-tags")]
all_tags: bool,
pub all_tags: bool,
/// Do not display EventRecordID number.
/// Do not display EventRecordID numbers.
#[clap(short = 'R', long = "hide-record-id")]
hide_record_id: bool,
pub hide_record_id: bool,
/// Output verbose information.
#[clap(short = 'v', long)]
verbose: bool,
pub verbose: bool,
/// Output event frequency timeline.
#[clap(short = 'V', long = "visualize-timeline")]
visualize_timeline: bool,
pub visualize_timeline: bool,
/// Enable rules marked as deprecated.
#[clap(short = 'D', long = "enable-deprecated-rules")]
enable_deprecated_rules: bool,
pub enable_deprecated_rules: bool,
/// Enable rules marked as noisy.
#[clap(short = 'n', long = "enable-noisy-rules")]
enable_noisy_rules: bool,
pub enable_noisy_rules: bool,
/// Update to the latest rules in the hayabusa-rules github repository.
#[clap(short = 'u', long = "update-rules")]
update_rules: bool,
pub update_rules: bool,
/// Minimum level for rules.
/// Minimum level for rules. (Default: informational)
#[clap(
short = 'm',
long = "min-level",
default_value = "informational",
hide_default_value = true,
value_name = "LEVEL"
)]
min_level: String,
pub min_level: String,
/// Analyze the local C:\\Windows\\System32\\winevt\\Logs folder (Windows Only. Administrator privileges required.)
#[clap(short = 'l', long = "live-analysis")]
live_analysis: bool,
pub live_analysis: bool,
/// Start time of the event logs to load. (Ex: "2020-02-22 00:00:00 +09:00")
#[clap(long = "start-timeline", value_name = "START_TIMELINE")]
start_timeline: Option<String>,
pub start_timeline: Option<String>,
/// End time of the event logs to load. (Ex: "2022-02-22 23:59:59 +09:00")
#[clap(long = "end-timeline", value_name = "END_TIMELINE")]
end_timeline: Option<String>,
pub end_timeline: Option<String>,
/// Output timestamp in RFC 2822 format. (Ex: Fri, 22 Feb 2022 22:00:00 -0600)
#[clap(long = "rfc-2822")]
rfc_2822: bool,
pub rfc_2822: bool,
/// Output timestamp in RFC 3339 format. (Ex: 2022-02-22 22:00:00.123456-06:00)
#[clap(long = "rfc-3339")]
rfc_3339: bool,
pub rfc_3339: bool,
/// Output timestamp in US time format. (Ex: 02-22-2022 10:00:00.123 PM -06:00)
#[clap(long = "US-time")]
us_time: bool,
pub us_time: bool,
/// Output timestamp in US military time format. (Ex: 02-22-2022 22:00:00.123 -06:00)
#[clap(long = "US-military-time")]
us_military_time: bool,
pub us_military_time: bool,
/// Output timestamp in European time format. (Ex: 22-02-2022 22:00:00.123 +02:00)
#[clap(long = "European-time")]
european_time: bool,
pub european_time: bool,
/// Output time in UTC format. [default: local time]
/// Output time in UTC format. [Default: local time]
#[clap(short = 'U', long = "UTC")]
utc: bool,
pub utc: bool,
/// Disable color output.
#[clap(long = "no_color")]
no_color: bool,
pub no_color: bool,
/// Thread number. [default: Optimal number for performance.]
/// Thread number. [Default: Optimal number for performance.]
#[clap(short, long = "thread-number", value_name = "NUMBER")]
thread_number: Option<usize>,
pub thread_number: Option<usize>,
/// Prints statistics of event IDs.
#[clap(short, long)]
statistics: bool,
pub statistics: bool,
/// Successful and failed logons summary.
#[clap(short = 'L', long = "logon-summary")]
logon_summary: bool,
pub logon_summary: bool,
/// Tune alert levels.
/// Tune alert levels. (Default: .\rules\config\level_tuning.txt)
#[clap(
long = "level-tuning",
default_value = "./rules/config/level_tuning.txt",
hide_default_value = true,
value_name = "LEVEL_TUNING_FILE"
)]
level_tuning: PathBuf,
pub level_tuning: PathBuf,
/// Quiet mode. Do not display the launch banner.
#[clap(short, long)]
quiet: bool,
pub quiet: bool,
/// Quiet errors mode. Do not save error logs.
#[clap(short = 'Q', long = "quiet-errors")]
quiet_errors: bool,
pub quiet_errors: bool,
/// Create a list of pivot keywords.
#[clap(short = 'p', long = "pivot-keywords-list")]
pivot_keywords_list: bool,
pub pivot_keywords_list: bool,
/// Prints the list of contributors.
#[clap(long)]
contributors: bool,
pub contributors: bool,
}
impl ConfigReader {
impl ConfigReader<'_> {
pub fn new() -> Self {
let app_str = "Hayabusa 1.4";
let custom_usage_and_opt = r#"
let parse = Config::parse();
let help_term_width = if let Some((Width(w), _)) = *TERM_SIZE {
w as usize
} else {
400
};
let build_cmd = Config::command().term_width(help_term_width).help_template(r#"
USAGE:
{usage}
USAGE:
hayabusa.exe -f file.evtx [OPTIONS] / hayabusa.exe -d evtx-directory [OPTIONS]
OPTIONS:
--European-time Output timestamp in European time format. (Ex: 22-02-2022 22:00:00.123 +02:00)
--US-military-time Output timestamp in US military time format. (Ex: 02-22-2022 22:00:00.123 -06:00)
--US-time Output timestamp in US time format. (Ex: 02-22-2022 10:00:00.123 PM -06:00)
--all-tags Output all tags when saving to a CSV file.
-c, --config <RULE_CONFIG_DIRECTORY> Specify rule config folder. (Default: .\rules\config)
--contributors Prints the list of contributors.
-d, --directory <DIRECTORY> Directory of multiple .evtx files.
-D, --enable-deprecated-rules Enable rules marked as deprecated.
--end-timeline <END_TIMELINE> End time of the event logs to load. (Ex: "2022-02-22 23:59:59 +09:00")
-f, --filepath <FILE_PATH> File path to one .evtx file.
-F, --full-data Print all field information.
-h, --help Print help information.
-l, --live-analysis Analyze the local C:\Windows\System32\winevt\Logs folder. (Windows Only. Administrator privileges required.)
-L, --logon-summary Successful and failed logons summary.
--level-tuning <LEVEL_TUNING_FILE> Tune alert levels. (Default: .\rules\config\level_tuning.txt)
-m, --min-level <LEVEL> Minimum level for rules. (Default: informational)
-n, --enable-noisy-rules Enable rules marked as noisy.
--no_color Disable color output.
-o, --output <CSV_TIMELINE> Save the timeline in CSV format. (Ex: results.csv)
-p, --pivot-keywords-list Create a list of pivot keywords.
-q, --quiet Quiet mode. Do not display the launch banner.
-Q, --quiet-errors Quiet errors mode. Do not save error logs.
-r, --rules <RULE_DIRECTORY/RULE_FILE> Specify rule directory or file. (Default: .\rules)
-R, --hide-record-id Do not display EventRecordID numbers.
--rfc-2822 Output timestamp in RFC 2822 format. (Ex: Fri, 22 Feb 2022 22:00:00 -0600)
--rfc-3339 Output timestamp in RFC 3339 format. (Ex: 2022-02-22 22:00:00.123456-06:00)
-s, --statistics Prints statistics of event IDs.
--start-timeline <START_TIMELINE> Start time of the event logs to load. (Ex: "2020-02-22 00:00:00 +09:00")
-t, --thread-number <NUMBER> Thread number. (Default: Optimal number for performance.)
-u, --update-rules Update to the latest rules in the hayabusa-rules github repository.
-U, --UTC Output time in UTC format. (Default: local time)
-v, --verbose Output verbose information.
-V, --visualize-timeline Output event frequency timeline.
--version Print version information."#;
let build_cmd = Config::command().override_help(r#"Hayabusa 1.4 Help Menu:
Hayabusa: A sigma-based threat hunting and fast forensics timeline generator for Windows event logs.
Yamato Security (https://github.com/Yamato-Security/hayabusa) @SecurityYamato)
USAGE:
hayabusa.exe -f file.evtx [OPTIONS] / hayabusa.exe -d evtx-directory [OPTIONS]
OPTIONS:
--European-time Output timestamp in European time format. (Ex: 22-02-2022 22:00:00.123 +02:00)
--US-military-time Output timestamp in US military time format. (Ex: 02-22-2022 22:00:00.123 -06:00)
--US-time Output timestamp in US time format. (Ex: 02-22-2022 10:00:00.123 PM -06:00)
--all-tags Output all tags when saving to a CSV file.
-c, --config <RULE_CONFIG_DIRECTORY> Specify rule config folder. (Default: .\rules\config)
--contributors Prints the list of contributors.
-d, --directory <DIRECTORY> Directory of multiple .evtx files.
-D, --enable-deprecated-rules Enable rules marked as deprecated.
--end-timeline <END_TIMELINE> End time of the event logs to load. (Ex: "2022-02-22 23:59:59 +09:00")
-f, --filepath <FILE_PATH> File path to one .evtx file.
-F, --full-data Print all field information.
-h, --help Print help information.
-l, --live-analysis Analyze the local C:\Windows\System32\winevt\Logs folder. (Windows Only. Administrator privileges required.)
-L, --logon-summary Successful and failed logons summary.
--level-tuning <LEVEL_TUNING_FILE> Tune alert levels. (Default: .\rules\config\level_tuning.txt)
-m, --min-level <LEVEL> Minimum level for rules. (Default: informational)
-n, --enable-noisy-rules Enable rules marked as noisy.
--no_color Disable color output.
-o, --output <CSV_TIMELINE> Save the timeline in CSV format. (Ex: results.csv)
-p, --pivot-keywords-list Create a list of pivot keywords.
-q, --quiet Quiet mode. Do not display the launch banner.
-Q, --quiet-errors Quiet errors mode. Do not save error logs.
-r, --rules <RULE_DIRECTORY/RULE_FILE> Specify rule directory or file. (Default: .\rules)
-R, --hide-record-id Do not display EventRecordID numbers.
--rfc-2822 Output timestamp in RFC 2822 format. (Ex: Fri, 22 Feb 2022 22:00:00 -0600)
--rfc-3339 Output timestamp in RFC 3339 format. (Ex: 2022-02-22 22:00:00.123456-06:00)
-s, --statistics Prints statistics of event IDs.
--start-timeline <START_TIMELINE> Start time of the event logs to load. (Ex: "2020-02-22 00:00:00 +09:00")
-t, --thread-number <NUMBER> Thread number. (Default: Optimal number for performance.)
-u, --update-rules Update to the latest rules in the hayabusa-rules github repository.
-U, --UTC Output time in UTC format. (Default: local time)
-v, --verbose Output verbose information.
-V, --visualize-timeline Output event frequency timeline.
--version Print version information.
"#);
let arg = build_cmd.clone().get_matches();
let headless_help = format!("{}{}", app_str, custom_usage_and_opt);
let folder_path = arg.value_of("config").unwrap().to_string();
OPTIONS:
{options}"#);
ConfigReader {
args: arg,
headless_help,
folder_path,
app: build_cmd,
args: parse,
headless_help: String::default(),
event_timeline_config: load_eventcode_info("config/statistics_event_info.txt"),
target_eventids: load_target_ids("config/target_eventids.txt"),
}