Skip to content

Commit

Permalink
new: tcp.ports will now default to top common port
Browse files Browse the repository at this point in the history
  • Loading branch information
evilsocket committed Jul 23, 2024
1 parent 92eee9f commit 6eba10c
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 6 deletions.
52 changes: 51 additions & 1 deletion src/creds/expression.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ pub(crate) enum Expression {
Glob {
pattern: String,
},
Multiple {
expressions: Vec<Expression>,
},
}

impl Default for Expression {
Expand Down Expand Up @@ -67,6 +70,7 @@ impl fmt::Display for Expression {
write!(f, "range {:?}", set)
}
}
Expression::Multiple { expressions: _ } => write!(f, "multi {{ ... }}"),
}
}
}
Expand Down Expand Up @@ -150,14 +154,26 @@ pub(crate) fn parse_expression(expr: Option<&String>) -> Expression {
}
};
}
// file name or constant
// file name, constant or multiple
_ => {
let filepath = Path::new(&expr);
if filepath.exists() && filepath.is_file() {
// this is a file name
return Expression::Wordlist {
filename: expr.to_owned(),
};
} else if expr.contains(',') {
// parse as multiple expressions
let multi = expr
.split(',')
.map(|s| s.to_owned())
.collect::<Vec<String>>();
let mut expressions = vec![];
for exp in multi {
expressions.push(parse_expression(Some(exp).as_ref()));
}

return Expression::Multiple { expressions };
} else {
// constant value casually starting with @
return Expression::Constant {
Expand Down Expand Up @@ -298,4 +314,38 @@ mod tests {
}
)
}

#[test]
fn can_parse_multiople() {
let expr = "1,[3-5],[6-8],9,[10-13]";
let res = parse_expression(Some(expr.to_owned()).as_ref());
assert_eq!(
res,
Expression::Multiple {
expressions: vec![
Expression::Constant {
value: "1".to_string()
},
Expression::Range {
min: 3,
max: 5,
set: vec![],
},
Expression::Range {
min: 6,
max: 8,
set: vec![],
},
Expression::Constant {
value: "9".to_string()
},
Expression::Range {
min: 10,
max: 13,
set: vec![],
},
]
}
)
}
}
11 changes: 11 additions & 0 deletions src/creds/iterator/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use crate::session::Error;

mod constant;
mod glob;
mod multi;
mod permutations;
mod permutator;
mod range;
Expand Down Expand Up @@ -45,5 +46,15 @@ pub(crate) fn new(expr: Expression) -> Result<Box<dyn Iterator>, Error> {
let it = range::Range::new(min, max, set)?;
Ok(Box::new(it))
}
Expression::Multiple { expressions } => {
let mut iters = vec![];
for expr in expressions.iter() {
iters.push(new(expr.clone())?)
}

let it = multi::Multi::new(iters)?;

Ok(Box::new(it))
}
}
}
59 changes: 59 additions & 0 deletions src/creds/iterator/multi.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
use crate::{creds, session::Error};

pub(crate) struct Multi {
curr_it: usize,
num_its: usize,
elements: usize,
iters: Vec<Box<dyn creds::Iterator<Item = String>>>,
}

impl Multi {
pub fn new(iters: Vec<Box<dyn creds::Iterator<Item = String>>>) -> Result<Self, Error> {
log::debug!("loading Multi with {} iterators ...", iters.len());

// count the number of items for each iterator
let curr_it = 0;
let num_its = iters.len();
let mut elements = 0;
for it in iters.iter() {
elements += it.search_space_size();
}

Ok(Self {
elements,
curr_it,
num_its,
iters,
})
}
}

impl creds::Iterator for Multi {
fn search_space_size(&self) -> usize {
self.elements
}
}

impl creds::IteratorClone for Multi {
fn create_boxed_copy(&self) -> Box<dyn creds::Iterator> {
Box::new(Self::new(self.iters.clone()).unwrap())
}
}

impl std::iter::Iterator for Multi {
type Item = String;

fn next(&mut self) -> Option<Self::Item> {
if self.curr_it < self.num_its {
let curr = &mut self.iters[self.curr_it];
let next = curr.next();
return if next.is_none() {
self.curr_it += 1;
self.next()
} else {
next
};
}
None
}
}
8 changes: 4 additions & 4 deletions src/plugins/tcp_ports/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,18 +50,18 @@ impl Plugin for TcpPortScanner {
}

fn setup(&mut self, opts: &Options) -> Result<(), Error> {
self.ports = creds::parse_expression(Some(&format!("[{}]", &opts.tcp_ports.tcp_ports)));
self.ports = creds::parse_expression(Some(&opts.tcp_ports.tcp_ports));
if !matches!(
&self.ports,
Expression::Range {
min: _,
max: _,
set: _
}
} | Expression::Multiple { expressions: _ }
) {
return Err(format!(
"'{}' is not a valid port range expression",
&opts.tcp_ports.tcp_ports
"'{:?}' is not a valid port range expression",
&self.ports
));
}

Expand Down
5 changes: 4 additions & 1 deletion src/plugins/tcp_ports/options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ use serde::{Deserialize, Serialize};
#[derive(Parser, Debug, Serialize, Deserialize, Clone, Default)]
#[group(skip)]
pub(crate) struct Options {
#[clap(long, default_value = "1-65535")]
#[clap(
long,
default_value = "1,[3-4],6-7,9,13,17,[19-26],30,[32-33],37,[42-43],49,53,70,[79-85],88-90,[99-100],106,[109-111],113,119,125,135,139,[143-144],146,161,163,179,199,[211-212],222,[254-256],259,264,280,301,306,311,340,366,389,[406-407],416-417,425,427,[443-445],458,[464-465],481,497,500,[512-515],524,541,[543-545],548,[554-555],563,587,593,[616-617],625,631,636,646,648,[666-668],683,687,691,700,705,711,714,720,722,726,749,765,777,783,787,[800-801],808,843,873,880,888,898,[900-903],911-912,981,987,990,[992-993],995,[999-1002],1007,[1009-1011],1021-1100,1102,[1104-1108],1110-1114,1117,1119,[1121-1124],1126,[1130-1132],1137-1138,1141,1145,[1147-1149],1151-1152,1154,[1163-1166],1169,[1174-1175],1183,[1185-1187],1192,[1198-1199],1201,1213,[1216-1218],1233-1234,1236,1244,[1247-1248],1259,[1271-1272],1277,1287,1296,[1300-1301],1309-1311,1322,1328,1334,1352,1417,[1433-1434],1443,1455,1461,1494,[1500-1501],1503,1521,1524,1533,1556,1580,1583,1594,1600,1641,1658,1666,[1687-1688],1700,[1717-1721],1723,1755,1761,[1782-1783],1801,1805,1812,[1839-1840],1862-1864,1875,1900,1914,1935,1947,[1971-1972],1974,1984,[1998-2010],2013,[2020-2022],2030,[2033-2035],2038,[2040-2043],2045-2049,2065,2068,[2099-2100],2103,[2105-2107],2111,2119,2121,2126,2135,2144,[2160-2161],2170,2179,[2190-2191],2196,2200,2222,2251,2260,2288,2301,2323,2366,[2381-2383],2393-2394,2399,2401,2492,2500,2522,2525,2557,[2601-2602],2604-2605,[2607-2608],2638,[2701-2702],2710,[2717-2718],2725,2800,2809,2811,2869,2875,[2909-2910],2920,[2967-2968],2998,[3000-3001],3003,[3005-3007],3011,3013,3017,[3030-3031],3052,3071,3077,3128,3168,3211,3221,[3260-3261],3268-3269,3283,[3300-3301],3306,[3322-3325],3333,3351,3367,[3369-3372],3389-3390,3404,3476,3493,3517,3527,3546,3551,3580,3659,[3689-3690],3703,3737,3766,3784,[3800-3801],3809,3814,[3826-3828],3851,3869,3871,3878,3880,3889,3905,3914,3918,3920,3945,3971,3986,3995,3998,[4000-4006],4045,4111,[4125-4126],4129,4224,4242,4279,4321,4343,[4443-4446],4449,4550,4567,4662,4848,[4899-4900],4998,[5000-5004],5009,5030,5033,[5050-5051],5054,[5060-5061],5080,5087,[5100-5102],5120,5190,5200,5214,[5221-5222],5225-5226,5269,5280,5298,5357,5405,5414,[5431-5432],5440,5500,5510,5544,5550,5555,5560,5566,5631,5633,5666,[5678-5679],5718,5730,[5800-5802],5810-5811,5815,5822,5825,5850,5859,5862,5877,[5900-5904],5906-5907,[5910-5911],5915,5922,5925,5950,5952,[5959-5963],5987-5989,[5998-6007],6009,6025,6059,[6100-6101],6106,6112,6123,6129,6156,6346,6389,6502,6510,6543,6547,[6565-6567],6580,6646,[6666-6669],6689,6692,6699,6779,[6788-6789],6792,6839,6881,6901,6969,[7000-7002],7004,7007,7019,7025,7070,7100,7103,7106,[7200-7201],7402,7435,7443,7496,7512,7625,7627,7676,7741,[7777-7778],7800,7911,[7920-7921],7937-7938,[7999-8002],8007-8011,[8021-8022],8031,8042,8045,[8080-8090],8093,[8099-8100],8180-8181,[8192-8194],8200,8222,8254,[8290-8292],8300,8333,8383,8400,8402,8443,8500,8600,8649,[8651-8652],8654,8701,8800,8873,8888,8899,8994,[9000-9003],9009-9011,9040,9050,9071,[9080-9081],9090-9091,[9099-9103],9110-9111,9200,9207,9220,9290,9415,9418,9485,9500,[9502-9503],9535,9575,[9593-9595],9618,9666,[9876-9878],9898,9900,9917,9929,[9943-9944],9968,[9998-10004],10009-10010,10012,[10024-10025],10082,10180,10215,10243,10566,[10616-10617],10621,10626,[10628-10629],10778,[11110-11111],11967,12000,12174,12265,12345,13456,13722,[13782-13783],14000,14238,[14441-14442],15000,[15002-15004],15660,15742,[16000-16001],16012,16016,16018,16080,16113,[16992-16993],17877,17988,18040,18101,18988,19101,19283,19315,19350,19780,19801,19842,20000,20005,20031,[20221-20222],20828,21571,22939,23502,24444,24800,[25734-25735],26214,27000,[27352-27353],27355-27356,27715,28201,30000,30718,30951,31038,31337,[32768-32785],33354,33899,[34571-34573],35500,38292,40193,40911,41511,42510,44176,[44442-44443],44501,45100,48080,[49152-49161],49163,49165,49167,[49175-49176],49400,[49999-50003],50006,50300,50389,50500,50636,50800,51103,51493,52673,52822,52848,52869,54045,54328,[55055-55056],55555,55600,[56737-56738],57294,57797,58080,60020,60443,61532,61900,62078,63331,64623,64680,65000,65129,65389"
)]
/// Range or comma separated values of integer port numbers to scan.
pub tcp_ports: String,
#[clap(long, default_value_t = false)]
Expand Down

0 comments on commit 6eba10c

Please sign in to comment.