From d4f4383833ca4718b713348d13bc88656ad6d33a Mon Sep 17 00:00:00 2001 From: mattcorbin Date: Sat, 29 Aug 2020 13:52:33 -0400 Subject: [PATCH 1/3] feat: added progress bar for scanning, changed open port list output to be post scan instead of during as it caused issues with the progress bar. --- Cargo.lock | 61 ++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/scanner/mod.rs | 19 ++++++++++----- 3 files changed, 75 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d673c82ed..545d92e0f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -249,6 +249,23 @@ dependencies = [ "cache-padded", ] +[[package]] +name = "console" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b1aacfaffdbff75be81c15a399b4bedf78aaefe840e8af1d299ac2ade885d2" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "regex", + "terminal_size", + "termios", + "unicode-width", + "winapi", + "winapi-util", +] + [[package]] name = "constant_time_eq" version = "0.1.5" @@ -286,6 +303,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + [[package]] name = "env_logger" version = "0.7.1" @@ -465,6 +488,18 @@ dependencies = [ "quick-error", ] +[[package]] +name = "indicatif" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7baab56125e25686df467fe470785512329883aab42696d661247aca2a2896e4" +dependencies = [ + "console", + "lazy_static", + "number_prefix", + "regex", +] + [[package]] name = "js-sys" version = "0.3.44" @@ -531,6 +566,12 @@ dependencies = [ "libc", ] +[[package]] +name = "number_prefix" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a" + [[package]] name = "once_cell" version = "1.4.0" @@ -769,6 +810,7 @@ dependencies = [ "env_logger", "futures", "gcd", + "indicatif", "log", "rand", "rlimit", @@ -876,6 +918,25 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "terminal_size" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a14cd9f8c72704232f0bfc8455c0e861f0ad4eb60cc9ec8a170e231414c1e13" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "termios" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0fcee7b24a25675de40d5bb4de6e41b0df07bc9856295e7e2b3a3600c400c2" +dependencies = [ + "libc", +] + [[package]] name = "textwrap" version = "0.11.0" diff --git a/Cargo.toml b/Cargo.toml index a4ee885fc..af8c206b0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,6 +33,7 @@ ansi_term = "0.12.1" toml = "0.5.6" serde = "1.0.115" serde_derive = "1.0.115" +indicatif = "0.15.0" [package.metadata.deb] depends = "$auto, nmap" diff --git a/src/scanner/mod.rs b/src/scanner/mod.rs index 56d9d289e..14ae9c45a 100644 --- a/src/scanner/mod.rs +++ b/src/scanner/mod.rs @@ -5,6 +5,7 @@ use async_std::net::TcpStream; use async_std::prelude::*; use colored::*; use futures::stream::FuturesUnordered; +use indicatif::ProgressBar; use std::time::Duration; use std::{ io::ErrorKind, @@ -48,20 +49,27 @@ impl Scanner { /// Returns all open ports as Vec pub async fn run(&self) -> Vec { let ports: Vec = self.port_strategy.order(); + let progress: ProgressBar = ProgressBar::new(ports.len() as u64); let batch_per_ip: usize = self.batch_size as usize / self.ips.len(); let mut open_sockets: Vec = Vec::new(); for batch in ports.chunks(batch_per_ip) { - let mut sockets = self.scan_ports(batch).await; + let mut sockets = self.scan_ports(batch, &progress).await; open_sockets.append(&mut sockets); } + progress.finish(); + if !self.quiet { + for socket in &open_sockets { + println!("Open {}", socket.to_string().purple()); + } + } open_sockets } /// Given a slice of sockets, scan them all. /// Returns a vector of open sockets. - async fn scan_ports(&self, ports: &[u16]) -> Vec { + async fn scan_ports(&self, ports: &[u16], progress: &ProgressBar) -> Vec { let mut ftrs = FuturesUnordered::new(); for port in ports { for ip in &self.ips { @@ -75,8 +83,10 @@ impl Scanner { Ok(socket) => open_sockets.push(socket), _ => {} } + if !self.quiet { + progress.inc(1); + } } - open_sockets } @@ -100,9 +110,6 @@ impl Scanner { match x.shutdown(Shutdown::Both) { _ => {} } - if !self.quiet { - println!("Open {}", socket.to_string().purple()); - } Ok(socket) } From 2a7cf23f8706d1a746a8651725f63a058db926a2 Mon Sep 17 00:00:00 2001 From: Matt Corbin Date: Mon, 7 Sep 2020 13:37:35 -0400 Subject: [PATCH 2/3] swapped indicatif for pbr --- Cargo.lock | 109 +++++++++++++++++++-------------------------- Cargo.toml | 2 +- src/scanner/mod.rs | 32 +++++++------ 3 files changed, 66 insertions(+), 77 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 545d92e0f..c10305356 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -249,29 +249,22 @@ dependencies = [ "cache-padded", ] -[[package]] -name = "console" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b1aacfaffdbff75be81c15a399b4bedf78aaefe840e8af1d299ac2ade885d2" -dependencies = [ - "encode_unicode", - "lazy_static", - "libc", - "regex", - "terminal_size", - "termios", - "unicode-width", - "winapi", - "winapi-util", -] - [[package]] name = "constant_time_eq" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +[[package]] +name = "crossbeam-channel" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87" +dependencies = [ + "crossbeam-utils", + "maybe-uninit", +] + [[package]] name = "crossbeam-utils" version = "0.7.2" @@ -303,12 +296,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "encode_unicode" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - [[package]] name = "env_logger" version = "0.7.1" @@ -458,7 +445,7 @@ checksum = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.9.0+wasi-snapshot-preview1", ] [[package]] @@ -488,18 +475,6 @@ dependencies = [ "quick-error", ] -[[package]] -name = "indicatif" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7baab56125e25686df467fe470785512329883aab42696d661247aca2a2896e4" -dependencies = [ - "console", - "lazy_static", - "number_prefix", - "regex", -] - [[package]] name = "js-sys" version = "0.3.44" @@ -539,6 +514,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + [[package]] name = "memchr" version = "2.3.3" @@ -566,12 +547,6 @@ dependencies = [ "libc", ] -[[package]] -name = "number_prefix" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a" - [[package]] name = "once_cell" version = "1.4.0" @@ -590,6 +565,18 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" +[[package]] +name = "pbr" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74333e3d1d8bced07fd0b8599304825684bcdb4a1fcc6fa6a470e6e08cefd254" +dependencies = [ + "crossbeam-channel", + "libc", + "time", + "winapi", +] + [[package]] name = "pin-project" version = "0.4.23" @@ -810,8 +797,8 @@ dependencies = [ "env_logger", "futures", "gcd", - "indicatif", "log", + "pbr", "rand", "rlimit", "serde", @@ -918,25 +905,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "terminal_size" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a14cd9f8c72704232f0bfc8455c0e861f0ad4eb60cc9ec8a170e231414c1e13" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "termios" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0fcee7b24a25675de40d5bb4de6e41b0df07bc9856295e7e2b3a3600c400c2" -dependencies = [ - "libc", -] - [[package]] name = "textwrap" version = "0.11.0" @@ -955,6 +923,17 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + [[package]] name = "toml" version = "0.5.6" @@ -1012,6 +991,12 @@ version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "wasm-bindgen" version = "0.2.67" diff --git a/Cargo.toml b/Cargo.toml index af8c206b0..d4aefbc60 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,7 +33,7 @@ ansi_term = "0.12.1" toml = "0.5.6" serde = "1.0.115" serde_derive = "1.0.115" -indicatif = "0.15.0" +pbr = "1.0.3" [package.metadata.deb] depends = "$auto, nmap" diff --git a/src/scanner/mod.rs b/src/scanner/mod.rs index 14ae9c45a..8d9288733 100644 --- a/src/scanner/mod.rs +++ b/src/scanner/mod.rs @@ -1,16 +1,17 @@ -use super::PortStrategy; +use std::{ + io::{ErrorKind, Stdout}, + net::{IpAddr, Shutdown, SocketAddr}, + time::Duration, +}; use async_std::io; use async_std::net::TcpStream; use async_std::prelude::*; use colored::*; use futures::stream::FuturesUnordered; -use indicatif::ProgressBar; -use std::time::Duration; -use std::{ - io::ErrorKind, - net::{IpAddr, Shutdown, SocketAddr}, -}; +use pbr::ProgressBar; + +use super::PortStrategy; /// The class for the scanner /// IP is data type IpAddr and is the IP address @@ -49,12 +50,12 @@ impl Scanner { /// Returns all open ports as Vec pub async fn run(&self) -> Vec { let ports: Vec = self.port_strategy.order(); - let progress: ProgressBar = ProgressBar::new(ports.len() as u64); + let mut progress: ProgressBar = ProgressBar::new(ports.len() as u64); let batch_per_ip: usize = self.batch_size as usize / self.ips.len(); let mut open_sockets: Vec = Vec::new(); for batch in ports.chunks(batch_per_ip) { - let mut sockets = self.scan_ports(batch, &progress).await; + let mut sockets = self.scan_ports(batch, &mut progress).await; open_sockets.append(&mut sockets); } progress.finish(); @@ -69,7 +70,7 @@ impl Scanner { /// Given a slice of sockets, scan them all. /// Returns a vector of open sockets. - async fn scan_ports(&self, ports: &[u16], progress: &ProgressBar) -> Vec { + async fn scan_ports(&self, ports: &[u16], progress: &mut ProgressBar) -> Vec { let mut ftrs = FuturesUnordered::new(); for port in ports { for ip in &self.ips { @@ -84,7 +85,7 @@ impl Scanner { _ => {} } if !self.quiet { - progress.inc(1); + progress.inc(); } } open_sockets @@ -145,11 +146,14 @@ impl Scanner { #[cfg(test)] mod tests { - use super::*; - use crate::{PortRange, ScanOrder}; - use async_std::task::block_on; use std::{net::IpAddr, time::Duration}; + use async_std::task::block_on; + + use crate::{PortRange, ScanOrder}; + + use super::*; + #[test] fn scanner_runs() { // Makes sure the program still runs and doesn't panic From 43d68113a7905aeab8cc04177527776601db4ffe Mon Sep 17 00:00:00 2001 From: mattcorbin Date: Mon, 7 Sep 2020 13:49:47 -0400 Subject: [PATCH 3/3] Fix formatting --- src/scanner/mod.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/scanner/mod.rs b/src/scanner/mod.rs index 8d9288733..0ff9895c0 100644 --- a/src/scanner/mod.rs +++ b/src/scanner/mod.rs @@ -70,7 +70,11 @@ impl Scanner { /// Given a slice of sockets, scan them all. /// Returns a vector of open sockets. - async fn scan_ports(&self, ports: &[u16], progress: &mut ProgressBar) -> Vec { + async fn scan_ports( + &self, + ports: &[u16], + progress: &mut ProgressBar, + ) -> Vec { let mut ftrs = FuturesUnordered::new(); for port in ports { for ip in &self.ips {