From 8b0c7fcb27c9dd29e2367f488d5dbfdcce885628 Mon Sep 17 00:00:00 2001 From: Eduard Tolosa Date: Mon, 7 Apr 2025 16:10:42 +0000 Subject: [PATCH] (fix): do not launch nmap scans if not valid IPs are found. Fixes #12 --- .vscode/launch.json | 2 +- Cargo.toml | 8 ++- src/logger.rs | 7 --- src/logic.rs | 2 +- src/resolver_engine.rs | 111 ++++++++++++++++++++++------------------- 5 files changed, 70 insertions(+), 60 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 5d2c43b..98a0a0c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,7 +9,7 @@ "request": "launch", "name": "Debug", "program": "${workspaceRoot}/target/debug/${workspaceRootFolderName}", - "args": "-f targets.txt -u log.csv --resolvers resolvers.txt --iport 1 --lport 10000 --min-rate 10", + "args": "-t useast1.sugarcrm.com --fast-scan", "cwd": "${workspaceRoot}", "sourceLanguages": [ "rust" diff --git a/Cargo.toml b/Cargo.toml index d366194..4b69b87 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,13 @@ prettytable-rs = "0.8.0" serde-xml-rs = "0.5.1" chrono = "0.4.26" clap = { version = "2.34.0", features = ["yaml"] } -config = { version = "0.11.0", features = ["yaml", "json", "toml", "hjson", "ini"] } +config = { version = "0.11.0", features = [ + "yaml", + "json", + "toml", + "hjson", + "ini", +] } failure = "0.1.8" # https://github.com/bluejekyll/trust-dns/pull/1632 diff --git a/src/logger.rs b/src/logger.rs index 7bc5b80..79a05ce 100644 --- a/src/logger.rs +++ b/src/logger.rs @@ -1,6 +1,5 @@ #[cfg(windows)] extern crate atty; -#[cfg(feature = "chrono")] extern crate chrono; #[cfg(feature = "colored")] extern crate colored; @@ -8,7 +7,6 @@ extern crate log; #[cfg(windows)] extern crate winapi; -#[cfg(feature = "chrono")] use chrono::Local; #[cfg(feature = "colored")] use colored::*; @@ -45,7 +43,6 @@ impl Log for SimpleLogger { record.level().to_string() } }; - #[cfg(feature = "chrono")] { print!( "\n{} [{}] {}", @@ -54,10 +51,6 @@ impl Log for SimpleLogger { record.args() ); } - #[cfg(not(feature = "chrono"))] - { - print!("\n[{}] {}", level_string, record.args()); - } } } diff --git a/src/logic.rs b/src/logic.rs index 105d616..a1eff09 100644 --- a/src/logic.rs +++ b/src/logic.rs @@ -9,7 +9,7 @@ pub fn validate_target(target: &str) -> bool { !target.starts_with('.') && target.contains('.') && !target.contains(&SPECIAL_CHARS[..]) - && target.chars().all(|c| c.is_ascii()) + && target.is_ascii() } pub fn null_ip_checker(ip: &str) -> String { diff --git a/src/resolver_engine.rs b/src/resolver_engine.rs index f530d2a..1ffbb77 100644 --- a/src/resolver_engine.rs +++ b/src/resolver_engine.rs @@ -220,65 +220,76 @@ fn parallel_resolver_engine( nmap_ips.retain(|ip| { !ip.is_empty() - && ip.parse::().is_ok() && !ip.parse::().unwrap().is_private() + && ip.parse::().is_ok() }); - let nmap_data: HashMap = nmap_ips - .par_iter() - .map(|ip| { - let filename = format!("{}/{}.xml", &args.logs_dir, &ip); - match nmap::get_nmap_data(&filename, ip, &args.min_rate, &args.ports, args.fast_scan) { - Ok(nmap_data) => { - nmap_data - .host - .clone() - .unwrap_or_default() - .ports - .unwrap_or_default() - .port - .retain(|f| f.state.state == "open"); - if args.no_keep_nmap_logs && std::fs::remove_file(&filename).is_err() { - error!("Error removing filename {}.", &filename) - } - (ip.clone(), nmap_data) - } - Err(e) => { - error!("Error scanning the ip {}. Description: {}", &ip, e); - (String::new(), Nmaprun::default()) - } - } - }) - .collect(); - - // Delete the args.logs_dir directory if it's empty - if args.no_keep_nmap_logs && std::fs::remove_dir(&args.logs_dir).is_err() { - error!("Error removing directory {}.", &args.logs_dir) - } - - resolv_data - .iter() - .map(|(target, resolv_data)| { - ( - target.clone(), - ResolvData { - ip: resolv_data.ip.clone(), - ports_data: if resolv_data.ip.is_empty() { - resolv_data.ports_data.clone() - } else { + if nmap_ips.is_empty() { + error!("No valid IPs found for scanning.\n"); + std::process::exit(1) + } else { + let nmap_data: HashMap = nmap_ips + .par_iter() + .map(|ip| { + let filename = format!("{}/{}.xml", &args.logs_dir, &ip); + match nmap::get_nmap_data( + &filename, + ip, + &args.min_rate, + &args.ports, + args.fast_scan, + ) { + Ok(nmap_data) => { nmap_data - .get_key_value(&resolv_data.ip) - .unwrap() - .1 .host .clone() .unwrap_or_default() .ports .unwrap_or_default() .port + .retain(|f| f.state.state == "open"); + if args.no_keep_nmap_logs && std::fs::remove_file(&filename).is_err() { + error!("Error removing filename {}.", &filename) + } + (ip.clone(), nmap_data) + } + Err(e) => { + error!("Error scanning the ip {}. Description: {}", &ip, e); + (String::new(), Nmaprun::default()) + } + } + }) + .collect(); + + // Delete the args.logs_dir directory if it's empty + if args.no_keep_nmap_logs && std::fs::remove_dir(&args.logs_dir).is_err() { + error!("Error removing directory {}.", &args.logs_dir) + } + + resolv_data + .iter() + .map(|(target, resolv_data)| { + ( + target.clone(), + ResolvData { + ip: resolv_data.ip.clone(), + ports_data: if resolv_data.ip.is_empty() { + resolv_data.ports_data.clone() + } else { + nmap_data + .get_key_value(&resolv_data.ip) + .unwrap() + .1 + .host + .clone() + .unwrap_or_default() + .ports + .unwrap_or_default() + .port + }, }, - }, - ) - }) - .collect() + ) + }) + .collect() + } }