Skip to content

Commit 3b06a34

Browse files
authored
Merge pull request #719 from thannaske/feature-exclude-addresses
feat: add address exclusion flag (#718)
2 parents e3f129e + 8676de1 commit 3b06a34

File tree

2 files changed

+70
-1
lines changed

2 files changed

+70
-1
lines changed

src/address.rs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,18 @@ pub fn parse_addresses(input: &Opts) -> Vec<IpAddr> {
6969
}
7070
}
7171

72+
// Finally, craft a list of addresses to be excluded from the scan.
73+
let mut excluded_ips: Vec<IpAddr> = Vec::new();
74+
if let Some(exclude_addresses) = &input.exclude_addresses {
75+
for addr in exclude_addresses {
76+
excluded_ips.extend(parse_address(addr, &backup_resolver));
77+
}
78+
}
79+
7280
ips.into_iter()
7381
.collect::<BTreeSet<_>>()
7482
.into_iter()
83+
.filter(|ip| !excluded_ips.contains(ip))
7584
.collect()
7685
}
7786

@@ -212,6 +221,58 @@ mod tests {
212221
);
213222
}
214223

224+
#[test]
225+
fn parse_addresses_with_address_exclusions() {
226+
let mut opts = Opts::default();
227+
opts.addresses = vec!["192.168.0.0/30".to_owned()];
228+
opts.exclude_addresses = Some(vec!["192.168.0.1".to_owned()]);
229+
let ips = parse_addresses(&opts);
230+
231+
assert_eq!(
232+
ips,
233+
[
234+
Ipv4Addr::new(192, 168, 0, 0),
235+
Ipv4Addr::new(192, 168, 0, 2),
236+
Ipv4Addr::new(192, 168, 0, 3)
237+
]
238+
);
239+
}
240+
241+
#[test]
242+
fn parse_addresses_with_cidr_exclusions() {
243+
let mut opts = Opts::default();
244+
opts.addresses = vec!["192.168.0.0/29".to_owned()];
245+
opts.exclude_addresses = Some(vec!["192.168.0.0/30".to_owned()]);
246+
let ips = parse_addresses(&opts);
247+
248+
assert_eq!(
249+
ips,
250+
[
251+
Ipv4Addr::new(192, 168, 0, 4),
252+
Ipv4Addr::new(192, 168, 0, 5),
253+
Ipv4Addr::new(192, 168, 0, 6),
254+
Ipv4Addr::new(192, 168, 0, 7),
255+
]
256+
);
257+
}
258+
259+
#[test]
260+
fn parse_addresses_with_incorrect_address_exclusions() {
261+
let mut opts = Opts::default();
262+
opts.addresses = vec!["192.168.0.0/30".to_owned()];
263+
opts.exclude_addresses = Some(vec!["192.168.0.1".to_owned(), "im_wrong".to_owned()]);
264+
let ips = parse_addresses(&opts);
265+
266+
assert_eq!(
267+
ips,
268+
[
269+
Ipv4Addr::new(192, 168, 0, 0),
270+
Ipv4Addr::new(192, 168, 0, 2),
271+
Ipv4Addr::new(192, 168, 0, 3)
272+
]
273+
);
274+
}
275+
215276
#[test]
216277
fn parse_correct_host_addresses() {
217278
let opts = Opts {
@@ -247,6 +308,7 @@ mod tests {
247308

248309
assert!(ips.is_empty());
249310
}
311+
250312
#[test]
251313
fn parse_hosts_file_and_incorrect_hosts() {
252314
// Host file contains IP, Hosts, incorrect IPs, incorrect hosts

src/input.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ pub struct Opts {
155155
#[arg(short, long, value_delimiter = ',')]
156156
pub exclude_ports: Option<Vec<u16>>,
157157

158+
/// A list of comma separated CIDRs, IPs, or hosts to be excluded from scanning.
159+
#[arg(short = 'x', long = "exclude-addresses", value_delimiter = ',')]
160+
pub exclude_addresses: Option<Vec<String>>,
161+
158162
/// UDP scanning mode, finds UDP ports that send back responses
159163
#[arg(long)]
160164
pub udp: bool,
@@ -221,7 +225,7 @@ impl Opts {
221225
self.ports = Some(ports);
222226
}
223227

224-
merge_optional!(range, resolver, ulimit, exclude_ports);
228+
merge_optional!(range, resolver, ulimit, exclude_ports, exclude_addresses);
225229
}
226230
}
227231

@@ -246,6 +250,7 @@ impl Default for Opts {
246250
scripts: ScriptsRequired::Default,
247251
config_path: None,
248252
exclude_ports: None,
253+
exclude_addresses: None,
249254
udp: false,
250255
}
251256
}
@@ -271,6 +276,7 @@ pub struct Config {
271276
command: Option<Vec<String>>,
272277
scripts: Option<ScriptsRequired>,
273278
exclude_ports: Option<Vec<u16>>,
279+
exclude_addresses: Option<Vec<String>>,
274280
udp: Option<bool>,
275281
}
276282

@@ -345,6 +351,7 @@ mod tests {
345351
scan_order: Some(ScanOrder::Random),
346352
scripts: None,
347353
exclude_ports: None,
354+
exclude_addresses: None,
348355
udp: Some(false),
349356
}
350357
}

0 commit comments

Comments
 (0)